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);

Reply via email to