set stream_eof flag per stream, only when the stream initiates a close. Fix htp parser to close connection per direction based on this

remotes/origin/master
Anoop Saldanha 14 years ago committed by Victor Julien
parent 1f0272afeb
commit 64625675ce

@ -686,12 +686,13 @@ static int HTPHandleRequestData(Flow *f, void *htp_state,
/* if the TCP connection is closed, then close the HTTP connection */ /* if the TCP connection is closed, then close the HTTP connection */
if ((pstate->flags & APP_LAYER_PARSER_EOF) && if ((pstate->flags & APP_LAYER_PARSER_EOF) &&
! (hstate->flags & HTP_FLAG_STATE_CLOSED) && !(hstate->flags & HTP_FLAG_STATE_CLOSED_TS)) {
! (hstate->flags & HTP_FLAG_STATE_DATA)) hstate->connp->in_status = STREAM_STATE_CLOSED;
{ // Call the parsers one last time, which will allow them
htp_connp_close(hstate->connp, 0); // to process the events that depend on stream closure
hstate->flags |= HTP_FLAG_STATE_CLOSED; htp_connp_req_data(hstate->connp, 0, NULL, 0);
SCLogDebug("stream eof encountered, closing htp handle"); hstate->flags |= HTP_FLAG_STATE_CLOSED_TS;
SCLogDebug("stream eof encountered, closing htp handle for ts");
} }
SCLogDebug("hstate->connp %p", hstate->connp); SCLogDebug("hstate->connp %p", hstate->connp);
@ -766,11 +767,12 @@ static int HTPHandleResponseData(Flow *f, void *htp_state,
/* if we the TCP connection is closed, then close the HTTP connection */ /* if we the TCP connection is closed, then close the HTTP connection */
if ((pstate->flags & APP_LAYER_PARSER_EOF) && if ((pstate->flags & APP_LAYER_PARSER_EOF) &&
! (hstate->flags & HTP_FLAG_STATE_CLOSED) && !(hstate->flags & HTP_FLAG_STATE_CLOSED_TC)) {
! (hstate->flags & HTP_FLAG_STATE_DATA)) hstate->connp->out_status = STREAM_STATE_CLOSED;
{ // Call the parsers one last time, which will allow them
htp_connp_close(hstate->connp, 0); // to process the events that depend on stream closure
hstate->flags |= HTP_FLAG_STATE_CLOSED; htp_connp_res_data(hstate->connp, 0, NULL, 0);
hstate->flags |= HTP_FLAG_STATE_CLOSED_TC;
} }
SCLogDebug("hstate->connp %p", hstate->connp); SCLogDebug("hstate->connp %p", hstate->connp);

@ -47,24 +47,26 @@
#define HTP_FLAG_STATE_OPEN 0x0001 /**< Flag to indicate that HTTP #define HTP_FLAG_STATE_OPEN 0x0001 /**< Flag to indicate that HTTP
connection is open */ connection is open */
#define HTP_FLAG_STATE_CLOSED 0x0002 /**< Flag to indicate that HTTP #define HTP_FLAG_STATE_CLOSED_TS 0x0002 /**< Flag to indicate that HTTP
connection is closed */ connection is closed */
#define HTP_FLAG_STATE_DATA 0x0004 /**< Flag to indicate that HTTP #define HTP_FLAG_STATE_CLOSED_TC 0x0004 /**< Flag to indicate that HTTP
connection is closed */
#define HTP_FLAG_STATE_DATA 0x0008 /**< Flag to indicate that HTTP
connection needs more data */ connection needs more data */
#define HTP_FLAG_STATE_ERROR 0x0008 /**< Flag to indicate that an error #define HTP_FLAG_STATE_ERROR 0x0010 /**< Flag to indicate that an error
has been occured on HTTP has been occured on HTTP
connection */ connection */
#define HTP_FLAG_NEW_BODY_SET 0x0010 /**< Flag to indicate that HTTP #define HTP_FLAG_NEW_BODY_SET 0x0020 /**< Flag to indicate that HTTP
has parsed a new body (for has parsed a new body (for
pcre) */ pcre) */
#define HTP_FLAG_STORE_FILES_TS 0x0020 #define HTP_FLAG_STORE_FILES_TS 0x0040
#define HTP_FLAG_STORE_FILES_TC 0x0040 #define HTP_FLAG_STORE_FILES_TC 0x0080
#define HTP_FLAG_STORE_FILES_TX_TS 0x0080 #define HTP_FLAG_STORE_FILES_TX_TS 0x0100
#define HTP_FLAG_STORE_FILES_TX_TC 0x0100 #define HTP_FLAG_STORE_FILES_TX_TC 0x0200
/** flag the state that a new file has been set in this tx */ /** flag the state that a new file has been set in this tx */
#define HTP_FLAG_NEW_FILE_TX_TS 0x0200 #define HTP_FLAG_NEW_FILE_TX_TS 0x0400
/** flag the state that a new file has been set in this tx */ /** flag the state that a new file has been set in this tx */
#define HTP_FLAG_NEW_FILE_TX_TC 0x0400 #define HTP_FLAG_NEW_FILE_TX_TC 0x0800
enum { enum {
HTP_BODY_NONE = 0, /**< Flag to indicate the current HTP_BODY_NONE = 0, /**< Flag to indicate the current

@ -132,6 +132,8 @@ enum
#define STREAMTCP_STREAM_FLAG_PAUSE_REASSEMBLY 0x04 #define STREAMTCP_STREAM_FLAG_PAUSE_REASSEMBLY 0x04
/** Stream has reached it's reassembly depth, all further packets are ignored */ /** Stream has reached it's reassembly depth, all further packets are ignored */
#define STREAMTCP_STREAM_FLAG_DEPTH_REACHED 0x08 #define STREAMTCP_STREAM_FLAG_DEPTH_REACHED 0x08
/** Stream has sent a FIN/RST */
#define STREAMTCP_STREAM_FLAG_CLOSE_INITIATED 0x10
/* /*
* Per SEGMENT flags * Per SEGMENT flags

@ -1624,7 +1624,7 @@ int StreamTcpReassembleHandleSegmentHandleData(ThreadVars *tv, TcpReassemblyThre
if (!(ssn->flags & STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED)) {\ if (!(ssn->flags & STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED)) {\
flag |= STREAM_START; \ flag |= STREAM_START; \
} \ } \
if ((ssn)->state > TCP_ESTABLISHED) { \ if (stream->flags & STREAMTCP_STREAM_FLAG_CLOSE_INITIATED) { \
flag |= STREAM_EOF; \ flag |= STREAM_EOF; \
} \ } \
if ((p)->flowflags & FLOW_PKT_TOSERVER) { \ if ((p)->flowflags & FLOW_PKT_TOSERVER) { \
@ -1639,7 +1639,7 @@ int StreamTcpReassembleHandleSegmentHandleData(ThreadVars *tv, TcpReassemblyThre
if (!(ssn->flags & STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED)) {\ if (!(ssn->flags & STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED)) {\
flag |= STREAM_START; \ flag |= STREAM_START; \
} \ } \
if ((ssn)->state > TCP_ESTABLISHED) { \ if (stream->flags & STREAMTCP_STREAM_FLAG_CLOSE_INITIATED) { \
flag |= STREAM_EOF; \ flag |= STREAM_EOF; \
} \ } \
if ((p)->flowflags & FLOW_PKT_TOSERVER) { \ if ((p)->flowflags & FLOW_PKT_TOSERVER) { \
@ -1660,7 +1660,7 @@ static void StreamTcpSetupMsg(TcpSession *ssn, TcpStream *stream, Packet *p,
SCLogDebug("setting STREAM_START"); SCLogDebug("setting STREAM_START");
smsg->flags = STREAM_START; smsg->flags = STREAM_START;
} }
if (ssn->state > TCP_ESTABLISHED) { if (stream->flags & STREAMTCP_STREAM_FLAG_CLOSE_INITIATED) {
SCLogDebug("setting STREAM_EOF"); SCLogDebug("setting STREAM_EOF");
smsg->flags |= STREAM_EOF; smsg->flags |= STREAM_EOF;
} }
@ -1823,7 +1823,7 @@ static int StreamTcpReassembleInlineAppLayer (ThreadVars *tv,
/* send EOF to app layer */ /* send EOF to app layer */
STREAM_SET_INLINE_FLAGS(ssn, stream, p, flags); STREAM_SET_INLINE_FLAGS(ssn, stream, p, flags);
AppLayerHandleTCPData(&ra_ctx->dp_ctx, p->flow, ssn, AppLayerHandleTCPData(&ra_ctx->dp_ctx, p->flow, ssn,
NULL, 0, flags|STREAM_EOF); NULL, 0, flags);
PACKET_PROFILING_APP_STORE(&ra_ctx->dp_ctx, p); PACKET_PROFILING_APP_STORE(&ra_ctx->dp_ctx, p);
} else { } else {
@ -2110,7 +2110,7 @@ static int StreamTcpReassembleInlineAppLayer (ThreadVars *tv,
/* send EOF to app layer */ /* send EOF to app layer */
STREAM_SET_INLINE_FLAGS(ssn, stream, p, flags); STREAM_SET_INLINE_FLAGS(ssn, stream, p, flags);
AppLayerHandleTCPData(&ra_ctx->dp_ctx, p->flow, ssn, AppLayerHandleTCPData(&ra_ctx->dp_ctx, p->flow, ssn,
NULL, 0, flags|STREAM_EOF); NULL, 0, flags);
PACKET_PROFILING_APP_STORE(&ra_ctx->dp_ctx, p); PACKET_PROFILING_APP_STORE(&ra_ctx->dp_ctx, p);
} }
@ -2484,7 +2484,7 @@ static int StreamTcpReassembleAppLayer (ThreadVars *tv,
/* send EOF to app layer */ /* send EOF to app layer */
STREAM_SET_FLAGS(ssn, stream, p, flags); STREAM_SET_FLAGS(ssn, stream, p, flags);
AppLayerHandleTCPData(&ra_ctx->dp_ctx, p->flow, ssn, AppLayerHandleTCPData(&ra_ctx->dp_ctx, p->flow, ssn,
NULL, 0, flags|STREAM_EOF); NULL, 0, flags);
PACKET_PROFILING_APP_STORE(&ra_ctx->dp_ctx, p); PACKET_PROFILING_APP_STORE(&ra_ctx->dp_ctx, p);
SCReturnInt(0); SCReturnInt(0);

@ -1263,11 +1263,15 @@ static int StreamTcpPacketStateSynSent(ThreadVars *tv, Packet *p,
SEQ_EQ(TCP_GET_ACK(p), (ssn->client.isn + 1))) SEQ_EQ(TCP_GET_ACK(p), (ssn->client.isn + 1)))
{ {
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received and state changed to " SCLogDebug("ssn %p: Reset received and state changed to "
"TCP_CLOSED", ssn); "TCP_CLOSED", ssn);
} }
} else { } else {
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received and state changed to " SCLogDebug("ssn %p: Reset received and state changed to "
"TCP_CLOSED", ssn); "TCP_CLOSED", ssn);
} }
@ -1577,6 +1581,8 @@ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p,
if (reset == TRUE) { if (reset == TRUE) {
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received and state changed to " SCLogDebug("ssn %p: Reset received and state changed to "
"TCP_CLOSED", ssn); "TCP_CLOSED", ssn);
@ -2036,6 +2042,8 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
if(PKT_IS_TOSERVER(p)) { if(PKT_IS_TOSERVER(p)) {
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received and state changed to " SCLogDebug("ssn %p: Reset received and state changed to "
"TCP_CLOSED", ssn); "TCP_CLOSED", ssn);
@ -2066,6 +2074,8 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
* cleanup. */ * cleanup. */
} else { } else {
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received and state changed to " SCLogDebug("ssn %p: Reset received and state changed to "
"TCP_CLOSED", ssn); "TCP_CLOSED", ssn);
@ -2146,6 +2156,7 @@ static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt,
} }
StreamTcpPacketSetState(p, ssn, TCP_CLOSE_WAIT); StreamTcpPacketSetState(p, ssn, TCP_CLOSE_WAIT);
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_CLOSE_WAIT", ssn); SCLogDebug("ssn %p: state changed to TCP_CLOSE_WAIT", ssn);
if (SEQ_EQ(TCP_GET_SEQ(p), ssn->client.next_seq)) if (SEQ_EQ(TCP_GET_SEQ(p), ssn->client.next_seq))
@ -2193,6 +2204,7 @@ static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt,
} }
StreamTcpPacketSetState(p, ssn, TCP_FIN_WAIT1); StreamTcpPacketSetState(p, ssn, TCP_FIN_WAIT1);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_FIN_WAIT1", ssn); SCLogDebug("ssn %p: state changed to TCP_FIN_WAIT1", ssn);
if (SEQ_EQ(TCP_GET_SEQ(p), ssn->server.next_seq)) if (SEQ_EQ(TCP_GET_SEQ(p), ssn->server.next_seq))
@ -2414,6 +2426,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
} }
StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT); StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn); SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale; ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
@ -2463,6 +2476,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
} }
StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT); StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn); SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale; ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
@ -2504,6 +2518,8 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca); SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca);
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED", SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED",
ssn); ssn);
@ -2689,6 +2705,8 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca); SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca);
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED", SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED",
ssn); ssn);
@ -2759,6 +2777,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
} }
StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT); StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn); SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale; ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
@ -2804,6 +2823,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
} }
StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT); StreamTcpPacketSetState(p, ssn, TCP_TIME_WAIT);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn); SCLogDebug("ssn %p: state changed to TCP_TIME_WAIT", ssn);
ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale; ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
@ -2956,6 +2976,8 @@ static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p,
SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca); SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca);
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED", SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED",
ssn); ssn);
@ -3060,6 +3082,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
} }
StreamTcpPacketSetState(p, ssn, TCP_LAST_ACK); StreamTcpPacketSetState(p, ssn, TCP_LAST_ACK);
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_LAST_ACK", ssn); SCLogDebug("ssn %p: state changed to TCP_LAST_ACK", ssn);
ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale; ssn->server.window = TCP_GET_WINDOW(p) << ssn->server.wscale;
@ -3102,6 +3125,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
} }
StreamTcpPacketSetState(p, ssn, TCP_LAST_ACK); StreamTcpPacketSetState(p, ssn, TCP_LAST_ACK);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: state changed to TCP_LAST_ACK", ssn); SCLogDebug("ssn %p: state changed to TCP_LAST_ACK", ssn);
ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale; ssn->client.window = TCP_GET_WINDOW(p) << ssn->client.wscale;
@ -3232,6 +3256,8 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca); SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca);
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED", SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED",
ssn); ssn);
@ -3355,6 +3381,8 @@ static int StreamTcpPakcetStateLastAck(ThreadVars *tv, Packet *p,
SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca); SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca);
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED", SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED",
ssn); ssn);
@ -3522,6 +3550,8 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p,
SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca); SCPerfCounterIncr(stt->counter_tcp_pseudo, tv->sc_perf_pca);
StreamTcpPacketSetState(p, ssn, TCP_CLOSED); StreamTcpPacketSetState(p, ssn, TCP_CLOSED);
ssn->server.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
ssn->client.flags |= STREAMTCP_STREAM_FLAG_CLOSE_INITIATED;
SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED", SCLogDebug("ssn %p: Reset received state changed to TCP_CLOSED",
ssn); ssn);
@ -3715,7 +3745,12 @@ static int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt,
if (ssn->state >= TCP_ESTABLISHED) { if (ssn->state >= TCP_ESTABLISHED) {
p->flags |= PKT_STREAM_EST; p->flags |= PKT_STREAM_EST;
} }
if (ssn->state > TCP_ESTABLISHED) {
if (PKT_IS_TOSERVER(p)) {
if (ssn->client.flags & STREAMTCP_STREAM_FLAG_CLOSE_INITIATED)
p->flags |= PKT_STREAM_EOF;
} else {
if (ssn->server.flags & STREAMTCP_STREAM_FLAG_CLOSE_INITIATED)
p->flags |= PKT_STREAM_EOF; p->flags |= PKT_STREAM_EOF;
} }
} }

Loading…
Cancel
Save