[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.172 and 1.173

version 1.172, 2003/08/07 16:33:12 version 1.173, 2003/08/15 03:42:02
Line 147  __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 429  ip_input(struct mbuf *m)
Line 433  ip_input(struct mbuf *m)
         int downmatch;          int downmatch;
         int checkif;          int checkif;
         int srcrt = 0;          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 762  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;
                   }
   
                   /*
                    * 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);                  ip_forward(m, srcrt);
         }          }
Line 850  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 862  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 1566  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 1664  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 *)0, (struct inpcb *)0);
   
         if (error)          if (error)
                 ipstat.ips_cantforward++;                  ipstat.ips_cantforward++;
         else {          else {
Line 1704  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 1755  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.172  
changed lines
  Added in v.1.173

CVSweb <webmaster@jp.NetBSD.org>