[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.166 and 1.174

version 1.166, 2003/06/15 02:49:33 version 1.174, 2003/08/22 21:53:03
Line 78 
Line 78 
  * 2. Redistributions in binary form must reproduce the above copyright   * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the   *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.   *    documentation and/or other materials provided with the distribution.
  * 3. All advertising materials mentioning features or use of this software   * 3. Neither the name of the University nor the names of its contributors
  *    must display the following acknowledgement:  
  *      This product includes software developed by the University of  
  *      California, Berkeley and its contributors.  
  * 4. Neither the name of the University nor the names of its contributors  
  *    may be used to endorse or promote products derived from this software   *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.   *    without specific prior written permission.
  *   *
Line 108  __KERNEL_RCSID(0, "$NetBSD$");
Line 104  __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 150  __KERNEL_RCSID(0, "$NetBSD$");
Line 147  __KERNEL_RCSID(0, "$NetBSD$");
 #include <netinet6/ipsec.h>  #include <netinet6/ipsec.h>
 #include <netkey/key.h>  #include <netkey/key.h>
 #endif  #endif
   #ifdef FAST_IPSEC
   #include <netipsec/ipsec.h>
   #include <netipsec/key.h>
   #endif  /* FAST_IPSEC*/
   
 #ifndef IPFORWARDING  #ifndef IPFORWARDING
 #ifdef GATEWAY  #ifdef GATEWAY
Line 222  struct in_ifaddrhead in_ifaddr;
Line 223  struct in_ifaddrhead in_ifaddr;
 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 */
 struct  in_multihead in_multi;  
 struct  in_multihashhead *in_multihashtbl;  struct  in_multihashhead *in_multihashtbl;
 struct  ifqueue ipintrq;  struct  ifqueue ipintrq;
 struct  ipstat  ipstat;  struct  ipstat  ipstat;
Line 432  ip_input(struct mbuf *m)
Line 432  ip_input(struct mbuf *m)
         int hlen = 0, mff, len;          int hlen = 0, mff, len;
         int downmatch;          int downmatch;
         int checkif;          int checkif;
           int srcrt = 0;
   #ifdef FAST_IPSEC
           struct m_tag *mtag;
           struct tdb_ident *tdbi;
           struct secpolicy *sp;
           int s, error;
   #endif /* FAST_IPSEC */
   
         MCLAIM(m, &ip_rx_mowner);          MCLAIM(m, &ip_rx_mowner);
 #ifdef  DIAGNOSTIC  #ifdef  DIAGNOSTIC
Line 589  ip_input(struct mbuf *m)
Line 596  ip_input(struct mbuf *m)
         if (1)          if (1)
 #endif  #endif
         {          {
                   struct in_addr odst;
   
                   odst = ip->ip_dst;
                 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 *);
                 hlen = ip->ip_hl << 2;                  hlen = ip->ip_hl << 2;
                   srcrt = (odst.s_addr != ip->ip_dst.s_addr);
         }          }
 #endif /* PFIL_HOOKS */  #endif /* PFIL_HOOKS */
   
Line 761  ip_input(struct mbuf *m)
Line 772  ip_input(struct mbuf *m)
                         goto bad;                          goto bad;
                 }                  }
 #endif  #endif
   #ifdef FAST_IPSEC
                   mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL);
                   s = splsoftnet();
                   if (mtag != NULL) {
                           tdbi = (struct tdb_ident *)(mtag + 1);
                           sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);
                   } else {
                           sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,
                                                      IP_FORWARDING, &error);
                   }
                   if (sp == NULL) {       /* NB: can happen if error */
                           splx(s);
                           /*XXX error stat???*/
                           DPRINTF(("ip_input: no SP for forwarding\n"));  /*XXX*/
                           goto bad;
                   }
   
                 ip_forward(m, 0);                  /*
                    * Check security policy against packet attributes.
                    */
                   error = ipsec_in_reject(sp, m);
                   KEY_FREESP(&sp);
                   splx(s);
                   if (error) {
                           ipstat.ips_cantforward++;
                           goto bad;
                   }
   #endif  /* FAST_IPSEC */
   
                   ip_forward(m, srcrt);
         }          }
         return;          return;
   
Line 849  found:
Line 888  found:
                 IPQ_UNLOCK();                  IPQ_UNLOCK();
         }          }
   
 #ifdef IPSEC  #if defined(IPSEC)
         /*          /*
          * enforce IPsec policy checking if we are seeing last header.           * enforce IPsec policy checking if we are seeing last header.
          * note that we do not visit this with protocols with pcb layer           * note that we do not visit this with protocols with pcb layer
Line 861  found:
Line 900  found:
                 goto bad;                  goto bad;
         }          }
 #endif  #endif
   #if FAST_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) {
                   /*
                    * Check if the packet has already had IPsec processing
                    * done.  If so, then just pass it along.  This tag gets
                    * set during AH, ESP, etc. input handling, before the
                    * packet is returned to the ip input queue for delivery.
                    */
                   mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL);
                   s = splsoftnet();
                   if (mtag != NULL) {
                           tdbi = (struct tdb_ident *)(mtag + 1);
                           sp = ipsec_getpolicy(tdbi, IPSEC_DIR_INBOUND);
                   } else {
                           sp = ipsec_getpolicybyaddr(m, IPSEC_DIR_INBOUND,
                                                      IP_FORWARDING, &error);
                   }
                   if (sp != NULL) {
                           /*
                            * Check security policy against packet attributes.
                            */
                           error = ipsec_in_reject(sp, m);
                           KEY_FREESP(&sp);
                   } else {
                           /* XXX error stat??? */
                           error = EINVAL;
   DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/
                           goto bad;
                   }
                   splx(s);
                   if (error)
                           goto bad;
           }
   #endif /* FAST_IPSEC */
   
         /*          /*
          * Switch out to protocol's input routine.           * Switch out to protocol's input routine.
Line 1565  ip_forward(m, srcrt)
Line 1643  ip_forward(m, srcrt)
         struct mbuf *mcopy;          struct mbuf *mcopy;
         n_long dest;          n_long dest;
         struct ifnet *destifp;          struct ifnet *destifp;
 #ifdef IPSEC  #if defined(IPSEC) || defined(FAST_IPSEC)
         struct ifnet dummyifp;          struct ifnet dummyifp;
 #endif  #endif
   
Line 1663  ip_forward(m, srcrt)
Line 1741  ip_forward(m, srcrt)
         (void)ipsec_setsocket(m, NULL);          (void)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)),
               (struct ip_moptions *)NULL, (struct socket *)NULL);
   
         if (error)          if (error)
                 ipstat.ips_cantforward++;                  ipstat.ips_cantforward++;
         else {          else {
Line 1703  ip_forward(m, srcrt)
Line 1783  ip_forward(m, srcrt)
         case EMSGSIZE:          case EMSGSIZE:
                 type = ICMP_UNREACH;                  type = ICMP_UNREACH;
                 code = ICMP_UNREACH_NEEDFRAG;                  code = ICMP_UNREACH_NEEDFRAG;
 #ifndef IPSEC  #if !defined(IPSEC) && !defined(FAST_IPSEC)
                 if (ipforward_rt.ro_rt)                  if (ipforward_rt.ro_rt)
                         destifp = ipforward_rt.ro_rt->rt_ifp;                          destifp = ipforward_rt.ro_rt->rt_ifp;
 #else  #else
Line 1720  ip_forward(m, srcrt)
Line 1800  ip_forward(m, srcrt)
                         struct route *ro;                          struct route *ro;
   
                         sp = ipsec4_getpolicybyaddr(mcopy,                          sp = ipsec4_getpolicybyaddr(mcopy,
                                                     IPSEC_DIR_OUTBOUND,                              IPSEC_DIR_OUTBOUND, IP_FORWARDING,
                                                     IP_FORWARDING,                              &ipsecerror);
                                                     &ipsecerror);  
   
                         if (sp == NULL)                          if (sp == NULL)
                                 destifp = ipforward_rt.ro_rt->rt_ifp;                                  destifp = ipforward_rt.ro_rt->rt_ifp;
                         else {                          else {
                                 /* count IPsec header size */                                  /* count IPsec header size */
                                 ipsechdr = ipsec4_hdrsiz(mcopy,                                  ipsechdr = ipsec4_hdrsiz(mcopy,
                                                          IPSEC_DIR_OUTBOUND,                                      IPSEC_DIR_OUTBOUND, NULL);
                                                          NULL);  
   
                                 /*                                  /*
                                  * find the correct route for outer IPv4                                   * find the correct route for outer IPv4
Line 1756  ip_forward(m, srcrt)
Line 1834  ip_forward(m, srcrt)
                                         }                                          }
                                 }                                  }
   
   #ifdef  IPSEC
                                 key_freesp(sp);                                  key_freesp(sp);
   #else
                                   KEY_FREESP(&sp);
   #endif
                         }                          }
                 }                  }
 #endif /*IPSEC*/  #endif /*IPSEC*/

Legend:
Removed from v.1.166  
changed lines
  Added in v.1.174

CVSweb <webmaster@jp.NetBSD.org>