Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files. =================================================================== RCS file: /ftp/cvs/cvsroot/src/sys/netinet/ip_input.c,v rcsdiff: /ftp/cvs/cvsroot/src/sys/netinet/ip_input.c,v: warning: Unknown phrases like `commitid ...;' are present. retrieving revision 1.236.2.2 retrieving revision 1.240 diff -u -p -r1.236.2.2 -r1.240 --- src/sys/netinet/ip_input.c 2008/03/30 15:27:49 1.236.2.2 +++ src/sys/netinet/ip_input.c 2006/12/15 21:18:53 1.240 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.236.2.2 2008/03/30 15:27:49 jdc Exp $ */ +/* $NetBSD: ip_input.c,v 1.240 2006/12/15 21:18:53 joerg Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -98,7 +98,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.236.2.2 2008/03/30 15:27:49 jdc Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_input.c,v 1.240 2006/12/15 21:18:53 joerg Exp $"); #include "opt_inet.h" #include "opt_gateway.h" @@ -1013,6 +1013,7 @@ found: /* XXX error stat??? */ error = EINVAL; DPRINTF(("ip_input: no SP, packet discarded\n"));/*XXX*/ + goto bad; } splx(s); if (error) @@ -1678,19 +1679,19 @@ ip_rtaddr(struct in_addr dst) sin = satosin(&ipforward_rt.ro_dst); - if (ipforward_rt.ro_rt == 0 || !in_hosteq(dst, sin->sin_addr)) { - if (ipforward_rt.ro_rt) { - RTFREE(ipforward_rt.ro_rt); - ipforward_rt.ro_rt = 0; - } + if (!in_hosteq(dst, sin->sin_addr)) + rtcache_free(&ipforward_rt); + else + rtcache_check(&ipforward_rt); + if (ipforward_rt.ro_rt == NULL) { sin->sin_family = AF_INET; sin->sin_len = sizeof(*sin); sin->sin_addr = dst; - rtalloc(&ipforward_rt); + rtcache_init(&ipforward_rt); + if (ipforward_rt.ro_rt == NULL) + return NULL; } - if (ipforward_rt.ro_rt == 0) - return ((struct in_ifaddr *)0); return (ifatoia(ipforward_rt.ro_rt->rt_ifa)); } @@ -1727,10 +1728,10 @@ ip_srcroute(void) struct mbuf *m; if (ip_nhops == 0) - return ((struct mbuf *)0); + return NULL; m = m_get(M_DONTWAIT, MT_SOOPTS); if (m == 0) - return ((struct mbuf *)0); + return NULL; MCLAIM(m, &inetdomain.dom_mowner); #define OPTSIZ (sizeof(ip_srcrt.nop) + sizeof(ip_srcrt.srcopt)) @@ -1872,23 +1873,22 @@ ip_forward(struct mbuf *m, int srcrt) } sin = satosin(&ipforward_rt.ro_dst); - if ((rt = ipforward_rt.ro_rt) == 0 || - !in_hosteq(ip->ip_dst, sin->sin_addr)) { - if (ipforward_rt.ro_rt) { - RTFREE(ipforward_rt.ro_rt); - ipforward_rt.ro_rt = 0; - } + if (!in_hosteq(ip->ip_dst, sin->sin_addr)) + rtcache_free(&ipforward_rt); + else + rtcache_check(&ipforward_rt); + if (ipforward_rt.ro_rt == NULL) { sin->sin_family = AF_INET; sin->sin_len = sizeof(struct sockaddr_in); sin->sin_addr = ip->ip_dst; - rtalloc(&ipforward_rt); - if (ipforward_rt.ro_rt == 0) { + rtcache_init(&ipforward_rt); + if (ipforward_rt.ro_rt == NULL) { icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_NET, dest, 0); return; } - rt = ipforward_rt.ro_rt; } + rt = ipforward_rt.ro_rt; /* * Save at most 68 bytes of the packet in case @@ -1934,7 +1934,7 @@ ip_forward(struct mbuf *m, int srcrt) } } - error = ip_output(m, (struct mbuf *)0, &ipforward_rt, + error = ip_output(m, NULL, &ipforward_rt, (IP_FORWARDING | (ip_directedbcast ? IP_ALLOWBROADCAST : 0)), (struct ip_moptions *)NULL, (struct socket *)NULL); @@ -1976,17 +1976,17 @@ ip_forward(struct mbuf *m, int srcrt) case EMSGSIZE: type = ICMP_UNREACH; code = ICMP_UNREACH_NEEDFRAG; - - if (ipforward_rt.ro_rt) { - -#if defined(IPSEC) || defined(FAST_IPSEC) - /* - * 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!!! - */ - +#if !defined(IPSEC) && !defined(FAST_IPSEC) + if (ipforward_rt.ro_rt != NULL) + destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu; +#else + /* + * 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!!! + */ + if (ipforward_rt.ro_rt != NULL) { struct secpolicy *sp; int ipsecerror; size_t ipsechdr; @@ -1995,11 +1995,10 @@ ip_forward(struct mbuf *m, int srcrt) sp = ipsec4_getpolicybyaddr(mcopy, IPSEC_DIR_OUTBOUND, IP_FORWARDING, &ipsecerror); -#endif - destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu; -#if defined(IPSEC) || defined(FAST_IPSEC) - if (sp != NULL) { + if (sp == NULL) + destmtu = ipforward_rt.ro_rt->rt_ifp->if_mtu; + else { /* count IPsec header size */ ipsechdr = ipsec4_hdrsiz(mcopy, IPSEC_DIR_OUTBOUND, NULL); @@ -2028,8 +2027,8 @@ ip_forward(struct mbuf *m, int srcrt) KEY_FREESP(&sp); #endif } -#endif /*defined(IPSEC) || defined(FAST_IPSEC)*/ } +#endif /*IPSEC*/ ipstat.ips_cantfrag++; break;