View | Details | Raw Unified | Return to bug 199672
Collapse All | Expand All

(-)sys/net80211/ieee80211_node.c (-28 / +26 lines)
Lines 871-877 Link Here
871
void
879
void
872
ieee80211_node_deauth(struct ieee80211_node *ni, int reason)
880
ieee80211_node_deauth(struct ieee80211_node *ni, int reason)
873
{
881
{
874
	/* NB: bump the refcnt to be sure temporay nodes are not reclaimed */
882
	/* NB: bump the refcnt to be sure temporary nodes are not reclaimed */
875
	ieee80211_ref_node(ni);
883
	ieee80211_ref_node(ni);
876
	if (ni->ni_associd != 0)
884
	if (ni->ni_associd != 0)
877
		IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_DEAUTH, reason);
885
		IEEE80211_SEND_MGMT(ni, IEEE80211_FC0_SUBTYPE_DEAUTH, reason);
Lines 1749-1754 Link Here
1749
	ni->ni_ic->ic_node_free(ni);
1757
	ni->ni_ic->ic_node_free(ni);
1750
}
1758
}
1751
1759
1760
/*
1761
 * Clear any entry in the unicast key mapping table.
1762
 */
1763
static int
1764
node_clear_keyixmap(struct ieee80211_node_table *nt, struct ieee80211_node *ni)
1765
{
1766
	ieee80211_keyix keyix;
1767
1768
	keyix = ni->ni_ucastkey.wk_rxkeyix;
1769
	if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax &&
1770
	    nt->nt_keyixmap[keyix] == ni) {
1771
		IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
1772
			"%s: %p<%s> clear key map entry %u\n",
1773
			__func__, ni, ether_sprintf(ni->ni_macaddr), keyix);
1774
		nt->nt_keyixmap[keyix] = NULL;
1775
		ieee80211_node_decref(ni);
1776
		return 1;
1777
	}
1778
1779
	return 0;
1780
}
1781
1752
void
1782
void
1753
#ifdef IEEE80211_DEBUG_REFCNT
1783
#ifdef IEEE80211_DEBUG_REFCNT
1754
ieee80211_free_node_debug(struct ieee80211_node *ni, const char *func, int line)
1784
ieee80211_free_node_debug(struct ieee80211_node *ni, const char *func, int line)
Lines 1770-1793 Link Here
1770
			 * Last reference, reclaim state.
1800
			 * Last reference, reclaim state.
1771
			 */
1801
			 */
1772
			_ieee80211_free_node(ni);
1802
			_ieee80211_free_node(ni);
1773
		} else if (ieee80211_node_refcnt(ni) == 1 &&
1803
		} else if (ieee80211_node_refcnt(ni) == 1)
1774
		    nt->nt_keyixmap != NULL) {
1804
			if (node_clear_keyixmap(nt, ni))
1775
			ieee80211_keyix keyix;
1776
			/*
1777
			 * Check for a last reference in the key mapping table.
1778
			 */
1779
			keyix = ni->ni_ucastkey.wk_rxkeyix;
1780
			if (keyix < nt->nt_keyixmax &&
1781
			    nt->nt_keyixmap[keyix] == ni) {
1782
				IEEE80211_DPRINTF(ni->ni_vap,
1783
				    IEEE80211_MSG_NODE,
1784
				    "%s: %p<%s> clear key map entry", __func__,
1785
				    ni, ether_sprintf(ni->ni_macaddr));
1786
				nt->nt_keyixmap[keyix] = NULL;
1787
				ieee80211_node_decref(ni); /* XXX needed? */
1788
				_ieee80211_free_node(ni);
1805
				_ieee80211_free_node(ni);
1789
			}
1790
		}
1791
		IEEE80211_NODE_UNLOCK(nt);
1806
		IEEE80211_NODE_UNLOCK(nt);
1792
	} else {
1807
	} else {
1793
		if (ieee80211_node_dectestref(ni))
1808
		if (ieee80211_node_dectestref(ni))
Lines 1855-1861 Link Here
1855
static void
1870
static void
1856
node_reclaim(struct ieee80211_node_table *nt, struct ieee80211_node *ni)
1871
node_reclaim(struct ieee80211_node_table *nt, struct ieee80211_node *ni)
1857
{
1872
{
1858
	ieee80211_keyix keyix;
1859
1873
1860
	IEEE80211_NODE_LOCK_ASSERT(nt);
1874
	IEEE80211_NODE_LOCK_ASSERT(nt);
1861
1875
Lines 1870-1884 Link Here
1870
	 * table.  We cannot depend on the mapping table entry
1884
	 * table.  We cannot depend on the mapping table entry
1871
	 * being cleared because the node may not be free'd.
1885
	 * being cleared because the node may not be free'd.
1872
	 */
1886
	 */
1873
	keyix = ni->ni_ucastkey.wk_rxkeyix;
1887
	(void)node_clear_keyixmap(nt, ni);
1874
	if (nt->nt_keyixmap != NULL && keyix < nt->nt_keyixmax &&
1875
	    nt->nt_keyixmap[keyix] == ni) {
1876
		IEEE80211_DPRINTF(ni->ni_vap, IEEE80211_MSG_NODE,
1877
			"%s: %p<%s> clear key map entry %u\n",
1878
			__func__, ni, ether_sprintf(ni->ni_macaddr), keyix);
1879
		nt->nt_keyixmap[keyix] = NULL;
1880
		ieee80211_node_decref(ni);	/* NB: don't need free */
1881
	}
1882
	if (!ieee80211_node_dectestref(ni)) {
1888
	if (!ieee80211_node_dectestref(ni)) {
1883
		/*
1889
		/*
1884
		 * Other references are present, just remove the
1890
		 * Other references are present, just remove the

Return to bug 199672