[BACK]Return to ip6_input.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / netinet6

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/netinet6/ip6_input.c between version 1.149.2.4 and 1.150

version 1.149.2.4, 2019/09/17 18:07:15 version 1.150, 2015/01/20 21:27:36
Line 249  ip6_input(struct mbuf *m)
Line 249  ip6_input(struct mbuf *m)
         int hit, off = sizeof(struct ip6_hdr), nest;          int hit, off = sizeof(struct ip6_hdr), nest;
         u_int32_t plen;          u_int32_t plen;
         u_int32_t rtalert = ~0;          u_int32_t rtalert = ~0;
         int nxt, ours = 0, rh_present = 0, frg_present;          int nxt, ours = 0, rh_present = 0;
         struct ifnet *deliverifp = NULL;          struct ifnet *deliverifp = NULL;
         int srcrt = 0;          int srcrt = 0;
         const struct rtentry *rt;          const struct rtentry *rt;
Line 352  ip6_input(struct mbuf *m)
Line 352  ip6_input(struct mbuf *m)
                         return;                          return;
                 if (m == NULL)                  if (m == NULL)
                         return;                          return;
                 if (__predict_false(m->m_len < sizeof(struct ip6_hdr))) {  
                         struct ifnet *inifp = m->m_pkthdr.rcvif;  
                         if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {  
                                 IP6_STATINC(IP6_STAT_TOOSMALL);  
                                 in6_ifstat_inc(inifp, ifs6_in_hdrerr);  
                                 return;  
                         }  
                 }  
                 ip6 = mtod(m, struct ip6_hdr *);                  ip6 = mtod(m, struct ip6_hdr *);
                 srcrt = !IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst);                  srcrt = !IN6_ARE_ADDR_EQUAL(&odst, &ip6->ip6_dst);
         }          }
Line 728  ip6_input(struct mbuf *m)
Line 720  ip6_input(struct mbuf *m)
         nest = 0;          nest = 0;
   
         rh_present = 0;          rh_present = 0;
         frg_present = 0;  
         while (nxt != IPPROTO_DONE) {          while (nxt != IPPROTO_DONE) {
                 if (ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) {                  if (ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) {
                         IP6_STATINC(IP6_STAT_TOOMANYHDR);                          IP6_STATINC(IP6_STAT_TOOMANYHDR);
Line 753  ip6_input(struct mbuf *m)
Line 744  ip6_input(struct mbuf *m)
                                 IP6_STATINC(IP6_STAT_BADOPTIONS);                                  IP6_STATINC(IP6_STAT_BADOPTIONS);
                                 goto bad;                                  goto bad;
                         }                          }
                 } else if (nxt == IPPROTO_FRAGMENT) {  
                         if (frg_present++) {  
                                 in6_ifstat_inc(m->m_pkthdr.rcvif,  
                                     ifs6_in_hdrerr);  
                                 IP6_STATINC(IP6_STAT_BADOPTIONS);  
                                 goto bad;  
                         }  
                 }                  }
   
 #ifdef IPSEC  #ifdef IPSEC
Line 1400  ip6_pullexthdr(struct mbuf *m, size_t of
Line 1384  ip6_pullexthdr(struct mbuf *m, size_t of
 }  }
   
 /*  /*
  * Get offset to the previous header followed by the header   * Get pointer to the previous header followed by the header
  * currently processed.   * currently processed.
    * XXX: This function supposes that
    *      M includes all headers,
    *      the next header field and the header length field of each header
    *      are valid, and
    *      the sum of each header length equals to OFF.
    * Because of these assumptions, this function must be called very
    * carefully. Moreover, it will not be used in the near future when
    * we develop `neater' mechanism to process extension headers.
  */   */
 int  u_int8_t *
 ip6_get_prevhdr(struct mbuf *m, int off)  ip6_get_prevhdr(struct mbuf *m, int off)
 {  {
         struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);          struct ip6_hdr *ip6 = mtod(m, struct ip6_hdr *);
   
         if (off == sizeof(struct ip6_hdr)) {          if (off == sizeof(struct ip6_hdr))
                 return offsetof(struct ip6_hdr, ip6_nxt);                  return (&ip6->ip6_nxt);
         } else if (off < sizeof(struct ip6_hdr)) {          else {
                 panic("%s: off < sizeof(struct ip6_hdr)", __func__);                  int len, nxt;
         } else {                  struct ip6_ext *ip6e = NULL;
                 int len, nlen, nxt;  
                 struct ip6_ext ip6e;  
   
                 nxt = ip6->ip6_nxt;                  nxt = ip6->ip6_nxt;
                 len = sizeof(struct ip6_hdr);                  len = sizeof(struct ip6_hdr);
                 nlen = 0;  
                 while (len < off) {                  while (len < off) {
                         m_copydata(m, len, sizeof(ip6e), &ip6e);                          ip6e = (struct ip6_ext *)(mtod(m, char *) + len);
   
                         switch (nxt) {                          switch (nxt) {
                         case IPPROTO_FRAGMENT:                          case IPPROTO_FRAGMENT:
                                 nlen = sizeof(struct ip6_frag);                                  len += sizeof(struct ip6_frag);
                                 break;                                  break;
                         case IPPROTO_AH:                          case IPPROTO_AH:
                                 nlen = (ip6e.ip6e_len + 2) << 2;                                  len += (ip6e->ip6e_len + 2) << 2;
                                 break;                                  break;
                         default:                          default:
                                 nlen = (ip6e.ip6e_len + 1) << 3;                                  len += (ip6e->ip6e_len + 1) << 3;
                                 break;                                  break;
                         }                          }
                         len += nlen;                          nxt = ip6e->ip6e_nxt;
                         nxt = ip6e.ip6e_nxt;  
                 }                  }
                   if (ip6e)
                 return (len - nlen);                          return (&ip6e->ip6e_nxt);
                   else
                           return NULL;
         }          }
 }  }
   

Legend:
Removed from v.1.149.2.4  
changed lines
  Added in v.1.150

CVSweb <webmaster@jp.NetBSD.org>