[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.208 and 1.208.2.1

version 1.208, 2004/12/19 06:42:24 version 1.208.2.1, 2005/04/29 11:29:33
Line 131  __KERNEL_RCSID(0, "$NetBSD$");
Line 131  __KERNEL_RCSID(0, "$NetBSD$");
 #include <netinet/in_systm.h>  #include <netinet/in_systm.h>
 #include <netinet/ip.h>  #include <netinet/ip.h>
 #include <netinet/in_pcb.h>  #include <netinet/in_pcb.h>
   #include <netinet/in_proto.h>
 #include <netinet/in_var.h>  #include <netinet/in_var.h>
 #include <netinet/ip_var.h>  #include <netinet/ip_var.h>
 #include <netinet/ip_icmp.h>  #include <netinet/ip_icmp.h>
Line 200  int ipprintfs = 0;
Line 201  int ipprintfs = 0;
 #endif  #endif
   
 int     ip_do_randomid = 0;  int     ip_do_randomid = 0;
 int     ip_do_loopback_cksum = 0;  
   
 /*  /*
  * XXX - Setting ip_checkinterface mostly implements the receive side of   * XXX - Setting ip_checkinterface mostly implements the receive side of
Line 223  struct rttimer_queue *ip_mtudisc_timeout
Line 223  struct rttimer_queue *ip_mtudisc_timeout
 int     ipqmaxlen = IFQ_MAXLEN;  int     ipqmaxlen = IFQ_MAXLEN;
 u_long  in_ifaddrhash;                          /* size of hash table - 1 */  u_long  in_ifaddrhash;                          /* size of hash table - 1 */
 int     in_ifaddrentries;                       /* total number of addrs */  int     in_ifaddrentries;                       /* total number of addrs */
 struct in_ifaddrhead in_ifaddrhead;  struct in_ifaddrhead in_ifaddrhead;
 struct  in_ifaddrhashhead *in_ifaddrhashtbl;  struct  in_ifaddrhashhead *in_ifaddrhashtbl;
 u_long  in_multihash;                           /* size of hash table - 1 */  u_long  in_multihash;                           /* size of hash table - 1 */
 int     in_multientries;                        /* total number of addrs */  int     in_multientries;                        /* total number of addrs */
Line 241  struct pfil_head inet_pfil_hook;
Line 241  struct pfil_head inet_pfil_hook;
  * recalculate IP parameters derived from nmbclusters.   * recalculate IP parameters derived from nmbclusters.
  */   */
 static int      ip_nmbclusters;                 /* copy of nmbclusters */  static int      ip_nmbclusters;                 /* copy of nmbclusters */
 static void     ip_nmbclusters_changed __P((void));     /* recalc limits */  static void     ip_nmbclusters_changed(void);   /* recalc limits */
   
 #define CHECK_NMBCLUSTER_PARAMS()                               \  #define CHECK_NMBCLUSTER_PARAMS()                               \
 do {                                                            \  do {                                                            \
Line 257  do {        \
Line 257  do {        \
         (((((x) & 0xF) | ((((x) >> 8) & 0xF) << 4)) ^ (y)) & IPREASS_HMASK)          (((((x) & 0xF) | ((((x) >> 8) & 0xF) << 4)) ^ (y)) & IPREASS_HMASK)
 struct ipqhead ipq[IPREASS_NHASH];  struct ipqhead ipq[IPREASS_NHASH];
 int     ipq_locked;  int     ipq_locked;
 static int      ip_nfragpackets;        /* packets in reass queue */  static int      ip_nfragpackets;        /* packets in reass queue */
 static int      ip_nfrags;              /* total fragments in reass queues */  static int      ip_nfrags;              /* total fragments in reass queues */
   
 int     ip_maxfragpackets = 200;        /* limit on packets. XXX sysctl */  int     ip_maxfragpackets = 200;        /* limit on packets. XXX sysctl */
Line 267  int ip_maxfrags;          /* limit on fr
Line 267  int ip_maxfrags;          /* limit on fr
 /*  /*
  * Additive-Increase/Multiplicative-Decrease (AIMD) strategy for   * Additive-Increase/Multiplicative-Decrease (AIMD) strategy for
  * IP reassembly queue buffer managment.   * IP reassembly queue buffer managment.
  *   *
  * We keep a count of total IP fragments (NB: not fragmented packets!)   * We keep a count of total IP fragments (NB: not fragmented packets!)
  * awaiting reassembly (ip_nfrags) and a limit (ip_maxfrags) on fragments.   * awaiting reassembly (ip_nfrags) and a limit (ip_maxfrags) on fragments.
  * If ip_nfrags exceeds ip_maxfrags the limit, we drop half the   * If ip_nfrags exceeds ip_maxfrags the limit, we drop half the
Line 275  int ip_maxfrags;          /* limit on fr
Line 275  int ip_maxfrags;          /* limit on fr
  * repeatedly deleting single packets under heavy fragmentation load   * repeatedly deleting single packets under heavy fragmentation load
  * (e.g., from lossy NFS peers).   * (e.g., from lossy NFS peers).
  */   */
 static u_int    ip_reass_ttl_decr __P((u_int ticks));  static u_int    ip_reass_ttl_decr(u_int ticks);
 static void     ip_reass_drophalf __P((void));  static void     ip_reass_drophalf(void);
   
   
 static __inline int ipq_lock_try __P((void));  static __inline int ipq_lock_try(void);
 static __inline void ipq_unlock __P((void));  static __inline void ipq_unlock(void);
   
 static __inline int  static __inline int
 ipq_lock_try()  ipq_lock_try(void)
 {  {
         int s;          int s;
   
Line 302  ipq_lock_try()
Line 302  ipq_lock_try()
 }  }
   
 static __inline void  static __inline void
 ipq_unlock()  ipq_unlock(void)
 {  {
         int s;          int s;
   
Line 373  static struct ip_srcrt {
Line 373  static struct ip_srcrt {
         struct  in_addr route[MAX_IPOPTLEN/sizeof(struct in_addr)];          struct  in_addr route[MAX_IPOPTLEN/sizeof(struct in_addr)];
 } ip_srcrt;  } ip_srcrt;
   
 static void save_rte __P((u_char *, struct in_addr));  static void save_rte(u_char *, struct in_addr);
   
 #ifdef MBUFTRACE  #ifdef MBUFTRACE
 struct mowner ip_rx_mowner = { "internet", "rx" };  struct mowner ip_rx_mowner = { "internet", "rx" };
Line 395  ip_nmbclusters_changed(void)
Line 395  ip_nmbclusters_changed(void)
  * All protocols not implemented in kernel go to raw IP protocol handler.   * All protocols not implemented in kernel go to raw IP protocol handler.
  */   */
 void  void
 ip_init()  ip_init(void)
 {  {
         const struct protosw *pr;          const struct protosw *pr;
         int i;          int i;
Line 452  struct route ipforward_rt;
Line 452  struct route ipforward_rt;
  * IP software interrupt routine   * IP software interrupt routine
  */   */
 void  void
 ipintr()  ipintr(void)
 {  {
         int s;          int s;
         struct mbuf *m;          struct mbuf *m;
Line 668  ip_input(struct mbuf *m)
Line 668  ip_input(struct mbuf *m)
                  * default route for hosts on 1.1.1.0/24.  Of course this                   * default route for hosts on 1.1.1.0/24.  Of course this
                  * also requires a "map tlp0 ..." to complete the story.                   * also requires a "map tlp0 ..." to complete the story.
                  * One might argue whether or not this kind of network config.                   * One might argue whether or not this kind of network config.
                  * should be supported in this manner...                   * should be supported in this manner...
                  */                   */
                 srcrt = (odst.s_addr != ip->ip_dst.s_addr);                  srcrt = (odst.s_addr != ip->ip_dst.s_addr);
         }          }
Line 733  ip_input(struct mbuf *m)
Line 733  ip_input(struct mbuf *m)
         if (ia != NULL)          if (ia != NULL)
                 goto ours;                  goto ours;
         if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {          if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {
                 TAILQ_FOREACH(ifa, &m->m_pkthdr.rcvif->if_addrlist, ifa_list) {                  IFADDR_FOREACH(ifa, m->m_pkthdr.rcvif) {
                         if (ifa->ifa_addr->sa_family != AF_INET)                          if (ifa->ifa_addr->sa_family != AF_INET)
                                 continue;                                  continue;
                         ia = ifatoia(ifa);                          ia = ifatoia(ifa);
Line 836  ip_input(struct mbuf *m)
Line 836  ip_input(struct mbuf *m)
                         sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);                          sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);
                 } else {                  } else {
                         sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,                          sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,
                                                    IP_FORWARDING, &error);                                                     IP_FORWARDING, &error);
                 }                  }
                 if (sp == NULL) {       /* NB: can happen if error */                  if (sp == NULL) {       /* NB: can happen if error */
                         splx(s);                          splx(s);
Line 986  found:
Line 986  found:
                  * done.  If so, then just pass it along.  This tag gets                   * done.  If so, then just pass it along.  This tag gets
                  * set during AH, ESP, etc. input handling, before the                   * set during AH, ESP, etc. input handling, before the
                  * packet is returned to the ip input queue for delivery.                   * packet is returned to the ip input queue for delivery.
                  */                   */
                 mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL);                  mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL);
                 s = splsoftnet();                  s = splsoftnet();
                 if (mtag != NULL) {                  if (mtag != NULL) {
Line 994  found:
Line 994  found:
                         sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);                          sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);
                 } else {                  } else {
                         sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,                          sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,
                                                    IP_FORWARDING, &error);                                                     IP_FORWARDING, &error);
                 }                  }
                 if (sp != NULL) {                  if (sp != NULL) {
                         /*                          /*
Line 1044  badcsum:
Line 1044  badcsum:
  * is given as fp; otherwise have to make a chain.   * is given as fp; otherwise have to make a chain.
  */   */
 struct mbuf *  struct mbuf *
 ip_reass(ipqe, fp, ipqhead)  ip_reass(struct ipqent *ipqe, struct ipq *fp, struct ipqhead *ipqhead)
         struct ipqent *ipqe;  
         struct ipq *fp;  
         struct ipqhead *ipqhead;  
 {  {
         struct mbuf *m = ipqe->ipqe_m;          struct mbuf *m = ipqe->ipqe_m;
         struct ipqent *nq, *p, *q;          struct ipqent *nq, *p, *q;
Line 1078  ip_reass(ipqe, fp, ipqhead)
Line 1075  ip_reass(ipqe, fp, ipqhead)
          * We are about to add a fragment; increment frag count.           * We are about to add a fragment; increment frag count.
          */           */
         ip_nfrags++;          ip_nfrags++;
   
         /*          /*
          * If first fragment to arrive, create a reassembly queue.           * If first fragment to arrive, create a reassembly queue.
          */           */
Line 1229  insert:
Line 1226  insert:
                 for (t = m; t; t = t->m_next)                  for (t = m; t; t = t->m_next)
                         plen += t->m_len;                          plen += t->m_len;
                 m->m_pkthdr.len = plen;                  m->m_pkthdr.len = plen;
                   m->m_pkthdr.csum_flags = 0;
         }          }
         return (m);          return (m);
   
Line 1247  dropfrag:
Line 1245  dropfrag:
  * associated datagrams.   * associated datagrams.
  */   */
 void  void
 ip_freef(fp)  ip_freef(struct ipq *fp)
         struct ipq *fp;  
 {  {
         struct ipqent *q, *p;          struct ipqent *q, *p;
         u_int nfrags = 0;          u_int nfrags = 0;
Line 1289  ip_reass_ttl_decr(u_int ticks)
Line 1286  ip_reass_ttl_decr(u_int ticks)
         u_int nfrags, median, dropfraction, keepfraction;          u_int nfrags, median, dropfraction, keepfraction;
         struct ipq *fp, *nfp;          struct ipq *fp, *nfp;
         int i;          int i;
   
         nfrags = 0;          nfrags = 0;
         memset(fragttl_histo, 0, sizeof fragttl_histo);          memset(fragttl_histo, 0, sizeof fragttl_histo);
   
         for (i = 0; i < IPREASS_NHASH; i++) {          for (i = 0; i < IPREASS_NHASH; i++) {
                 for (fp = LIST_FIRST(&ipq[i]); fp != NULL; fp = nfp) {                  for (fp = LIST_FIRST(&ipq[i]); fp != NULL; fp = nfp) {
                         fp->ipq_ttl = ((fp->ipq_ttl  <= ticks) ?                          fp->ipq_ttl = ((fp->ipq_ttl  <= ticks) ?
Line 1345  ip_reass_drophalf(void)
Line 1342  ip_reass_drophalf(void)
  * queue, discard it.   * queue, discard it.
  */   */
 void  void
 ip_slowtimo()  ip_slowtimo(void)
 {  {
         static u_int dropscanidx = 0;          static u_int dropscanidx = 0;
         u_int i;          u_int i;
Line 1402  ip_slowtimo()
Line 1399  ip_slowtimo()
  * Drain off all datagram fragments.   * Drain off all datagram fragments.
  */   */
 void  void
 ip_drain()  ip_drain(void)
 {  {
   
         /*          /*
Line 1429  ip_drain()
Line 1426  ip_drain()
  * 0 if the packet should be processed further.   * 0 if the packet should be processed further.
  */   */
 int  int
 ip_dooptions(m)  ip_dooptions(struct mbuf *m)
         struct mbuf *m;  
 {  {
         struct ip *ip = mtod(m, struct ip *);          struct ip *ip = mtod(m, struct ip *);
         u_char *cp, *cp0;          u_char *cp, *cp0;
Line 1659  bad:
Line 1655  bad:
  * return internet address info of interface to be used to get there.   * return internet address info of interface to be used to get there.
  */   */
 struct in_ifaddr *  struct in_ifaddr *
 ip_rtaddr(dst)  ip_rtaddr(struct in_addr dst)
          struct in_addr dst;  
 {  {
         struct sockaddr_in *sin;          struct sockaddr_in *sin;
   
Line 1687  ip_rtaddr(dst)
Line 1682  ip_rtaddr(dst)
  * to be picked up later by ip_srcroute if the receiver is interested.   * to be picked up later by ip_srcroute if the receiver is interested.
  */   */
 void  void
 save_rte(option, dst)  save_rte(u_char *option, struct in_addr dst)
         u_char *option;  
         struct in_addr dst;  
 {  {
         unsigned olen;          unsigned olen;
   
Line 1711  save_rte(option, dst)
Line 1704  save_rte(option, dst)
  * The first hop is placed before the options, will be removed later.   * The first hop is placed before the options, will be removed later.
  */   */
 struct mbuf *  struct mbuf *
 ip_srcroute()  ip_srcroute(void)
 {  {
         struct in_addr *p, *q;          struct in_addr *p, *q;
         struct mbuf *m;          struct mbuf *m;
Line 1783  ip_srcroute()
Line 1776  ip_srcroute()
  * XXX should be deleted; last arg currently ignored.   * XXX should be deleted; last arg currently ignored.
  */   */
 void  void
 ip_stripoptions(m, mopt)  ip_stripoptions(struct mbuf *m, struct mbuf *mopt)
         struct mbuf *m;  
         struct mbuf *mopt;  
 {  {
         int i;          int i;
         struct ip *ip = mtod(m, struct ip *);          struct ip *ip = mtod(m, struct ip *);
Line 1827  const int inetctlerrmap[PRC_NCMDS] = {
Line 1818  const int inetctlerrmap[PRC_NCMDS] = {
  * via a source route.   * via a source route.
  */   */
 void  void
 ip_forward(m, srcrt)  ip_forward(struct mbuf *m, int srcrt)
         struct mbuf *m;  
         int srcrt;  
 {  {
         struct ip *ip = mtod(m, struct ip *);          struct ip *ip = mtod(m, struct ip *);
         struct sockaddr_in *sin;          struct sockaddr_in *sin;
Line 2057  ip_forward(m, srcrt)
Line 2046  ip_forward(m, srcrt)
 }  }
   
 void  void
 ip_savecontrol(inp, mp, ip, m)  ip_savecontrol(struct inpcb *inp, struct mbuf **mp, struct ip *ip,
         struct inpcb *inp;      struct mbuf *m)
         struct mbuf **mp;  
         struct ip *ip;  
         struct mbuf *m;  
 {  {
   
         if (inp->inp_socket->so_options & SO_TIMESTAMP) {          if (inp->inp_socket->so_options & SO_TIMESTAMP) {
Line 2154  sysctl_net_inet_ip_maxflows(SYSCTLFN_ARG
Line 2140  sysctl_net_inet_ip_maxflows(SYSCTLFN_ARG
         s = sysctl_lookup(SYSCTLFN_CALL(rnode));          s = sysctl_lookup(SYSCTLFN_CALL(rnode));
         if (s)          if (s)
                 return (s);                  return (s);
   
         s = splsoftnet();          s = splsoftnet();
         ipflow_reap(0);          ipflow_reap(0);
         splx(s);          splx(s);
Line 2185  SYSCTL_SETUP(sysctl_net_inet_ip_setup, "
Line 2171  SYSCTL_SETUP(sysctl_net_inet_ip_setup, "
                        SYSCTL_DESCR("IPv4 related settings"),                         SYSCTL_DESCR("IPv4 related settings"),
                        NULL, 0, NULL, 0,                         NULL, 0, NULL, 0,
                        CTL_NET, PF_INET, IPPROTO_IP, CTL_EOL);                         CTL_NET, PF_INET, IPPROTO_IP, CTL_EOL);
   
         sysctl_createv(clog, 0, NULL, NULL,          sysctl_createv(clog, 0, NULL, NULL,
                        CTLFLAG_PERMANENT|CTLFLAG_READWRITE,                         CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
                        CTLTYPE_INT, "forwarding",                         CTLTYPE_INT, "forwarding",

Legend:
Removed from v.1.208  
changed lines
  Added in v.1.208.2.1

CVSweb <webmaster@jp.NetBSD.org>