[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.130.2.12 and 1.168

version 1.130.2.12, 2002/08/27 23:48:00 version 1.168, 2003/06/30 01:21:11
Line 108  __KERNEL_RCSID(0, "$NetBSD$");
Line 108  __KERNEL_RCSID(0, "$NetBSD$");
 #include "opt_pfil_hooks.h"  #include "opt_pfil_hooks.h"
 #include "opt_ipsec.h"  #include "opt_ipsec.h"
 #include "opt_mrouting.h"  #include "opt_mrouting.h"
   #include "opt_mbuftrace.h"
 #include "opt_inet_csum.h"  #include "opt_inet_csum.h"
   
 #include <sys/param.h>  #include <sys/param.h>
Line 192  int ip_forwsrcrt = IPFORWSRCRT;
Line 193  int ip_forwsrcrt = IPFORWSRCRT;
 int     ip_directedbcast = IPDIRECTEDBCAST;  int     ip_directedbcast = IPDIRECTEDBCAST;
 int     ip_allowsrcrt = IPALLOWSRCRT;  int     ip_allowsrcrt = IPALLOWSRCRT;
 int     ip_mtudisc = IPMTUDISC;  int     ip_mtudisc = IPMTUDISC;
 u_int   ip_mtudisc_timeout = IPMTUDISCTIMEOUT;  int     ip_mtudisc_timeout = IPMTUDISCTIMEOUT;
 #ifdef DIAGNOSTIC  #ifdef DIAGNOSTIC
 int     ipprintfs = 0;  int     ipprintfs = 0;
 #endif  #endif
   /*
    * XXX - Setting ip_checkinterface mostly implements the receive side of
    * the Strong ES model described in RFC 1122, but since the routing table
    * and transmit implementation do not implement the Strong ES model,
    * setting this to 1 results in an odd hybrid.
    *
    * XXX - ip_checkinterface currently must be disabled if you use ipnat
    * to translate the destination address to another local interface.
    *
    * XXX - ip_checkinterface must be disabled if you add IP aliases
    * to the loopback interface instead of the interface where the
    * packets for those addresses are received.
    */
   int     ip_checkinterface = 0;
   
   
 struct rttimer_queue *ip_mtudisc_timeout_q = NULL;  struct rttimer_queue *ip_mtudisc_timeout_q = NULL;
   
Line 205  u_long in_ifaddrhash;    /* size of hash
Line 221  u_long in_ifaddrhash;    /* size of hash
 int     in_ifaddrentries;                       /* total number of addrs */  int     in_ifaddrentries;                       /* total number of addrs */
 struct  in_ifaddrhead in_ifaddr;  struct  in_ifaddrhead in_ifaddr;
 struct  in_ifaddrhashhead *in_ifaddrhashtbl;  struct  in_ifaddrhashhead *in_ifaddrhashtbl;
   u_long  in_multihash;                           /* size of hash table - 1 */
   int     in_multientries;                        /* total number of addrs */
   struct  in_multihead in_multi;
   struct  in_multihashhead *in_multihashtbl;
 struct  ifqueue ipintrq;  struct  ifqueue ipintrq;
 struct  ipstat  ipstat;  struct  ipstat  ipstat;
 u_int16_t       ip_id;  u_int16_t       ip_id;
Line 257  do {         \
Line 277  do {         \
                 printf("%s:%d: ipq already locked\n", __FILE__, __LINE__); \                  printf("%s:%d: ipq already locked\n", __FILE__, __LINE__); \
                 panic("ipq_lock");                                      \                  panic("ipq_lock");                                      \
         }                                                               \          }                                                               \
 } while (0)  } while (/*CONSTCOND*/ 0)
 #define IPQ_LOCK_CHECK()                                                \  #define IPQ_LOCK_CHECK()                                                \
 do {                                                                    \  do {                                                                    \
         if (ipq_locked == 0) {                                          \          if (ipq_locked == 0) {                                          \
                 printf("%s:%d: ipq lock not held\n", __FILE__, __LINE__); \                  printf("%s:%d: ipq lock not held\n", __FILE__, __LINE__); \
                 panic("ipq lock check");                                \                  panic("ipq lock check");                                \
         }                                                               \          }                                                               \
 } while (0)  } while (/*CONSTCOND*/ 0)
 #else  #else
 #define IPQ_LOCK()              (void) ipq_lock_try()  #define IPQ_LOCK()              (void) ipq_lock_try()
 #define IPQ_LOCK_CHECK()        /* nothing */  #define IPQ_LOCK_CHECK()        /* nothing */
Line 272  do {         \
Line 292  do {         \
   
 #define IPQ_UNLOCK()            ipq_unlock()  #define IPQ_UNLOCK()            ipq_unlock()
   
   struct pool inmulti_pool;
 struct pool ipqent_pool;  struct pool ipqent_pool;
   
 #ifdef INET_CSUM_COUNTERS  #ifdef INET_CSUM_COUNTERS
Line 309  static struct ip_srcrt {
Line 330  static struct ip_srcrt {
   
 static void save_rte __P((u_char *, struct in_addr));  static void save_rte __P((u_char *, struct in_addr));
   
   #ifdef MBUFTRACE
   struct mowner ip_rx_mowner = { "internet", "rx" };
   struct mowner ip_tx_mowner = { "internet", "tx" };
   #endif
   
 /*  /*
  * IP initialization: fill in IP protocol switch table.   * IP initialization: fill in IP protocol switch table.
  * All protocols not implemented in kernel go to raw IP protocol handler.   * All protocols not implemented in kernel go to raw IP protocol handler.
Line 319  ip_init()
Line 345  ip_init()
         struct protosw *pr;          struct protosw *pr;
         int i;          int i;
   
           pool_init(&inmulti_pool, sizeof(struct in_multi), 0, 0, 0, "inmltpl",
               NULL);
         pool_init(&ipqent_pool, sizeof(struct ipqent), 0, 0, 0, "ipqepl",          pool_init(&ipqent_pool, sizeof(struct ipqent), 0, 0, 0, "ipqepl",
             NULL);              NULL);
   
Line 338  ip_init()
Line 366  ip_init()
         TAILQ_INIT(&in_ifaddr);          TAILQ_INIT(&in_ifaddr);
         in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, M_IFADDR,          in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, M_IFADDR,
             M_WAITOK, &in_ifaddrhash);              M_WAITOK, &in_ifaddrhash);
         if (ip_mtudisc != 0)          in_multihashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, M_IPMADDR,
                 ip_mtudisc_timeout_q =              M_WAITOK, &in_multihash);
                     rt_timer_queue_create(ip_mtudisc_timeout);          ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout);
 #ifdef GATEWAY  #ifdef GATEWAY
         ipflow_init();          ipflow_init();
 #endif  #endif
Line 360  ip_init()
Line 388  ip_init()
         evcnt_attach_static(&ip_hwcsum_ok);          evcnt_attach_static(&ip_hwcsum_ok);
         evcnt_attach_static(&ip_swcsum);          evcnt_attach_static(&ip_swcsum);
 #endif /* INET_CSUM_COUNTERS */  #endif /* INET_CSUM_COUNTERS */
   
   #ifdef MBUFTRACE
           MOWNER_ATTACH(&ip_tx_mowner);
           MOWNER_ATTACH(&ip_rx_mowner);
   #endif /* MBUFTRACE */
 }  }
   
 struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };  struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };
Line 380  ipintr()
Line 413  ipintr()
                 splx(s);                  splx(s);
                 if (m == 0)                  if (m == 0)
                         return;                          return;
                   MCLAIM(m, &ip_rx_mowner);
                 ip_input(m);                  ip_input(m);
         }          }
 }  }
Line 398  ip_input(struct mbuf *m)
Line 432  ip_input(struct mbuf *m)
         struct ipqent *ipqe;          struct ipqent *ipqe;
         int hlen = 0, mff, len;          int hlen = 0, mff, len;
         int downmatch;          int downmatch;
           int checkif;
   
           MCLAIM(m, &ip_rx_mowner);
 #ifdef  DIAGNOSTIC  #ifdef  DIAGNOSTIC
         if ((m->m_flags & M_PKTHDR) == 0)          if ((m->m_flags & M_PKTHDR) == 0)
                 panic("ipintr no HDR");                  panic("ipintr no HDR");
Line 413  ip_input(struct mbuf *m)
Line 449  ip_input(struct mbuf *m)
                 m->m_flags &= ~M_AUTHIPDGM;                  m->m_flags &= ~M_AUTHIPDGM;
         }          }
 #endif  #endif
   
         /*          /*
          * If no IP addresses have been set yet but the interfaces           * If no IP addresses have been set yet but the interfaces
          * are receiving, can't do anything with incoming packets yet.           * are receiving, can't do anything with incoming packets yet.
Line 554  ip_input(struct mbuf *m)
Line 591  ip_input(struct mbuf *m)
 #endif  #endif
         {          {
                 if (pfil_run_hooks(&inet_pfil_hook, &m, m->m_pkthdr.rcvif,                  if (pfil_run_hooks(&inet_pfil_hook, &m, m->m_pkthdr.rcvif,
                                    PFIL_IN) != 0)                      PFIL_IN) != 0)
                 return;                          return;
                 if (m == NULL)                  if (m == NULL)
                         return;                          return;
                 ip = mtod(m, struct ip *);                  ip = mtod(m, struct ip *);
Line 582  ip_input(struct mbuf *m)
Line 619  ip_input(struct mbuf *m)
                 return;                  return;
   
         /*          /*
            * Enable a consistency check between the destination address
            * and the arrival interface for a unicast packet (the RFC 1122
            * strong ES model) if IP forwarding is disabled and the packet
            * is not locally generated.
            *
            * XXX - Checking also should be disabled if the destination
            * address is ipnat'ed to a different interface.
            *
            * XXX - Checking is incompatible with IP aliases added
            * to the loopback interface instead of the interface where
            * the packets are received.
            *
            * XXX - We need to add a per ifaddr flag for this so that
            * we get finer grain control.
            */
           checkif = ip_checkinterface && (ipforwarding == 0) &&
               (m->m_pkthdr.rcvif != NULL) &&
               ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0);
   
           /*
          * 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.
          *           *
          * Traditional 4.4BSD did not consult IFF_UP at all.           * Traditional 4.4BSD did not consult IFF_UP at all.
Line 591  ip_input(struct mbuf *m)
Line 648  ip_input(struct mbuf *m)
         downmatch = 0;          downmatch = 0;
         LIST_FOREACH(ia, &IN_IFADDR_HASH(ip->ip_dst.s_addr), ia_hash) {          LIST_FOREACH(ia, &IN_IFADDR_HASH(ip->ip_dst.s_addr), ia_hash) {
                 if (in_hosteq(ia->ia_addr.sin_addr, ip->ip_dst)) {                  if (in_hosteq(ia->ia_addr.sin_addr, ip->ip_dst)) {
                           if (checkif && ia->ia_ifp != m->m_pkthdr.rcvif)
                                   continue;
                         if ((ia->ia_ifp->if_flags & IFF_UP) != 0)                          if ((ia->ia_ifp->if_flags & IFF_UP) != 0)
                                 break;                                  break;
                         else                          else
Line 1391  ip_srcroute()
Line 1450  ip_srcroute()
         if (m == 0)          if (m == 0)
                 return ((struct mbuf *)0);                  return ((struct mbuf *)0);
   
           MCLAIM(m, &inetdomain.dom_mowner);
 #define OPTSIZ  (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt))  #define OPTSIZ  (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt))
   
         /* length is (nhops+1)*sizeof(addr) + sizeof(nop + srcrt header) */          /* length is (nhops+1)*sizeof(addr) + sizeof(nop + srcrt header) */
Line 1511  ip_forward(m, srcrt)
Line 1571  ip_forward(m, srcrt)
 #endif  #endif
   
         /*          /*
            * We are now in the output path.
            */
           MCLAIM(m, &ip_tx_mowner);
   
           /*
          * Clear any in-bound checksum flags for this packet.           * Clear any in-bound checksum flags for this packet.
          */           */
         m->m_pkthdr.csum_flags = 0;          m->m_pkthdr.csum_flags = 0;
Line 1828  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1893  ip_sysctl(name, namelen, oldp, oldlenp, 
         case IPCTL_MTUDISC:          case IPCTL_MTUDISC:
                 error = sysctl_int(oldp, oldlenp, newp, newlen,                  error = sysctl_int(oldp, oldlenp, newp, newlen,
                     &ip_mtudisc);                      &ip_mtudisc);
                 if (ip_mtudisc != 0 && ip_mtudisc_timeout_q == NULL) {                  if (error == 0 && ip_mtudisc == 0)
                         ip_mtudisc_timeout_q =                          rt_timer_queue_remove_all(ip_mtudisc_timeout_q, TRUE);
                             rt_timer_queue_create(ip_mtudisc_timeout);  
                 } else if (ip_mtudisc == 0 && ip_mtudisc_timeout_q != NULL) {  
                         rt_timer_queue_destroy(ip_mtudisc_timeout_q, TRUE);  
                         ip_mtudisc_timeout_q = NULL;  
                 }  
                 return error;                  return error;
         case IPCTL_ANONPORTMIN:          case IPCTL_ANONPORTMIN:
                 old = anonportmin;                  old = anonportmin;
Line 1863  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1923  ip_sysctl(name, namelen, oldp, oldlenp, 
                 }                  }
                 return (error);                  return (error);
         case IPCTL_MTUDISCTIMEOUT:          case IPCTL_MTUDISCTIMEOUT:
                   old = ip_mtudisc_timeout;
                 error = sysctl_int(oldp, oldlenp, newp, newlen,                  error = sysctl_int(oldp, oldlenp, newp, newlen,
                    &ip_mtudisc_timeout);                     &ip_mtudisc_timeout);
                 if (ip_mtudisc_timeout_q != NULL)                  if (ip_mtudisc_timeout < 0) {
                           ip_mtudisc_timeout = old;
                           return (EINVAL);
                   }
                   if (error == 0)
                         rt_timer_queue_change(ip_mtudisc_timeout_q,                          rt_timer_queue_change(ip_mtudisc_timeout_q,
                                               ip_mtudisc_timeout);                                                ip_mtudisc_timeout);
                 return (error);                  return (error);
Line 1887  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1952  ip_sysctl(name, namelen, oldp, oldlenp, 
                     &hostzeroisbroadcast));                      &hostzeroisbroadcast));
 #if NGIF > 0  #if NGIF > 0
         case IPCTL_GIF_TTL:          case IPCTL_GIF_TTL:
                 return(sysctl_int(oldp, oldlenp, newp, newlen,                  return (sysctl_int(oldp, oldlenp, newp, newlen,
                                   &ip_gif_ttl));                                    &ip_gif_ttl));
 #endif  #endif
   
 #if NGRE > 0  #if NGRE > 0
         case IPCTL_GRE_TTL:          case IPCTL_GRE_TTL:
                 return(sysctl_int(oldp, oldlenp, newp, newlen,                  return (sysctl_int(oldp, oldlenp, newp, newlen,
                                   &ip_gre_ttl));                                    &ip_gre_ttl));
 #endif  #endif
   
Line 1926  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1991  ip_sysctl(name, namelen, oldp, oldlenp, 
                 return (sysctl_int(oldp, oldlenp, newp, newlen,                  return (sysctl_int(oldp, oldlenp, newp, newlen,
                     &ip_maxfragpackets));                      &ip_maxfragpackets));
   
           case IPCTL_CHECKINTERFACE:
                   return (sysctl_int(oldp, oldlenp, newp, newlen,
                       &ip_checkinterface));
         default:          default:
                 return (EOPNOTSUPP);                  return (EOPNOTSUPP);
         }          }

Legend:
Removed from v.1.130.2.12  
changed lines
  Added in v.1.168

CVSweb <webmaster@jp.NetBSD.org>