[BACK]Return to ip_input.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / netinet

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/netinet/ip_input.c between version 1.319.4.7 and 1.319.4.8

version 1.319.4.7, 2016/10/05 20:56:09 version 1.319.4.8, 2016/12/05 10:55:28
Line 101  __KERNEL_RCSID(0, "$NetBSD$");
Line 101  __KERNEL_RCSID(0, "$NetBSD$");
 #include "opt_mrouting.h"  #include "opt_mrouting.h"
 #include "opt_mbuftrace.h"  #include "opt_mbuftrace.h"
 #include "opt_inet_csum.h"  #include "opt_inet_csum.h"
   #include "opt_net_mpsafe.h"
 #endif  #endif
   
 #include "arp.h"  #include "arp.h"
Line 294  static struct in_ifaddr *ip_match_our_ad
Line 295  static struct in_ifaddr *ip_match_our_ad
 static struct in_ifaddr *ip_match_our_address_broadcast(struct ifnet *,  static struct in_ifaddr *ip_match_our_address_broadcast(struct ifnet *,
                             struct ip *);                              struct ip *);
   
 /* XXX: Not yet enabled. */  #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_LOCK()          KASSERT(mutex_owned(softnet_lock))
 #define SOFTNET_UNLOCK()        KASSERT(mutex_owned(softnet_lock))  #define SOFTNET_UNLOCK()        KASSERT(mutex_owned(softnet_lock))
   #endif
   
 /*  /*
  * IP initialization: fill in IP protocol switch table.   * IP initialization: fill in IP protocol switch table.
Line 437  ipintr(void *arg __unused)
Line 442  ipintr(void *arg __unused)
   
         KASSERT(cpu_softintr_p());          KASSERT(cpu_softintr_p());
   
   #ifndef NET_MPSAFE
         mutex_enter(softnet_lock);          mutex_enter(softnet_lock);
   #endif
         while ((m = pktq_dequeue(ip_pktq)) != NULL) {          while ((m = pktq_dequeue(ip_pktq)) != NULL) {
                 ip_input(m);                  ip_input(m);
         }          }
   #ifndef NET_MPSAFE
         mutex_exit(softnet_lock);          mutex_exit(softnet_lock);
   #endif
 }  }
   
 /*  /*
Line 614  ip_input(struct mbuf *m)
Line 623  ip_input(struct mbuf *m)
                 struct in_addr odst = ip->ip_dst;                  struct in_addr odst = ip->ip_dst;
                 bool freed;                  bool freed;
   
                 SOFTNET_LOCK();  
                 freed = pfil_run_hooks(inet_pfil_hook, &m, ifp, PFIL_IN) != 0;                  freed = pfil_run_hooks(inet_pfil_hook, &m, ifp, PFIL_IN) != 0;
                 SOFTNET_UNLOCK();  
                 if (freed || m == NULL) {                  if (freed || m == NULL) {
                           m = NULL;
                         goto out;                          goto out;
                 }                  }
                 ip = mtod(m, struct ip *);                  ip = mtod(m, struct ip *);
Line 647  ip_input(struct mbuf *m)
Line 655  ip_input(struct mbuf *m)
                 if ((*altq_input)(m, AF_INET) == 0) {                  if ((*altq_input)(m, AF_INET) == 0) {
                         /* Packet dropped by traffic conditioner. */                          /* Packet dropped by traffic conditioner. */
                         SOFTNET_UNLOCK();                          SOFTNET_UNLOCK();
                           m = NULL;
                         goto out;                          goto out;
                 }                  }
                 SOFTNET_UNLOCK();                  SOFTNET_UNLOCK();
Line 660  ip_input(struct mbuf *m)
Line 669  ip_input(struct mbuf *m)
          * to be sent and the original packet to be freed).           * to be sent and the original packet to be freed).
          */           */
         ip_nhops = 0;           /* for source routed packets */          ip_nhops = 0;           /* for source routed packets */
         if (hlen > sizeof (struct ip) && ip_dooptions(m))          if (hlen > sizeof (struct ip) && ip_dooptions(m)) {
                   m = NULL;
                 goto out;                  goto out;
           }
   
         /*          /*
          * Check our list of addresses, to see if the packet is for us.           * Check our list of addresses, to see if the packet is for us.
Line 829  ours:
Line 840  ours:
                  * is expensive, so explore ia here again.                   * is expensive, so explore ia here again.
                  */                   */
                 s = pserialize_read_enter();                  s = pserialize_read_enter();
                 _ia = in_get_ia(ip->ip_dst.s_addr);                  _ia = in_get_ia(ip->ip_dst);
                 _ia->ia_ifa.ifa_data.ifad_inbytes += ntohs(ip->ip_len);                  _ia->ia_ifa.ifa_data.ifad_inbytes += ntohs(ip->ip_len);
                 pserialize_read_exit(s);                  pserialize_read_exit(s);
         }          }
Line 1330  ip_forward(struct mbuf *m, int srcrt, st
Line 1341  ip_forward(struct mbuf *m, int srcrt, st
                 return;                  return;
         }          }
   
         SOFTNET_LOCK();  
   
         if (ip->ip_ttl <= IPTTLDEC) {          if (ip->ip_ttl <= IPTTLDEC) {
                 icmp_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, dest, 0);                  icmp_error(m, ICMP_TIMXCEED, ICMP_TIMXCEED_INTRANS, dest, 0);
                 SOFTNET_UNLOCK();  
                 return;                  return;
         }          }
   
Line 1344  ip_forward(struct mbuf *m, int srcrt, st
Line 1352  ip_forward(struct mbuf *m, int srcrt, st
         if ((rt = rtcache_lookup(ro, &u.dst)) == NULL) {          if ((rt = rtcache_lookup(ro, &u.dst)) == NULL) {
                 percpu_putref(ipforward_rt_percpu);                  percpu_putref(ipforward_rt_percpu);
                 icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0);                  icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0);
                 SOFTNET_UNLOCK();  
                 return;                  return;
         }          }
   
Line 1415  ip_forward(struct mbuf *m, int srcrt, st
Line 1422  ip_forward(struct mbuf *m, int srcrt, st
         }          }
   
         percpu_putref(ipforward_rt_percpu);          percpu_putref(ipforward_rt_percpu);
         SOFTNET_UNLOCK();  
         return;          return;
   
 redirect:  redirect:
 error:  error:
         if (mcopy == NULL) {          if (mcopy == NULL) {
                 percpu_putref(ipforward_rt_percpu);                  percpu_putref(ipforward_rt_percpu);
                 SOFTNET_UNLOCK();  
                 return;                  return;
         }          }
   
Line 1464  error:
Line 1469  error:
                 if (mcopy)                  if (mcopy)
                         m_freem(mcopy);                          m_freem(mcopy);
                 percpu_putref(ipforward_rt_percpu);                  percpu_putref(ipforward_rt_percpu);
                 SOFTNET_UNLOCK();  
                 return;                  return;
         }          }
         icmp_error(mcopy, type, code, dest, destmtu);          icmp_error(mcopy, type, code, dest, destmtu);
         percpu_putref(ipforward_rt_percpu);          percpu_putref(ipforward_rt_percpu);
         SOFTNET_UNLOCK();  
 }  }
   
 void  void

Legend:
Removed from v.1.319.4.7  
changed lines
  Added in v.1.319.4.8

CVSweb <webmaster@jp.NetBSD.org>