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;
}
/*