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 - 1.239
+++ netinet/ip_input.c 4 Nov 2014 11:23:33 -
@@ -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 - 1.270
+++ netinet/ip_output.c 4 Nov 2014 11:23:33 -
@@ -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.h21 Apr 2014 12:22:26 - 1.56
+++ netinet/ip_var.h4 Nov 2014 11:23:33 -
@@ -189,8 +189,6 @@ int ip_pcbopts(struct mbuf **, struct m
struct mbuf *
ip_reass(struct ipqent *, struct ipq *);
struct