On Thu, Dec 03, 2015 at 02:52:59PM +0100, Vincent Gross wrote: > bluhm@ spotted one case where in_broadcast was needed. > > ok ?
OK bluhm@ > > Index: sys/net/if.c > =================================================================== > RCS file: /cvs/src/sys/net/if.c,v > retrieving revision 1.418 > diff -u -p -r1.418 if.c > --- sys/net/if.c 3 Dec 2015 12:22:51 -0000 1.418 > +++ sys/net/if.c 3 Dec 2015 13:48:58 -0000 > @@ -1220,13 +1220,6 @@ ifa_ifwithaddr(struct sockaddr *addr, u_ > > 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); > Index: sys/net/route.c > =================================================================== > RCS file: /cvs/src/sys/net/route.c,v > retrieving revision 1.283 > diff -u -p -r1.283 route.c > --- sys/net/route.c 2 Dec 2015 16:49:58 -0000 1.283 > +++ sys/net/route.c 3 Dec 2015 13:49:00 -0000 > @@ -539,7 +539,9 @@ rtredirect(struct sockaddr *dst, struct > bcmp((caddr_t)(a1), (caddr_t)(a2), (a1)->sa_len) == 0) > if (rt != NULL && (!equal(src, rt->rt_gateway) || rt->rt_ifa != ifa)) > error = EINVAL; > - else if (ifa_ifwithaddr(gateway, rdomain) != NULL) > + else if (ifa_ifwithaddr(gateway, rdomain) != NULL || > + (gateway->sa_family = AF_INET && > + in_broadcast(satosin(gateway)->sin_addr, rdomain))) > error = EHOSTUNREACH; > if (error) > goto done; > Index: sys/netinet/in_pcb.c > =================================================================== > RCS file: /cvs/src/sys/netinet/in_pcb.c,v > retrieving revision 1.191 > diff -u -p -r1.191 in_pcb.c > --- sys/netinet/in_pcb.c 3 Dec 2015 09:49:15 -0000 1.191 > +++ sys/netinet/in_pcb.c 3 Dec 2015 13:49:00 -0000 > @@ -332,14 +332,13 @@ in_pcbbind(struct inpcb *inp, struct mbu > > ia = ifatoia(ifa_ifwithaddr(sintosa(sin), > inp->inp_rtableid)); > - if (ia == NULL) > - return (EADDRNOTAVAIL); > > /* SOCK_RAW does not use in_pcbbind() */ > - if (so->so_type != SOCK_DGRAM && > - sin->sin_addr.s_addr != > - ia->ia_addr.sin_addr.s_addr) > - return (EADDRNOTAVAIL); > + if (ia == NULL && > + (so->so_type != SOCK_DGRAM || > + !in_broadcast(sin->sin_addr, > + inp->inp_rtableid))) > + return (EADDRNOTAVAIL); > } > } > if (lport) { > @@ -353,7 +352,8 @@ in_pcbbind(struct inpcb *inp, struct mbu > t = in_pcblookup(table, &zeroin_addr, 0, > &sin->sin_addr, lport, INPLOOKUP_WILDCARD, > inp->inp_rtableid); > - if (t && (so->so_euid != > t->inp_socket->so_euid)) > + if (t && > + (so->so_euid != t->inp_socket->so_euid)) > return (EADDRINUSE); > } > t = in_pcblookup(table, &zeroin_addr, 0, > Index: sys/netinet/ip_output.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_output.c,v > retrieving revision 1.311 > diff -u -p -r1.311 ip_output.c > --- sys/netinet/ip_output.c 2 Dec 2015 20:50:20 -0000 1.311 > +++ sys/netinet/ip_output.c 3 Dec 2015 13:49:01 -0000 > @@ -1368,13 +1368,12 @@ ip_setmoptions(int optname, struct ip_mo > 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) { > + if (ia == NULL || > + (ia->ia_ifp->if_flags & IFF_MULTICAST) == 0) { > error = EADDRNOTAVAIL; > break; > } > - imo->imo_ifidx = ifp->if_index; > + imo->imo_ifidx = ia->ia_ifp->if_index; > break; > > case IP_MULTICAST_TTL: > @@ -1542,12 +1541,11 @@ ip_setmoptions(int optname, struct ip_mo > 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 { > + if (ia == NULL) { > error = EADDRNOTAVAIL; > break; > } > + ifp = ia->ia_ifp; > } > /* > * Find the membership in the membership array. > Index: sys/netinet/raw_ip.c > =================================================================== > RCS file: /cvs/src/sys/netinet/raw_ip.c,v > retrieving revision 1.84 > diff -u -p -r1.84 raw_ip.c > --- sys/netinet/raw_ip.c 28 Jul 2015 12:22:07 -0000 1.84 > +++ sys/netinet/raw_ip.c 3 Dec 2015 13:49:01 -0000 > @@ -473,6 +473,7 @@ rip_usrreq(struct socket *so, int req, s > if (!((so->so_options & SO_BINDANY) || > addr->sin_addr.s_addr == INADDR_ANY || > addr->sin_addr.s_addr == INADDR_BROADCAST || > + in_broadcast(addr->sin_addr, inp->inp_rtableid) || > ifa_ifwithaddr(sintosa(addr), inp->inp_rtableid))) { > error = EADDRNOTAVAIL; > break;