[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.113.12.1 and 1.113.12.2

version 1.113.12.1, 2008/04/03 12:43:09 version 1.113.12.2, 2008/06/02 13:24:27
Line 102  __KERNEL_RCSID(0, "$NetBSD$");
Line 102  __KERNEL_RCSID(0, "$NetBSD$");
 #include <netinet/ip6.h>  #include <netinet/ip6.h>
 #include <netinet6/in6_var.h>  #include <netinet6/in6_var.h>
 #include <netinet6/ip6_var.h>  #include <netinet6/ip6_var.h>
   #include <netinet6/ip6_private.h>
 #include <netinet6/in6_pcb.h>  #include <netinet6/in6_pcb.h>
 #include <netinet/icmp6.h>  #include <netinet/icmp6.h>
 #include <netinet6/scope6_var.h>  #include <netinet6/scope6_var.h>
Line 110  __KERNEL_RCSID(0, "$NetBSD$");
Line 111  __KERNEL_RCSID(0, "$NetBSD$");
   
 #ifdef IPSEC  #ifdef IPSEC
 #include <netinet6/ipsec.h>  #include <netinet6/ipsec.h>
   #include <netinet6/ipsec_private.h>
 #endif  #endif
   
 #ifdef FAST_IPSEC  #ifdef FAST_IPSEC
Line 146  int ip6_sourcecheck_interval;  /* XXX */
Line 148  int ip6_sourcecheck_interval;  /* XXX */
 struct pfil_head inet6_pfil_hook;  struct pfil_head inet6_pfil_hook;
 #endif  #endif
   
 struct ip6stat ip6stat;  percpu_t *ip6stat_percpu;
   
 static void ip6_init2(void *);  static void ip6_init2(void *);
 static struct m_tag *ip6_setdstifaddr(struct mbuf *, const struct in6_ifaddr *);  static struct m_tag *ip6_setdstifaddr(struct mbuf *, const struct in6_ifaddr *);
Line 195  ip6_init(void)
Line 197  ip6_init(void)
                 printf("ip6_init: WARNING: unable to register pfil hook, "                  printf("ip6_init: WARNING: unable to register pfil hook, "
                     "error %d\n", i);                      "error %d\n", i);
 #endif /* PFIL_HOOKS */  #endif /* PFIL_HOOKS */
   
           ip6stat_percpu = percpu_alloc(sizeof(uint64_t) * IP6_NSTATS);
 }  }
   
 static void  static void
Line 202  ip6_init2(void *dummy)
Line 206  ip6_init2(void *dummy)
 {  {
   
         /* nd6_timer_init */          /* nd6_timer_init */
         callout_init(&nd6_timer_ch, 0);          callout_init(&nd6_timer_ch, CALLOUT_MPSAFE);
         callout_reset(&nd6_timer_ch, hz, nd6_timer, NULL);          callout_reset(&nd6_timer_ch, hz, nd6_timer, NULL);
   
         /* timer for regeneranation of temporary addresses randomize ID */          /* timer for regeneranation of temporary addresses randomize ID */
         callout_init(&in6_tmpaddrtimer_ch, 0);          callout_init(&in6_tmpaddrtimer_ch, CALLOUT_MPSAFE);
         callout_reset(&in6_tmpaddrtimer_ch,          callout_reset(&in6_tmpaddrtimer_ch,
                       (ip6_temp_preferred_lifetime - ip6_desync_factor -                        (ip6_temp_preferred_lifetime - ip6_desync_factor -
                        ip6_temp_regen_advance) * hz,                         ip6_temp_regen_advance) * hz,
Line 222  ip6intr(void)
Line 226  ip6intr(void)
         int s;          int s;
         struct mbuf *m;          struct mbuf *m;
   
           mutex_enter(softnet_lock);
           KERNEL_LOCK(1, NULL);
         for (;;) {          for (;;) {
                 s = splnet();                  s = splnet();
                 IF_DEQUEUE(&ip6intrq, m);                  IF_DEQUEUE(&ip6intrq, m);
                 splx(s);                  splx(s);
                 if (m == 0)                  if (m == 0)
                         return;                          break;
                 /* drop the packet if IPv6 operation is disabled on the IF */                  /* drop the packet if IPv6 operation is disabled on the IF */
                 if ((ND_IFINFO(m->m_pkthdr.rcvif)->flags & ND6_IFF_IFDISABLED)) {                  if ((ND_IFINFO(m->m_pkthdr.rcvif)->flags & ND6_IFF_IFDISABLED)) {
                         m_freem(m);                          m_freem(m);
                         return;                          break;
                 }                  }
                 ip6_input(m);                  ip6_input(m);
         }          }
           KERNEL_UNLOCK_ONE(NULL);
           mutex_exit(softnet_lock);
 }  }
   
 extern struct   route ip6_forward_rt;  extern struct   route ip6_forward_rt;
Line 280  ip6_input(struct mbuf *m)
Line 288  ip6_input(struct mbuf *m)
          */           */
         if (m->m_flags & M_EXT) {          if (m->m_flags & M_EXT) {
                 if (m->m_next)                  if (m->m_next)
                         ip6stat.ip6s_mext2m++;                          IP6_STATINC(IP6_STAT_MEXT2M);
                 else                  else
                         ip6stat.ip6s_mext1++;                          IP6_STATINC(IP6_STAT_MEXT1);
         } else {          } else {
 #define M2MMAX  __arraycount(ip6stat.ip6s_m2m)  #define M2MMAX  32
                 if (m->m_next) {                  if (m->m_next) {
                         if (m->m_flags & M_LOOP) {                          if (m->m_flags & M_LOOP) {
                                 ip6stat.ip6s_m2m[lo0ifp->if_index]++; /* XXX */                          /*XXX*/ IP6_STATINC(IP6_STAT_M2M + lo0ifp->if_index);
                         } else if (m->m_pkthdr.rcvif->if_index < M2MMAX)                          } else if (m->m_pkthdr.rcvif->if_index < M2MMAX) {
                                 ip6stat.ip6s_m2m[m->m_pkthdr.rcvif->if_index]++;                                  IP6_STATINC(IP6_STAT_M2M +
                         else                                              m->m_pkthdr.rcvif->if_index);
                                 ip6stat.ip6s_m2m[0]++;                          } else
                                   IP6_STATINC(IP6_STAT_M2M);
                 } else                  } else
                         ip6stat.ip6s_m1++;                          IP6_STATINC(IP6_STAT_M1);
 #undef M2MMAX  #undef M2MMAX
         }          }
   
         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_receive);          in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_receive);
         ip6stat.ip6s_total++;          IP6_STATINC(IP6_STAT_TOTAL);
   
         /*          /*
          * If the IPv6 header is not aligned, slurp it up into a new           * If the IPv6 header is not aligned, slurp it up into a new
Line 311  ip6_input(struct mbuf *m)
Line 320  ip6_input(struct mbuf *m)
                 if ((m = m_copyup(m, sizeof(struct ip6_hdr),                  if ((m = m_copyup(m, sizeof(struct ip6_hdr),
                                   (max_linkhdr + 3) & ~3)) == NULL) {                                    (max_linkhdr + 3) & ~3)) == NULL) {
                         /* XXXJRT new stat, please */                          /* XXXJRT new stat, please */
                         ip6stat.ip6s_toosmall++;                          IP6_STATINC(IP6_STAT_TOOSMALL);
                         in6_ifstat_inc(inifp, ifs6_in_hdrerr);                          in6_ifstat_inc(inifp, ifs6_in_hdrerr);
                         return;                          return;
                 }                  }
         } else if (__predict_false(m->m_len < sizeof(struct ip6_hdr))) {          } else if (__predict_false(m->m_len < sizeof(struct ip6_hdr))) {
                 struct ifnet *inifp = m->m_pkthdr.rcvif;                  struct ifnet *inifp = m->m_pkthdr.rcvif;
                 if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {                  if ((m = m_pullup(m, sizeof(struct ip6_hdr))) == NULL) {
                         ip6stat.ip6s_toosmall++;                          IP6_STATINC(IP6_STAT_TOOSMALL);
                         in6_ifstat_inc(inifp, ifs6_in_hdrerr);                          in6_ifstat_inc(inifp, ifs6_in_hdrerr);
                         return;                          return;
                 }                  }
Line 327  ip6_input(struct mbuf *m)
Line 336  ip6_input(struct mbuf *m)
         ip6 = mtod(m, struct ip6_hdr *);          ip6 = mtod(m, struct ip6_hdr *);
   
         if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {          if ((ip6->ip6_vfc & IPV6_VERSION_MASK) != IPV6_VERSION) {
                 ip6stat.ip6s_badvers++;                  IP6_STATINC(IP6_STAT_BADVERS);
                 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);                  in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);
                 goto bad;                  goto bad;
         }          }
Line 376  ip6_input(struct mbuf *m)
Line 385  ip6_input(struct mbuf *m)
         }          }
 #endif /* PFIL_HOOKS */  #endif /* PFIL_HOOKS */
   
         ip6stat.ip6s_nxthist[ip6->ip6_nxt]++;          IP6_STATINC(IP6_STAT_NXTHIST + ip6->ip6_nxt);
   
 #ifdef ALTQ  #ifdef ALTQ
         if (altq_input != NULL && (*altq_input)(m, AF_INET6) == 0) {          if (altq_input != NULL && (*altq_input)(m, AF_INET6) == 0) {
Line 393  ip6_input(struct mbuf *m)
Line 402  ip6_input(struct mbuf *m)
                 /*                  /*
                  * XXX: "badscope" is not very suitable for a multicast source.                   * XXX: "badscope" is not very suitable for a multicast source.
                  */                   */
                 ip6stat.ip6s_badscope++;                  IP6_STATINC(IP6_STAT_BADSCOPE);
                 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);                  in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
                 goto bad;                  goto bad;
         }          }
Line 411  ip6_input(struct mbuf *m)
Line 420  ip6_input(struct mbuf *m)
          */           */
         if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) ||          if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) ||
             IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) {              IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) {
                 ip6stat.ip6s_badscope++;                  IP6_STATINC(IP6_STAT_BADSCOPE);
                 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);                  in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
                 goto bad;                  goto bad;
         }          }
Line 425  ip6_input(struct mbuf *m)
Line 434  ip6_input(struct mbuf *m)
          */           */
         if (IN6_IS_ADDR_V4COMPAT(&ip6->ip6_src) ||          if (IN6_IS_ADDR_V4COMPAT(&ip6->ip6_src) ||
             IN6_IS_ADDR_V4COMPAT(&ip6->ip6_dst)) {              IN6_IS_ADDR_V4COMPAT(&ip6->ip6_dst)) {
                 ip6stat.ip6s_badscope++;                  IP6_STATINC(IP6_STAT_BADSCOPE);
                 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);                  in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
                 goto bad;                  goto bad;
         }          }
Line 446  ip6_input(struct mbuf *m)
Line 455  ip6_input(struct mbuf *m)
                 goto bad;                  goto bad;
         ip6 = mtod(m, struct ip6_hdr *);          ip6 = mtod(m, struct ip6_hdr *);
         if (in6_clearscope(&ip6->ip6_src) || in6_clearscope(&ip6->ip6_dst)) {          if (in6_clearscope(&ip6->ip6_src) || in6_clearscope(&ip6->ip6_dst)) {
                 ip6stat.ip6s_badscope++; /* XXX */                  IP6_STATINC(IP6_STAT_BADSCOPE); /* XXX */
                 goto bad;                  goto bad;
         }          }
         if (in6_setscope(&ip6->ip6_src, m->m_pkthdr.rcvif, NULL) ||          if (in6_setscope(&ip6->ip6_src, m->m_pkthdr.rcvif, NULL) ||
             in6_setscope(&ip6->ip6_dst, m->m_pkthdr.rcvif, NULL)) {              in6_setscope(&ip6->ip6_dst, m->m_pkthdr.rcvif, NULL)) {
                 ip6stat.ip6s_badscope++;                  IP6_STATINC(IP6_STAT_BADSCOPE);
                 goto bad;                  goto bad;
         }          }
   
Line 470  ip6_input(struct mbuf *m)
Line 479  ip6_input(struct mbuf *m)
                 if (in6m)                  if (in6m)
                         ours = 1;                          ours = 1;
                 else if (!ip6_mrouter) {                  else if (!ip6_mrouter) {
                         ip6stat.ip6s_notmember++;                          uint64_t *ip6s = IP6_STAT_GETREF();
                         ip6stat.ip6s_cantforward++;                          ip6s[IP6_STAT_NOTMEMBER]++;
                           ip6s[IP6_STAT_CANTFORWARD]++;
                           IP6_STAT_PUTREF();
                         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);                          in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
                         goto bad;                          goto bad;
                 }                  }
Line 486  ip6_input(struct mbuf *m)
Line 497  ip6_input(struct mbuf *m)
          */           */
         rt = rtcache_lookup2(&ip6_forward_rt, &u.dst, 1, &hit);          rt = rtcache_lookup2(&ip6_forward_rt, &u.dst, 1, &hit);
         if (hit)          if (hit)
                 ip6stat.ip6s_forward_cachehit++;                  IP6_STATINC(IP6_STAT_FORWARD_CACHEHIT);
         else          else
                 ip6stat.ip6s_forward_cachemiss++;                  IP6_STATINC(IP6_STAT_FORWARD_CACHEMISS);
   
 #define rt6_getkey(__rt) satocsin6(rt_getkey(__rt))  #define rt6_getkey(__rt) satocsin6(rt_getkey(__rt))
   
Line 578  ip6_input(struct mbuf *m)
Line 589  ip6_input(struct mbuf *m)
          * and we're not a router.           * and we're not a router.
          */           */
         if (!ip6_forwarding) {          if (!ip6_forwarding) {
                 ip6stat.ip6s_cantforward++;                  IP6_STATINC(IP6_STAT_CANTFORWARD);
                 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);                  in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
                 goto bad;                  goto bad;
         }          }
Line 633  ip6_input(struct mbuf *m)
Line 644  ip6_input(struct mbuf *m)
                          * contained, ip6_hopopts_input() must set a valid                           * contained, ip6_hopopts_input() must set a valid
                          * (non-zero) payload length to the variable plen.                           * (non-zero) payload length to the variable plen.
                          */                           */
                         ip6stat.ip6s_badoptions++;                          IP6_STATINC(IP6_STAT_BADOPTIONS);
                         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);                          in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_discard);
                         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);                          in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);
                         icmp6_error(m, ICMP6_PARAM_PROB,                          icmp6_error(m, ICMP6_PARAM_PROB,
Line 644  ip6_input(struct mbuf *m)
Line 655  ip6_input(struct mbuf *m)
                 IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr),                  IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr),
                         sizeof(struct ip6_hbh));                          sizeof(struct ip6_hbh));
                 if (hbh == NULL) {                  if (hbh == NULL) {
                         ip6stat.ip6s_tooshort++;                          IP6_STATINC(IP6_STAT_TOOSHORT);
                         return;                          return;
                 }                  }
                 KASSERT(IP6_HDR_ALIGNED_P(hbh));                  KASSERT(IP6_HDR_ALIGNED_P(hbh));
Line 666  ip6_input(struct mbuf *m)
Line 677  ip6_input(struct mbuf *m)
          * Drop packet if shorter than we expect.           * Drop packet if shorter than we expect.
          */           */
         if (m->m_pkthdr.len - sizeof(struct ip6_hdr) < plen) {          if (m->m_pkthdr.len - sizeof(struct ip6_hdr) < plen) {
                 ip6stat.ip6s_tooshort++;                  IP6_STATINC(IP6_STAT_TOOSHORT);
                 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);                  in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);
                 goto bad;                  goto bad;
         }          }
Line 691  ip6_input(struct mbuf *m)
Line 702  ip6_input(struct mbuf *m)
                  * must be discarded, else it may be accepted below.                   * must be discarded, else it may be accepted below.
                  */                   */
                 if (ip6_mrouter && ip6_mforward(ip6, m->m_pkthdr.rcvif, m)) {                  if (ip6_mrouter && ip6_mforward(ip6, m->m_pkthdr.rcvif, m)) {
                         ip6stat.ip6s_cantforward++;                          IP6_STATINC(IP6_STAT_CANTFORWARD);
                         m_freem(m);                          m_freem(m);
                         return;                          return;
                 }                  }
Line 717  ip6_input(struct mbuf *m)
Line 728  ip6_input(struct mbuf *m)
          */           */
         if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) ||          if (IN6_IS_ADDR_V4MAPPED(&ip6->ip6_src) ||
             IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) {              IN6_IS_ADDR_V4MAPPED(&ip6->ip6_dst)) {
                 ip6stat.ip6s_badscope++;                  IP6_STATINC(IP6_STAT_BADSCOPE);
                 in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);                  in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_addrerr);
                 goto bad;                  goto bad;
         }          }
Line 733  ip6_input(struct mbuf *m)
Line 744  ip6_input(struct mbuf *m)
                         ia6->ia_ifa.ifa_data.ifad_inbytes += m->m_pkthdr.len;                          ia6->ia_ifa.ifa_data.ifad_inbytes += m->m_pkthdr.len;
         }          }
 #endif  #endif
         ip6stat.ip6s_delivered++;          IP6_STATINC(IP6_STAT_DELIVERED);
         in6_ifstat_inc(deliverifp, ifs6_in_deliver);          in6_ifstat_inc(deliverifp, ifs6_in_deliver);
         nest = 0;          nest = 0;
   
         rh_present = 0;          rh_present = 0;
         while (nxt != IPPROTO_DONE) {          while (nxt != IPPROTO_DONE) {
                 if (ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) {                  if (ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) {
                         ip6stat.ip6s_toomanyhdr++;                          IP6_STATINC(IP6_STAT_TOOMANYHDR);
                         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);                          in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_hdrerr);
                         goto bad;                          goto bad;
                 }                  }
Line 750  ip6_input(struct mbuf *m)
Line 761  ip6_input(struct mbuf *m)
                  * more sanity checks in header chain processing.                   * more sanity checks in header chain processing.
                  */                   */
                 if (m->m_pkthdr.len < off) {                  if (m->m_pkthdr.len < off) {
                         ip6stat.ip6s_tooshort++;                          IP6_STATINC(IP6_STAT_TOOSHORT);
                         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);                          in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);
                         goto bad;                          goto bad;
                 }                  }
Line 759  ip6_input(struct mbuf *m)
Line 770  ip6_input(struct mbuf *m)
                         if (rh_present++) {                          if (rh_present++) {
                                 in6_ifstat_inc(m->m_pkthdr.rcvif,                                  in6_ifstat_inc(m->m_pkthdr.rcvif,
                                     ifs6_in_hdrerr);                                      ifs6_in_hdrerr);
                                 ip6stat.ip6s_badoptions++;                                  IP6_STATINC(IP6_STAT_BADOPTIONS);
                                 goto bad;                                  goto bad;
                         }                          }
                 }                  }
Line 772  ip6_input(struct mbuf *m)
Line 783  ip6_input(struct mbuf *m)
                  */                   */
                 if ((inet6sw[ip6_protox[nxt]].pr_flags & PR_LASTHDR) != 0 &&                  if ((inet6sw[ip6_protox[nxt]].pr_flags & PR_LASTHDR) != 0 &&
                     ipsec6_in_reject(m, NULL)) {                      ipsec6_in_reject(m, NULL)) {
                         ipsec6stat.in_polvio++;                          IPSEC6_STATINC(IPSEC_STAT_IN_POLVIO);
                         goto bad;                          goto bad;
                 }                  }
 #endif  #endif
Line 873  ip6_hopopts_input(u_int32_t *plenp, u_in
Line 884  ip6_hopopts_input(u_int32_t *plenp, u_in
         IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m,          IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m,
                 sizeof(struct ip6_hdr), sizeof(struct ip6_hbh));                  sizeof(struct ip6_hdr), sizeof(struct ip6_hbh));
         if (hbh == NULL) {          if (hbh == NULL) {
                 ip6stat.ip6s_tooshort++;                  IP6_STATINC(IP6_STAT_TOOSHORT);
                 return -1;                  return -1;
         }          }
         hbhlen = (hbh->ip6h_len + 1) << 3;          hbhlen = (hbh->ip6h_len + 1) << 3;
         IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr),          IP6_EXTHDR_GET(hbh, struct ip6_hbh *, m, sizeof(struct ip6_hdr),
                 hbhlen);                  hbhlen);
         if (hbh == NULL) {          if (hbh == NULL) {
                 ip6stat.ip6s_tooshort++;                  IP6_STATINC(IP6_STAT_TOOSHORT);
                 return -1;                  return -1;
         }          }
         KASSERT(IP6_HDR_ALIGNED_P(hbh));          KASSERT(IP6_HDR_ALIGNED_P(hbh));
Line 924  ip6_process_hopopts(struct mbuf *m, u_in
Line 935  ip6_process_hopopts(struct mbuf *m, u_in
                         break;                          break;
                 case IP6OPT_PADN:                  case IP6OPT_PADN:
                         if (hbhlen < IP6OPT_MINLEN) {                          if (hbhlen < IP6OPT_MINLEN) {
                                 ip6stat.ip6s_toosmall++;                                  IP6_STATINC(IP6_STAT_TOOSMALL);
                                 goto bad;                                  goto bad;
                         }                          }
                         optlen = *(opt + 1) + 2;                          optlen = *(opt + 1) + 2;
Line 932  ip6_process_hopopts(struct mbuf *m, u_in
Line 943  ip6_process_hopopts(struct mbuf *m, u_in
                 case IP6OPT_RTALERT:                  case IP6OPT_RTALERT:
                         /* XXX may need check for alignment */                          /* XXX may need check for alignment */
                         if (hbhlen < IP6OPT_RTALERT_LEN) {                          if (hbhlen < IP6OPT_RTALERT_LEN) {
                                 ip6stat.ip6s_toosmall++;                                  IP6_STATINC(IP6_STAT_TOOSMALL);
                                 goto bad;                                  goto bad;
                         }                          }
                         if (*(opt + 1) != IP6OPT_RTALERT_LEN - 2) {                          if (*(opt + 1) != IP6OPT_RTALERT_LEN - 2) {
Line 949  ip6_process_hopopts(struct mbuf *m, u_in
Line 960  ip6_process_hopopts(struct mbuf *m, u_in
                 case IP6OPT_JUMBO:                  case IP6OPT_JUMBO:
                         /* XXX may need check for alignment */                          /* XXX may need check for alignment */
                         if (hbhlen < IP6OPT_JUMBO_LEN) {                          if (hbhlen < IP6OPT_JUMBO_LEN) {
                                 ip6stat.ip6s_toosmall++;                                  IP6_STATINC(IP6_STAT_TOOSMALL);
                                 goto bad;                                  goto bad;
                         }                          }
                         if (*(opt + 1) != IP6OPT_JUMBO_LEN - 2) {                          if (*(opt + 1) != IP6OPT_JUMBO_LEN - 2) {
Line 967  ip6_process_hopopts(struct mbuf *m, u_in
Line 978  ip6_process_hopopts(struct mbuf *m, u_in
                          */                           */
                         ip6 = mtod(m, struct ip6_hdr *);                          ip6 = mtod(m, struct ip6_hdr *);
                         if (ip6->ip6_plen) {                          if (ip6->ip6_plen) {
                                 ip6stat.ip6s_badoptions++;                                  IP6_STATINC(IP6_STAT_BADOPTIONS);
                                 icmp6_error(m, ICMP6_PARAM_PROB,                                  icmp6_error(m, ICMP6_PARAM_PROB,
                                     ICMP6_PARAMPROB_HEADER,                                      ICMP6_PARAMPROB_HEADER,
                                     erroff + opt - opthead);                                      erroff + opt - opthead);
Line 991  ip6_process_hopopts(struct mbuf *m, u_in
Line 1002  ip6_process_hopopts(struct mbuf *m, u_in
                          * there's no explicit mention in specification.                           * there's no explicit mention in specification.
                          */                           */
                         if (*plenp != 0) {                          if (*plenp != 0) {
                                 ip6stat.ip6s_badoptions++;                                  IP6_STATINC(IP6_STAT_BADOPTIONS);
                                 icmp6_error(m, ICMP6_PARAM_PROB,                                  icmp6_error(m, ICMP6_PARAM_PROB,
                                     ICMP6_PARAMPROB_HEADER,                                      ICMP6_PARAMPROB_HEADER,
                                     erroff + opt + 2 - opthead);                                      erroff + opt + 2 - opthead);
Line 1003  ip6_process_hopopts(struct mbuf *m, u_in
Line 1014  ip6_process_hopopts(struct mbuf *m, u_in
                          * jumbo payload length must be larger than 65535.                           * jumbo payload length must be larger than 65535.
                          */                           */
                         if (jumboplen <= IPV6_MAXPACKET) {                          if (jumboplen <= IPV6_MAXPACKET) {
                                 ip6stat.ip6s_badoptions++;                                  IP6_STATINC(IP6_STAT_BADOPTIONS);
                                 icmp6_error(m, ICMP6_PARAM_PROB,                                  icmp6_error(m, ICMP6_PARAM_PROB,
                                     ICMP6_PARAMPROB_HEADER,                                      ICMP6_PARAMPROB_HEADER,
                                     erroff + opt + 2 - opthead);                                      erroff + opt + 2 - opthead);
Line 1014  ip6_process_hopopts(struct mbuf *m, u_in
Line 1025  ip6_process_hopopts(struct mbuf *m, u_in
                         break;                          break;
                 default:                /* unknown option */                  default:                /* unknown option */
                         if (hbhlen < IP6OPT_MINLEN) {                          if (hbhlen < IP6OPT_MINLEN) {
                                 ip6stat.ip6s_toosmall++;                                  IP6_STATINC(IP6_STAT_TOOSMALL);
                                 goto bad;                                  goto bad;
                         }                          }
                         optlen = ip6_unknown_opt(opt, m,                          optlen = ip6_unknown_opt(opt, m,
Line 1051  ip6_unknown_opt(u_int8_t *optp, struct m
Line 1062  ip6_unknown_opt(u_int8_t *optp, struct m
                 m_freem(m);                  m_freem(m);
                 return (-1);                  return (-1);
         case IP6OPT_TYPE_FORCEICMP: /* send ICMP even if multicasted */          case IP6OPT_TYPE_FORCEICMP: /* send ICMP even if multicasted */
                 ip6stat.ip6s_badoptions++;                  IP6_STATINC(IP6_STAT_BADOPTIONS);
                 icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_OPTION, off);                  icmp6_error(m, ICMP6_PARAM_PROB, ICMP6_PARAMPROB_OPTION, off);
                 return (-1);                  return (-1);
         case IP6OPT_TYPE_ICMP: /* send ICMP if not multicasted */          case IP6OPT_TYPE_ICMP: /* send ICMP if not multicasted */
                 ip6stat.ip6s_badoptions++;                  IP6_STATINC(IP6_STAT_BADOPTIONS);
                 ip6 = mtod(m, struct ip6_hdr *);                  ip6 = mtod(m, struct ip6_hdr *);
                 if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) ||                  if (IN6_IS_ADDR_MULTICAST(&ip6->ip6_dst) ||
                     (m->m_flags & (M_BCAST|M_MCAST)))                      (m->m_flags & (M_BCAST|M_MCAST)))
Line 1170  ip6_savecontrol(struct in6pcb *in6p, str
Line 1181  ip6_savecontrol(struct in6pcb *in6p, str
                         ext = ip6_pullexthdr(m, sizeof(struct ip6_hdr),                          ext = ip6_pullexthdr(m, sizeof(struct ip6_hdr),
                             xip6->ip6_nxt);                              xip6->ip6_nxt);
                         if (ext == NULL) {                          if (ext == NULL) {
                                 ip6stat.ip6s_tooshort++;                                  IP6_STATINC(IP6_STAT_TOOSHORT);
                                 return;                                  return;
                         }                          }
                         hbh = mtod(ext, struct ip6_hbh *);                          hbh = mtod(ext, struct ip6_hbh *);
                         hbhlen = (hbh->ip6h_len + 1) << 3;                          hbhlen = (hbh->ip6h_len + 1) << 3;
                         if (hbhlen != ext->m_len) {                          if (hbhlen != ext->m_len) {
                                 m_freem(ext);                                  m_freem(ext);
                                 ip6stat.ip6s_tooshort++;                                  IP6_STATINC(IP6_STAT_TOOSHORT);
                                 return;                                  return;
                         }                          }
   
Line 1229  ip6_savecontrol(struct in6pcb *in6p, str
Line 1240  ip6_savecontrol(struct in6pcb *in6p, str
   
                         ext = ip6_pullexthdr(m, off, nxt);                          ext = ip6_pullexthdr(m, off, nxt);
                         if (ext == NULL) {                          if (ext == NULL) {
                                 ip6stat.ip6s_tooshort++;                                  IP6_STATINC(IP6_STAT_TOOSHORT);
                                 return;                                  return;
                         }                          }
                         ip6e = mtod(ext, struct ip6_ext *);                          ip6e = mtod(ext, struct ip6_ext *);
Line 1239  ip6_savecontrol(struct in6pcb *in6p, str
Line 1250  ip6_savecontrol(struct in6pcb *in6p, str
                                 elen = (ip6e->ip6e_len + 1) << 3;                                  elen = (ip6e->ip6e_len + 1) << 3;
                         if (elen != ext->m_len) {                          if (elen != ext->m_len) {
                                 m_freem(ext);                                  m_freem(ext);
                                 ip6stat.ip6s_tooshort++;                                  IP6_STATINC(IP6_STAT_TOOSHORT);
                                 return;                                  return;
                         }                          }
                         KASSERT(IP6_HDR_ALIGNED_P(ip6e));                          KASSERT(IP6_HDR_ALIGNED_P(ip6e));
Line 1640  u_char inet6ctlerrmap[PRC_NCMDS] = {
Line 1651  u_char inet6ctlerrmap[PRC_NCMDS] = {
         ENOPROTOOPT          ENOPROTOOPT
 };  };
   
   static int
   sysctl_net_inet6_ip6_stats(SYSCTLFN_ARGS)
   {
   
           return (NETSTAT_SYSCTL(ip6stat_percpu, IP6_NSTATS));
   }
   
 SYSCTL_SETUP(sysctl_net_inet6_ip6_setup, "sysctl net.inet6.ip6 subtree setup")  SYSCTL_SETUP(sysctl_net_inet6_ip6_setup, "sysctl net.inet6.ip6 subtree setup")
 {  {
 #ifdef RFC2292  #ifdef RFC2292
Line 1893  SYSCTL_SETUP(sysctl_net_inet6_ip6_setup,
Line 1911  SYSCTL_SETUP(sysctl_net_inet6_ip6_setup,
                        CTLFLAG_PERMANENT,                         CTLFLAG_PERMANENT,
                        CTLTYPE_STRUCT, "stats",                         CTLTYPE_STRUCT, "stats",
                        SYSCTL_DESCR("IPv6 statistics"),                         SYSCTL_DESCR("IPv6 statistics"),
                        NULL, 0, &ip6stat, sizeof(ip6stat),                         sysctl_net_inet6_ip6_stats, 0, NULL, 0,
                        CTL_NET, PF_INET6, IPPROTO_IPV6,                         CTL_NET, PF_INET6, IPPROTO_IPV6,
                        IPV6CTL_STATS, CTL_EOL);                         IPV6CTL_STATS, CTL_EOL);
         sysctl_createv(clog, 0, NULL, NULL,          sysctl_createv(clog, 0, NULL, NULL,
Line 1927  SYSCTL_SETUP(sysctl_net_inet6_ip6_setup,
Line 1945  SYSCTL_SETUP(sysctl_net_inet6_ip6_setup,
                         CTL_CREATE, CTL_EOL);                          CTL_CREATE, CTL_EOL);
 #endif  #endif
 }  }
   
   void
   ip6_statinc(u_int stat)
   {
   
           KASSERT(stat < IP6_NSTATS);
           IP6_STATINC(stat);
   }

Legend:
Removed from v.1.113.12.1  
changed lines
  Added in v.1.113.12.2

CVSweb <webmaster@jp.NetBSD.org>