void wlan_node_reclaim(struct ath6kl_node_table *nt, struct bss *ni) { int hash; spin_lock_bh(&nt->nt_nodelock); if (ni->ni_list_prev == NULL) /* fix list head */ nt->nt_node_first = ni->ni_list_next; else ni->ni_list_prev->ni_list_next = ni->ni_list_next; if (ni->ni_list_next == NULL) /* fix list tail */ nt->nt_node_last = ni->ni_list_prev; else ni->ni_list_next->ni_list_prev = ni->ni_list_prev; if (ni->ni_hash_prev == NULL) { /* first in list so fix the list head */ hash = ATH6KL_NODE_HASH(ni->ni_macaddr); nt->nt_hash[hash] = ni->ni_hash_next; } else { ni->ni_hash_prev->ni_hash_next = ni->ni_hash_next; } if (ni->ni_hash_next != NULL) ni->ni_hash_next->ni_hash_prev = ni->ni_hash_prev; wlan_node_free(ni); spin_unlock_bh(&nt->nt_nodelock); }
static void wlan_node_dec_free(bss_t *ni) { if (ieee80211_node_dectestref(ni)) { wlan_node_free(ni); } }
static void wlan_node_dec_free(bss_t *ni) { ieee80211_node_decref(ni); if (ieee80211_node_refcnt(ni) == 0) { wlan_node_free(ni); } }
void wlan_node_ret_n_remove(struct ieee80211_node_table *nt, bss_t *ni) { IEEE80211_NODE_LOCK(nt); ieee80211_node_decref(ni); if (ieee80211_node_refcnt(ni) == 0) { wlan_node_free(ni); } else { wlan_node_reclaim(nt, ni); } IEEE80211_NODE_UNLOCK(nt); }
/* * Reclaim a node. If this is the last reference count then * do the normal free work. Otherwise remove it from the node * table and mark it gone by clearing the back-reference. */ void wlan_node_reclaim(struct ieee80211_node_table *nt, bss_t *ni) { IEEE80211_NODE_LOCK(nt); if (ieee80211_node_dectestref(ni)) { if(ni->ni_list_prev == NULL) { /* First in list so fix the list head */ nt->nt_node_first = ni->ni_list_next; } else { ni->ni_list_prev->ni_list_next = ni->ni_list_next; } if(ni->ni_list_next == NULL) { /* Last in list so fix list tail */ nt->nt_node_last = ni->ni_list_prev; } else { ni->ni_list_next->ni_list_prev = ni->ni_list_prev; } if(ni->ni_hash_prev == NULL) { /* First in list so fix the list head */ int hash; hash = IEEE80211_NODE_HASH(ni->ni_macaddr); nt->nt_hash[hash] = ni->ni_hash_next; } else { ni->ni_hash_prev->ni_hash_next = ni->ni_hash_next; } if(ni->ni_hash_next != NULL) { ni->ni_hash_next->ni_hash_prev = ni->ni_hash_prev; } wlan_node_free(ni); } IEEE80211_NODE_UNLOCK(nt); }
static void wlan_node_dec_free(struct bss *ni) { if ((ni->ni_refcnt--) == 1) wlan_node_free(ni); }