Mihail Balikov wrote: > In -stable ip_input.c in_forward() we cache last used route in ipforward_rt. > > sin = (struct sockaddr_in *)&ipforward_rt.ro_dst; > if ((rt = ipforward_rt.ro_rt) == 0 || > pkt_dst.s_addr != sin->sin_addr.s_addr) { > if (ipforward_rt.ro_rt) { > RTFREE(ipforward_rt.ro_rt); > ipforward_rt.ro_rt = 0; > } > sin->sin_family = AF_INET; > sin->sin_len = sizeof(*sin); > sin->sin_addr = pkt_dst; > > rtalloc_ign(&ipforward_rt, RTF_PRCLONING); > if (ipforward_rt.ro_rt == 0) { > icmp_error(m, ICMP_UNREACH, ICMP_UNREACH_HOST, dest, > 0); > return; > } > rt = ipforward_rt.ro_rt; > } > > In my opinion, we should verify that ipforward_rt is not last reference to > route and route is UP: > > sin = (struct sockaddr_in *)&ipforward_rt.ro_dst; > if ((rt = ipforward_rt.ro_rt) == 0 || > pkt_dst.s_addr != sin->sin_addr.s_addr || > rt->rt_refcnt <= 1 || > (rt->rt_flags & RTF_UP) == 0) { > .... > }
Sounds like kern/10778... ? http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/10778 -Archie __________________________________________________________________________ Archie Cobbs * Packet Design * http://www.packetdesign.com To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-net" in the body of the message