Example #1
0
static void
wlan_node_dec_free(bss_t *ni)
{
    if (ieee80211_node_dectestref(ni)) {
        wlan_node_free(ni);
    }
}
Example #2
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);
}