From 9552e6f69652c9dca8d4c24c4d09bbd66fdf484b Mon Sep 17 00:00:00 2001 From: Anoop Saldanha Date: Fri, 9 Sep 2011 12:30:29 +0530 Subject: [PATCH] Shutdown flow timeout reassembly now supports ipv6 --- src/flow.c | 87 ++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 65 insertions(+), 22 deletions(-) diff --git a/src/flow.c b/src/flow.c index 5bf0da13e9..ac45808530 100644 --- a/src/flow.c +++ b/src/flow.c @@ -1093,17 +1093,39 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) p->payload = NULL; p->payload_len = 0; - /* set the ip header */ - p->ip4h = (IPV4Hdr *)p->pkt; - /* version 4 and length 20 bytes for the tcp header */ - p->ip4h->ip_verhl = 0x45; - p->ip4h->ip_len = htons(40); - p->ip4h->ip_proto = IPPROTO_TCP; - p->ip4h->ip_src.s_addr = f->src.addr_data32[0]; - p->ip4h->ip_dst.s_addr = f->dst.addr_data32[0]; - - /* set the tcp header */ - p->tcph = (TCPHdr *)((uint8_t *)p->pkt + 20); + if (f->src.family == AF_INET) { + /* set the ip header */ + p->ip4h = (IPV4Hdr *)p->pkt; + /* version 4 and length 20 bytes for the tcp header */ + p->ip4h->ip_verhl = 0x45; + p->ip4h->ip_len = htons(40); + p->ip4h->ip_proto = IPPROTO_TCP; + p->ip4h->ip_src.s_addr = f->src.addr_data32[0]; + p->ip4h->ip_dst.s_addr = f->dst.addr_data32[0]; + + /* set the tcp header */ + p->tcph = (TCPHdr *)((uint8_t *)p->pkt + 20); + + } else { + /* set the ip header */ + p->ip6h = (IPV6Hdr *)p->pkt; + /* version 6 */ + p->ip6h->s_ip6_vfc = 0x60; + p->ip6h->s_ip6_plen = htons(20); + p->ip6h->s_ip6_nxt = IPPROTO_TCP; + 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_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]; + + /* set the tcp header */ + p->tcph = (TCPHdr *)((uint8_t *)p->pkt + 40); + } + p->tcph->th_sport = htons(f->sp); p->tcph->th_dport = htons(f->dp); @@ -1145,17 +1167,38 @@ static inline void FlowForceReassemblyForQ(FlowQueue *q) p->payload = NULL; p->payload_len = 0; - /* set the ip header */ - p->ip4h = (IPV4Hdr *)p->pkt; - /* version 4 and length 20 bytes for the tcp header */ - p->ip4h->ip_verhl = 0x45; - p->ip4h->ip_len = htons(40); - p->ip4h->ip_proto = IPPROTO_TCP; - p->ip4h->ip_src.s_addr = f->dst.addr_data32[0]; - p->ip4h->ip_dst.s_addr = f->src.addr_data32[0]; - - /* set the tcp header */ - p->tcph = (TCPHdr *)((uint8_t *)p->pkt + 20); + if (f->src.family == AF_INET) { + /* set the ip header */ + p->ip4h = (IPV4Hdr *)p->pkt; + /* version 4 and length 20 bytes for the tcp header */ + p->ip4h->ip_verhl = 0x45; + p->ip4h->ip_len = htons(40); + p->ip4h->ip_proto = IPPROTO_TCP; + p->ip4h->ip_src.s_addr = f->dst.addr_data32[0]; + p->ip4h->ip_dst.s_addr = f->src.addr_data32[0]; + + /* set the tcp header */ + p->tcph = (TCPHdr *)((uint8_t *)p->pkt + 20); + + } else { + /* set the ip header */ + p->ip6h = (IPV6Hdr *)p->pkt; + /* version 6 */ + p->ip6h->s_ip6_vfc = 0x60; + p->ip6h->s_ip6_plen = htons(20); + p->ip6h->s_ip6_nxt = IPPROTO_TCP; + 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_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]; + + /* set the tcp header */ + p->tcph = (TCPHdr *)((uint8_t *)p->pkt + 40); + } p->tcph->th_sport = htons(f->dp); p->tcph->th_dport = htons(f->sp);