[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.304 and 1.305

version 1.304, 2013/06/05 19:01:26 version 1.305, 2013/06/08 13:50:22
Line 143  __KERNEL_RCSID(0, "$NetBSD$");
Line 143  __KERNEL_RCSID(0, "$NetBSD$");
   
 #ifdef IPSEC  #ifdef IPSEC
 #include <netipsec/ipsec.h>  #include <netipsec/ipsec.h>
 #include <netipsec/key.h>  #endif
 #endif  /* IPSEC*/  
   
 #ifndef IPFORWARDING  #ifndef IPFORWARDING
 #ifdef GATEWAY  #ifdef GATEWAY
Line 405  ip_input(struct mbuf *m)
Line 404  ip_input(struct mbuf *m)
         int downmatch;          int downmatch;
         int checkif;          int checkif;
         int srcrt = 0;          int srcrt = 0;
 #ifdef IPSEC  
         struct m_tag *mtag;  
         struct tdb_ident *tdbi;  
         struct secpolicy *sp;  
         int error, s;  
 #endif /* IPSEC */  
   
         MCLAIM(m, &ip_rx_mowner);          MCLAIM(m, &ip_rx_mowner);
         KASSERT((m->m_flags & M_PKTHDR) != 0);          KASSERT((m->m_flags & M_PKTHDR) != 0);
Line 733  ip_input(struct mbuf *m)
Line 726  ip_input(struct mbuf *m)
                         return;                          return;
                 }                  }
 #ifdef IPSEC  #ifdef IPSEC
                 mtag = m_tag_find(m, PACKET_TAG_IPSEC_IN_DONE, NULL);                  /* Perform IPsec, if any. */
                 s = splsoftnet();                  if (ipsec4_input(m, IP_FORWARDING | (ip_directedbcast ?
                 if (mtag != NULL) {                      IP_ALLOWBROADCAST : 0)) != 0) {
                         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) {  
                         IP_STATINC(IP_STAT_CANTFORWARD);  
                         goto bad;                          goto bad;
                 }                  }
   #endif
                 /*  
                  * Peek at the outbound SP for this packet to determine if  
                  * it's a Fast Forward candidate.  
                  */  
                 mtag = m_tag_find(m, PACKET_TAG_IPSEC_PENDING_TDB, NULL);  
                 if (mtag != NULL)  
                         m->m_flags &= ~M_CANFASTFWD;  
                 else {  
                         s = splsoftnet();  
                         sp = ipsec4_checkpolicy(m, IPSEC_DIR_OUTBOUND,  
                             (IP_FORWARDING |  
                              (ip_directedbcast ? IP_ALLOWBROADCAST : 0)),  
                             &error, NULL);  
                         if (sp != NULL) {  
                                 m->m_flags &= ~M_CANFASTFWD;  
                                 KEY_FREESP(&sp);  
                         }  
                         splx(s);  
                 }  
 #endif  /* IPSEC */  
   
                 ip_forward(m, srcrt);                  ip_forward(m, srcrt);
         }          }
         return;          return;
Line 811  ours:
Line 762  ours:
   
 #ifdef IPSEC  #ifdef 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
          * code - like udp/tcp/raw ip.           * code - like UDP/TCP/raw IP.
          */           */
         if ((inetsw[ip_protox[ip->ip_p]].pr_flags & PR_LASTHDR) != 0) {          if ((inetsw[ip_protox[ip->ip_p]].pr_flags & PR_LASTHDR) != 0) {
                 /*                  if (ipsec4_input(m, 0) != 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*/  
                 }  
                 splx(s);  
                 if (error)  
                         goto bad;                          goto bad;
                   }
         }          }
 #endif /* IPSEC */  #endif
   
         /*          /*
          * Switch out to protocol's input routine.           * Switch out to protocol's input routine.
Line 1422  ip_forward(struct mbuf *m, int srcrt)
Line 1347  ip_forward(struct mbuf *m, int srcrt)
   
                 if ((rt = rtcache_validate(&ipforward_rt)) != NULL)                  if ((rt = rtcache_validate(&ipforward_rt)) != NULL)
                         destmtu = rt->rt_ifp->if_mtu;                          destmtu = rt->rt_ifp->if_mtu;
   #ifdef IPSEC
 #if defined(IPSEC)                  (void)ipsec4_forward(mcopy, &destmtu);
                 {  #endif
                         /*  
                          * If the packet is routed over IPsec tunnel, tell the  
                          * originator the tunnel MTU.  
                          *      tunnel MTU = if MTU - sizeof(IP) - ESP/AH hdrsiz  
                          * XXX quickhack!!!  
                          */  
   
                         struct secpolicy *sp;  
                         int ipsecerror;  
                         size_t ipsechdr;  
                         struct route *ro;  
   
                         sp = ipsec4_getpolicybyaddr(mcopy,  
                             IPSEC_DIR_OUTBOUND, IP_FORWARDING,  
                             &ipsecerror);  
   
                         if (sp != NULL) {  
                                 /* count IPsec header size */  
                                 ipsechdr = ipsec4_hdrsiz(mcopy,  
                                     IPSEC_DIR_OUTBOUND, NULL);  
   
                                 /*  
                                  * find the correct route for outer IPv4  
                                  * header, compute tunnel MTU.  
                                  */  
   
                                 if (sp->req != NULL  
                                  && sp->req->sav != NULL  
                                  && sp->req->sav->sah != NULL) {  
                                         ro = &sp->req->sav->sah->sa_route;  
                                         rt = rtcache_validate(ro);  
                                         if (rt && rt->rt_ifp) {  
                                                 destmtu =  
                                                     rt->rt_rmx.rmx_mtu ?  
                                                     rt->rt_rmx.rmx_mtu :  
                                                     rt->rt_ifp->if_mtu;  
                                                 destmtu -= ipsechdr;  
                                         }  
                                 }  
   
                                 KEY_FREESP(&sp);  
                         }  
                 }  
 #endif /*defined(IPSEC)*/  
                 IP_STATINC(IP_STAT_CANTFRAG);                  IP_STATINC(IP_STAT_CANTFRAG);
                 break;                  break;
   

Legend:
Removed from v.1.304  
changed lines
  Added in v.1.305

CVSweb <webmaster@jp.NetBSD.org>