Kill in_iawithaddr()

2014-11-04 Thread Martin Pieuchot

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 

Re: Kill in_iawithaddr()

2014-11-04 Thread Mike Belopuhov
On 4 November 2014 12:52, Martin Pieuchot mpieuc...@nolizard.org wrote:
 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?



what's not immediately apparent is that it also makes sure that the
address that ifa_ifwithaddr returns is not a broadcast address. oh god.

ok for the cleanup



Re: Kill in_iawithaddr()

2014-11-04 Thread Martin Pieuchot

On 04/11/14(Tue) 13:20, Mike Belopuhov wrote:
On 4 November 2014 12:52, Martin Pieuchot mpieuc...@nolizard.org 
wrote:

 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?



what's not immediately apparent is that it also makes sure that the
address that ifa_ifwithaddr returns is not a broadcast address. oh god.


Actually I'd like to do an audit afterward because I'm quite sure most 
of

the places where ifa_ifwithaddr() is called do *not* expect to see a
broadcast address.