This function is just a wrapper around ifa_ifwithaddr() and I'd prefer to have less function iterating over the global list of interfaces.
ok? Index: netinet/ip_input.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_input.c,v retrieving revision 1.239 diff -u -p -r1.239 ip_input.c --- netinet/ip_input.c 1 Nov 2014 21:40:38 -0000 1.239 +++ netinet/ip_input.c 4 Nov 2014 11:23:33 -0000 @@ -723,23 +723,6 @@ in_ouraddr(struct mbuf *m, struct ifnet return (ISSET(ia->ia_ifp->if_flags, IFF_UP)); } -struct in_ifaddr * -in_iawithaddr(struct in_addr ina, u_int rtableid) -{ - struct in_ifaddr *ia; - struct sockaddr_in sin; - - memset(&sin, 0, sizeof(sin)); - sin.sin_len = sizeof(sin); - sin.sin_family = AF_INET; - sin.sin_addr = ina; - ia = ifatoia(ifa_ifwithaddr(sintosa(&sin), rtableid)); - if (ia == NULL || ina.s_addr == ia->ia_addr.sin_addr.s_addr) - return (ia); - - return (NULL); -} - /* * Take incoming datagram fragment and try to * reassemble it into whole datagram. If a chain for Index: netinet/ip_output.c =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_output.c,v retrieving revision 1.270 diff -u -p -r1.270 ip_output.c --- netinet/ip_output.c 1 Nov 2014 21:40:38 -0000 1.270 +++ netinet/ip_output.c 4 Nov 2014 11:23:33 -0000 @@ -1656,9 +1656,6 @@ int ip_setmoptions(int optname, struct ip_moptions **imop, struct mbuf *m, u_int rtableid) { - int error = 0; - u_char loop; - int i; struct in_addr addr; struct in_ifaddr *ia; struct ip_mreq *mreq; @@ -1666,7 +1663,9 @@ ip_setmoptions(int optname, struct ip_mo struct ip_moptions *imo = *imop; struct in_multi **immp; struct route ro; - struct sockaddr_in *dst; + struct sockaddr_in *dst, sin; + int i, error = 0; + u_char loop; if (imo == NULL) { /* @@ -1712,8 +1711,12 @@ ip_setmoptions(int optname, struct ip_mo * IP address. Find the interface and confirm that * it supports multicasting. */ - ia = in_iawithaddr(addr, rtableid); - if (ia) + memset(&sin, 0, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_addr = addr; + ia = ifatoia(ifa_ifwithaddr(sintosa(&sin), rtableid)); + if (ia && in_hosteq(sin.sin_addr, ia->ia_addr.sin_addr)) ifp = ia->ia_ifp; if (ifp == NULL || (ifp->if_flags & IFF_MULTICAST) == 0) { error = EADDRNOTAVAIL; @@ -1781,8 +1784,12 @@ ip_setmoptions(int optname, struct ip_mo ifp = ro.ro_rt->rt_ifp; rtfree(ro.ro_rt); } else { - ia = in_iawithaddr(mreq->imr_interface, rtableid); - if (ia) + memset(&sin, 0, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_addr = mreq->imr_interface; + ia = ifatoia(ifa_ifwithaddr(sintosa(&sin), rtableid)); + if (ia && in_hosteq(sin.sin_addr, ia->ia_addr.sin_addr)) ifp = ia->ia_ifp; } /* @@ -1870,12 +1877,17 @@ ip_setmoptions(int optname, struct ip_mo if (mreq->imr_interface.s_addr == INADDR_ANY) ifp = NULL; else { - ia = in_iawithaddr(mreq->imr_interface, rtableid); - if (ia == NULL) { + memset(&sin, 0, sizeof(sin)); + sin.sin_len = sizeof(sin); + sin.sin_family = AF_INET; + sin.sin_addr = mreq->imr_interface; + ia = ifatoia(ifa_ifwithaddr(sintosa(&sin), rtableid)); + if (ia && in_hosteq(sin.sin_addr, ia->ia_addr.sin_addr)) + ifp = ia->ia_ifp; + else { error = EADDRNOTAVAIL; break; } - ifp = ia->ia_ifp; } /* * Find the membership in the membership array. Index: netinet/ip_var.h =================================================================== RCS file: /home/ncvs/src/sys/netinet/ip_var.h,v retrieving revision 1.56 diff -u -p -r1.56 ip_var.h --- netinet/ip_var.h 21 Apr 2014 12:22:26 -0000 1.56 +++ netinet/ip_var.h 4 Nov 2014 11:23:33 -0000 @@ -189,8 +189,6 @@ int ip_pcbopts(struct mbuf **, struct m struct mbuf * ip_reass(struct ipqent *, struct ipq *); struct in_ifaddr * - in_iawithaddr(struct in_addr, u_int); -struct in_ifaddr * ip_rtaddr(struct in_addr, u_int); u_int16_t ip_randomid(void);