sepherosa_gmail.com created this revision. sepherosa_gmail.com added reviewers: delphij, royger, decui_microsoft.com, honzhan_microsoft.com, howard0su_gmail.com, adrian, bz, gnn, hiren, glebius, rwatson, karels. sepherosa_gmail.com added a subscriber: freebsd-net-list.
REVISION SUMMARY This is mainly intended to fix the following case at least: ifconfig iface0 192.168.5.1 ifconfig iface0 down ifconfig iface0 alias 192.168.6.1 Before this commit, the related part of the routing table is: 192.168.5.1 link#3 UHS lo0 192.168.6.0/24 link#3 U hn1 192.168.6.1 link#3 UHS lo0 The 192.168.5.0/24 can't be reached. After this fix, the related part of the routing table is: 192.168.5.0/24 link#3 U hn1 192.168.5.1 link#3 UHS lo0 192.168.6.0/24 link#3 U hn1 192.168.6.1 link#3 UHS lo0 Everything works as expected. REVISION DETAIL https://reviews.freebsd.org/D8904 AFFECTED FILES sys/netinet/in.c CHANGE DETAILS diff --git a/sys/netinet/in.c b/sys/netinet/in.c --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -228,7 +228,7 @@ struct sockaddr_in *addr = (struct sockaddr_in *)&ifr->ifr_addr; struct ifaddr *ifa; struct in_ifaddr *ia; - int error; + int error, was_up = 0; if (ifp == NULL) return (EADDRNOTAVAIL); @@ -250,9 +250,13 @@ return (error); case OSIOCAIFADDR: /* 9.x compat */ case SIOCAIFADDR: + if (ifp->if_flags & IFF_UP) + was_up = 1; sx_xlock(&in_control_sx); error = in_aifaddr_ioctl(cmd, data, ifp, td); sx_xunlock(&in_control_sx); + if (!was_up && (ifp->if_flags & IFF_UP)) + if_up(ifp); return (error); case SIOCSIFADDR: case SIOCSIFBRDADDR: EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: sepherosa_gmail.com, delphij, royger, decui_microsoft.com, honzhan_microsoft.com, howard0su_gmail.com, adrian, bz, gnn, hiren, glebius, rwatson, karels Cc: freebsd-net-list
diff --git a/sys/netinet/in.c b/sys/netinet/in.c --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -228,7 +228,7 @@ struct sockaddr_in *addr = (struct sockaddr_in *)&ifr->ifr_addr; struct ifaddr *ifa; struct in_ifaddr *ia; - int error; + int error, was_up = 0; if (ifp == NULL) return (EADDRNOTAVAIL); @@ -250,9 +250,13 @@ return (error); case OSIOCAIFADDR: /* 9.x compat */ case SIOCAIFADDR: + if (ifp->if_flags & IFF_UP) + was_up = 1; sx_xlock(&in_control_sx); error = in_aifaddr_ioctl(cmd, data, ifp, td); sx_xunlock(&in_control_sx); + if (!was_up && (ifp->if_flags & IFF_UP)) + if_up(ifp); return (error); case SIOCSIFADDR: case SIOCSIFBRDADDR:
_______________________________________________ freebsd-net@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-net To unsubscribe, send any mail to "freebsd-net-unsubscr...@freebsd.org"