[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.54 and 1.67

version 1.54, 1998/01/05 09:52:04 version 1.67, 1998/06/01 00:39:37
Line 1 
Line 1 
 /*      $NetBSD$        */  /*      $NetBSD$        */
   
   /*-
    * Copyright (c) 1998 The NetBSD Foundation, Inc.
    * All rights reserved.
    *
    * This code is derived from software contributed to The NetBSD Foundation
    * by Public Access Networks Corporation ("Panix").  It was developed under
    * contract to Panix by Eric Haszlakiewicz and Thor Lancelot Simon.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    * 1. Redistributions of source code must retain the above copyright
    *    notice, this list of conditions and the following disclaimer.
    * 2. Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the
    *    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
    * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
    * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
    * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    * POSSIBILITY OF SUCH DAMAGE.
    */
   
 /*  /*
  * Copyright (c) 1982, 1986, 1988, 1993   * Copyright (c) 1982, 1986, 1988, 1993
  *      The Regents of the University of California.  All rights reserved.   *      The Regents of the University of California.  All rights reserved.
Line 35 
Line 72 
  *      @(#)ip_input.c  8.2 (Berkeley) 1/4/94   *      @(#)ip_input.c  8.2 (Berkeley) 1/4/94
  */   */
   
   #include "opt_gateway.h"
   #include "opt_mrouting.h"
   
 #include <sys/param.h>  #include <sys/param.h>
 #include <sys/systm.h>  #include <sys/systm.h>
 #include <sys/malloc.h>  #include <sys/malloc.h>
Line 64 
Line 104 
 #include <netinet/ip_var.h>  #include <netinet/ip_var.h>
 #include <netinet/ip_icmp.h>  #include <netinet/ip_icmp.h>
   
 /* XXX should really put this in libkern.h */  
 #define offsetof(type, member)  ((size_t)(&((type *)0)->member))  
   
 #ifndef IPFORWARDING  #ifndef IPFORWARDING
 #ifdef GATEWAY  #ifdef GATEWAY
 #define IPFORWARDING    1       /* forward IP packets not for us */  #define IPFORWARDING    1       /* forward IP packets not for us */
Line 86 
Line 123 
 #ifndef IPMTUDISC  #ifndef IPMTUDISC
 #define IPMTUDISC       0  #define IPMTUDISC       0
 #endif  #endif
   #ifndef IPMTUDISCTIMEOUT
   #define IPMTUDISCTIMEOUT (10 * 60)      /* as per RFC 1191 */
   #endif
   
 /*  /*
  * Note: DIRECTED_BROADCAST is handled this way so that previous   * Note: DIRECTED_BROADCAST is handled this way so that previous
Line 105  int ip_forwsrcrt = IPFORWSRCRT;
Line 145  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;
 #ifdef DIAGNOSTIC  #ifdef DIAGNOSTIC
 int     ipprintfs = 0;  int     ipprintfs = 0;
 #endif  #endif
   
   struct rttimer_queue *ip_mtudisc_timeout_q = NULL;
   
 extern  struct domain inetdomain;  extern  struct domain inetdomain;
 extern  struct protosw inetsw[];  extern  struct protosw inetsw[];
 u_char  ip_protox[IPPROTO_MAX];  u_char  ip_protox[IPPROTO_MAX];
 int     ipqmaxlen = IFQ_MAXLEN;  int     ipqmaxlen = IFQ_MAXLEN;
 struct  in_ifaddrhead in_ifaddr;  struct  in_ifaddrhead in_ifaddr;
   struct  in_ifaddrhashhead *in_ifaddrhashtbl;
 struct  ifqueue ipintrq;  struct  ifqueue ipintrq;
   struct  ipstat  ipstat;
   u_int16_t       ip_id;
   int     ip_defttl;
   struct ipqhead ipq;
   
 /*  /*
  * We need to save the IP options in case a protocol wants to respond   * We need to save the IP options in case a protocol wants to respond
Line 157  ip_init()
Line 205  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, M_IFADDR, M_WAITOK, &in_ifaddrhash);
           if (ip_mtudisc != 0)
                   ip_mtudisc_timeout_q =
                       rt_timer_queue_create(ip_mtudisc_timeout);
 }  }
   
 struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };  struct  sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };
Line 173  ipintr()
Line 226  ipintr()
         register struct mbuf *m;          register struct mbuf *m;
         register struct ipq *fp;          register struct ipq *fp;
         register struct in_ifaddr *ia;          register struct in_ifaddr *ia;
           register struct ifaddr *ifa;
         struct ipqent *ipqe;          struct ipqent *ipqe;
         int hlen = 0, mff, len, s;          int hlen = 0, mff, len, s;
 #ifdef PFIL_HOOKS  #ifdef PFIL_HOOKS
Line 255  next:
Line 309  next:
                         m_adj(m, len - m->m_pkthdr.len);                          m_adj(m, len - m->m_pkthdr.len);
         }          }
   
           /*
            * Assume that we can create a fast-forward IP flow entry
            * based on this packet.
            */
           m->m_flags |= M_CANFASTFWD;
   
 #ifdef PFIL_HOOKS  #ifdef PFIL_HOOKS
         /*          /*
          * Run through list of hooks for input packets.           * Run through list of hooks for input packets.  If there are any
            * filters which require that additional packets in the flow are
            * not fast-forwarded, they must clear the M_CANFASTFWD flag.
            * Note that filters must _never_ set this flag, as another filter
            * in the list may have previously cleared it.
          */           */
         m0 = m;          m0 = m;
         for (pfh = pfil_hook_get(PFIL_IN); pfh; pfh = pfh->pfil_link.le_next)          for (pfh = pfil_hook_get(PFIL_IN); pfh; pfh = pfh->pfil_link.tqe_next)
                 if (pfh->pfil_func) {                  if (pfh->pfil_func) {
                         rv = pfh->pfil_func(ip, hlen, m->m_pkthdr.rcvif, 0, &m0);                          rv = pfh->pfil_func(ip, hlen, m->m_pkthdr.rcvif, 0, &m0);
                         if (rv)                          if (rv)
Line 282  next:
Line 346  next:
         /*          /*
          * 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.
          */           */
         for (ia = in_ifaddr.tqh_first; ia; ia = ia->ia_list.tqe_next) {          INADDR_TO_IA(ip->ip_dst, ia);
                 if (in_hosteq(ip->ip_dst, ia->ia_addr.sin_addr))          if (ia != NULL) goto ours;
                         goto ours;          if (m->m_pkthdr.rcvif->if_flags & IFF_BROADCAST) {
                 if (((ip_directedbcast == 0) || (ip_directedbcast &&                  for (ifa = m->m_pkthdr.rcvif->if_addrlist.tqh_first;
                     ia->ia_ifp == m->m_pkthdr.rcvif)) &&                      ifa != NULL; ifa = ifa->ifa_list.tqe_next) {
                     (ia->ia_ifp->if_flags & IFF_BROADCAST)) {                          if (ifa->ifa_addr->sa_family != AF_INET) continue;
                           ia = ifatoia(ifa);
                         if (in_hosteq(ip->ip_dst, ia->ia_broadaddr.sin_addr) ||                          if (in_hosteq(ip->ip_dst, ia->ia_broadaddr.sin_addr) ||
                             in_hosteq(ip->ip_dst, ia->ia_netbroadcast) ||                              in_hosteq(ip->ip_dst, ia->ia_netbroadcast) ||
                             /*                              /*
Line 297  next:
Line 362  next:
                             ip->ip_dst.s_addr == ia->ia_subnet ||                              ip->ip_dst.s_addr == ia->ia_subnet ||
                             ip->ip_dst.s_addr == ia->ia_net)                              ip->ip_dst.s_addr == ia->ia_net)
                                 goto ours;                                  goto ours;
                           /*
                            * An interface with IP address zero accepts
                            * all packets that arrive on that interface.
                            */
                           if (in_nullhost(ia->ia_addr.sin_addr))
                                   goto ours;
                 }                  }
                 /*  
                  * An interface with IP address zero accepts  
                  * all packets that arrive on that interface.  
                  */  
                 if ((ia->ia_ifp == m->m_pkthdr.rcvif) &&  
                     in_nullhost(ia->ia_addr.sin_addr))  
                         goto ours;  
         }          }
         if (IN_MULTICAST(ip->ip_dst.s_addr)) {          if (IN_MULTICAST(ip->ip_dst.s_addr)) {
                 struct in_multi *inm;                  struct in_multi *inm;
Line 655  ip_slowtimo()
Line 719  ip_slowtimo()
                         ip_freef(fp);                          ip_freef(fp);
                 }                  }
         }          }
   #ifdef GATEWAY
           ipflow_slowtimo();
   #endif
         splx(s);          splx(s);
 }  }
   
Line 824  ip_dooptions(m)
Line 891  ip_dooptions(m)
                                 break;                                  break;
   
                         case IPOPT_TS_TSANDADDR:                          case IPOPT_TS_TSANDADDR:
                                 if (ipt->ipt_ptr + sizeof(n_time) +                                  if (ipt->ipt_ptr - 1 + sizeof(n_time) +
                                     sizeof(struct in_addr) > ipt->ipt_len)                                      sizeof(struct in_addr) > ipt->ipt_len)
                                         goto bad;                                          goto bad;
                                 ipaddr.sin_addr = dst;                                  ipaddr.sin_addr = dst;
Line 838  ip_dooptions(m)
Line 905  ip_dooptions(m)
                                 break;                                  break;
   
                         case IPOPT_TS_PRESPEC:                          case IPOPT_TS_PRESPEC:
                                 if (ipt->ipt_ptr + sizeof(n_time) +                                  if (ipt->ipt_ptr - 1 + sizeof(n_time) +
                                     sizeof(struct in_addr) > ipt->ipt_len)                                      sizeof(struct in_addr) > ipt->ipt_len)
                                         goto bad;                                          goto bad;
                                 bcopy((caddr_t)sin, (caddr_t)&ipaddr.sin_addr,                                  bcopy((caddr_t)sin, (caddr_t)&ipaddr.sin_addr,
Line 1138  ip_forward(m, srcrt)
Line 1205  ip_forward(m, srcrt)
                 if (type)                  if (type)
                         ipstat.ips_redirectsent++;                          ipstat.ips_redirectsent++;
                 else {                  else {
                         if (mcopy)                          if (mcopy) {
   #ifdef GATEWAY
                                   if (mcopy->m_flags & M_CANFASTFWD)
                                           ipflow_create(&ipforward_rt, mcopy);
   #endif
                                 m_freem(mcopy);                                  m_freem(mcopy);
                           }
                         return;                          return;
                 }                  }
         }          }
Line 1285  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1357  ip_sysctl(name, namelen, oldp, oldlenp, 
                 return (sysctl_int(oldp, oldlenp, newp, newlen,                  return (sysctl_int(oldp, oldlenp, newp, newlen,
                     &subnetsarelocal));                      &subnetsarelocal));
         case IPCTL_MTUDISC:          case IPCTL_MTUDISC:
                 return (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) {
                           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;
         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);
Line 1311  ip_sysctl(name, namelen, oldp, oldlenp, 
Line 1391  ip_sysctl(name, namelen, oldp, oldlenp, 
                         return (EINVAL);                          return (EINVAL);
                 }                  }
                 return (error);                  return (error);
           case IPCTL_MTUDISCTIMEOUT:
                   error = sysctl_int(oldp, oldlenp, newp, newlen,
                      &ip_mtudisc_timeout);
                   if (ip_mtudisc_timeout_q != NULL)
                           rt_timer_queue_change(ip_mtudisc_timeout_q,
                                                 ip_mtudisc_timeout);
                   return (error);
   #ifdef GATEWAY
           case IPCTL_MAXFLOWS:
               {
                   int s;
   
                   error = sysctl_int(oldp, oldlenp, newp, newlen,
                      &ip_maxflows);
                   s = splsoftnet();
                   ipflow_reap(0);
                   splx(s);
                   return (error);
               }
   #endif
         default:          default:
                 return (EOPNOTSUPP);                  return (EOPNOTSUPP);
         }          }

Legend:
Removed from v.1.54  
changed lines
  Added in v.1.67

CVSweb <webmaster@jp.NetBSD.org>