Now that IPv4 addresses stay on the interface list even if something
bad occurs during in_ifinit(), I'd like to make in_control() look for
the previously configured addresses on the interface list rather than
on the global list.
ok?
Index: netinet/in.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/in.c,v
retrieving revision 1.83
diff -u -p -r1.83 in.c
--- netinet/in.c 19 Aug 2013 08:45:34 -0000 1.83
+++ netinet/in.c 21 Aug 2013 14:23:50 -0000
@@ -192,6 +192,7 @@ int
in_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp)
{
struct ifreq *ifr = (struct ifreq *)data;
+ struct ifaddr *ifa; \
struct in_ifaddr *ia = NULL;
struct in_aliasreq *ifra = (struct in_aliasreq *)data;
struct sockaddr_in oldaddr;
@@ -215,20 +216,24 @@ in_control(struct socket *so, u_long cmd
* Find address for this interface, if it exists.
*/
if (ifp)
- TAILQ_FOREACH(ia, &in_ifaddr, ia_list)
- if (ia->ia_ifp == ifp)
+ TAILQ_FOREACH(ifa, &ifp->if_addrlist, ifa_list)
+ if (ifa->ifa_addr->sa_family == AF_INET) {
+ ia = ifatoia(ifa);
break;
+ }
switch (cmd) {
case SIOCAIFADDR:
case SIOCDIFADDR:
if (ifra->ifra_addr.sin_family == AF_INET)
- for (; ia != NULL; ia = TAILQ_NEXT(ia, ia_list)) {
- if (ia->ia_ifp == ifp &&
- ia->ia_addr.sin_addr.s_addr ==
- ifra->ifra_addr.sin_addr.s_addr)
- break;
+ for (; ifa != NULL; ifa = TAILQ_NEXT(ifa, ifa_list)) {
+ if ((ifa->ifa_addr->sa_family == AF_INET) &&
+ ifatoia(ifa)->ia_addr.sin_addr.s_addr ==
+ ifra->ifra_addr.sin_addr.s_addr) {
+ ia = ifatoia(ifa);
+ break;
+ }
}
if (cmd == SIOCDIFADDR && ia == NULL)
return (EADDRNOTAVAIL);
@@ -271,17 +276,14 @@ in_control(struct socket *so, u_long cmd
case SIOCGIFDSTADDR:
case SIOCGIFBRDADDR:
if (ia && satosin(&ifr->ifr_addr)->sin_addr.s_addr) {
- struct in_ifaddr *ia2;
-
- for (ia2 = ia; ia2 != NULL;
- ia2 = TAILQ_NEXT(ia2, ia_list)) {
- if (ia2->ia_ifp == ifp &&
- ia2->ia_addr.sin_addr.s_addr ==
- satosin(&ifr->ifr_addr)->sin_addr.s_addr)
+ for (; ifa != NULL; ifa = TAILQ_NEXT(ifa, ifa_list)) {
+ if ((ifa->ifa_addr->sa_family == AF_INET) &&
+ ifatoia(ifa)->ia_addr.sin_addr.s_addr ==
+ satosin(&ifr->ifr_addr)->sin_addr.s_addr) {
+ ia = ifatoia(ifa);
break;
+ }
}
- if (ia2 && ia2->ia_ifp == ifp)
- ia = ia2;
}
if (ia == NULL)
return (EADDRNOTAVAIL);