Date: Wed, 6 Jun 2001 03:30:07 -0700 (PDT) From: Andre Albsmeier <andre.albsmeier@mchp.siemens.de> To: freebsd-bugs@FreeBSD.org Subject: Re: kern/27890: FreeBSD not always seems to take the best route Message-ID: <200106061030.f56AU7J92591@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
The following reply was made to PR kern/27890; it has been noted by GNATS. From: Andre Albsmeier <andre.albsmeier@mchp.siemens.de> To: Ruslan Ermilov <ru@FreeBSD.org> Cc: Andre Albsmeier <andre.albsmeier@mchp.siemens.de>, bug-followup@FreeBSD.org Subject: Re: kern/27890: FreeBSD not always seems to take the best route Date: Wed, 6 Jun 2001 12:29:04 +0200 Thanks for helping... On Wed, 06-Jun-2001 at 11:24:19 +0300, Ruslan Ermilov wrote: > > ... > > I can't reproduce this problem on my 4.3-STABLE box. > > Yes, the UDP socket has the reference to the protocol-cloned > route to the destination host S through the router 1 initially, > and UDP packets go through that router. > > In my tests, router 1 (192.168.1.1) was the host *not* configured > to act as the router, so all "foreign" packets sent to it got OK, I have blocked packets coming from C on router 1. So I think I got the same config as you. > silently ignored. I used the ports/net/netcat utility to connect > to the UDP `echo' port of the destination S (192.168.2.1): > > Fig.1: Initial state, before UDP socket is open. > > : # netstat -arn > : Destination Gateway Flags Refs Use Netif Expire > : default 192.168.1.1 UGSc 0 2 rl0 > : 127.0.0.1 127.0.0.1 UH 1 6 lo0 > : 192.168.1 link#1 UC 3 0 rl0 => > > > Fig.2: We connect(2) UDP socket to the "echo" port on S (192.168.2.1). > > : # nc -u 192.168.2.1 echo > : ping1 > : ping2 > : ping3 > [...] > > As you can see, we receive no echos back. OK, same here. > Fig.3: Routing table after UDP socket is open. > > : # netstat -arn > : Destination Gateway Flags Refs Use Netif Expire > : default 192.168.1.1 UGSc 1 2 rl0 > : 127.0.0.1 127.0.0.1 UH 1 6 lo0 > : 192.168.1 link#1 UC 4 0 rl0 => > : 192.168.2.1 192.168.1.1 UGHW 1 14 rl0 > > The route to S (192.168.2.1) was cloned (W) from the `default' route. > refcnt=1 on the 192.168.2.1 route indicates that the UDP socket holds > a reference to this route. Same here: 192.168.2.1 192.168.1.1 UGHW 1 425 fxp0 > Fig.4: I manually add the route to the 192.168.2 network. > > : # route add -net 192.168.2 192.168.1.2 > : add net 192.168.2: gateway 192.168.1.2 OK, I don;t add it manually but wait until routed messages from 192.168.1.2 brings it back. > > Fig.5: Routing table after the route to the 192.168.2 network was added. > > : # netstat -arn > : Destination Gateway Flags Refs Use Netif Expire > : default 192.168.1.1 UGSc 1 2 rl0 > : 127.0.0.1 127.0.0.1 UH 1 6 lo0 > : 192.168.1 link#1 UC 4 0 rl0 => > : 192.168.2 192.168.1.2 UGSc 0 0 rl0 Yup, same here > As you can see, the route to the 192.168.2.1 host is deleted from the routing > table. It actually doesn't get freed completely, as it had non-zero reference > count (UDP socket still holds on it), but instead it gets marked as DOWN, and > will be freed and reallocated in ip_output() on the next use. > > Fig.6: We continue to send UDP datagrams. > > : # nc -u 192.168.2.1 echo (continued) > : ping4 > : ping4 > : ping5 > : ping5 > : ping6 > : ping6 > > As you can see, this time we get the echos back. Yes, same here :-( > Fig.7: Routing table after we sent more UDP datagrams. > > : # netstat -arn -finet > : Destination Gateway Flags Refs Use Netif Expire > : default 192.168.1.1 UGSc 0 2 rl0 > : 127.0.0.1 127.0.0.1 UH 1 6 lo0 > : 192.168.1 link#1 UC 4 0 rl0 => > : 192.168.2 192.168.1.2 UGSc 1 3 rl0 > > The refcount on 192.168.2 route has grown to 1, indicating that the > UDP socket now holds on this route. The `Use' count of 3 corresponds > to our three UDP datagrams (ping4, ping5, and ping6). > > Could you please repeat these steps in your environment, and try to > detect where it behaved differently in your case. It doesn't behave differently, that's interesting. May I ask you to try it using syslogd? - Let host C log to host S (with the route installed). - Watch C's messages appear on S. - Delete C's route to S (via router 2) - Let host C log again (run tcpdump on router 1 to see the packets come in) - Install the route to S (via router 2) again on C - Log more stuff. If you don't see the packets go into router 1 anymore I am really lost... Thanks, -Andre To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200106061030.f56AU7J92591>