Use rtalloc(9) instead of ifa_ifwithnet() to find an interface
authormpi <mpi@openbsd.org>
Mon, 22 Aug 2016 16:53:59 +0000 (16:53 +0000)
committermpi <mpi@openbsd.org>
Mon, 22 Aug 2016 16:53:59 +0000 (16:53 +0000)
when adding a route to gateway to ensure a most specific match.

This makes "# route add"  coherent to "# route get" even with
p2p interfaces.  Fix a problem reported by Mart Tõnso.

This also fix rttest20 after the introduction of RTF_CACHED.

ok vgross@

sys/net/route.c

index eed062d..bfa5925 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: route.c,v 1.316 2016/08/22 16:01:52 mpi Exp $ */
+/*     $OpenBSD: route.c,v 1.317 2016/08/22 16:53:59 mpi Exp $ */
 /*     $NetBSD: route.c,v 1.14 1996/02/13 22:00:46 christos Exp $      */
 
 /*
@@ -797,20 +797,16 @@ ifa_ifwithroute(int flags, struct sockaddr *dst, struct sockaddr *gateway,
                                ifa = ifaof_ifpforaddr(dst, ifp);
                        if_put(ifp);
                } else {
-                       ifa = ifa_ifwithnet(gateway, rtableid);
-               }
-       }
-       if (ifa == NULL) {
-               struct rtentry  *rt = rtalloc(gateway, 0, rtableid);
-               /* The gateway must be local if the same address family. */
-               if (!rtisvalid(rt) || ((rt->rt_flags & RTF_GATEWAY) &&
-                   rt_key(rt)->sa_family == dst->sa_family)) {
+                       struct rtentry *rt;
+
+                       rt = rtalloc(gateway, RT_RESOLVE, rtableid);
+                       if (rt != NULL)
+                               ifa = rt->rt_ifa;
                        rtfree(rt);
-                       return (NULL);
                }
-               ifa = rt->rt_ifa;
-               rtfree(rt);
        }
+       if (ifa == NULL)
+               return (NULL);
        if (ifa->ifa_addr->sa_family != dst->sa_family) {
                struct ifaddr   *oifa = ifa;
                ifa = ifaof_ifpforaddr(dst, ifa->ifa_ifp);