[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.168 and 1.169

version 1.168, 2016/09/07 15:41:44 version 1.169, 2016/10/18 07:30:31
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 155  static int ip6_process_hopopts(struct mb
Line 156  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 223  ip6intr(void *arg __unused)
Line 232  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 243  ip6intr(void *arg __unused)
Line 254  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
 }  }
   
 void  void
Line 360  ip6_input(struct mbuf *m, struct ifnet *
Line 373  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 674  ip6_input(struct mbuf *m, struct ifnet *
Line 692  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);
                           SOFTNET_UNLOCK();
   
                           if (error != 0) {
                                   IP6_STATINC(IP6_STAT_CANTFORWARD);
                                   m_freem(m);
                                   return;
                           }
                 }                  }
                 if (!ours) {                  if (!ours) {
                         m_freem(m);                          m_freem(m);
Line 758  ip6_input(struct mbuf *m, struct ifnet *
Line 784  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.168  
changed lines
  Added in v.1.169

CVSweb <webmaster@jp.NetBSD.org>