Lines 557-563
Link Here
|
557 |
continue; |
557 |
continue; |
558 |
inm = (struct in6_multi *)ifma->ifma_protospec; |
558 |
inm = (struct in6_multi *)ifma->ifma_protospec; |
559 |
if (inm->in6m_state == MLD_LEAVING_MEMBER) { |
559 |
if (inm->in6m_state == MLD_LEAVING_MEMBER) { |
560 |
in6m_disconnect(inm); |
560 |
in6m_disconnect_locked(&inmh, inm); |
561 |
in6m_rele_locked(&inmh, inm); |
561 |
in6m_rele_locked(&inmh, inm); |
562 |
ifma->ifma_protospec = NULL; |
562 |
ifma->ifma_protospec = NULL; |
563 |
} |
563 |
} |
Lines 1484-1491
Link Here
|
1484 |
case MLD_REPORTING_MEMBER: |
1484 |
case MLD_REPORTING_MEMBER: |
1485 |
if (report_timer_expired) { |
1485 |
if (report_timer_expired) { |
1486 |
inm->in6m_state = MLD_IDLE_MEMBER; |
1486 |
inm->in6m_state = MLD_IDLE_MEMBER; |
1487 |
in6m_disconnect(inm); |
1487 |
in6m_disconnect_locked(inmh, inm); |
1488 |
in6m_rele_locked(inmh, inm); |
|
|
1489 |
} |
1488 |
} |
1490 |
break; |
1489 |
break; |
1491 |
case MLD_G_QUERY_PENDING_MEMBER: |
1490 |
case MLD_G_QUERY_PENDING_MEMBER: |
Lines 1609-1615
Link Here
|
1609 |
if (inm->in6m_state == MLD_LEAVING_MEMBER && |
1608 |
if (inm->in6m_state == MLD_LEAVING_MEMBER && |
1610 |
inm->in6m_scrv == 0) { |
1609 |
inm->in6m_scrv == 0) { |
1611 |
inm->in6m_state = MLD_NOT_MEMBER; |
1610 |
inm->in6m_state = MLD_NOT_MEMBER; |
1612 |
in6m_disconnect(inm); |
1611 |
in6m_disconnect_locked(inmh, inm); |
1613 |
in6m_rele_locked(inmh, inm); |
1612 |
in6m_rele_locked(inmh, inm); |
1614 |
} |
1613 |
} |
1615 |
} |
1614 |
} |
Lines 1700-1706
Link Here
|
1700 |
* version, we need to release the final |
1699 |
* version, we need to release the final |
1701 |
* reference held for issuing the INCLUDE {}. |
1700 |
* reference held for issuing the INCLUDE {}. |
1702 |
*/ |
1701 |
*/ |
1703 |
in6m_disconnect(inm); |
1702 |
in6m_disconnect_locked(&inmh, inm); |
1704 |
in6m_rele_locked(&inmh, inm); |
1703 |
in6m_rele_locked(&inmh, inm); |
1705 |
ifma->ifma_protospec = NULL; |
1704 |
ifma->ifma_protospec = NULL; |
1706 |
/* FALLTHROUGH */ |
1705 |
/* FALLTHROUGH */ |
Lines 1895-1900
Link Here
|
1895 |
error = 0; |
1894 |
error = 0; |
1896 |
|
1895 |
|
1897 |
/* |
1896 |
/* |
|
|
1897 |
* Check if the in6_multi has already been disconnected. |
1898 |
*/ |
1899 |
if (inm->in6m_ifp == NULL) { |
1900 |
CTR1(KTR_MLD, "%s: inm is disconnected", __func__); |
1901 |
return (0); |
1902 |
} |
1903 |
|
1904 |
/* |
1898 |
* Try to detect if the upper layer just asked us to change state |
1905 |
* Try to detect if the upper layer just asked us to change state |
1899 |
* for an interface which has now gone away. |
1906 |
* for an interface which has now gone away. |
1900 |
*/ |
1907 |
*/ |
Lines 2004-2009
Link Here
|
2004 |
if (mli->mli_version == MLD_VERSION_2 && |
2011 |
if (mli->mli_version == MLD_VERSION_2 && |
2005 |
inm->in6m_state == MLD_LEAVING_MEMBER) { |
2012 |
inm->in6m_state == MLD_LEAVING_MEMBER) { |
2006 |
inm->in6m_refcount--; |
2013 |
inm->in6m_refcount--; |
|
|
2014 |
MPASS(inm->in6m_refcount > 0); |
2007 |
} |
2015 |
} |
2008 |
inm->in6m_state = MLD_REPORTING_MEMBER; |
2016 |
inm->in6m_state = MLD_REPORTING_MEMBER; |
2009 |
|
2017 |
|