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 1488-1495
Link Here
|
1488 |
case MLD_REPORTING_MEMBER: |
1488 |
case MLD_REPORTING_MEMBER: |
1489 |
if (report_timer_expired) { |
1489 |
if (report_timer_expired) { |
1490 |
inm->in6m_state = MLD_IDLE_MEMBER; |
1490 |
inm->in6m_state = MLD_IDLE_MEMBER; |
1491 |
in6m_disconnect(inm); |
1491 |
in6m_disconnect_locked(inmh, inm); |
1492 |
in6m_rele_locked(inmh, inm); |
|
|
1493 |
} |
1492 |
} |
1494 |
break; |
1493 |
break; |
1495 |
case MLD_G_QUERY_PENDING_MEMBER: |
1494 |
case MLD_G_QUERY_PENDING_MEMBER: |
Lines 1613-1619
Link Here
|
1613 |
if (inm->in6m_state == MLD_LEAVING_MEMBER && |
1612 |
if (inm->in6m_state == MLD_LEAVING_MEMBER && |
1614 |
inm->in6m_scrv == 0) { |
1613 |
inm->in6m_scrv == 0) { |
1615 |
inm->in6m_state = MLD_NOT_MEMBER; |
1614 |
inm->in6m_state = MLD_NOT_MEMBER; |
1616 |
in6m_disconnect(inm); |
1615 |
in6m_disconnect_locked(inmh, inm); |
1617 |
in6m_rele_locked(inmh, inm); |
1616 |
in6m_rele_locked(inmh, inm); |
1618 |
} |
1617 |
} |
1619 |
} |
1618 |
} |
Lines 1704-1710
Link Here
|
1704 |
* version, we need to release the final |
1703 |
* version, we need to release the final |
1705 |
* reference held for issuing the INCLUDE {}. |
1704 |
* reference held for issuing the INCLUDE {}. |
1706 |
*/ |
1705 |
*/ |
1707 |
in6m_disconnect(inm); |
1706 |
in6m_disconnect_locked(&inmh, inm); |
1708 |
in6m_rele_locked(&inmh, inm); |
1707 |
in6m_rele_locked(&inmh, inm); |
1709 |
ifma->ifma_protospec = NULL; |
1708 |
ifma->ifma_protospec = NULL; |
1710 |
/* FALLTHROUGH */ |
1709 |
/* FALLTHROUGH */ |
Lines 1899-1904
Link Here
|
1899 |
error = 0; |
1898 |
error = 0; |
1900 |
|
1899 |
|
1901 |
/* |
1900 |
/* |
|
|
1901 |
* Check if the in6_multi has already been disconnected. |
1902 |
*/ |
1903 |
if (inm->in6m_ifp == NULL) { |
1904 |
CTR1(KTR_MLD, "%s: inm is disconnected", __func__); |
1905 |
return (0); |
1906 |
} |
1907 |
|
1908 |
/* |
1902 |
* Try to detect if the upper layer just asked us to change state |
1909 |
* Try to detect if the upper layer just asked us to change state |
1903 |
* for an interface which has now gone away. |
1910 |
* for an interface which has now gone away. |
1904 |
*/ |
1911 |
*/ |
Lines 2008-2013
Link Here
|
2008 |
if (mli->mli_version == MLD_VERSION_2 && |
2015 |
if (mli->mli_version == MLD_VERSION_2 && |
2009 |
inm->in6m_state == MLD_LEAVING_MEMBER) { |
2016 |
inm->in6m_state == MLD_LEAVING_MEMBER) { |
2010 |
inm->in6m_refcount--; |
2017 |
inm->in6m_refcount--; |
|
|
2018 |
MPASS(inm->in6m_refcount > 0); |
2011 |
} |
2019 |
} |
2012 |
inm->in6m_state = MLD_REPORTING_MEMBER; |
2020 |
inm->in6m_state = MLD_REPORTING_MEMBER; |
2013 |
|
2021 |
|