From 42493ee6b7cacdb5bb317b565b219e4bb4f1197b Mon Sep 17 00:00:00 2001 From: Anoop Saldanha Date: Wed, 14 Sep 2011 20:40:59 +0530 Subject: [PATCH] rename pseudo packet creation function. Shift the check for forced reassembly necessity on a session/direction to an inline function in the stream api --- src/flow.c | 54 +++++++++++++++++++++++++----------------------- src/stream-tcp.h | 15 ++++++++++++++ 2 files changed, 43 insertions(+), 26 deletions(-) diff --git a/src/flow.c b/src/flow.c index c30ec1a5cc..b7c1b6c0fa 100644 --- a/src/flow.c +++ b/src/flow.c @@ -201,8 +201,22 @@ static uint64_t prune_no_timeout = 0; static uint64_t prune_usecnt = 0; #endif -static inline Packet *FFRPseudoPacketSetup(int direction, Flow *f, - TcpSession *ssn, int dummy) +/** + * \internal + * \brief Pseudo packet setup for flow forced reassembly. + * + * \param direction Direction of the packet. 0 indicates toserver and 1 + * indicates toclient. + * \param f Pointer to the flow. + * \param ssn Pointer to the tcp session. + * \param dummy Indicates to create a dummy pseudo packet. Not all pseudo + * packets need to force reassembly, in which case we just + * set dummy ack/seq values. + */ +static inline Packet *FlowForceReassemblyPseudoPacketSetup(int direction, + Flow *f, + TcpSession *ssn, + int dummy) { Packet *p = PacketGetFromAlloc(); if (p == NULL) @@ -363,16 +377,10 @@ static inline int FlowForceReassemblyForFlowV2(ThreadVars *tv, Flow *f) return 0; } - if (ssn->client.seg_list == NULL || - (ssn->client.seg_list_tail->flags & SEGMENTTCP_FLAG_RAW_PROCESSED && - ssn->client.seg_list_tail->flags & SEGMENTTCP_FLAG_APPLAYER_PROCESSED && - ssn->toserver_smsg_head == NULL)) { + if (!StreamHasUnprocessedSegments(ssn, 0)) { client_ok = 0; } - if (ssn->server.seg_list == NULL || - (ssn->server.seg_list_tail->flags & SEGMENTTCP_FLAG_RAW_PROCESSED && - ssn->server.seg_list_tail->flags & SEGMENTTCP_FLAG_APPLAYER_PROCESSED && - ssn->toclient_smsg_head == NULL)) { + if (!StreamHasUnprocessedSegments(ssn, 1)) { server_ok = 0; } @@ -399,38 +407,38 @@ static inline int FlowForceReassemblyForFlowV2(ThreadVars *tv, Flow *f) /* insert a pseudo packet in the toserver direction */ if (client_ok == 1) { - p1 = FFRPseudoPacketSetup(1, f, ssn, 0); + p1 = FlowForceReassemblyPseudoPacketSetup(1, f, ssn, 0); if (p1 == NULL) { return 1; } if (server_ok == 1) { - p2 = FFRPseudoPacketSetup(0, f, ssn, 0); + p2 = FlowForceReassemblyPseudoPacketSetup(0, f, ssn, 0); if (p2 == NULL) { TmqhOutputPacketpool(NULL,p1); return 1; } - p3 = FFRPseudoPacketSetup(1, f, ssn, 0); + p3 = FlowForceReassemblyPseudoPacketSetup(1, f, ssn, 0); if (p3 == NULL) { TmqhOutputPacketpool(NULL, p1); TmqhOutputPacketpool(NULL, p2); return 1; } } else { - p2 = FFRPseudoPacketSetup(0, f, ssn, 1); + p2 = FlowForceReassemblyPseudoPacketSetup(0, f, ssn, 1); if (p2 == NULL) { TmqhOutputPacketpool(NULL, p1); return 1; } } } else { - p1 = FFRPseudoPacketSetup(0, f, ssn, 0); + p1 = FlowForceReassemblyPseudoPacketSetup(0, f, ssn, 0); if (p1 == NULL) { return 1; } - p2 = FFRPseudoPacketSetup(1, f, ssn, 1); + p2 = FlowForceReassemblyPseudoPacketSetup(1, f, ssn, 1); if (p2 == NULL) { TmqhOutputPacketpool(NULL, p1); return 1; @@ -1364,10 +1372,7 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) } /* ah ah! We have some unattended toserver segments */ - if (!(ssn->client.seg_list == NULL || - (ssn->client.seg_list_tail->flags & SEGMENTTCP_FLAG_RAW_PROCESSED && - ssn->client.seg_list_tail->flags & SEGMENTTCP_FLAG_APPLAYER_PROCESSED && - ssn->toserver_smsg_head == NULL))) { + if (StreamHasUnprocessedSegments(ssn, 0)) { client_ok = 1; StreamTcpThread *stt = stream_pseudo_pkt_stream_tm_slot->slot_data; @@ -1383,10 +1388,7 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) StreamTcpReassembleProcessAppLayer(stt->ra_ctx); } /* oh oh! We have some unattended toclient segments */ - if (!(ssn->server.seg_list == NULL || - (ssn->server.seg_list_tail->flags & SEGMENTTCP_FLAG_RAW_PROCESSED && - ssn->server.seg_list_tail->flags & SEGMENTTCP_FLAG_APPLAYER_PROCESSED && - ssn->toclient_smsg_head == NULL))) { + if (StreamHasUnprocessedSegments(ssn, 1)) { server_ok = 1; StreamTcpThread *stt = stream_pseudo_pkt_stream_tm_slot->slot_data; @@ -1403,7 +1405,7 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) /* insert a pseudo packet in the toserver direction */ if (client_ok == 1) { - Packet *p = FFRPseudoPacketSetup(0, f, ssn, 1); + Packet *p = FlowForceReassemblyPseudoPacketSetup(0, f, ssn, 1); if (p == NULL) { return; } @@ -1426,7 +1428,7 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) } } /* if (ssn->client.seg_list != NULL) */ if (server_ok == 1) { - Packet *p = FFRPseudoPacketSetup(1, f, ssn, 1); + Packet *p = FlowForceReassemblyPseudoPacketSetup(1, f, ssn, 1); if (p == NULL) { return; } diff --git a/src/stream-tcp.h b/src/stream-tcp.h index 27dddc170f..92210c6122 100644 --- a/src/stream-tcp.h +++ b/src/stream-tcp.h @@ -145,6 +145,21 @@ static inline void StreamTcpPacketSwitchDir(TcpSession *ssn, Packet *p) } } +static inline int StreamHasUnprocessedSegments(TcpSession *ssn, int direction) +{ + /* server tcp state */ + if (direction) { + return (ssn->server.seg_list == NULL || + (ssn->server.seg_list_tail->flags & SEGMENTTCP_FLAG_RAW_PROCESSED && + ssn->server.seg_list_tail->flags & SEGMENTTCP_FLAG_APPLAYER_PROCESSED && + ssn->toclient_smsg_head == NULL)) ? 0 : 1; + } else { + return (ssn->client.seg_list == NULL || + (ssn->client.seg_list_tail->flags & SEGMENTTCP_FLAG_RAW_PROCESSED && + ssn->client.seg_list_tail->flags & SEGMENTTCP_FLAG_APPLAYER_PROCESSED && + ssn->toserver_smsg_head == NULL)) ? 0 : 1; + } +} #endif /* __STREAM_TCP_H__ */