From 9d94bb38d526a373b88a8255068934c3eee1dfa3 Mon Sep 17 00:00:00 2001 From: Anoop Saldanha Date: Thu, 29 Sep 2011 18:45:06 +0530 Subject: [PATCH] refactor flow timeout code. fix ipv6 address assignment for pseudo pkt. --- src/flow-timeout.c | 63 +++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/src/flow-timeout.c b/src/flow-timeout.c index e3ea4375d8..b8f47d76ce 100644 --- a/src/flow-timeout.c +++ b/src/flow-timeout.c @@ -86,12 +86,6 @@ static inline Packet *FlowForceReassemblyPseudoPacketSetup(Packet *p, TcpSession *ssn, int dummy) { - if (p == NULL) { - p = PacketGetFromAlloc(); - if (p == NULL) - return NULL; - } - p->proto = IPPROTO_TCP; p->flow = f; FlowIncrUsecnt(f); @@ -151,22 +145,22 @@ static inline Packet *FlowForceReassemblyPseudoPacketSetup(Packet *p, p->ip6h->s_ip6_hlim = 64; if (direction == 0) { p->ip6h->ip6_src[0] = f->src.addr_data32[0]; - p->ip6h->ip6_src[1] = f->src.addr_data32[0]; - p->ip6h->ip6_src[2] = f->src.addr_data32[0]; - p->ip6h->ip6_src[3] = f->src.addr_data32[0]; + p->ip6h->ip6_src[1] = f->src.addr_data32[1]; + p->ip6h->ip6_src[2] = f->src.addr_data32[2]; + p->ip6h->ip6_src[3] = f->src.addr_data32[3]; p->ip6h->ip6_dst[0] = f->dst.addr_data32[0]; - p->ip6h->ip6_dst[1] = f->dst.addr_data32[0]; - p->ip6h->ip6_dst[2] = f->dst.addr_data32[0]; - p->ip6h->ip6_dst[3] = f->dst.addr_data32[0]; + p->ip6h->ip6_dst[1] = f->dst.addr_data32[1]; + p->ip6h->ip6_dst[2] = f->dst.addr_data32[2]; + p->ip6h->ip6_dst[3] = f->dst.addr_data32[3]; } else { p->ip6h->ip6_src[0] = f->dst.addr_data32[0]; - p->ip6h->ip6_src[1] = f->dst.addr_data32[0]; - p->ip6h->ip6_src[2] = f->dst.addr_data32[0]; - p->ip6h->ip6_src[3] = f->dst.addr_data32[0]; + p->ip6h->ip6_src[1] = f->dst.addr_data32[1]; + p->ip6h->ip6_src[2] = f->dst.addr_data32[2]; + p->ip6h->ip6_src[3] = f->dst.addr_data32[3]; p->ip6h->ip6_dst[0] = f->src.addr_data32[0]; - p->ip6h->ip6_dst[1] = f->src.addr_data32[0]; - p->ip6h->ip6_dst[2] = f->src.addr_data32[0]; - p->ip6h->ip6_dst[3] = f->src.addr_data32[0]; + p->ip6h->ip6_dst[1] = f->src.addr_data32[1]; + p->ip6h->ip6_dst[2] = f->src.addr_data32[2]; + p->ip6h->ip6_dst[3] = f->src.addr_data32[3]; } /* set the tcp header */ @@ -218,6 +212,21 @@ static inline Packet *FlowForceReassemblyPseudoPacketSetup(Packet *p, return p; } +static inline Packet *FlowForceReassemblyPseudoPacketGet(int direction, + Flow *f, + TcpSession *ssn, + int dummy) +{ + Packet *p; + + p = PacketGetFromAlloc(); + if (p == NULL) + return NULL; + + return FlowForceReassemblyPseudoPacketSetup(p, direction, f, ssn, dummy); +} + + /** * \internal * \brief Forces reassembly for flow if it needs it. @@ -274,38 +283,38 @@ int FlowForceReassemblyForFlowV2(Flow *f) /* insert a pseudo packet in the toserver direction */ if (client_ok == 1) { - p1 = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 0); + p1 = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 0); if (p1 == NULL) { return 1; } if (server_ok == 1) { - p2 = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 0); + p2 = FlowForceReassemblyPseudoPacketGet( 0, f, ssn, 0); if (p2 == NULL) { TmqhOutputPacketpool(NULL,p1); return 1; } - p3 = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 0); + p3 = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 0); if (p3 == NULL) { TmqhOutputPacketpool(NULL, p1); TmqhOutputPacketpool(NULL, p2); return 1; } } else { - p2 = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 1); + p2 = FlowForceReassemblyPseudoPacketGet(0, f, ssn, 1); if (p2 == NULL) { TmqhOutputPacketpool(NULL, p1); return 1; } } } else { - p1 = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 0); + p1 = FlowForceReassemblyPseudoPacketGet(0, f, ssn, 0); if (p1 == NULL) { return 1; } - p2 = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 1); + p2 = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 1); if (p2 == NULL) { TmqhOutputPacketpool(NULL, p1); return 1; @@ -399,8 +408,9 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) /* insert a pseudo packet in the toserver direction */ if (client_ok == 1) { - Packet *p = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 1); + Packet *p = FlowForceReassemblyPseudoPacketGet(0, f, ssn, 1); if (p == NULL) { + TmqhOutputPacketpool(NULL, reassemble_p); return; } @@ -422,8 +432,9 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) } } /* if (ssn->client.seg_list != NULL) */ if (server_ok == 1) { - Packet *p = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 1); + Packet *p = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 1); if (p == NULL) { + TmqhOutputPacketpool(NULL, reassemble_p); return; }