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

version 1.93.2.7, 2001/03/27 15:32:31 version 1.115, 2000/06/28 03:01:16
Line 147 
Line 147 
 #ifdef IPSEC  #ifdef IPSEC
 #include <netinet6/ipsec.h>  #include <netinet6/ipsec.h>
 #include <netkey/key.h>  #include <netkey/key.h>
   #include <netkey/key_debug.h>
 #endif  #endif
   
 #ifndef IPFORWARDING  #ifndef IPFORWARDING
Line 205  struct ifqueue ipintrq;
Line 206  struct ifqueue ipintrq;
 struct  ipstat  ipstat;  struct  ipstat  ipstat;
 u_int16_t       ip_id;  u_int16_t       ip_id;
   
 #ifdef PFIL_HOOKS  
 struct pfil_head inet_pfil_hook;  
 #endif  
   
 struct ipqhead ipq;  struct ipqhead ipq;
 int     ipq_locked;  int     ipq_locked;
 int     ip_nfragpackets = 0;  
 int     ip_maxfragpackets = -1;  
   
 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 305  ip_init()
         ip_id = time.tv_sec & 0xffff;          ip_id = time.tv_sec & 0xffff;
         ipintrq.ifq_maxlen = ipqmaxlen;          ipintrq.ifq_maxlen = ipqmaxlen;
         TAILQ_INIT(&in_ifaddr);          TAILQ_INIT(&in_ifaddr);
         in_ifaddrhashtbl = hashinit(IN_IFADDR_HASH_SIZE, HASH_LIST, M_IFADDR,          in_ifaddrhashtbl =
             M_WAITOK, &in_ifaddrhash);              hashinit(IN_IFADDR_HASH_SIZE, M_IFADDR, M_WAITOK, &in_ifaddrhash);
         if (ip_mtudisc != 0)          if (ip_mtudisc != 0)
                 ip_mtudisc_timeout_q =                  ip_mtudisc_timeout_q =
                     rt_timer_queue_create(ip_mtudisc_timeout);                      rt_timer_queue_create(ip_mtudisc_timeout);
 #ifdef GATEWAY  #ifdef GATEWAY
         ipflow_init();          ipflow_init();
 #endif  #endif
   
 #ifdef PFIL_HOOKS  
         /* Register our Packet Filter hook. */  
         inet_pfil_hook.ph_type = PFIL_TYPE_AF;  
         inet_pfil_hook.ph_af   = AF_INET;  
         i = pfil_head_register(&inet_pfil_hook);  
         if (i != 0)  
                 printf("ip_init: WARNING: unable to register pfil hook, "  
                     "error %d\n", i);  
 #endif /* PFIL_HOOKS */  
 }  }
   
 struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };  struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };
Line 366  ip_input(struct mbuf *m)
Line 351  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;
   #ifdef PFIL_HOOKS
           struct packet_filter_hook *pfh;
           struct mbuf *m0;
           int rv;
   #endif /* PFIL_HOOKS */
   
 #ifdef  DIAGNOSTIC  #ifdef  DIAGNOSTIC
         if ((m->m_flags & M_PKTHDR) == 0)          if ((m->m_flags & M_PKTHDR) == 0)
Line 416  ip_input(struct mbuf *m)
Line 406  ip_input(struct mbuf *m)
          * not allowed.           * not allowed.
          */           */
         if (IN_MULTICAST(ip->ip_src.s_addr)) {          if (IN_MULTICAST(ip->ip_src.s_addr)) {
                 ipstat.ips_badaddr++;                  /* XXX stat */
                 goto bad;                  goto bad;
         }          }
   
         /* 127/8 must not appear on wire - RFC1122 */  
         if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET ||  
             (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) {  
                 if ((m->m_pkthdr.rcvif->if_flags & IFF_LOOPBACK) == 0) {  
                         ipstat.ips_badaddr++;  
                         goto bad;  
                 }  
         }  
   
         if (in_cksum(m, hlen) != 0) {          if (in_cksum(m, hlen) != 0) {
                 ipstat.ips_badsum++;                  ipstat.ips_badsum++;
                 goto bad;                  goto bad;
         }          }
   
         /* Retrieve the packet length. */          /*
         len = ntohs(ip->ip_len);           * Convert fields to host representation.
            */
           NTOHS(ip->ip_len);
           NTOHS(ip->ip_off);
           len = ip->ip_len;
   
         /*          /*
          * Check for additional length bogosity           * Check for additional length bogosity
Line 482  ip_input(struct mbuf *m)
Line 467  ip_input(struct mbuf *m)
          * Note that filters must _never_ set this flag, as another filter           * Note that filters must _never_ set this flag, as another filter
          * in the list may have previously cleared it.           * in the list may have previously cleared it.
          */           */
         /*          m0 = m;
          * let ipfilter look at packet on the wire,          pfh = pfil_hook_get(PFIL_IN, &inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
          * not the decapsulated packet.          for (; pfh; pfh = pfh->pfil_link.tqe_next)
          */                  if (pfh->pfil_func) {
 #ifdef IPSEC                          rv = pfh->pfil_func(ip, hlen,
         if (!ipsec_gethist(m, NULL))                                              m->m_pkthdr.rcvif, 0, &m0);
 #else                          if (rv)
         if (1)                                  return;
 #endif                          m = m0;
         {                          if (m == NULL)
                 if (pfil_run_hooks(&inet_pfil_hook, &m, m->m_pkthdr.rcvif,                                  return;
                                    PFIL_IN) != 0)                          ip = mtod(m, struct ip *);
                 return;                  }
                 if (m == NULL)  
                         return;  
                 ip = mtod(m, struct ip *);  
         }  
 #endif /* PFIL_HOOKS */  #endif /* PFIL_HOOKS */
   
 #ifdef ALTQ  
         /* XXX Temporary until ALTQ is changed to use a pfil hook */  
         if (altq_input != NULL && (*altq_input)(m, AF_INET) == 0) {  
                 /* packet dropped by traffic conditioner */  
                 return;  
         }  
 #endif  
   
         /*  
          * Convert fields to host representation.  
          */  
         NTOHS(ip->ip_len);  
         NTOHS(ip->ip_off);  
   
         /*          /*
          * Process options and, if not destined for us,           * Process options and, if not destined for us,
          * ship it on.  ip_dooptions returns 1 when an           * ship it on.  ip_dooptions returns 1 when an
Line 721  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.
          */           */
 #if IFA_STATS  #if IFA_STATS
         if (ia && ip)          ia->ia_ifa.ifa_data.ifad_inbytes += ip->ip_len;
                 ia->ia_ifa.ifa_data.ifad_inbytes += ip->ip_len;  
 #endif  #endif
         ipstat.ips_delivered++;          ipstat.ips_delivered++;
     {      {
Line 783  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 909  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 948  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 970  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 1470  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 1511  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 1740  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1666  ip_sysctl(name, namelen, oldp, oldlenp, 
         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 1753  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 1792  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1716  ip_sysctl(name, namelen, oldp, oldlenp, 
                                   &ip_gif_ttl));                                    &ip_gif_ttl));
 #endif  #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.93.2.7  
changed lines
  Added in v.1.115

CVSweb <webmaster@jp.NetBSD.org>