[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.164.2.1 and 1.164.2.2

version 1.164.2.1, 2016/08/06 00:19:10 version 1.164.2.2, 2016/11/04 14:49:21
Line 70  __KERNEL_RCSID(0, "$NetBSD$");
Line 70  __KERNEL_RCSID(0, "$NetBSD$");
 #include "opt_inet6.h"  #include "opt_inet6.h"
 #include "opt_ipsec.h"  #include "opt_ipsec.h"
 #include "opt_compat_netbsd.h"  #include "opt_compat_netbsd.h"
   #include "opt_net_mpsafe.h"
 #endif  #endif
   
 #include <sys/param.h>  #include <sys/param.h>
Line 152  static int ip6_process_hopopts(struct mb
Line 153  static int ip6_process_hopopts(struct mb
 static struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int);  static struct mbuf *ip6_pullexthdr(struct mbuf *, size_t, int);
 static void sysctl_net_inet6_ip6_setup(struct sysctllog **);  static void sysctl_net_inet6_ip6_setup(struct sysctllog **);
   
   #ifdef NET_MPSAFE
   #define SOFTNET_LOCK()          mutex_enter(softnet_lock)
   #define SOFTNET_UNLOCK()        mutex_exit(softnet_lock)
   #else
   #define SOFTNET_LOCK()          KASSERT(mutex_owned(softnet_lock))
   #define SOFTNET_UNLOCK()        KASSERT(mutex_owned(softnet_lock))
   #endif
   
 /*  /*
  * IP6 initialization: fill in IP6 protocol switch table.   * IP6 initialization: fill in IP6 protocol switch table.
  * All protocols not implemented in kernel go to raw IP6 protocol handler.   * All protocols not implemented in kernel go to raw IP6 protocol handler.
Line 216  ip6intr(void *arg __unused)
Line 225  ip6intr(void *arg __unused)
 {  {
         struct mbuf *m;          struct mbuf *m;
   
   #ifndef NET_MPSAFE
         mutex_enter(softnet_lock);          mutex_enter(softnet_lock);
   #endif
         while ((m = pktq_dequeue(ip6_pktq)) != NULL) {          while ((m = pktq_dequeue(ip6_pktq)) != NULL) {
                 struct psref psref;                  struct psref psref;
                 struct ifnet *rcvif = m_get_rcvif_psref(m, &psref);                  struct ifnet *rcvif = m_get_rcvif_psref(m, &psref);
Line 236  ip6intr(void *arg __unused)
Line 247  ip6intr(void *arg __unused)
                 ip6_input(m, rcvif);                  ip6_input(m, rcvif);
                 m_put_rcvif_psref(rcvif, &psref);                  m_put_rcvif_psref(rcvif, &psref);
         }          }
   #ifndef NET_MPSAFE
         mutex_exit(softnet_lock);          mutex_exit(softnet_lock);
   #endif
 }  }
   
 extern struct   route ip6_forward_rt;  extern struct   route ip6_forward_rt;
Line 354  ip6_input(struct mbuf *m, struct ifnet *
Line 367  ip6_input(struct mbuf *m, struct ifnet *
         IP6_STATINC(IP6_STAT_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) {
                 /* packet is dropped by traffic conditioner */                  SOFTNET_LOCK();
                 return;                  if ((*altq_input)(m, AF_INET6) == 0) {
                           SOFTNET_UNLOCK();
                           /* packet is dropped by traffic conditioner */
                           return;
                   }
                   SOFTNET_UNLOCK();
         }          }
 #endif  #endif
   
Line 666  ip6_input(struct mbuf *m, struct ifnet *
Line 684  ip6_input(struct mbuf *m, struct ifnet *
                  * ip6_mforward() returns a non-zero value, the packet                   * ip6_mforward() returns a non-zero value, the packet
                  * must be discarded, else it may be accepted below.                   * must be discarded, else it may be accepted below.
                  */                   */
                 if (ip6_mrouter && ip6_mforward(ip6, rcvif, m)) {                  if (ip6_mrouter != NULL) {
                         IP6_STATINC(IP6_STAT_CANTFORWARD);                          int error;
                         m_freem(m);  
                         return;                          SOFTNET_LOCK();
                 }                          error = ip6_mforward(ip6, rcvif, m);
                 if (!ours) {                          SOFTNET_UNLOCK();
                         m_freem(m);  
                         return;                          if (error != 0) {
                                   IP6_STATINC(IP6_STAT_CANTFORWARD);
                                   goto bad;
                           }
                 }                  }
                   if (!ours)
                           goto bad;
         } else if (!ours) {          } else if (!ours) {
                 ip6_forward(m, srcrt);                  ip6_forward(m, srcrt);
                 return;                  return;
Line 750  ip6_input(struct mbuf *m, struct ifnet *
Line 773  ip6_input(struct mbuf *m, struct ifnet *
                          */                           */
                         if ((inet6sw[ip_protox[nxt]].pr_flags                          if ((inet6sw[ip_protox[nxt]].pr_flags
                             & PR_LASTHDR) != 0) {                              & PR_LASTHDR) != 0) {
                                 int error = ipsec6_input(m);                                  int error;
   
                                   SOFTNET_LOCK();
                                   error = ipsec6_input(m);
                                   SOFTNET_UNLOCK();
                                 if (error)                                  if (error)
                                         goto bad;                                          goto bad;
                         }                          }
                 }                  }
 #endif /* IPSEC */  #endif /* IPSEC */
   
                   SOFTNET_LOCK();
                 nxt = (*inet6sw[ip6_protox[nxt]].pr_input)(&m, &off, nxt);                  nxt = (*inet6sw[ip6_protox[nxt]].pr_input)(&m, &off, nxt);
                   SOFTNET_UNLOCK();
         }          }
         return;          return;
  bad:   bad:

Legend:
Removed from v.1.164.2.1  
changed lines
  Added in v.1.164.2.2

CVSweb <webmaster@jp.NetBSD.org>