Hi, Remove the IPv6 fragment overlapping length adjustment code. It was already #if 0 and will never come back. Remove unused fragment struct fields and sort the others.
ok? bluhm Index: netinet6/frag6.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/frag6.c,v retrieving revision 1.37 diff -u -p -r1.37 frag6.c --- netinet6/frag6.c 9 Jan 2012 01:01:12 -0000 1.37 +++ netinet6/frag6.c 9 Jan 2012 10:59:32 -0000 @@ -279,12 +279,8 @@ frag6_input(struct mbuf **mp, int *offp, /* ip6q_nxt will be filled afterwards, from 1st fragment */ LIST_INIT(&q6->ip6q_asfrag); -#ifdef notyet - q6->ip6q_nxtp = (u_char *)nxtp; -#endif q6->ip6q_ident = ip6f->ip6f_ident; - q6->ip6q_arrive = 0; /* Is it used anywhere? */ - q6->ip6q_ttl = IPV6_FRAGTTL; + q6->ip6q_ttl = IPV6_FRAGTTL; q6->ip6q_src = ip6->ip6_src; q6->ip6q_dst = ip6->ip6_dst; q6->ip6q_unfrglen = -1; /* The 1st fragment has not arrived. */ @@ -362,10 +358,7 @@ frag6_input(struct mbuf **mp, int *offp, ip6af = malloc(sizeof(*ip6af), M_FTABLE, M_DONTWAIT | M_ZERO); if (ip6af == NULL) goto dropfrag; - ip6af->ip6af_head = ip6->ip6_flow; - ip6af->ip6af_len = ip6->ip6_plen; - ip6af->ip6af_nxt = ip6->ip6_nxt; - ip6af->ip6af_hlim = ip6->ip6_hlim; + ip6af->ip6af_flow = ip6->ip6_flow; ip6af->ip6af_mff = ip6f->ip6f_offlg & IP6F_MORE_FRAG; ip6af->ip6af_off = fragoff; ip6af->ip6af_frglen = frgpartlen; @@ -384,14 +377,14 @@ frag6_input(struct mbuf **mp, int *offp, */ af6 = LIST_FIRST(&q6->ip6q_asfrag); ecn = (ntohl(ip6->ip6_flow) >> 20) & IPTOS_ECN_MASK; - ecn0 = (ntohl(af6->ip6af_head) >> 20) & IPTOS_ECN_MASK; + ecn0 = (ntohl(af6->ip6af_flow) >> 20) & IPTOS_ECN_MASK; if (ecn == IPTOS_ECN_CE) { if (ecn0 == IPTOS_ECN_NOTECT) { free(ip6af, M_FTABLE); goto dropfrag; } if (ecn0 != IPTOS_ECN_CE) - af6->ip6af_head |= htonl(IPTOS_ECN_CE << 20); + af6->ip6af_flow |= htonl(IPTOS_ECN_CE << 20); } if (ecn == IPTOS_ECN_NOTECT && ecn0 != IPTOS_ECN_NOTECT) { free(ip6af, M_FTABLE); @@ -408,42 +401,6 @@ frag6_input(struct mbuf **mp, int *offp, if (af6->ip6af_off > ip6af->ip6af_off) break; -#if 0 - /* - * If there is a preceding segment, it may provide some of - * our data already. If so, drop the data from the incoming - * segment. If it provides all of our data, drop us. - */ - if (paf6 != LIST_END(&q6->ip6q_asfrag) { - i = (paf6->ip6af_off + paf6->ip6af_frglen) - ip6af->ip6af_off; - if (i > 0) { - if (i >= ip6af->ip6af_frglen) - goto dropfrag; - m_adj(IP6_REASS_MBUF(ip6af), i); - ip6af->ip6af_off += i; - ip6af->ip6af_frglen -= i; - } - } - - /* - * While we overlap succeeding segments trim them or, - * if they are completely covered, dequeue them. - */ - while (af6 != LIST_END(&q6->ip6q_asfrag) && - ip6af->ip6af_off + ip6af->ip6af_frglen > af6->ip6af_off) { - i = (ip6af->ip6af_off + ip6af->ip6af_frglen) - af6->ip6af_off; - if (i < af6->ip6af_frglen) { - af6->ip6af_frglen -= i; - af6->ip6af_off += i; - m_adj(IP6_REASS_MBUF(af6), i); - break; - } - naf6 = LIST_NEXT(af6, ip6af_list); - m_freem(IP6_REASS_MBUF(af6)); - LIST_REMOVE(&q6->ip6q_asfrag, af6, ip6af_list); - af6 = naf6; - } -#else /* * If the incoming fragment overlaps some existing fragments in * the reassembly queue, drop it, since it is dangerous to override @@ -475,7 +432,6 @@ frag6_input(struct mbuf **mp, int *offp, goto dropfrag; } } -#endif insert: /* @@ -536,9 +492,6 @@ frag6_input(struct mbuf **mp, int *offp, ip6->ip6_src = q6->ip6q_src; ip6->ip6_dst = q6->ip6q_dst; nxt = q6->ip6q_nxt; -#ifdef notyet - *q6->ip6q_nxtp = (u_char)(nxt & 0xff); -#endif /* Delete frag6 header */ if (frag6_deletefraghdr(m, offset) != 0) { Index: netinet6/ip6_var.h =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_var.h,v retrieving revision 1.43 diff -u -p -r1.43 ip6_var.h --- netinet6/ip6_var.h 9 Jan 2012 01:01:12 -0000 1.43 +++ netinet6/ip6_var.h 9 Jan 2012 11:05:30 -0000 @@ -69,31 +69,23 @@ * being reassembled is attached to one of these structures. */ struct ip6q { - u_int8_t ip6q_nxt; /* ip6f_nxt in first fragment */ + TAILQ_ENTRY(ip6q) ip6q_queue; LIST_HEAD(ip6asfrag_list, ip6asfrag) ip6q_asfrag; - u_int32_t ip6q_ident; - u_int8_t ip6q_arrive; - u_int8_t ip6q_ttl; struct in6_addr ip6q_src, ip6q_dst; - TAILQ_ENTRY(ip6q) ip6q_queue; int ip6q_unfrglen; /* len of unfragmentable part */ -#ifdef notyet - u_char *ip6q_nxtp; -#endif int ip6q_nfrag; /* # of fragments */ + u_int32_t ip6q_ident; /* fragment identification */ + u_int8_t ip6q_nxt; /* ip6f_nxt in first fragment */ + u_int8_t ip6q_ttl; /* time to live in slowtimo units */ }; struct ip6asfrag { - u_int32_t ip6af_head; - u_int16_t ip6af_len; - u_int8_t ip6af_nxt; - u_int8_t ip6af_hlim; - /* must not override the above members during reassembling */ LIST_ENTRY(ip6asfrag) ip6af_list; struct mbuf *ip6af_m; int ip6af_offset; /* offset in ip6af_m to next header */ int ip6af_frglen; /* fragmentable part length */ int ip6af_off; /* fragment offset */ + u_int32_t ip6af_flow; /* ip header flow id */ u_int16_t ip6af_mff; /* more fragment bit in frag off */ };