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.239 retrieving revision 1.240 diff -u -p -r1.239 -r1.240 --- src/sys/netinet/ip_input.c 2006/12/09 05:33:04 1.239 +++ src/sys/netinet/ip_input.c 2006/12/15 21:18:53 1.240 @@ -1,4 +1,4 @@ -/* $NetBSD: ip_input.c,v 1.239 2006/12/09 05:33:04 dyoung 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.239 2006/12/09 05:33:04 dyoung 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" @@ -1679,18 +1679,20 @@ ip_rtaddr(struct in_addr dst) sin = satosin(&ipforward_rt.ro_dst); - if (ipforward_rt.ro_rt == NULL || !in_hosteq(dst, sin->sin_addr)) { - if (ipforward_rt.ro_rt != NULL) - rtflush(&ipforward_rt); + 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 == NULL) - return NULL; - return ifatoia(ipforward_rt.ro_rt->rt_ifa); + return (ifatoia(ipforward_rt.ro_rt->rt_ifa)); } /* @@ -1871,21 +1873,22 @@ ip_forward(struct mbuf *m, int srcrt) } sin = satosin(&ipforward_rt.ro_dst); - if ((rt = ipforward_rt.ro_rt) == NULL || - !in_hosteq(ip->ip_dst, sin->sin_addr)) { - if (ipforward_rt.ro_rt != NULL) - rtflush(&ipforward_rt); + 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); + 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