[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.114.4.10 and 1.115

version 1.114.4.10, 2002/11/13 00:34:59 version 1.115, 2000/06/28 03:01:16
Line 120 
Line 120 
 #include <sys/proc.h>  #include <sys/proc.h>
 #include <sys/pool.h>  #include <sys/pool.h>
   
 #include <vm/vm.h>  #include <uvm/uvm_extern.h>
   
 #include <sys/sysctl.h>  #include <sys/sysctl.h>
   
 #include <net/if.h>  #include <net/if.h>
Line 138 
Line 139 
 /* just for gif_ttl */  /* just for gif_ttl */
 #include <netinet/in_gif.h>  #include <netinet/in_gif.h>
 #include "gif.h"  #include "gif.h"
 #include <net/if_gre.h>  
 #include "gre.h"  
   
 #ifdef MROUTING  #ifdef MROUTING
 #include <netinet/ip_mroute.h>  #include <netinet/ip_mroute.h>
Line 209  u_int16_t ip_id;
Line 208  u_int16_t ip_id;
   
 struct ipqhead ipq;  struct ipqhead ipq;
 int     ipq_locked;  int     ipq_locked;
 int     ip_nfragpackets = 0;  
 int     ip_maxfragpackets = 200;  
   
 static __inline int ipq_lock_try __P((void));  static __inline int ipq_lock_try __P((void));
 static __inline void ipq_unlock __P((void));  static __inline void ipq_unlock __P((void));
Line 310  ip_init()
Line 307  ip_init()
         TAILQ_INIT(&in_ifaddr);          TAILQ_INIT(&in_ifaddr);
         in_ifaddrhashtbl =          in_ifaddrhashtbl =
             hashinit(IN_IFADDR_HASH_SIZE, M_IFADDR, M_WAITOK, &in_ifaddrhash);              hashinit(IN_IFADDR_HASH_SIZE, M_IFADDR, M_WAITOK, &in_ifaddrhash);
         ip_mtudisc_timeout_q = rt_timer_queue_create(ip_mtudisc_timeout);          if (ip_mtudisc != 0)
                   ip_mtudisc_timeout_q =
                       rt_timer_queue_create(ip_mtudisc_timeout);
 #ifdef GATEWAY  #ifdef GATEWAY
         ipflow_init();          ipflow_init();
 #endif  #endif
Line 461  ip_input(struct mbuf *m)
Line 460  ip_input(struct mbuf *m)
 #endif  #endif
   
 #ifdef PFIL_HOOKS  #ifdef PFIL_HOOKS
 #ifdef IPSEC  
         /*  
          * let ipfilter look at packet on the wire,  
          * not the decapsulated packet.  
          */  
         if (ipsec_gethist(m, NULL))  
                 goto nofilt;  
 #endif  
         /*          /*
          * Run through list of hooks for input packets.  If there are any           * Run through list of hooks for input packets.  If there are any
          * filters which require that additional packets in the flow are           * filters which require that additional packets in the flow are
Line 489  ip_input(struct mbuf *m)
Line 480  ip_input(struct mbuf *m)
                                 return;                                  return;
                         ip = mtod(m, struct ip *);                          ip = mtod(m, struct ip *);
                 }                  }
 #ifdef IPSEC  
 nofilt:;  
 #endif  
 #endif /* PFIL_HOOKS */  #endif /* PFIL_HOOKS */
   
         /*          /*
Line 622  nofilt:;
Line 610  nofilt:;
                         ipstat.ips_cantforward++;                          ipstat.ips_cantforward++;
                         return;                          return;
                 }                  }
 #ifdef IPSEC  
                 if (ipsec4_in_reject(m, NULL)) {  
                         ipsecstat.in_polvio++;  
                         goto bad;  
                 }  
 #endif  
   
                 ip_forward(m, 0);                  ip_forward(m, 0);
         }          }
         return;          return;
Line 707  found:
Line 688  found:
                 IPQ_UNLOCK();                  IPQ_UNLOCK();
         }          }
   
 #ifdef IPSEC  
         /*  
          * enforce IPsec policy checking if we are seeing last header.  
          * note that we do not visit this with protocols with pcb layer  
          * code - like udp/tcp/raw ip.  
          */  
         if ((inetsw[ip_protox[ip->ip_p]].pr_flags & PR_LASTHDR) != 0 &&  
             ipsec4_in_reject(m, NULL)) {  
                 ipsecstat.in_polvio++;  
                 goto bad;  
         }  
 #endif  
   
         /*          /*
          * Switch out to protocol's input routine.           * Switch out to protocol's input routine.
          */           */
Line 768  ip_reass(ipqe, fp)
Line 736  ip_reass(ipqe, fp)
          * If first fragment to arrive, create a reassembly queue.           * If first fragment to arrive, create a reassembly queue.
          */           */
         if (fp == 0) {          if (fp == 0) {
                 /*  
                  * Enforce upper bound on number of fragmented packets  
                  * for which we attempt reassembly;  
                  * If maxfrag is 0, never accept fragments.  
                  * If maxfrag is -1, accept all fragments without limitation.  
                  */  
                 if (ip_maxfragpackets < 0)  
                         ;  
                 else if (ip_nfragpackets >= ip_maxfragpackets)  
                         goto dropfrag;  
                 ip_nfragpackets++;  
                 MALLOC(fp, struct ipq *, sizeof (struct ipq),                  MALLOC(fp, struct ipq *, sizeof (struct ipq),
                     M_FTABLE, M_NOWAIT);                      M_FTABLE, M_NOWAIT);
                 if (fp == NULL)                  if (fp == NULL)
Line 894  insert:
Line 851  insert:
         ip->ip_dst = fp->ipq_dst;          ip->ip_dst = fp->ipq_dst;
         LIST_REMOVE(fp, ipq_q);          LIST_REMOVE(fp, ipq_q);
         FREE(fp, M_FTABLE);          FREE(fp, M_FTABLE);
         ip_nfragpackets--;  
         m->m_len += (ip->ip_hl << 2);          m->m_len += (ip->ip_hl << 2);
         m->m_data -= (ip->ip_hl << 2);          m->m_data -= (ip->ip_hl << 2);
         /* some debugging cruft by sklower, below, will go away soon */          /* some debugging cruft by sklower, below, will go away soon */
Line 933  ip_freef(fp)
Line 889  ip_freef(fp)
         }          }
         LIST_REMOVE(fp, ipq_q);          LIST_REMOVE(fp, ipq_q);
         FREE(fp, M_FTABLE);          FREE(fp, M_FTABLE);
         ip_nfragpackets--;  
 }  }
   
 /*  /*
Line 955  ip_slowtimo()
Line 910  ip_slowtimo()
                         ip_freef(fp);                          ip_freef(fp);
                 }                  }
         }          }
         /*  
          * If we are over the maximum number of fragments  
          * (due to the limit being lowered), drain off  
          * enough to get down to the new limit.  
          */  
         if (ip_maxfragpackets < 0)  
                 ;  
         else {  
                 while (ip_nfragpackets > ip_maxfragpackets && ipq.lh_first)  
                         ip_freef(ipq.lh_first);  
         }  
         IPQ_UNLOCK();          IPQ_UNLOCK();
 #ifdef GATEWAY  #ifdef GATEWAY
         ipflow_slowtimo();          ipflow_slowtimo();
Line 1455  ip_forward(m, srcrt)
Line 1399  ip_forward(m, srcrt)
         /*          /*
          * Save at most 68 bytes of the packet in case           * Save at most 68 bytes of the packet in case
          * we need to generate an ICMP message to the src.           * we need to generate an ICMP message to the src.
          * Pullup to avoid sharing mbuf cluster between m and mcopy.  
          */           */
         mcopy = m_copym(m, 0, imin((int)ip->ip_len, 68), M_DONTWAIT);          mcopy = m_copy(m, 0, imin((int)ip->ip_len, 68));
         if (mcopy)  
                 mcopy = m_pullup(mcopy, ip->ip_hl << 2);  
   
         /*          /*
          * If forwarding packet using same interface that it came in on,           * If forwarding packet using same interface that it came in on,
Line 1496  ip_forward(m, srcrt)
Line 1437  ip_forward(m, srcrt)
   
 #ifdef IPSEC  #ifdef IPSEC
         /* Don't lookup socket in forwading case */          /* Don't lookup socket in forwading case */
         (void)ipsec_setsocket(m, NULL);          ipsec_setsocket(m, NULL);
 #endif  #endif
         error = ip_output(m, (struct mbuf *)0, &ipforward_rt,          error = ip_output(m, (struct mbuf *)0, &ipforward_rt,
             (IP_FORWARDING | (ip_directedbcast ? IP_ALLOWBROADCAST : 0)), 0);              (IP_FORWARDING | (ip_directedbcast ? IP_ALLOWBROADCAST : 0)), 0);
Line 1714  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1655  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 (error == 0 && ip_mtudisc == 0)                  if (ip_mtudisc != 0 && ip_mtudisc_timeout_q == NULL) {
                         rt_timer_queue_remove_all(ip_mtudisc_timeout_q, TRUE);                          ip_mtudisc_timeout_q =
                               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;
                 error = sysctl_int(oldp, oldlenp, newp, newlen, &anonportmin);                  error = sysctl_int(oldp, oldlenp, newp, newlen, &anonportmin);
                 if (anonportmin >= anonportmax || anonportmin < 0                  if (anonportmin >= anonportmax || anonportmin > 65535
                     || anonportmin > 65535  
 #ifndef IPNOPRIVPORTS  #ifndef IPNOPRIVPORTS
                     || anonportmin < IPPORT_RESERVED                      || anonportmin < IPPORT_RESERVED
 #endif  #endif
Line 1733  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1678  ip_sysctl(name, namelen, oldp, oldlenp, 
         case IPCTL_ANONPORTMAX:          case IPCTL_ANONPORTMAX:
                 old = anonportmax;                  old = anonportmax;
                 error = sysctl_int(oldp, oldlenp, newp, newlen, &anonportmax);                  error = sysctl_int(oldp, oldlenp, newp, newlen, &anonportmax);
                 if (anonportmin >= anonportmax || anonportmax < 0                  if (anonportmin >= anonportmax || anonportmax > 65535
                     || anonportmax > 65535  
 #ifndef IPNOPRIVPORTS  #ifndef IPNOPRIVPORTS
                     || anonportmax < IPPORT_RESERVED                      || anonportmax < IPPORT_RESERVED
 #endif  #endif
Line 1746  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1690  ip_sysctl(name, namelen, oldp, oldlenp, 
         case IPCTL_MTUDISCTIMEOUT:          case IPCTL_MTUDISCTIMEOUT:
                 error = sysctl_int(oldp, oldlenp, newp, newlen,                  error = sysctl_int(oldp, oldlenp, newp, newlen,
                    &ip_mtudisc_timeout);                     &ip_mtudisc_timeout);
                 if (error == 0)                  if (ip_mtudisc_timeout_q != NULL)
                         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);
 #ifdef GATEWAY  #ifdef GATEWAY
Line 1772  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1716  ip_sysctl(name, namelen, oldp, oldlenp, 
                                   &ip_gif_ttl));                                    &ip_gif_ttl));
 #endif  #endif
   
 #if NGRE > 0  
         case IPCTL_GRE_TTL:  
                 return(sysctl_int(oldp, oldlenp, newp, newlen,  
                                   &ip_gre_ttl));  
 #endif  
   
 #ifndef IPNOPRIVPORTS  
         case IPCTL_LOWPORTMIN:  
                 old = lowportmin;  
                 error = sysctl_int(oldp, oldlenp, newp, newlen, &lowportmin);  
                 if (lowportmin >= lowportmax  
                     || lowportmin > IPPORT_RESERVEDMAX  
                     || lowportmin < IPPORT_RESERVEDMIN  
                     ) {  
                         lowportmin = old;  
                         return (EINVAL);  
                 }  
                 return (error);  
         case IPCTL_LOWPORTMAX:  
                 old = lowportmax;  
                 error = sysctl_int(oldp, oldlenp, newp, newlen, &lowportmax);  
                 if (lowportmin >= lowportmax  
                     || lowportmax > IPPORT_RESERVEDMAX  
                     || lowportmax < IPPORT_RESERVEDMIN  
                     ) {  
                         lowportmax = old;  
                         return (EINVAL);  
                 }  
                 return (error);  
 #endif  
   
         case IPCTL_MAXFRAGPACKETS:  
                 return (sysctl_int(oldp, oldlenp, newp, newlen,  
                     &ip_maxfragpackets));  
   
         default:          default:
                 return (EOPNOTSUPP);                  return (EOPNOTSUPP);
         }          }

Legend:
Removed from v.1.114.4.10  
changed lines
  Added in v.1.115

CVSweb <webmaster@jp.NetBSD.org>