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 */
 };

Reply via email to