Bug 26970

Summary: 4.3 netstat -r output missing data
Product: Base System Reporter: jonathan.chen <jonathan.chen>
Component: binAssignee: ru <ru>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: Unspecified   
Hardware: Any   
OS: Any   

Description jonathan.chen 2001-04-30 00:30:01 UTC
	The output of `netstat -r' for 4.3-RELEASE onwards doesn't appear
	to include info on hosts on the local network that it has recently
	communicated with.

How-To-Repeat: 
	0:jonc-~,10:21am> uname -v
	FreeBSD 4.3-STABLE #1: Mon Apr 23 15:03:39 NZST 2001     root@jonc.itouch:/usr/obj/usr/src/sys/JONC 
	0:jonc-~,10:21am> ping 192.168.2.10
	PING 192.168.2.10 (192.168.2.10): 56 data bytes
	64 bytes from 192.168.2.10: icmp_seq=0 ttl=255 time=0.616 ms
	^C
	--- 192.168.2.10 ping statistics ---
	2 packets transmitted, 2 packets received, 0% packet loss
	round-trip min/avg/max/stddev = 0.616/0.788/0.961/0.172 ms
	0:jonc-~,10:21am> netstat -rn
	Routing tables

	Internet:
	Destination        Gateway            Flags     Refs     Use     Netif Expire
	default            192.168.2.1        UGSc        0        0      xl0
	127.0.0.1          127.0.0.1          UH          1        2      lo0
	192.168.2          link#1             UC          0        0      xl0 =>

	Internet6:
	[...]

	The 4.3 box doesn't have routing info for 192.168.2.10 listed.
	However, on a 4.2-STABLE machine, I get:

	pikachu-~,10:26am> netstat -rn 
	Routing tables

	Internet:
	Destination        Gateway            Flags     Refs     Use     Netif Expire
	default            XXX.XXX.XXX.XX     UGSc       48  4631786     fxp0
	192.168.2          link#6             UC          0        0      xl4 =>
	192.168.2.10       0:d0:b7:89:95:b6   UHLW        1    37061      xl4    698
	192.168.2.11       0:d0:b7:a9:56:3    UHLW        1     1685      xl4    811
	[...]
Comment 1 ru freebsd_committer freebsd_triage 2001-05-04 16:21:32 UTC
On Mon, Apr 30, 2001 at 11:29:11AM +1200, jonathan.chen@itouch.co.nz wrote:
> 
> The output of `netstat -r' for 4.3-RELEASE onwards doesn't appear
> to include info on hosts on the local network that it has recently
> communicated with.
> 
This is the documented behavior.  ``netstat -r'' does not anymore show
cloned routes by default unless -a is given, see manpage for details.
Previously, only protocol-cloned routes were hidden from a normal
output.  Now both protocol-cloned and cloned routes are not shown.
There was the reason for this change in -CURRENT, but for -STABLE it
was certainly premature.  I don't have an idea why DES did this.  DES?

I have a question for Garrett.  Was the original idea behind -a flag is
to hide protocol-cloned routes only but not RTF_CLONING generated routes,
or it was simply caused by the bug that `rt_parent' was not set for
routes generated from RTF_CLONING parent, as documented in rtentry(9)?

If the behavior of netstat(1) is to be restored, the following patch
will DTRT:

Index: route.c
===================================================================
RCS file: /home/ncvs/src/usr.bin/netstat/route.c,v
retrieving revision 1.41.2.5
diff -u -p -r1.41.2.5 route.c
--- route.c	2001/03/22 13:48:44	1.41.2.5
+++ route.c	2001/05/04 15:02:48
@@ -582,16 +582,20 @@ p_rtentry(rt)
 	register struct rtentry *rt;
 {
 	static struct ifnet ifnet, *lastif;
+	struct rtentry parent;
 	static char name[16];
 	static char prettyname[9];
 	struct sockaddr *sa;
 	sa_u addr, mask;
 
 	/*
-	 * Don't print cloned routes unless -a.
+	 * Don't print protocol-cloned routes unless -a.
 	 */
-	if (rt->rt_flags & RTF_WASCLONED && !aflag)
-		return;
+	if (rt->rt_flags & RTF_WASCLONED && !aflag) {
+		kget(rt->rt_parent, parent);
+		if (parent.rt_flags & RTF_PRCLONING)
+			return;
+	}
 
 	bzero(&addr, sizeof(addr));
 	if ((sa = kgetsa(rt_key(rt))))



Cheers,
-- 
Ruslan Ermilov		Oracle Developer/DBA,
ru@sunbay.com		Sunbay Software AG,
ru@FreeBSD.org		FreeBSD committer,
+380.652.512.251	Simferopol, Ukraine

http://www.FreeBSD.org	The Power To Serve
http://www.oracle.com	Enabling The Information Age
Comment 2 Garrett A. Wollman 2001-05-04 16:49:41 UTC
<<On Fri, 4 May 2001 18:21:32 +0300, Ruslan Ermilov <ru@FreeBSD.ORG> said:

> I have a question for Garrett.  Was the original idea behind -a flag is
> to hide protocol-cloned routes only but not RTF_CLONING generated routes,
> or it was simply caused by the bug that `rt_parent' was not set for
> routes generated from RTF_CLONING parent, as documented in rtentry(9)?

Let me see if I can reconstruct the history.

Originally, 4.4's `netstat -r' showed cloned routes.
Then I added the ``protocol cloning'' feature and suddenly there were
a lot more cloned routes.
Then people complained that this was too much information.
Then I added the `-a' flag to hide the stuff that protocol-cloning had
added.

I'm agnostic on whether `-a' should suppress all cloned routes or just
the protocol-cloned routes.  POLA suggests that the latter is probably
a better choice.

-GAWollman
Comment 3 des 2001-05-04 21:54:54 UTC
Ruslan Ermilov <ru@FreeBSD.org> writes:
> There was the reason for this change in -CURRENT, but for -STABLE it
> was certainly premature.  I don't have an idea why DES did this.  DES?

Probably because it was buried in a diff that contained other fixes
that needed MFCing.  It wasn't a conscious decision to MFC exactly
that one change.

DES
-- 
Dag-Erling Smorgrav - des@ofug.org
Comment 4 ru freebsd_committer freebsd_triage 2001-05-07 13:29:54 UTC
State Changed
From-To: open->analyzed

Old behavior of printing RTF_CLONING cloned routes restored in 5.0-CURRENT: 

src/usr.bin/netstat/route.c,v 1.48 
src/usr.bin/netstat/netstat.1,v 1.28 


Comment 5 ru freebsd_committer freebsd_triage 2001-05-07 13:29:54 UTC
Responsible Changed
From-To: freebsd-bugs->ru

My change, my fix.
Comment 6 ru freebsd_committer freebsd_triage 2001-05-10 09:26:55 UTC
State Changed
From-To: analyzed->closed

Fix merged into 4.3-STABLE: 

src/usr.bin/netstat/route.c,v 1.41.2.6 
src/usr.bin/netstat/netstat.1,v 1.22.2.4