refactor flow timeout code. fix ipv6 address assignment for pseudo pkt.

remotes/origin/master-1.1.x
Anoop Saldanha 14 years ago committed by Victor Julien
parent 246a4e9fff
commit 9d94bb38d5

@ -86,12 +86,6 @@ static inline Packet *FlowForceReassemblyPseudoPacketSetup(Packet *p,
TcpSession *ssn, TcpSession *ssn,
int dummy) int dummy)
{ {
if (p == NULL) {
p = PacketGetFromAlloc();
if (p == NULL)
return NULL;
}
p->proto = IPPROTO_TCP; p->proto = IPPROTO_TCP;
p->flow = f; p->flow = f;
FlowIncrUsecnt(f); FlowIncrUsecnt(f);
@ -151,22 +145,22 @@ static inline Packet *FlowForceReassemblyPseudoPacketSetup(Packet *p,
p->ip6h->s_ip6_hlim = 64; p->ip6h->s_ip6_hlim = 64;
if (direction == 0) { if (direction == 0) {
p->ip6h->ip6_src[0] = f->src.addr_data32[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[1] = f->src.addr_data32[1];
p->ip6h->ip6_src[2] = f->src.addr_data32[0]; p->ip6h->ip6_src[2] = f->src.addr_data32[2];
p->ip6h->ip6_src[3] = f->src.addr_data32[0]; p->ip6h->ip6_src[3] = f->src.addr_data32[3];
p->ip6h->ip6_dst[0] = f->dst.addr_data32[0]; p->ip6h->ip6_dst[0] = f->dst.addr_data32[0];
p->ip6h->ip6_dst[1] = f->dst.addr_data32[0]; p->ip6h->ip6_dst[1] = f->dst.addr_data32[1];
p->ip6h->ip6_dst[2] = f->dst.addr_data32[0]; p->ip6h->ip6_dst[2] = f->dst.addr_data32[2];
p->ip6h->ip6_dst[3] = f->dst.addr_data32[0]; p->ip6h->ip6_dst[3] = f->dst.addr_data32[3];
} else { } else {
p->ip6h->ip6_src[0] = f->dst.addr_data32[0]; p->ip6h->ip6_src[0] = f->dst.addr_data32[0];
p->ip6h->ip6_src[1] = f->dst.addr_data32[0]; p->ip6h->ip6_src[1] = f->dst.addr_data32[1];
p->ip6h->ip6_src[2] = f->dst.addr_data32[0]; p->ip6h->ip6_src[2] = f->dst.addr_data32[2];
p->ip6h->ip6_src[3] = f->dst.addr_data32[0]; p->ip6h->ip6_src[3] = f->dst.addr_data32[3];
p->ip6h->ip6_dst[0] = f->src.addr_data32[0]; p->ip6h->ip6_dst[0] = f->src.addr_data32[0];
p->ip6h->ip6_dst[1] = f->src.addr_data32[0]; p->ip6h->ip6_dst[1] = f->src.addr_data32[1];
p->ip6h->ip6_dst[2] = f->src.addr_data32[0]; p->ip6h->ip6_dst[2] = f->src.addr_data32[2];
p->ip6h->ip6_dst[3] = f->src.addr_data32[0]; p->ip6h->ip6_dst[3] = f->src.addr_data32[3];
} }
/* set the tcp header */ /* set the tcp header */
@ -218,6 +212,21 @@ static inline Packet *FlowForceReassemblyPseudoPacketSetup(Packet *p,
return 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 * \internal
* \brief Forces reassembly for flow if it needs it. * \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 */ /* insert a pseudo packet in the toserver direction */
if (client_ok == 1) { if (client_ok == 1) {
p1 = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 0); p1 = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 0);
if (p1 == NULL) { if (p1 == NULL) {
return 1; return 1;
} }
if (server_ok == 1) { if (server_ok == 1) {
p2 = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 0); p2 = FlowForceReassemblyPseudoPacketGet( 0, f, ssn, 0);
if (p2 == NULL) { if (p2 == NULL) {
TmqhOutputPacketpool(NULL,p1); TmqhOutputPacketpool(NULL,p1);
return 1; return 1;
} }
p3 = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 0); p3 = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 0);
if (p3 == NULL) { if (p3 == NULL) {
TmqhOutputPacketpool(NULL, p1); TmqhOutputPacketpool(NULL, p1);
TmqhOutputPacketpool(NULL, p2); TmqhOutputPacketpool(NULL, p2);
return 1; return 1;
} }
} else { } else {
p2 = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 1); p2 = FlowForceReassemblyPseudoPacketGet(0, f, ssn, 1);
if (p2 == NULL) { if (p2 == NULL) {
TmqhOutputPacketpool(NULL, p1); TmqhOutputPacketpool(NULL, p1);
return 1; return 1;
} }
} }
} else { } else {
p1 = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 0); p1 = FlowForceReassemblyPseudoPacketGet(0, f, ssn, 0);
if (p1 == NULL) { if (p1 == NULL) {
return 1; return 1;
} }
p2 = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 1); p2 = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 1);
if (p2 == NULL) { if (p2 == NULL) {
TmqhOutputPacketpool(NULL, p1); TmqhOutputPacketpool(NULL, p1);
return 1; return 1;
@ -399,8 +408,9 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q)
/* insert a pseudo packet in the toserver direction */ /* insert a pseudo packet in the toserver direction */
if (client_ok == 1) { if (client_ok == 1) {
Packet *p = FlowForceReassemblyPseudoPacketSetup(NULL, 0, f, ssn, 1); Packet *p = FlowForceReassemblyPseudoPacketGet(0, f, ssn, 1);
if (p == NULL) { if (p == NULL) {
TmqhOutputPacketpool(NULL, reassemble_p);
return; return;
} }
@ -422,8 +432,9 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q)
} }
} /* if (ssn->client.seg_list != NULL) */ } /* if (ssn->client.seg_list != NULL) */
if (server_ok == 1) { if (server_ok == 1) {
Packet *p = FlowForceReassemblyPseudoPacketSetup(NULL, 1, f, ssn, 1); Packet *p = FlowForceReassemblyPseudoPacketGet(1, f, ssn, 1);
if (p == NULL) { if (p == NULL) {
TmqhOutputPacketpool(NULL, reassemble_p);
return; return;
} }

Loading…
Cancel
Save