From 0e92ff1093cbfa2dfe1222c5c919b80ccdd8ece4 Mon Sep 17 00:00:00 2001 From: christos Date: Sat, 8 Jun 2013 02:42:56 +0000 Subject: [PATCH] PR/44032: Proxy entries stopped working with pppd. The issue here is that the route entry was added, but the RTF_LLINFO bit was not set, making arp -a not showing the entry, but netstat -rn -f inet showing it with the missing L bit. The order of resolution in ifa_ifwithroute() is that if a destination address is found, then the interface chosen for the route is that of the destination. This does not work for link-level addresses since the ppp interface does not arp (uses link_rtrequest, not arp_rtrequest), so the bit is never set. The easy solution here is to check that the gateway is a link address, and use the interface which we chose for the link address as opposed to the interface that routes to the destination. This restores the previous behavior, but is it correct? --- sys/net/route.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sys/net/route.c b/sys/net/route.c index 25a8c2ffd194..5e8e65b633c8 100644 --- a/sys/net/route.c +++ b/sys/net/route.c @@ -1,4 +1,4 @@ -/* $NetBSD: route.c,v 1.126 2012/01/30 20:01:08 christos Exp $ */ +/* $NetBSD: route.c,v 1.127 2013/06/08 02:42:56 christos Exp $ */ /*- * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc. @@ -93,7 +93,7 @@ #include "opt_route.h" #include -__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.126 2012/01/30 20:01:08 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.127 2013/06/08 02:42:56 christos Exp $"); #include #include @@ -594,7 +594,7 @@ ifa_ifwithroute(int flags, const struct sockaddr *dst, * we can use the local address. */ ifa = NULL; - if (flags & RTF_HOST) + if ((flags & RTF_HOST) && gateway->sa_family != AF_LINK) ifa = ifa_ifwithdstaddr(dst); if (ifa == NULL) ifa = ifa_ifwithaddr(gateway); @@ -619,7 +619,7 @@ ifa_ifwithroute(int flags, const struct sockaddr *dst, if (ifa->ifa_addr->sa_family != dst->sa_family) { struct ifaddr *oifa = ifa; ifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp); - if (ifa == 0) + if (ifa == NULL) ifa = oifa; } return ifa;