Пример #1
0
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);
}
Пример #2
0
static void
wlan_node_dec_free(bss_t *ni)
{
    if (ieee80211_node_dectestref(ni)) {
        wlan_node_free(ni);
    }
}
Пример #3
0
static void
wlan_node_dec_free(bss_t *ni)
{
    ieee80211_node_decref(ni);
    if (ieee80211_node_refcnt(ni) == 0) {
        wlan_node_free(ni);
    }
}
Пример #4
0
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);
}
Пример #5
0
/*
 * 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);
}
Пример #6
0
static void wlan_node_dec_free(struct bss *ni)
{
	if ((ni->ni_refcnt--) == 1)
		wlan_node_free(ni);
}