regress/sys/net/rdomains still passes with this diff.

Ok ?

Index: net/if.c
===================================================================
RCS file: /cvs/src/sys/net/if.c,v
retrieving revision 1.398
diff -u -p -r1.398 if.c
--- net/if.c    25 Oct 2015 21:58:04 -0000      1.398
+++ net/if.c    26 Oct 2015 09:44:10 -0000
@@ -1143,31 +1143,19 @@ if_congested(void)
 struct ifaddr *
 ifa_ifwithaddr(struct sockaddr *addr, u_int rtableid)
 {
-       struct ifnet *ifp;
        struct ifaddr *ifa;
+       struct rtentry *rt;
        u_int rdomain;
 
+       /*
+        * Local routes corresponding to ifas are in rdomain's
+        * default rtable.
+        */
        rdomain = rtable_l2(rtableid);
-       TAILQ_FOREACH(ifp, &ifnet, if_list) {
-               if (ifp->if_rdomain != rdomain)
-                       continue;
-
-               TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list) {
-                       if (ifa->ifa_addr->sa_family != addr->sa_family)
-                               continue;
-
-                       if (equal(addr, ifa->ifa_addr))
-                               return (ifa);
-
-                       /* IPv6 doesn't have broadcast */
-                       if ((ifp->if_flags & IFF_BROADCAST) &&
-                           ifa->ifa_broadaddr &&
-                           ifa->ifa_broadaddr->sa_len != 0 &&
-                           equal(ifa->ifa_broadaddr, addr))
-                               return (ifa);
-               }
-       }
-       return (NULL);
+       rt = rtalloc(addr, 0, rdomain);
+       ifa = rt && (rt->rt_flags & RTF_LOCAL) ? rt->rt_ifa : NULL;
+       rtfree(rt);
+       return ifa;
 }
 
 /*

Reply via email to