[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.37.2.1 and 1.41

version 1.37.2.1, 2001/03/05 22:49:57 version 1.41, 2001/04/13 23:30:26
Line 1 
Line 1 
 /*      $NetBSD$        */  /*      $NetBSD$        */
 /*      $KAME: ip6_input.c,v 1.183 2001/03/01 15:15:23 itojun Exp $     */  /*      $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $     */
   
 /*  /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.   * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
Line 81 
Line 81 
 #include <sys/time.h>  #include <sys/time.h>
 #include <sys/kernel.h>  #include <sys/kernel.h>
 #include <sys/syslog.h>  #include <sys/syslog.h>
 #include <sys/lwp.h>  
 #include <sys/proc.h>  #include <sys/proc.h>
   
 #include <net/if.h>  #include <net/if.h>
Line 217  ip6intr()
Line 216  ip6intr()
         struct mbuf *m;          struct mbuf *m;
   
         for (;;) {          for (;;) {
                 s = splimp();                  s = splnet();
                 IF_DEQUEUE(&ip6intrq, m);                  IF_DEQUEUE(&ip6intrq, m);
                 splx(s);                  splx(s);
                 if (m == 0)                  if (m == 0)
Line 259  ip6_input(m)
Line 258  ip6_input(m)
                 else                  else
                         ip6stat.ip6s_mext1++;                          ip6stat.ip6s_mext1++;
         } else {          } else {
   #define M2MMAX  (sizeof(ip6stat.ip6s_m2m)/sizeof(ip6stat.ip6s_m2m[0]))
                 if (m->m_next) {                  if (m->m_next) {
                         if (m->m_flags & M_LOOP) {                          if (m->m_flags & M_LOOP) {
                                 ip6stat.ip6s_m2m[loif[0].if_index]++;   /*XXX*/                                  ip6stat.ip6s_m2m[loif[0].if_index]++;   /*XXX*/
                         } else if (m->m_pkthdr.rcvif->if_index <= 31)                          } else if (m->m_pkthdr.rcvif->if_index < M2MMAX)
                                 ip6stat.ip6s_m2m[m->m_pkthdr.rcvif->if_index]++;                                  ip6stat.ip6s_m2m[m->m_pkthdr.rcvif->if_index]++;
                         else                          else
                                 ip6stat.ip6s_m2m[0]++;                                  ip6stat.ip6s_m2m[0]++;
                 } else                  } else
                         ip6stat.ip6s_m1++;                          ip6stat.ip6s_m1++;
   #undef M2MMAX
         }          }
   
         in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_receive);          in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_receive);
Line 304  ip6_input(m)
Line 305  ip6_input(m)
          * Note that filters must _never_ set this flag, as another filter           * Note that filters must _never_ set this flag, as another filter
          * in the list may have previously cleared it.           * in the list may have previously cleared it.
          */           */
         if (pfil_run_hooks(&inet6_pfil_hook, &m, m->m_pkthdr.rcvif,          /*
                            PFIL_IN) != 0)           * let ipfilter look at packet on the wire,
                 return;           * not the decapsulated packet.
         if (m == NULL)           */
                 return;  #ifdef IPSEC
         ip6 = mtod(m, struct ip6_hdr *);          if (!ipsec_gethist(m, NULL))
   #else
           if (1)
   #endif
           {
                   if (pfil_run_hooks(&inet6_pfil_hook, &m, m->m_pkthdr.rcvif,
                                      PFIL_IN) != 0)
                           return;
                   if (m == NULL)
                           return;
                   ip6 = mtod(m, struct ip6_hdr *);
           }
 #endif /* PFIL_HOOKS */  #endif /* PFIL_HOOKS */
   
   
Line 379  ip6_input(m)
Line 391  ip6_input(m)
                 }                  }
         }          }
   
 #ifndef FAKE_LOOPBACK_IF          /* drop packets if interface ID portion is already filled */
         if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0)          if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0) {
 #else                  if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src) &&
         if (1)                      ip6->ip6_src.s6_addr16[1]) {
 #endif                          ip6stat.ip6s_badscope++;
         {                          goto bad;
                 if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src))                  }
                         ip6->ip6_src.s6_addr16[1]                  if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst) &&
                                 = htons(m->m_pkthdr.rcvif->if_index);                      ip6->ip6_dst.s6_addr16[1]) {
                 if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst))                          ip6stat.ip6s_badscope++;
                         ip6->ip6_dst.s6_addr16[1]                          goto bad;
                                 = htons(m->m_pkthdr.rcvif->if_index);                  }
         }          }
   
         /*          if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src))
          * XXX we need this since we do not have "goto ours" hack route                  ip6->ip6_src.s6_addr16[1]
          * for some of our ifaddrs on loopback interface.                          = htons(m->m_pkthdr.rcvif->if_index);
          * we should correct it by changing in6_ifattach to install          if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst))
          * "goto ours" hack route.                  ip6->ip6_dst.s6_addr16[1]
          */                          = htons(m->m_pkthdr.rcvif->if_index);
         if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) != 0) {  
                 if (IN6_IS_ADDR_LINKLOCAL(&ip6->ip6_dst)) {          /*
                         ours = 1;           * We use rt->rt_ifp to determine if the address is ours or not.
                         deliverifp = m->m_pkthdr.rcvif;           * If rt_ifp is lo0, the address is ours.
                         goto hbhcheck;           * The problem here is, rt->rt_ifp for fe80::%lo0/64 is set to lo0,
            * so any address under fe80::%lo0/64 will be mistakenly considered
            * local.  The special case is supplied to handle the case properly
            * by actually looking at interface addresses
            * (using in6ifa_ifpwithaddr).
            */
           if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) != 0 &&
               IN6_IS_ADDR_LINKLOCAL(&ip6->ip6_dst)) {
                   if (!in6ifa_ifpwithaddr(m->m_pkthdr.rcvif, &ip6->ip6_dst)) {
                           icmp6_error(m, ICMP6_DST_UNREACH,
                               ICMP6_DST_UNREACH_ADDR, 0);
                           /* m is already freed */
                           return;
                 }                  }
   
                   ours = 1;
                   deliverifp = m->m_pkthdr.rcvif;
                   goto hbhcheck;
         }          }
   
         /*          /*
Line 693  ip6_input(m)
Line 721  ip6_input(m)
         ip6stat.ip6s_delivered++;          ip6stat.ip6s_delivered++;
         in6_ifstat_inc(deliverifp, ifs6_in_deliver);          in6_ifstat_inc(deliverifp, ifs6_in_deliver);
         nest = 0;          nest = 0;
   
         while (nxt != IPPROTO_DONE) {          while (nxt != IPPROTO_DONE) {
                 if (ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) {                  if (ip6_hdrnestlimit && (++nest > ip6_hdrnestlimit)) {
                         ip6stat.ip6s_toomanyhdr++;                          ip6stat.ip6s_toomanyhdr++;
Line 979  ip6_savecontrol(in6p, mp, ip6, m)
Line 1008  ip6_savecontrol(in6p, mp, ip6, m)
         struct ip6_hdr *ip6;          struct ip6_hdr *ip6;
         struct mbuf *m;          struct mbuf *m;
 {  {
         struct proc *p = curproc->l_proc;       /* XXX */          struct proc *p = curproc;       /* XXX */
         int privileged;          int privileged;
   
         privileged = 0;          privileged = 0;

Legend:
Removed from v.1.37.2.1  
changed lines
  Added in v.1.41

CVSweb <webmaster@jp.NetBSD.org>