Index: sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c =================================================================== --- sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c (revision 4) +++ sys/dev/hyperv/netvsc/hv_netvsc_drv_freebsd.c (working copy) @@ -957,7 +957,25 @@ case SIOCSIFADDR: case SIOCGIFADDR: +#ifdef INET + NV_LOCK(sc); + if (ifa->ifa_addr->sa_family == AF_INET) { + ifp->if_flags |= IFF_UP; + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + if_link_state_change(ifp, LINK_STATE_DOWN); + ifp->if_drv_flags |= IFF_DRV_RUNNING; + ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_link_state_change(ifp, LINK_STATE_UP); + } + NV_UNLOCK(sc); + } else { + NV_UNLOCK(sc); +#endif error = ether_ioctl(ifp, cmd, data); +#ifdef INET + } +#endif break; case SIOCSIFMTU: hn_dev = vmbus_get_devctx(sc->hn_dev); @@ -1131,6 +1149,7 @@ printf(" Closing Device ...\n"); ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); + if_link_state_change(ifp, LINK_STATE_DOWN); sc->hn_initdone = 0; ret = hv_rf_on_close(device_ctx); @@ -1180,6 +1199,7 @@ } ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; + if_link_state_change(ifp, LINK_STATE_UP); } /*