Changeset 1819

Show
Ignore:
Timestamp:
11/22/06 10:17:27 (2 years ago)
Author:
kelmo
Message:

In a multi-vap scenario (for example, a STA or WDS-REPEATER vap on the same
device as an AP vap) an IEEE80211_MLME_DISASSOC/DEAUTH (for example, from
hostapd upon startup) will call ieee80211_node_leave for all nodes in the node
table, regardless of what vap they are associated with.

Instead, ieee80211_node_leave should only be called for nodes that are on the
specified vap (Note that this same mis-behavior of iterating over all nodes
regardless of vap may be alsmo present elsewhere in madwifi)

This can cause a number of issues, including driver crash when nodes get
dropped that shouldn't be.

See #969 for details about how to reliably reproduce this problem.

Signed-off-by: Tim Harvey <tim_harvey@yahoo.com>

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/net80211/ieee80211_node.c

    r1817 r1819  
    16631663ieee80211_iterate_nodes(struct ieee80211_node_table *nt, ieee80211_iter_func *f, void *arg) 
    16641664{ 
     1665        ieee80211_iterate_dev_nodes(NULL, nt, f, arg); 
     1666} 
     1667EXPORT_SYMBOL(ieee80211_iterate_nodes); 
     1668 
     1669void 
     1670ieee80211_iterate_dev_nodes(struct net_device *dev, struct ieee80211_node_table *nt, ieee80211_iter_func *f, void *arg) 
     1671{ 
    16651672        struct ieee80211_node *ni; 
    16661673        u_int gen; 
     
    16711678        IEEE80211_NODE_LOCK(nt); 
    16721679        TAILQ_FOREACH(ni, &nt->nt_node, ni_list) { 
    1673                 if (ni->ni_scangen != gen) { 
     1680                if (dev != NULL && ni->ni_vap->iv_dev != dev)  
     1681                        continue;  /* skip node not for this vap */ 
     1682                if (ni->ni_scangen) { 
    16741683                        ni->ni_scangen = gen; 
    16751684                        (void) ieee80211_ref_node(ni); 
     
    16841693        IEEE80211_SCAN_UNLOCK_IRQ(nt); 
    16851694} 
    1686 EXPORT_SYMBOL(ieee80211_iterate_nodes); 
     1695EXPORT_SYMBOL(ieee80211_iterate_dev_nodes); 
    16871696 
    16881697void 
  • trunk/net80211/ieee80211_node.h

    r1588 r1819  
    299299void ieee80211_iterate_nodes(struct ieee80211_node_table *, 
    300300        ieee80211_iter_func *, void *); 
     301void ieee80211_iterate_dev_nodes(struct net_device *,  
     302        struct ieee80211_node_table *, ieee80211_iter_func *, void *); 
    301303 
    302304void    ieee80211_dump_node(struct ieee80211_node_table *, 
  • trunk/net80211/ieee80211_wireless.c

    r1770 r1819  
    33223322                                ni = ieee80211_find_node(&ic->ic_sta, 
    33233323                                        mlme->im_macaddr); 
    3324                                 if (ni == NULL) 
     3324                                if (ni == NULL) { 
     3325                                        ieee80211_free_node(ni); 
    33253326                                        return -EINVAL; 
    3326                                 domlme(mlme, ni); 
     3327                                } 
     3328                                if (dev == ni->ni_vap->iv_dev) 
     3329                                        domlme(mlme, ni); 
    33273330                                ieee80211_free_node(ni); 
    33283331                        } else 
    3329                                 ieee80211_iterate_nodes(&ic->ic_sta, domlme, mlme); 
     3332                                ieee80211_iterate_dev_nodes(dev, &ic->ic_sta, domlme, mlme); 
    33303333                        break; 
    33313334                default: