Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/in.c
Show First 20 Lines • Show All 1,028 Lines • ▼ Show 20 Lines | in_purgemaddrs(struct ifnet *ifp) | ||||
*/ | */ | ||||
IF_ADDR_WLOCK(ifp); | IF_ADDR_WLOCK(ifp); | ||||
restart: | restart: | ||||
CK_STAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next) { | CK_STAILQ_FOREACH_SAFE(ifma, &ifp->if_multiaddrs, ifma_link, next) { | ||||
if (ifma->ifma_addr->sa_family != AF_INET || | if (ifma->ifma_addr->sa_family != AF_INET || | ||||
ifma->ifma_protospec == NULL) | ifma->ifma_protospec == NULL) | ||||
continue; | continue; | ||||
inm = (struct in_multi *)ifma->ifma_protospec; | inm = (struct in_multi *)ifma->ifma_protospec; | ||||
ifma->ifma_protospec = NULL; | |||||
inm_rele_locked(&purgeinms, inm); | inm_rele_locked(&purgeinms, inm); | ||||
if (__predict_false(ifma_restart)) { | if (__predict_false(ifma_restart)) { | ||||
ifma_restart = true; | ifma_restart = false; | ||||
goto restart; | goto restart; | ||||
} | } | ||||
} | } | ||||
IF_ADDR_WUNLOCK(ifp); | IF_ADDR_WUNLOCK(ifp); | ||||
inm_release_list_deferred(&purgeinms); | inm_release_list_deferred(&purgeinms); | ||||
igmp_ifdetach(ifp); | igmp_ifdetach(ifp); | ||||
IN_MULTI_LIST_UNLOCK(); | IN_MULTI_LIST_UNLOCK(); | ||||
▲ Show 20 Lines • Show All 470 Lines • Show Last 20 Lines |