added the counter for tcp.segment_memcap_drop to show the dropped segments count due to memory limit

remotes/origin/master-1.1.x
Gurvinder Singh 15 years ago committed by Victor Julien
parent 1c1c8cef89
commit 892dea31e4

File diff suppressed because it is too large Load Diff

@ -54,11 +54,13 @@ enum
typedef struct TcpReassemblyThreadCtx_ { typedef struct TcpReassemblyThreadCtx_ {
StreamMsgQueue *stream_q; StreamMsgQueue *stream_q;
AlpProtoDetectThreadCtx dp_ctx; /**< proto detection thread data */ AlpProtoDetectThreadCtx dp_ctx; /**< proto detection thread data */
/** TCP segments which are not being reassembled due to memcap was reached */
uint16_t counter_tcp_segment_memcap;
} TcpReassemblyThreadCtx; } TcpReassemblyThreadCtx;
#define OS_POLICY_DEFAULT OS_POLICY_BSD #define OS_POLICY_DEFAULT OS_POLICY_BSD
int StreamTcpReassembleHandleSegment(TcpReassemblyThreadCtx *, TcpSession *, TcpStream *, Packet *); int StreamTcpReassembleHandleSegment(ThreadVars *, TcpReassemblyThreadCtx *, TcpSession *, TcpStream *, Packet *);
int StreamTcpReassembleInit(char); int StreamTcpReassembleInit(char);
void StreamTcpReassembleFree(char); void StreamTcpReassembleFree(char);
void StreamTcpReassembleRegisterTests(void); void StreamTcpReassembleRegisterTests(void);

@ -86,7 +86,7 @@ TmEcode StreamTcpThreadInit(ThreadVars *, void *, void **);
TmEcode StreamTcpThreadDeinit(ThreadVars *, void *); TmEcode StreamTcpThreadDeinit(ThreadVars *, void *);
void StreamTcpExitPrintStats(ThreadVars *, void *); void StreamTcpExitPrintStats(ThreadVars *, void *);
static int ValidReset(TcpSession * , Packet *); static int ValidReset(TcpSession * , Packet *);
static int StreamTcpHandleFin(StreamTcpThread *, TcpSession *, Packet *); static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *, TcpSession *, Packet *);
void StreamTcpRegisterTests (void); void StreamTcpRegisterTests (void);
void StreamTcpReturnStreamSegments (TcpStream *); void StreamTcpReturnStreamSegments (TcpStream *);
void StreamTcpInitConfig(char); void StreamTcpInitConfig(char);
@ -801,7 +801,7 @@ static int StreamTcpPacketStateNone(ThreadVars *tv, Packet *p,
ssn->client.last_ts = 0; ssn->client.last_ts = 0;
} }
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, &ssn->client, p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
break; break;
case TH_RST: case TH_RST:
@ -1235,7 +1235,7 @@ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p,
ssn->client.next_win = ssn->client.last_ack + ssn->client.next_win = ssn->client.last_ack +
ssn->client.window; ssn->client.window;
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
} else { } else {
SCLogDebug("ssn %p: 4WHS wrong seq nr on packet", ssn); SCLogDebug("ssn %p: 4WHS wrong seq nr on packet", ssn);
@ -1298,7 +1298,7 @@ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p,
ssn->client.wscale = TCP_WSCALE_MAX; ssn->client.wscale = TCP_WSCALE_MAX;
} }
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
/* If asynchronous stream handling is allowed then set the session, /* If asynchronous stream handling is allowed then set the session,
@ -1331,7 +1331,7 @@ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p,
, ssn, TCP_GET_SEQ(p), p->payload_len, TCP_GET_SEQ(p) , ssn, TCP_GET_SEQ(p), p->payload_len, TCP_GET_SEQ(p)
+ p->payload_len, ssn->server.next_seq); + p->payload_len, ssn->server.next_seq);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
/* Upon receiving the packet with correct seq number and wrong /* Upon receiving the packet with correct seq number and wrong
ACK number, it causes the other end to send RST. But some target ACK number, it causes the other end to send RST. But some target
@ -1412,7 +1412,7 @@ http://www.packetstan.com/2010/06/recently-ive-been-on-campaign-to-make.html */
return -1; return -1;
} }
if((StreamTcpHandleFin(stt, ssn, p)) == -1) if((StreamTcpHandleFin(tv, stt, ssn, p)) == -1)
return -1; return -1;
break; break;
default: default:
@ -1426,14 +1426,15 @@ http://www.packetstan.com/2010/06/recently-ive-been-on-campaign-to-make.html */
/** /**
* \brief Function to handle the TCP_ESTABLISHED state packets, which are * \brief Function to handle the TCP_ESTABLISHED state packets, which are
* sent by the client to server. The function handles * sent by the client to server. The function handles
* ACK packets and call StreamTcpReassembleHandleSegment() to handle * ACK packets and call StreamTcpReassembleHandleSegment(tv, ) to handle
* the reassembling. * the reassembling.
* *
* \param tv Thread Variable containig input/output queue, cpu affinity etc.
* \param ssn Pointer to the current TCP session * \param ssn Pointer to the current TCP session
* \param p Packet which has to be handled in this TCP state. * \param p Packet which has to be handled in this TCP state.
* \param stt Strean Thread module registered to handle the stream handling * \param stt Strean Thread module registered to handle the stream handling
*/ */
static int HandleEstablishedPacketToServer(TcpSession *ssn, Packet *p, static int HandleEstablishedPacketToServer(ThreadVars *tv, TcpSession *ssn, Packet *p,
StreamTcpThread *stt) StreamTcpThread *stt)
{ {
SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to server: SEQ %" PRIu32 "," SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to server: SEQ %" PRIu32 ","
@ -1538,7 +1539,7 @@ static int HandleEstablishedPacketToServer(TcpSession *ssn, Packet *p,
ssn->server.next_win, ssn->server.window); ssn->server.next_win, ssn->server.window);
} }
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, &ssn->client, p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else { } else {
SCLogDebug("ssn %p: toserver => SEQ out of window, packet SEQ " SCLogDebug("ssn %p: toserver => SEQ out of window, packet SEQ "
"%" PRIu32 ", payload size %" PRIu32 " (%" PRIu32 ")," "%" PRIu32 ", payload size %" PRIu32 " (%" PRIu32 "),"
@ -1555,14 +1556,15 @@ static int HandleEstablishedPacketToServer(TcpSession *ssn, Packet *p,
/** /**
* \brief Function to handle the TCP_ESTABLISHED state packets, which are * \brief Function to handle the TCP_ESTABLISHED state packets, which are
* sent by the server to client. The function handles * sent by the server to client. The function handles
* ACK packets and call StreamTcpReassembleHandleSegment() to handle * ACK packets and call StreamTcpReassembleHandleSegment(tv, ) to handle
* the reassembling. * the reassembling.
* *
* \param tv Thread Variable containig input/output queue, cpu affinity etc.
* \param ssn Pointer to the current TCP session * \param ssn Pointer to the current TCP session
* \param p Packet which has to be handled in this TCP state. * \param p Packet which has to be handled in this TCP state.
* \param stt Strean Thread module registered to handle the stream handling * \param stt Strean Thread module registered to handle the stream handling
*/ */
static int HandleEstablishedPacketToClient(TcpSession *ssn, Packet *p, static int HandleEstablishedPacketToClient(ThreadVars *tv, TcpSession *ssn, Packet *p,
StreamTcpThread *stt) StreamTcpThread *stt)
{ {
SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to client: SEQ %" PRIu32 "," SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to client: SEQ %" PRIu32 ","
@ -1631,7 +1633,7 @@ static int HandleEstablishedPacketToClient(TcpSession *ssn, Packet *p,
TCP_GET_SEQ(p),ssn->client.next_win, ssn->client.window); TCP_GET_SEQ(p),ssn->client.next_win, ssn->client.window);
} }
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, &ssn->server, p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
} else { } else {
SCLogDebug("ssn %p: client => SEQ out of window, packet SEQ" SCLogDebug("ssn %p: client => SEQ out of window, packet SEQ"
"%" PRIu32 ", payload size %" PRIu32 " (%" PRIu32 ")," "%" PRIu32 ", payload size %" PRIu32 " (%" PRIu32 "),"
@ -1648,7 +1650,7 @@ static int HandleEstablishedPacketToClient(TcpSession *ssn, Packet *p,
* \brief Function to handle the TCP_ESTABLISHED state. The function handles * \brief Function to handle the TCP_ESTABLISHED state. The function handles
* ACK, FIN, RST packets and correspondingly changes the connection * ACK, FIN, RST packets and correspondingly changes the connection
* state. The function handles the data inside packets and call * state. The function handles the data inside packets and call
* StreamTcpReassembleHandleSegment() to handle the reassembling. * StreamTcpReassembleHandleSegment(tv, ) to handle the reassembling.
* *
* \param tv Thread Variable containig input/output queue, cpu affinity etc. * \param tv Thread Variable containig input/output queue, cpu affinity etc.
* \param p Packet which has to be handled in this TCP state. * \param p Packet which has to be handled in this TCP state.
@ -1698,7 +1700,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
if (PKT_IS_TOSERVER(p)) { if (PKT_IS_TOSERVER(p)) {
/* Process the received packet to server */ /* Process the received packet to server */
HandleEstablishedPacketToServer(ssn, p, stt); HandleEstablishedPacketToServer(tv, ssn, p, stt);
SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 "," SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 ","
" next win %" PRIu32 ", win %" PRIu32 "", ssn, " next win %" PRIu32 ", win %" PRIu32 "", ssn,
@ -1708,7 +1710,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
} else { /* implied to client */ } else { /* implied to client */
/* Process the received packet to client */ /* Process the received packet to client */
HandleEstablishedPacketToClient(ssn, p, stt); HandleEstablishedPacketToClient(tv, ssn, p, stt);
SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 "," SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 ","
" next win %" PRIu32 ", win %" PRIu32 "", ssn, " next win %" PRIu32 ", win %" PRIu32 "", ssn,
@ -1735,7 +1737,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
ssn->client.last_ack, ssn->server.next_win, ssn->client.last_ack, ssn->server.next_win,
ssn->server.window); ssn->server.window);
if((StreamTcpHandleFin(stt, ssn, p)) == -1) if((StreamTcpHandleFin(tv, stt, ssn, p)) == -1)
return -1; return -1;
break; break;
case TH_RST: case TH_RST:
@ -1758,7 +1760,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq, "%" PRIu32 "", ssn, ssn->client.next_seq,
@ -1779,7 +1781,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq, "%" PRIu32 "", ssn, ssn->server.next_seq,
@ -1806,7 +1808,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
* \param stt Strean Thread module registered to handle the stream handling * \param stt Strean Thread module registered to handle the stream handling
*/ */
static int StreamTcpHandleFin(StreamTcpThread *stt, TcpSession *ssn, Packet *p) static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt, TcpSession *ssn, Packet *p)
{ {
if (PKT_IS_TOSERVER(p)) { if (PKT_IS_TOSERVER(p)) {
@ -1836,7 +1838,7 @@ static int StreamTcpHandleFin(StreamTcpThread *stt, TcpSession *ssn, Packet *p)
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, &ssn->client, p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "", SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "",
ssn, ssn->client.next_seq, ssn->server.last_ack); ssn, ssn->client.next_seq, ssn->server.last_ack);
@ -1867,7 +1869,7 @@ static int StreamTcpHandleFin(StreamTcpThread *stt, TcpSession *ssn, Packet *p)
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, &ssn->server, p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "", SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "",
ssn, ssn->server.next_seq, ssn->client.last_ack); ssn, ssn->server.next_seq, ssn->client.last_ack);
@ -1921,7 +1923,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) { if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) {
@ -1951,7 +1953,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) { if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) {
@ -2001,7 +2003,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) { if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) {
@ -2036,7 +2038,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) { if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) {
@ -2119,7 +2121,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) { if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) {
@ -2150,7 +2152,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) { if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) {
@ -2208,7 +2210,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
@ -2236,7 +2238,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq, "%" PRIu32 "", ssn, ssn->server.next_seq,
@ -2297,7 +2299,7 @@ static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq, "%" PRIu32 "", ssn, ssn->client.next_seq,
@ -2321,7 +2323,7 @@ static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
SCLogDebug("StreamTcpPacketStateClosing (%p): =+ next SEQ " SCLogDebug("StreamTcpPacketStateClosing (%p): =+ next SEQ "
"%" PRIu32 ", last ACK %" PRIu32 "", ssn, "%" PRIu32 ", last ACK %" PRIu32 "", ssn,
@ -2394,7 +2396,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq, "%" PRIu32 "", ssn, ssn->server.next_seq,
@ -2421,7 +2423,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq, "%" PRIu32 "", ssn, ssn->client.next_seq,
@ -2459,7 +2461,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
if (SEQ_EQ(TCP_GET_SEQ(p),ssn->server.next_seq)) if (SEQ_EQ(TCP_GET_SEQ(p),ssn->server.next_seq))
ssn->server.next_seq += p->payload_len; ssn->server.next_seq += p->payload_len;
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq, "%" PRIu32 "", ssn, ssn->server.next_seq,
@ -2486,7 +2488,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
if (SEQ_EQ(TCP_GET_SEQ(p),ssn->client.next_seq)) if (SEQ_EQ(TCP_GET_SEQ(p),ssn->client.next_seq))
ssn->client.next_seq += p->payload_len; ssn->client.next_seq += p->payload_len;
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq, "%" PRIu32 "", ssn, ssn->client.next_seq,
@ -2546,7 +2548,7 @@ static int StreamTcpPakcetStateLastAck(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq, "%" PRIu32 "", ssn, ssn->client.next_seq,
@ -2608,7 +2610,7 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack))
ssn->server.last_ack = TCP_GET_ACK(p); ssn->server.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->client, p); &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq, "%" PRIu32 "", ssn, ssn->client.next_seq,
@ -2634,7 +2636,7 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p,
if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack))
ssn->client.last_ack = TCP_GET_ACK(p); ssn->client.last_ack = TCP_GET_ACK(p);
StreamTcpReassembleHandleSegment(stt->ra_ctx, ssn, StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
&ssn->server, p); &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq, "%" PRIu32 "", ssn, ssn->server.next_seq,
@ -2831,14 +2833,19 @@ TmEcode StreamTcpThreadInit(ThreadVars *tv, void *initdata, void **data)
stt->counter_tcp_ssn_memcap = SCPerfTVRegisterCounter("tcp.ssn_memcap_drop", tv, stt->counter_tcp_ssn_memcap = SCPerfTVRegisterCounter("tcp.ssn_memcap_drop", tv,
SC_PERF_TYPE_UINT64, SC_PERF_TYPE_UINT64,
"NULL"); "NULL");
tv->sc_perf_pca = SCPerfGetAllCountersArray(&tv->sc_perf_pctx);
SCPerfAddToClubbedTMTable(tv->name, &tv->sc_perf_pctx);
/* init reassembly ctx */ /* init reassembly ctx */
stt->ra_ctx = StreamTcpReassembleInitThreadCtx(); stt->ra_ctx = StreamTcpReassembleInitThreadCtx();
if (stt->ra_ctx == NULL) if (stt->ra_ctx == NULL)
SCReturnInt(TM_ECODE_FAILED); SCReturnInt(TM_ECODE_FAILED);
stt->ra_ctx->counter_tcp_segment_memcap = SCPerfTVRegisterCounter("tcp.segment_memcap_drop", tv,
SC_PERF_TYPE_UINT64,
"NULL");
tv->sc_perf_pca = SCPerfGetAllCountersArray(&tv->sc_perf_pctx);
SCPerfAddToClubbedTMTable(tv->name, &tv->sc_perf_pctx);
SCLogDebug("StreamTcp thread specific ctx online at %p, reassembly ctx %p", SCLogDebug("StreamTcp thread specific ctx online at %p, reassembly ctx %p",
stt, stt->ra_ctx); stt, stt->ra_ctx);
SCReturnInt(TM_ECODE_OK); SCReturnInt(TM_ECODE_OK);
@ -5471,6 +5478,7 @@ static int StreamTcpTest23(void)
TCPHdr tcph; TCPHdr tcph;
TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx();
uint8_t packet[1460] = ""; uint8_t packet[1460] = "";
ThreadVars tv;
int result = 1; int result = 1;
StreamTcpInitConfig(TRUE); StreamTcpInitConfig(TRUE);
@ -5485,6 +5493,7 @@ static int StreamTcpTest23(void)
memset(&p, 0, sizeof (Packet)); memset(&p, 0, sizeof (Packet));
memset(&f, 0, sizeof (Flow)); memset(&f, 0, sizeof (Flow));
memset(&tcph, 0, sizeof (TCPHdr)); memset(&tcph, 0, sizeof (TCPHdr));
memset(&tv, 0, sizeof (ThreadVars));
ssn.client.os_policy = OS_POLICY_BSD; ssn.client.os_policy = OS_POLICY_BSD;
f.protoctx = &ssn; f.protoctx = &ssn;
p.src.family = AF_INET; p.src.family = AF_INET;
@ -5501,7 +5510,7 @@ static int StreamTcpTest23(void)
p.tcph->th_ack = htonl(3373419609UL); p.tcph->th_ack = htonl(3373419609UL);
p.payload_len = 2; p.payload_len = 2;
if (StreamTcpReassembleHandleSegment(ra_ctx,&ssn, &ssn.client, &p) == -1) { if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, &p) == -1) {
printf("failed in segment reassmebling\n"); printf("failed in segment reassmebling\n");
result &= 0; result &= 0;
goto end; goto end;
@ -5511,7 +5520,7 @@ static int StreamTcpTest23(void)
p.tcph->th_ack = htonl(3373419621UL); p.tcph->th_ack = htonl(3373419621UL);
p.payload_len = 2; p.payload_len = 2;
if (StreamTcpReassembleHandleSegment(ra_ctx,&ssn, &ssn.client, &p) == -1) { if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, &p) == -1) {
printf("failed in segment reassmebling\n"); printf("failed in segment reassmebling\n");
result &= 0; result &= 0;
goto end; goto end;
@ -5521,7 +5530,7 @@ static int StreamTcpTest23(void)
p.tcph->th_ack = htonl(3373419621UL); p.tcph->th_ack = htonl(3373419621UL);
p.payload_len = 6; p.payload_len = 6;
if (StreamTcpReassembleHandleSegment(ra_ctx,&ssn, &ssn.client, &p) == -1) { if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, &p) == -1) {
printf("failed in segment reassmebling\n"); printf("failed in segment reassmebling\n");
result &= 0; result &= 0;
goto end; goto end;
@ -5552,6 +5561,7 @@ static int StreamTcpTest24(void)
TCPHdr tcph; TCPHdr tcph;
TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx();
uint8_t packet[1460] = ""; uint8_t packet[1460] = "";
ThreadVars tv;
int result = 1; int result = 1;
StreamTcpInitConfig(TRUE); StreamTcpInitConfig(TRUE);
@ -5565,6 +5575,7 @@ static int StreamTcpTest24(void)
memset(&ssn, 0, sizeof (TcpSession)); memset(&ssn, 0, sizeof (TcpSession));
memset(&p, 0, sizeof (Packet)); memset(&p, 0, sizeof (Packet));
memset(&f, 0, sizeof (Flow)); memset(&f, 0, sizeof (Flow));
memset(&tv, 0, sizeof (ThreadVars));
memset(&tcph, 0, sizeof (TCPHdr)); memset(&tcph, 0, sizeof (TCPHdr));
ssn.client.os_policy = OS_POLICY_BSD; ssn.client.os_policy = OS_POLICY_BSD;
f.protoctx = &ssn; f.protoctx = &ssn;
@ -5582,7 +5593,7 @@ static int StreamTcpTest24(void)
p.tcph->th_ack = htonl(3373419621UL); p.tcph->th_ack = htonl(3373419621UL);
p.payload_len = 4; p.payload_len = 4;
if (StreamTcpReassembleHandleSegment(ra_ctx,&ssn, &ssn.client, &p) == -1) { if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, &p) == -1) {
printf("failed in segment reassmebling\n"); printf("failed in segment reassmebling\n");
result &= 0; result &= 0;
goto end; goto end;
@ -5592,7 +5603,7 @@ static int StreamTcpTest24(void)
p.tcph->th_ack = htonl(3373419633UL); p.tcph->th_ack = htonl(3373419633UL);
p.payload_len = 2; p.payload_len = 2;
if (StreamTcpReassembleHandleSegment(ra_ctx,&ssn, &ssn.client, &p) == -1) { if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, &p) == -1) {
printf("failed in segment reassmebling\n"); printf("failed in segment reassmebling\n");
result &= 0; result &= 0;
goto end; goto end;
@ -5602,7 +5613,7 @@ static int StreamTcpTest24(void)
p.tcph->th_ack = htonl(3373419657UL); p.tcph->th_ack = htonl(3373419657UL);
p.payload_len = 4; p.payload_len = 4;
if (StreamTcpReassembleHandleSegment(ra_ctx,&ssn, &ssn.client, &p) == -1) { if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, &p) == -1) {
printf("failed in segment reassmebling\n"); printf("failed in segment reassmebling\n");
result &= 0; result &= 0;
goto end; goto end;

Loading…
Cancel
Save