Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet6/in6_mcast.c
Show First 20 Lines • Show All 533 Lines • ▼ Show 20 Lines | if (SLIST_EMPTY(inmh)) | ||||
return; | return; | ||||
mtx_lock(&in6_multi_free_mtx); | mtx_lock(&in6_multi_free_mtx); | ||||
SLIST_CONCAT(&in6m_free_list, inmh, in6_multi, in6m_nrele); | SLIST_CONCAT(&in6m_free_list, inmh, in6_multi, in6m_nrele); | ||||
mtx_unlock(&in6_multi_free_mtx); | mtx_unlock(&in6_multi_free_mtx); | ||||
taskqueue_enqueue(taskqueue_in6m_free, &in6m_free_task); | taskqueue_enqueue(taskqueue_in6m_free, &in6m_free_task); | ||||
} | } | ||||
void | void | ||||
in6m_release_wait(void) | in6m_release_wait(void *arg __unused) | ||||
{ | { | ||||
/* | |||||
* Make sure all pending multicast addresses are freed before | |||||
* the VNET or network device is destroyed: | |||||
*/ | |||||
taskqueue_drain_all(taskqueue_in6m_free); | taskqueue_drain_all(taskqueue_in6m_free); | ||||
} | } | ||||
#ifdef VIMAGE | |||||
VNET_SYSUNINIT(in6m_release_wait, SI_SUB_PROTO_DOMAIN, SI_ORDER_FIRST, in6m_release_wait, NULL); | |||||
#endif | |||||
void | void | ||||
in6m_disconnect_locked(struct in6_multi_head *inmh, struct in6_multi *inm) | in6m_disconnect_locked(struct in6_multi_head *inmh, struct in6_multi *inm) | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct ifaddr *ifa; | struct ifaddr *ifa; | ||||
struct in6_ifaddr *ifa6; | struct in6_ifaddr *ifa6; | ||||
struct in6_multi_mship *imm, *imm_tmp; | struct in6_multi_mship *imm, *imm_tmp; | ||||
▲ Show 20 Lines • Show All 2,349 Lines • Show Last 20 Lines |