Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 9 Aug 2002 16:34:32 -0700
From:      "Qing Li" <Qing.Li@windriver.com>
To:        "Freebsd Bugs" <freebsd-bugs@freebsd.org>
Subject:   static routes set with interface address as gateway are non-functional
Message-ID:  <DMEGKJAJNLKBGDDBEAIPGECLFPAA.Qing.Li@windriver.com>

next in thread | raw e-mail | index | archive | help
SEND-PR: -*- send-pr -*-
SEND-PR: Lines starting with `SEND-PR' will be removed automatically, as
SEND-PR: will all comments (text enclosed in `<' and `>').
SEND-PR:
SEND-PR: Please consult the following URL if you are not sure how to
SEND-PR: fill out a problem report:
SEND-PR: http://www.freebsd.org/doc/en/articles/problem-reports/article.html
SEND-PR:
SEND-PR: Note that the Synopsis field is mandatory.
SEND-PR:
SEND-PR: Please note that (unless you state otherwise) if your report
SEND-PR: includes a patch then it will be taken under the same license as
SEND-PR: the one on the file(s) you want to change.
SEND-PR:
SEND-PR: BE ADVISED THAT FREEBSD PROBLEM REPORTS ARE PUBLIC INFORMATION AND
SEND-PR: WILL BE PUBLISHED AS-IS ON THE PROJECT'S MAILING LISTS AND WEB
SITES.
SEND-PR: DO NOT SUBMIT ANY INFORMATION YOU DO NOT WANT MADE PUBLIC.
SEND-PR:
SEND-PR: For sensitive security issues, consider contacting the FreeBSD
SEND-PR: security officer team (security-officer@freebsd.org) directly.
SEND-PR:
SEND-PR: Choose from the following categories:
SEND-PR:
SEND-PR: advocacy alpha    bin      conf     docs     gnu
SEND-PR: i386     kern     misc     ports    sparc
SEND-PR:
To: FreeBSD-gnats-submit@freebsd.org
From: Qing.Li@windriver.com
Reply-To: Qing.Li@windriver.com
Cc:
X-send-pr-version: 3.113
X-GNATS-Notify:


>Submitter-Id:	current-users
>Originator:	Qing Li
>Organization:
>Confidential:	no
>Synopsis:	static routes set with interface address as gateway are
non-functional
>Severity:	critical
>Priority:	high
>Category:	kern
>Class:		sw-bug
>Release:	FreeBSD 4.6-PRERELEASE i386
>Environment:
System: FreeBSD t38-108.wrs.com 4.6-PRERELEASE FreeBSD 4.6-PRERELEASE #2:
Mon Jun 17 11:10:00 GMT 2002
root@t38-108.wrs.com:/usr/obj/usr/src/sys/GENERIC i386

Timecounter "i8254"  frequency 1193182 Hz
CPU: Pentium II/Pentium II Xeon/Celeron (265.37-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0x634  Stepping = 4

Features=0x80f9ff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,SEP,MTRR,PGE,MCA,CMOV,M
MX>
real memory  = 167772160 (163840K bytes)
avail memory = 158187520 (154480K bytes)
pnpbios: Bad PnP BIOS data checksum
Preloaded elf kernel "kernel" at 0xc04c8000.
Pentium Pro MTRR support enabled

>Description:

	My interface xl0 is assigned 147.11.38.218.

	==========
	Routing tables

	Internet:
	Destination        Gateway            Flags    Refs      Use  Netif Expire
	default            147.11.38.1        UGSc        4        0    xl0
	127.0.0.1          127.0.0.1          UH          1       22    lo0
	147.11.38/24       link#5             UC          2        0    xl0
	147.11.38.1        00:00:0c:07:ac:26  UHLW        5        0    xl0    783
	147.11.38.15       147.11.38.218      UGHS        0        3    xl0
	147.11.38.218      127.0.0.1          UGHS        1        0    lo0
	147.11.38.254      00:02:7e:23:fa:80  UHLW        0        0    xl0     49

	Internet6:
	Destination                       Gateway                       Flags
Netif Expire
	::1                               ::1                           UH
lo0
	fe80::%xl0/64                     link#5                        UC
xl0
	fe80::2b0:d0ff:fe84:c8bc%xl0      fe80::2c0:4fff:fe8d:63b9%xl0  UGHS
xl0
	fe80::2c0:4fff:fe8d:63b9%xl0      00:c0:4f:8d:63:b9             UHL
lo0
	fe80::2e0:ff:fe84:4237%xl0        00:e0:00:84:42:37             UHLW
xl0
	fe80::%lo0/64                     fe80::1%lo0                   Uc
lo0
	fe80::1%lo0                       link#8                        UHL
lo0
	ff01::/32                         ::1                           U
lo0
	ff02::%xl0/32                     link#5                        UC
xl0
	ff02::%lo0/32                     ::1                           UC
lo0
	==========

	Now I add a host route:
	"route add -host 147.11.38.15 147.11.38.218"

	Then "ping 147.11.38.15"  fails.

	This is due to the "G" flag in that static route entry with the gateway
	address being one of the interface addresses. During transmission the
	route lookup on the gateway address will point the output interface
	to the loopback interface.

	This route addition should be allowed as a place holder
	to be filled in later, similar to of an entry with RTF_LLINFO flag.

	I put in the fixes, here is what the routing table shows after the fix
	using the same route command,

	===========
	147.11.38.15       link#5      UHLS        0        3    xl0
	===========

	"ping 147.11.38.15" now succeeds, that route entry is modified to be

	===========
	147.11.38.15       8:0:20:d1:64:c6    UHLS        0        3    xl0
	===========

	Similar problem exists in IPv6.
	Unlike "ping", "ping6" returns -1 with an error message
	of "No route to host".


>How-To-Repeat:

	Add a static route entry to a host that is directely reachable, set
	the gateway value using the interface address.

	For IPv4
	--------
	Step 1: route add -host 147.11.38.15 147.11.38.218
	Step 2: ping 147.11.38.15

	For IPv6
	--------
	Step 1: route add -host -inet6 fe80::2b0:d0ff:fe84:c8bc%xl0 -inet6 \
					      fe80::2c0:4fff:fe8d:63b9%xl0
	Step 2: ping6 fe80::2b0:d0ff:fe84:c8bc%xl0

>Fix:

	/usr/src/net/route.c

*** route.c     Mon Aug  5 17:33:39 2002
--- route.c.new Fri Aug  9 15:18:04 2002
***************
*** 1006,1011 ****
--- 1006,1018 ----
                        rt->rt_gwroute = 0;
                        return EDQUOT; /* failure */
                }
+                 if (rt->rt_gwroute->rt_ifp &&
+                     (rt->rt_gwroute->rt_ifp->if_flags & IFF_LOOPBACK))
+                 {
+                     rt->rt_gwroute = 0;
+                     rt->rt_flags &= ~RTF_GATEWAY;
+                     rt->rt_flags |= RTF_LLINFO;
+                 }
        }

        /*


	/usr/src/netinet/if_ether.c

*** if_ether.c  Mon Aug  5 17:33:44 2002
--- if_ether.c.new      Fri Aug  9 15:15:50 2002
***************
*** 188,194 ****
                if ((rt->rt_flags & RTF_HOST) == 0 &&
                    SIN(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
                        rt->rt_flags |= RTF_CLONING;
!               if (rt->rt_flags & RTF_CLONING) {
                        /*
                         * Case 1: This route should come from a route to
iface.
                         */
--- 188,194 ----
                if ((rt->rt_flags & RTF_HOST) == 0 &&
                    SIN(rt_mask(rt))->sin_addr.s_addr != 0xffffffff)
                        rt->rt_flags |= RTF_CLONING;
!               if (rt->rt_flags & (RTF_CLONING | RTF_LLINFO)) {
                        /*
                         * Case 1: This route should come from a route to
iface.
                         */
***************
*** 198,204 ****
                        SDL(gate)->sdl_type = rt->rt_ifp->if_type;
                        SDL(gate)->sdl_index = rt->rt_ifp->if_index;
                        rt->rt_expire = time_second;
!                       break;
                }
                /* Announce a new entry if requested. */
                if (rt->rt_flags & RTF_ANNOUNCE)
--- 198,205 ----
                        SDL(gate)->sdl_type = rt->rt_ifp->if_type;
                        SDL(gate)->sdl_index = rt->rt_ifp->if_index;
                        rt->rt_expire = time_second;
!                         if (rt->rt_flags & RTF_CLONING)
!                           break;
                }
                /* Announce a new entry if requested. */
                if (rt->rt_flags & RTF_ANNOUNCE)


	/usr/src/netinet6/nd6.c

*** nd6.c       Tue Apr 30 14:09:54 2002
--- nd6.c.new   Fri Aug  9 15:20:11 2002
***************
*** 1227,1233 ****
                Bzero(ln, sizeof(*ln));
                ln->ln_rt = rt;
                /* this is required for "ndp" command. - shin */
!               if (req == RTM_ADD) {
                        /*
                         * gate should have some valid AF_LINK entry,
                         * and ln->ln_expire should have some lifetime
--- 1227,1233 ----
                Bzero(ln, sizeof(*ln));
                ln->ln_rt = rt;
                /* this is required for "ndp" command. - shin */
!                 if ((req == RTM_ADD) && !(rt->rt_flags & RTF_LLINFO)) {
                        /*
                         * gate should have some valid AF_LINK entry,
                         * and ln->ln_expire should have some lifetime





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?DMEGKJAJNLKBGDDBEAIPGECLFPAA.Qing.Li>