[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.266 and 1.266.2.1

version 1.266, 2008/04/12 05:58:22 version 1.266.2.1, 2008/05/18 12:35:29
Line 45 
Line 45 
  * 2. Redistributions in binary form must reproduce the above copyright   * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the   *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.   *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software  
  *    must display the following acknowledgement:  
  *      This product includes software developed by the NetBSD  
  *      Foundation, Inc. and its contributors.  
  * 4. Neither the name of The NetBSD Foundation nor the names of its  
  *    contributors may be used to endorse or promote products derived  
  *    from this software without specific prior written permission.  
  *   *
  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS   * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
Line 149  __KERNEL_RCSID(0, "$NetBSD$");
Line 142  __KERNEL_RCSID(0, "$NetBSD$");
   
 #ifdef IPSEC  #ifdef IPSEC
 #include <netinet6/ipsec.h>  #include <netinet6/ipsec.h>
   #include <netinet6/ipsec_private.h>
 #include <netkey/key.h>  #include <netkey/key.h>
 #endif  #endif
 #ifdef FAST_IPSEC  #ifdef FAST_IPSEC
Line 426  ip_init(void)
Line 420  ip_init(void)
         ip_nmbclusters_changed();          ip_nmbclusters_changed();
   
         TAILQ_INIT(&in_ifaddrhead);          TAILQ_INIT(&in_ifaddrhead);
         in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, M_IFADDR,          in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
             M_WAITOK, &in_ifaddrhash);              &in_ifaddrhash);
         in_multihashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, M_IPMADDR,          in_multihashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, true,
             M_WAITOK, &in_multihash);              &in_multihash);
         ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout);          ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout);
 #ifdef GATEWAY  #ifdef GATEWAY
         ipflow_init(ip_hashsize);          ipflow_init(ip_hashsize);
Line 468  ipintr(void)
Line 462  ipintr(void)
         int s;          int s;
         struct mbuf *m;          struct mbuf *m;
   
           mutex_enter(softnet_lock);
           KERNEL_LOCK(1, NULL);
         while (!IF_IS_EMPTY(&ipintrq)) {          while (!IF_IS_EMPTY(&ipintrq)) {
                 s = splnet();                  s = splnet();
                 IF_DEQUEUE(&ipintrq, m);                  IF_DEQUEUE(&ipintrq, m);
                 splx(s);                  splx(s);
                 if (m == 0)                  if (m == NULL)
                         return;                          break;
                 ip_input(m);                  ip_input(m);
         }          }
           KERNEL_UNLOCK_ONE(NULL);
           mutex_exit(softnet_lock);
 }  }
   
 /*  /*
Line 835  ip_input(struct mbuf *m)
Line 833  ip_input(struct mbuf *m)
                 }                  }
 #ifdef IPSEC  #ifdef IPSEC
                 if (ipsec4_in_reject(m, NULL)) {                  if (ipsec4_in_reject(m, NULL)) {
                         ipsecstat.in_polvio++;                          IPSEC_STATINC(IPSEC_STAT_IN_POLVIO);
                         goto bad;                          goto bad;
                 }                  }
 #endif  #endif
Line 1000  found:
Line 998  found:
          */           */
         if ((inetsw[ip_protox[ip->ip_p]].pr_flags & PR_LASTHDR) != 0 &&          if ((inetsw[ip_protox[ip->ip_p]].pr_flags & PR_LASTHDR) != 0 &&
             ipsec4_in_reject(m, NULL)) {              ipsec4_in_reject(m, NULL)) {
                 ipsecstat.in_polvio++;                  IPSEC_STATINC(IPSEC_STAT_IN_POLVIO);
                 goto bad;                  goto bad;
         }          }
 #endif  #endif
Line 1388  ip_slowtimo(void)
Line 1386  ip_slowtimo(void)
         static u_int dropscanidx = 0;          static u_int dropscanidx = 0;
         u_int i;          u_int i;
         u_int median_ttl;          u_int median_ttl;
         int s = splsoftnet();  
           mutex_enter(softnet_lock);
           KERNEL_LOCK(1, NULL);
   
         IPQ_LOCK();          IPQ_LOCK();
   
Line 1430  ip_slowtimo(void)
Line 1430  ip_slowtimo(void)
                 dropscanidx = i;                  dropscanidx = i;
         }          }
         IPQ_UNLOCK();          IPQ_UNLOCK();
         splx(s);  
           KERNEL_UNLOCK_ONE(NULL);
           mutex_exit(softnet_lock);
 }  }
   
 /*  /*
  * Drain off all datagram fragments.   * Drain off all datagram fragments.  Don't acquire softnet_lock as
    * can be called from hardware interrupt context.
  */   */
 void  void
 ip_drain(void)  ip_drain(void)
 {  {
   
           KERNEL_LOCK(1, NULL);
   
         /*          /*
          * We may be called from a device's interrupt context.  If           * We may be called from a device's interrupt context.  If
          * the ipq is already busy, just bail out now.           * the ipq is already busy, just bail out now.
          */           */
         if (ipq_lock_try() == 0)          if (ipq_lock_try() != 0) {
                 return;                  /*
                    * Drop half the total fragments now. If more mbufs are
         /*                   * needed, we will be called again soon.
          * Drop half the total fragments now. If more mbufs are needed,                   */
          *  we will be called again soon.                  ip_reass_drophalf();
          */                  IPQ_UNLOCK();
         ip_reass_drophalf();          }
   
         IPQ_UNLOCK();          KERNEL_UNLOCK_ONE(NULL);
 }  }
   
 /*  /*
Line 2194  sysctl_net_inet_ip_hashsize(SYSCTLFN_ARG
Line 2199  sysctl_net_inet_ip_hashsize(SYSCTLFN_ARG
 }  }
 #endif /* GATEWAY */  #endif /* GATEWAY */
   
 static void  
 ipstat_convert_to_user_cb(void *v1, void *v2, struct cpu_info *ci)  
 {  
         uint64_t *ipsc = v1;  
         uint64_t *ips = v2;  
         u_int i;  
   
         for (i = 0; i < IP_NSTATS; i++)  
                 ips[i] += ipsc[i];  
 }  
   
 static void  
 ipstat_convert_to_user(uint64_t *ips)  
 {  
   
         memset(ips, 0, sizeof(uint64_t) * IP_NSTATS);  
         percpu_foreach(ipstat_percpu, ipstat_convert_to_user_cb, ips);  
 }  
   
 static int  static int
 sysctl_net_inet_ip_stats(SYSCTLFN_ARGS)  sysctl_net_inet_ip_stats(SYSCTLFN_ARGS)
 {  {
         struct sysctlnode node;  
         uint64_t ips[IP_NSTATS];  
   
         ipstat_convert_to_user(ips);          return (NETSTAT_SYSCTL(ipstat_percpu, IP_NSTATS));
         node = *rnode;  
         node.sysctl_data = ips;  
         node.sysctl_size = sizeof(ips);  
         return (sysctl_lookup(SYSCTLFN_CALL(&node)));  
 }  }
   
 SYSCTL_SETUP(sysctl_net_inet_ip_setup, "sysctl net.inet.ip subtree setup")  SYSCTL_SETUP(sysctl_net_inet_ip_setup, "sysctl net.inet.ip subtree setup")

Legend:
Removed from v.1.266  
changed lines
  Added in v.1.266.2.1

CVSweb <webmaster@jp.NetBSD.org>