[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.3 and 1.38

version 1.37.2.3, 2001/04/09 01:58:39 version 1.38, 2001/03/16 12:22:34
Line 1 
Line 1 
 /*      $NetBSD$        */  /*      $NetBSD$        */
 /*      $KAME: ip6_input.c,v 1.188 2001/03/29 05:34:31 itojun Exp $     */  /*      $KAME: ip6_input.c,v 1.183 2001/03/01 15:15:23 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 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 < M2MMAX)                          } else if (m->m_pkthdr.rcvif->if_index <= 31)
                                 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 306  ip6_input(m)
Line 303  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,
          * let ipfilter look at packet on the wire,                             PFIL_IN) != 0)
          * not the decapsulated packet.                  return;
          */          if (m == NULL)
 #ifdef IPSEC                  return;
         if (!ipsec_gethist(m, NULL))          ip6 = mtod(m, struct ip6_hdr *);
 #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 405  ip6_input(m)
Line 391  ip6_input(m)
                         goto bad;                          goto bad;
                 }                  }
         }          }
   
   #ifndef FAKE_LOOPBACK_IF
           if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0)
   #else
           if (1)
   #endif
           {
                   if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src))
                           ip6->ip6_src.s6_addr16[1]
                                   = htons(m->m_pkthdr.rcvif->if_index);
                   if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst))
                           ip6->ip6_dst.s6_addr16[1]
                                   = htons(m->m_pkthdr.rcvif->if_index);
           }
   
         if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_src))          /*
                 ip6->ip6_src.s6_addr16[1]           * XXX we need this since we do not have "goto ours" hack route
                         = htons(m->m_pkthdr.rcvif->if_index);           * for some of our ifaddrs on loopback interface.
         if (IN6_IS_SCOPE_LINKLOCAL(&ip6->ip6_dst))           * we should correct it by changing in6_ifattach to install
                 ip6->ip6_dst.s6_addr16[1]           * "goto ours" hack route.
                         = 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)) {
          * We use rt->rt_ifp to determine if the address is ours or not.                          ours = 1;
          * If rt_ifp is lo0, the address is ours.                          deliverifp = m->m_pkthdr.rcvif;
          * The problem here is, rt->rt_ifp for fe80::%lo0/64 is set to lo0,                          goto hbhcheck;
          * 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 722  ip6_input(m)
Line 706  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 1009  ip6_savecontrol(in6p, mp, ip6, m)
Line 992  ip6_savecontrol(in6p, mp, ip6, m)
         struct ip6_hdr *ip6;          struct ip6_hdr *ip6;
         struct mbuf *m;          struct mbuf *m;
 {  {
         struct proc *p = (curproc ? curproc->l_proc : 0);       /* XXX */          struct proc *p = curproc;       /* XXX */
         int privileged;          int privileged;
   
         privileged = 0;          privileged = 0;

Legend:
Removed from v.1.37.2.3  
changed lines
  Added in v.1.38

CVSweb <webmaster@jp.NetBSD.org>