From owner-freebsd-bugs Fri Aug 9 16:52:10 2002 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 9C92E37B409 for ; Fri, 9 Aug 2002 16:51:57 -0700 (PDT) Received: from freefall.freebsd.org (freefall.FreeBSD.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 8FEF043E9E for ; Fri, 9 Aug 2002 16:51:56 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.4/8.12.4) with ESMTP id g79NpoJU096644 for ; Fri, 9 Aug 2002 16:51:50 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.4/8.12.4/Submit) id g79NpoK2096643; Fri, 9 Aug 2002 16:51:50 -0700 (PDT) Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A872437B400 for ; Fri, 9 Aug 2002 16:48:53 -0700 (PDT) Received: from mail.wrs.com (unknown-1-11.windriver.com [147.11.1.11]) by mx1.FreeBSD.org (Postfix) with ESMTP id C5FA643E70 for ; Fri, 9 Aug 2002 16:48:52 -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 QAA19399 for ; Fri, 9 Aug 2002 16:48:42 -0700 (PDT) Message-Id: Date: Fri, 9 Aug 2002 16:47:52 -0700 From: "Qing Li" To: "FreeBSD gnats submit" Subject: kern/41494: static routes set with interface address as gateway are non-functional 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 >Number: 41494 >Category: kern >Synopsis: static routes set with interface address as gateway are >Confidential: no >Severity: critical >Priority: high >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Aug 09 16:51:24 PDT 2002 >Closed-Date: >Last-Modified: >Originator: Qing Li >Release: FreeBSD 4.6-PRERELEASE i386 >Organization: >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 >Release-Note: >Audit-Trail: >Unformatted: non-functional To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message