From owner-freebsd-bugs Fri Aug 9 16:35:44 2002 Delivered-To: freebsd-bugs@freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 945A837B400 for ; Fri, 9 Aug 2002 16:35:35 -0700 (PDT) Received: from mail.wrs.com (unknown-1-11.windriver.com [147.11.1.11]) by mx1.FreeBSD.org (Postfix) with ESMTP id 395FC43E6E for ; Fri, 9 Aug 2002 16:35:34 -0700 (PDT) (envelope-from Qing.Li@windriver.com) Received: from heavygear (qing3.isi.com [192.103.54.234]) by mail.wrs.com (8.9.3/8.9.1) with SMTP id QAA13015 for ; Fri, 9 Aug 2002 16:35:23 -0700 (PDT) From: "Qing Li" To: "Freebsd Bugs" Subject: static routes set with interface address as gateway are non-functional Date: Fri, 9 Aug 2002 16:34:32 -0700 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) Importance: Normal X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org 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 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