Changeset 18052


Ignore:
Timestamp:
2009-10-17T06:56:05+02:00 (7 years ago)
Author:
nbd
Message:

madwifi: fix various noderef/memleak issues

Location:
trunk/package/madwifi/patches
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/madwifi/patches/421-channel_handling.patch

    r17687 r18052  
    854854        /* Initialize candidate channels to all available */ 
    855855        memcpy(ic->ic_chan_active, ic->ic_chan_avail, 
    856 @@ -311,11 +296,58 @@ ieee80211_ifattach(struct ieee80211com * 
     856@@ -311,11 +296,59 @@ ieee80211_ifattach(struct ieee80211com * 
    857857         * When 11g is supported, force the rate set to 
    858858         * include basic rates suitable for a mixed b/g bss. 
     
    867867+               return; 
    868868+ 
     869+       ifmedia_removeall(&ic->ic_media); 
    869870+       ieee80211_media_setup(ic, &ic->ic_media, ic->ic_caps, NULL, NULL); 
    870871+       ieee80211com_media_status(ic->ic_dev, &imr); 
     
    914915        ic->ic_bsschan = IEEE80211_CHAN_ANYC; 
    915916        /* Arbitrarily pick the first channel */ 
    916 @@ -327,6 +359,7 @@ ieee80211_ifattach(struct ieee80211com * 
     917@@ -327,6 +360,7 @@ ieee80211_ifattach(struct ieee80211com * 
    917918        /* Enable WME by default, if we're capable. */ 
    918919        if (ic->ic_caps & IEEE80211_C_WME) 
     
    922923  
    923924        /* Store default beacon interval, as nec. */ 
    924 @@ -763,7 +796,8 @@ ieee80211_media_setup(struct ieee80211co 
     925@@ -763,7 +797,8 @@ ieee80211_media_setup(struct ieee80211co 
    925926        struct ieee80211_rateset allrates; 
    926927  
     
    932933        memset(&allrates, 0, sizeof(allrates)); 
    933934  
    934 @@ -793,7 +827,7 @@ ieee80211_media_setup(struct ieee80211co 
     935@@ -793,7 +828,7 @@ ieee80211_media_setup(struct ieee80211co 
    935936                        ADD(media, IFM_AUTO, mopt | IFM_IEEE80211_WDS); 
    936937                if (mode == IEEE80211_MODE_AUTO) 
     
    941942                for (i = 0; i < rs->rs_nrates; i++) { 
    942943                        rate = rs->rs_rates[i]; 
    943 @@ -1207,7 +1241,7 @@ ieee80211_announce(struct ieee80211com * 
     944@@ -1207,7 +1242,7 @@ ieee80211_announce(struct ieee80211com * 
    944945                if ((ic->ic_modecaps & (1 << mode)) == 0) 
    945946                        continue; 
     
    950951                        rate = rs->rs_rates[i]; 
    951952                        mword = ieee80211_rate2media(ic, rate, mode); 
    952 @@ -1417,7 +1451,7 @@ ieee80211com_media_change(struct net_dev 
     953@@ -1417,7 +1452,7 @@ ieee80211com_media_change(struct net_dev 
    953954                         * now so drivers have a consistent state. 
    954955                         */ 
     
    959960                error = -ENETRESET; 
    960961        } 
    961 @@ -1435,7 +1469,7 @@ findrate(struct ieee80211com *ic, enum i 
     962@@ -1435,7 +1470,7 @@ findrate(struct ieee80211com *ic, enum i 
    962963 { 
    963964 #define        IEEERATE(_ic,_m,_i) \ 
     
    968969                if (IEEERATE(ic, mode, i) == rate) 
    969970                        return i; 
    970 @@ -1877,11 +1911,6 @@ ieee80211_build_countryie(struct ieee802 
     971@@ -1877,11 +1912,6 @@ ieee80211_build_countryie(struct ieee802 
    971972                        if (ieee80211_chan2mode(c) != curmode_noturbo) 
    972973                                continue; 
     
    980981                                (*cur_runlen)++; 
    981982                                *cur_pow = c->ic_maxregpower; 
    982 @@ -1915,7 +1944,7 @@ void 
     983@@ -1915,7 +1945,7 @@ void 
    983984 ieee80211_build_sc_ie(struct ieee80211com *ic) 
    984985 { 
  • trunk/package/madwifi/patches/430-use_netdev_priv.patch

    r17687 r18052  
    10031003--- a/net80211/ieee80211.c 
    10041004+++ b/net80211/ieee80211.c 
    1005 @@ -457,7 +457,7 @@ ieee80211_vap_setup(struct ieee80211com  
     1005@@ -458,7 +458,7 @@ ieee80211_vap_setup(struct ieee80211com  
    10061006 #define        IEEE80211_C_OPMODE \ 
    10071007        (IEEE80211_C_IBSS | IEEE80211_C_HOSTAP | IEEE80211_C_AHDEMO | \ 
     
    10121012        int err; 
    10131013  
    1014 @@ -1354,7 +1354,7 @@ media_status(enum ieee80211_opmode opmod 
     1014@@ -1355,7 +1355,7 @@ media_status(enum ieee80211_opmode opmod 
    10151015 static void 
    10161016 ieee80211com_media_status(struct net_device *dev, struct ifmediareq *imr) 
     
    10211021        imr->ifm_status = IFM_AVALID; 
    10221022        if (!TAILQ_EMPTY(&ic->ic_vaps)) 
    1023 @@ -1406,7 +1406,7 @@ media2mode(const struct ifmedia_entry *i 
     1023@@ -1407,7 +1407,7 @@ media2mode(const struct ifmedia_entry *i 
    10241024 static int 
    10251025 ieee80211com_media_change(struct net_device *dev) 
     
    10301030        struct ifmedia_entry *ime = ic->ic_media.ifm_cur; 
    10311031        enum ieee80211_phymode newphymode; 
    1032 @@ -1510,7 +1510,7 @@ checkrate(struct ieee80211com *ic, enum  
     1032@@ -1511,7 +1511,7 @@ checkrate(struct ieee80211com *ic, enum  
    10331033 int 
    10341034 ieee80211_media_change(struct net_device *dev) 
     
    10391039        struct ifmedia_entry *ime = vap->iv_media.ifm_cur; 
    10401040        enum ieee80211_phymode newmode; 
    1041 @@ -1544,7 +1544,7 @@ EXPORT_SYMBOL(ieee80211_media_change); 
     1041@@ -1545,7 +1545,7 @@ EXPORT_SYMBOL(ieee80211_media_change); 
    10421042 void 
    10431043 ieee80211_media_status(struct net_device *dev, struct ifmediareq *imr) 
     
    10481048        enum ieee80211_phymode mode; 
    10491049        struct ieee80211_rateset *rs; 
    1050 @@ -1750,7 +1750,7 @@ EXPORT_SYMBOL(ieee80211_media2rate); 
     1050@@ -1751,7 +1751,7 @@ EXPORT_SYMBOL(ieee80211_media2rate); 
    10511051 static struct net_device_stats * 
    10521052 ieee80211_getstats(struct net_device *dev) 
     
    10571057  
    10581058        /* XXX: Total guess as to what to count where */ 
    1059 @@ -1789,7 +1789,7 @@ ieee80211_change_mtu(struct net_device * 
     1059@@ -1790,7 +1790,7 @@ ieee80211_change_mtu(struct net_device * 
    10601060 static void 
    10611061 ieee80211_set_multicast_list(struct net_device *dev) 
  • trunk/package/madwifi/patches/432-netdev_ops.patch

    r17687 r18052  
    7070--- a/net80211/ieee80211.c 
    7171+++ b/net80211/ieee80211.c 
    72 @@ -450,6 +450,18 @@ ieee80211_ifdetach(struct ieee80211com * 
     72@@ -451,6 +451,18 @@ ieee80211_ifdetach(struct ieee80211com * 
    7373 } 
    7474 EXPORT_SYMBOL(ieee80211_ifdetach); 
     
    8989 ieee80211_vap_setup(struct ieee80211com *ic, struct net_device *dev, 
    9090        const char *name, int opmode, int flags, struct ieee80211vap *master) 
    91 @@ -470,16 +482,21 @@ ieee80211_vap_setup(struct ieee80211com  
     91@@ -471,16 +483,21 @@ ieee80211_vap_setup(struct ieee80211com  
    9292                } else 
    9393                        strncpy(dev->name, name, sizeof(dev->name)); 
     
    111111        dev->hard_header_len = parent->hard_header_len; 
    112112        /* 
    113 @@ -1823,7 +1840,11 @@ ieee80211_set_multicast_list(struct net_ 
     113@@ -1824,7 +1841,11 @@ ieee80211_set_multicast_list(struct net_ 
    114114        IEEE80211_UNLOCK_IRQ(ic); 
    115115  
  • trunk/package/madwifi/patches/446-single_module.patch

    r17687 r18052  
    352352 #include <linux/skbuff.h> 
    353353 #include <linux/netdevice.h> 
    354 @@ -2014,3 +2015,65 @@ ieee80211_build_sc_ie(struct ieee80211co 
     354@@ -2015,3 +2016,65 @@ ieee80211_build_sc_ie(struct ieee80211co 
    355355 int ath_debug_global = 0; 
    356356 EXPORT_SYMBOL(ath_debug_global); 
  • trunk/package/madwifi/patches/451-ibss_race_fix.patch

    r18050 r18052  
    11--- a/net80211/ieee80211_input.c 
    22+++ b/net80211/ieee80211_input.c 
    3 @@ -322,7 +322,6 @@ ieee80211_input(struct ieee80211vap * va 
     3@@ -294,10 +294,10 @@ ieee80211_input(struct ieee80211vap * va 
     4                        break; 
     5                case IEEE80211_M_IBSS: 
     6                case IEEE80211_M_AHDEMO: 
     7-                       if (!IEEE80211_ADDR_EQ(wh->i_addr3, vap->iv_bssid) || 
     8+                       if ((!IEEE80211_ADDR_EQ(wh->i_addr3, vap->iv_bssid) || 
     9                            (!IEEE80211_ADDR_EQ(wh->i_addr1, vap->iv_myaddr) && 
     10-                            !IEEE80211_IS_MULTICAST(wh->i_addr1) && 
     11-                            (subtype != IEEE80211_FC0_SUBTYPE_BEACON))) { 
     12+                            !IEEE80211_IS_MULTICAST(wh->i_addr1))) && 
     13+                            (type == IEEE80211_FC0_TYPE_DATA)) { 
     14                                if (!(vap->iv_dev->flags & IFF_PROMISC)) { 
     15                                        IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_INPUT, 
     16                                                bssid, NULL, "%s", "not to bss"); 
     17@@ -322,22 +322,15 @@ ieee80211_input(struct ieee80211vap * va 
    418                        } 
    519                        /* Do not try to find a node reference if the packet really did come from the BSS */ 
     
    822                                        IEEE80211_ADDR_EQ(vap->iv_bssid, wh->i_addr3)) { 
    923                                /* Try to find sender in local node table. */ 
    10                                 ni = ieee80211_find_node(&ic->ic_sta, wh->i_addr2); 
    11 @@ -3572,10 +3571,12 @@ ieee80211_recv_mgmt(struct ieee80211vap  
     24-                               ni = ieee80211_find_node(&ic->ic_sta, wh->i_addr2); 
     25+                               if (!ni_or_null) { 
     26+                                       ieee80211_unref_node(&ni); 
     27+                                       ni = ieee80211_find_txnode(vap, wh->i_addr2); 
     28+                               } 
     29                                if (ni == NULL) { 
     30-                                       /* 
     31-                                        * Fake up a node for this newly discovered 
     32-                                        * member of the IBSS.  This should probably 
     33-                                        * done after an ACL check. 
     34-                                        */ 
     35-                                       ni = ieee80211_fakeup_adhoc_node(vap, 
     36-                                                       wh->i_addr2); 
     37-                                       if (ni == NULL) { 
     38-                                               /* NB: stat kept for alloc failure */ 
     39-                                               goto err; 
     40-                                       } 
     41+                                       /* NB: stat kept for alloc failure */ 
     42+                                       goto discard; 
     43                                } 
     44                        } 
     45                        iwspy_event(vap, ni, rssi); 
     46@@ -3553,8 +3546,8 @@ ieee80211_recv_mgmt(struct ieee80211vap  
     47                                (((vap->iv_opmode == IEEE80211_M_HOSTAP) || 
     48                                 (vap->iv_opmode == IEEE80211_M_WDS)) && 
     49                                (scan.capinfo & IEEE80211_CAPINFO_ESS))) { 
     50+                       struct ieee80211_node *tni = NULL; 
     51                        struct ieee80211vap *avp = NULL; 
     52-                       int do_unref = 0; 
     53                        int found = 0; 
     54  
     55                        IEEE80211_LOCK_IRQ(vap->iv_ic); 
     56@@ -3568,14 +3561,12 @@ ieee80211_recv_mgmt(struct ieee80211vap  
     57                                        } 
     58                                } 
     59                                if (found) 
     60-                                       ni = ni_or_null = avp->iv_wdsnode; 
     61+                                       tni = ieee80211_ref_node(avp->iv_wdsnode); 
    1262                        } else if (vap->iv_opmode == IEEE80211_M_WDS) { 
    1363                                found = 1; 
    14                                 ni = ni_or_null = vap->iv_wdsnode; 
     64-                               ni = ni_or_null = vap->iv_wdsnode; 
    1565-                       } else if (vap->iv_opmode == IEEE80211_M_IBSS) { 
     66-                               ni_or_null = ieee80211_find_node(&ic->ic_sta, wh->i_addr2); 
     67-                               if (ni_or_null) 
     68-                                       ni = ni_or_null; 
     69+                               tni = ieee80211_ref_node(vap->iv_wdsnode); 
    1670+                       } else if ((vap->iv_opmode == IEEE80211_M_IBSS) && (vap->iv_state == IEEE80211_S_RUN)) { 
    17                                 ni_or_null = ieee80211_find_node(&ic->ic_sta, wh->i_addr2); 
    18 -                               if (ni_or_null) 
    19 +                               if (ni_or_null) { 
    20                                         ni = ni_or_null; 
    21 +                                       do_unref = 1; 
    22 +                               } 
     71+                               tni = ieee80211_find_node(&ic->ic_sta, wh->i_addr2); 
    2372                                found = 1; 
    2473                        } 
    2574                        IEEE80211_UNLOCK_IRQ(vap->iv_ic); 
     75@@ -3583,20 +3574,21 @@ ieee80211_recv_mgmt(struct ieee80211vap  
     76                        if (!found) 
     77                                break; 
     78  
     79-                       if (ni_or_null == NULL) { 
     80+                       memcpy(&SKB_CB(skb)->beacon_tsf, scan.tstamp, sizeof(u_int64_t)); 
     81+ 
     82+                       if (tni == NULL) { 
     83                                if (avp) { 
     84                                        IEEE80211_LOCK_IRQ(ic); 
     85-                                       ni = ieee80211_add_neighbor(avp, wh, &scan); 
     86+                                       tni = ieee80211_add_neighbor(avp, wh, &scan); 
     87                                        /* force assoc */ 
     88-                                       ni->ni_associd |= 0xc000; 
     89-                                       avp->iv_wdsnode = ieee80211_ref_node(ni); 
     90+                                       tni->ni_associd |= 0xc000; 
     91+                                       avp->iv_wdsnode = ieee80211_ref_node(tni); 
     92                                        IEEE80211_UNLOCK_IRQ(ic); 
     93                                } else if ((vap->iv_opmode == IEEE80211_M_IBSS) && 
     94                                           IEEE80211_ADDR_EQ(wh->i_addr3, vap->iv_bssid)) { 
     95                                        /* Create a new entry in the neighbor table. */ 
     96-                                       ni = ieee80211_add_neighbor(vap, wh, &scan); 
     97+                                       tni = ieee80211_add_neighbor(vap, wh, &scan); 
     98                                } 
     99-                               do_unref = 1; 
     100                        } else { 
     101                                /* 
     102                                 * Copy data from beacon to neighbor table. 
     103@@ -3604,39 +3596,38 @@ ieee80211_recv_mgmt(struct ieee80211vap  
     104                                 * ieee80211_add_neighbor(), so we just copy 
     105                                 * everything over to be safe. 
     106                                 */ 
     107-                               ni->ni_esslen = scan.ssid[1]; 
     108-                               memcpy(ni->ni_essid, scan.ssid + 2, scan.ssid[1]); 
     109-                               IEEE80211_ADDR_COPY(ni->ni_bssid, wh->i_addr3); 
     110-                               memcpy(ni->ni_tstamp.data, scan.tstamp, 
     111-                                       sizeof(ni->ni_tstamp)); 
     112-                               ni->ni_inact = ni->ni_inact_reload; 
     113-                               ni->ni_intval =  
     114+                               tni->ni_esslen = scan.ssid[1]; 
     115+                               memcpy(tni->ni_essid, scan.ssid + 2, scan.ssid[1]); 
     116+                               IEEE80211_ADDR_COPY(tni->ni_bssid, wh->i_addr3); 
     117+                               memcpy(tni->ni_tstamp.data, scan.tstamp, 
     118+                                       sizeof(tni->ni_tstamp)); 
     119+                               tni->ni_inact = tni->ni_inact_reload; 
     120+                               tni->ni_intval = 
     121                                        IEEE80211_BINTVAL_SANITISE(scan.bintval); 
     122-                               ni->ni_capinfo = scan.capinfo; 
     123-                               ni->ni_chan = ic->ic_curchan; 
     124-                               ni->ni_fhdwell = scan.fhdwell; 
     125-                               ni->ni_fhindex = scan.fhindex; 
     126-                               ni->ni_erp = scan.erp; 
     127-                               ni->ni_timoff = scan.timoff; 
     128+                               tni->ni_capinfo = scan.capinfo; 
     129+                               tni->ni_chan = ic->ic_curchan; 
     130+                               tni->ni_fhdwell = scan.fhdwell; 
     131+                               tni->ni_fhindex = scan.fhindex; 
     132+                               tni->ni_erp = scan.erp; 
     133+                               tni->ni_timoff = scan.timoff; 
     134                                if (scan.wme != NULL) 
     135-                                       ieee80211_saveie(&ni->ni_wme_ie, scan.wme); 
     136+                                       ieee80211_saveie(&tni->ni_wme_ie, scan.wme); 
     137                                if (scan.wpa != NULL) 
     138-                                       ieee80211_saveie(&ni->ni_wpa_ie, scan.wpa); 
     139+                                       ieee80211_saveie(&tni->ni_wpa_ie, scan.wpa); 
     140                                if (scan.rsn != NULL) 
     141-                                       ieee80211_saveie(&ni->ni_rsn_ie, scan.rsn); 
     142+                                       ieee80211_saveie(&tni->ni_rsn_ie, scan.rsn); 
     143                                if (scan.ath != NULL) 
     144-                                       ieee80211_saveath(ni, scan.ath); 
     145+                                       ieee80211_saveath(tni, scan.ath); 
     146  
     147                                /* NB: must be after ni_chan is setup */ 
     148-                               ieee80211_setup_rates(ni, scan.rates, 
     149+                               ieee80211_setup_rates(tni, scan.rates, 
     150                                        scan.xrates, IEEE80211_F_DOSORT); 
     151                        } 
     152-                       if (ni != NULL) { 
     153-                               ni->ni_rssi = rssi; 
     154-                               ni->ni_rtsf = rtsf; 
     155-                               ni->ni_last_rx = jiffies; 
     156-                               if (do_unref) 
     157-                                       ieee80211_unref_node(&ni); 
     158+                       if (tni != NULL) { 
     159+                               tni->ni_rssi = rssi; 
     160+                               tni->ni_rtsf = rtsf; 
     161+                               tni->ni_last_rx = jiffies; 
     162+                               ieee80211_unref_node(&tni); 
     163                        } 
     164                } 
     165                break; 
    26166--- a/net80211/ieee80211_node.c 
    27167+++ b/net80211/ieee80211_node.c 
    28 @@ -317,16 +317,16 @@ ieee80211_create_ibss(struct ieee80211va 
     168@@ -53,6 +53,7 @@ 
     169  
     170 #include <net80211/ieee80211_var.h> 
     171 #include <net80211/if_athproto.h> 
     172+#include <net80211/ieee80211_node.h> 
     173  
     174 /* 
     175  * Association IDs are managed with a bit vector. 
     176@@ -317,16 +318,11 @@ ieee80211_create_ibss(struct ieee80211va 
    29177        /* Check to see if we already have a node for this mac 
    30178         * NB: we gain a node reference here 
    31179         */ 
    32180-       ni = ieee80211_find_txnode(vap, vap->iv_myaddr); 
    33 +       ni = ieee80211_find_node(&ic->ic_sta, vap->iv_myaddr); 
    34 +       if (ni) { 
    35 +               ieee80211_node_leave(ni); 
    36 +               ieee80211_unref_node(&ni); 
    37 +       } 
    38 + 
     181+       ieee80211_node_table_reset(&ic->ic_sta, vap); 
    39182+       ni = ieee80211_alloc_node_table(vap, vap->iv_myaddr); 
    40183        if (ni == NULL) { 
     
    52195  
    53196        IEEE80211_ADDR_COPY(ni->ni_bssid, vap->iv_myaddr); 
    54 @@ -759,6 +759,9 @@ ieee80211_sta_join(struct ieee80211vap * 
    55         ieee80211_setup_rates(ni, se->se_rates, se->se_xrates, 
    56                 IEEE80211_F_DOSORT | IEEE80211_F_DONEGO | IEEE80211_F_DODEL); 
    57   
    58 +       if (vap->iv_opmode == IEEE80211_M_IBSS) 
    59 +               ieee80211_node_table_reset(&vap->iv_ic->ic_sta, vap); 
    60 + 
    61         return ieee80211_sta_join1(PASS_NODE(ni)); 
    62  } 
    63  EXPORT_SYMBOL(ieee80211_sta_join); 
     197@@ -429,8 +425,8 @@ ieee80211_reset_bss(struct ieee80211vap  
     198                          __func__, ni, MAC_ADDR(vap->iv_myaddr)); 
     199        KASSERT(ni != NULL, ("unable to setup inital BSS node")); 
     200  
     201-       vap->iv_bss = ieee80211_ref_node(ni); 
     202-       KASSERT((atomic_read(&vap->iv_bss->ni_refcnt) == 3),  
     203+       vap->iv_bss = ni; 
     204+       KASSERT((atomic_read(&vap->iv_bss->ni_refcnt) == 2), 
     205                ("wrong refcount for new node.")); 
     206  
     207        if (obss != NULL) { 
     208@@ -647,7 +643,7 @@ ieee80211_sta_join1(struct ieee80211_nod 
     209                (vap->iv_state == IEEE80211_S_RUN) && bssid_equal(obss, selbs)); */ 
     210        vap->iv_bss = selbs; 
     211        IEEE80211_ADDR_COPY(vap->iv_bssid, selbs->ni_bssid); 
     212-       if (obss != NULL) { 
     213+       if ((obss != NULL) && (obss != selbs)) { 
     214                if (obss->ni_table) 
     215                        ieee80211_node_leave(obss); 
     216                ieee80211_unref_node(&obss); 
    64217--- a/ath/if_ath.c 
    65218+++ b/ath/if_ath.c 
    66 @@ -6655,10 +6655,8 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
     219@@ -6625,14 +6625,6 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
     220  
     221        sc->sc_recv_mgmt(vap, ni_or_null, skb, subtype, rssi, rtsf); 
     222  
     223-       /* Lookup the new node if any (this grabs a reference to it) */ 
     224-       ni = ieee80211_find_rxnode(vap->iv_ic, vap, 
     225-                (const struct ieee80211_frame_min *)skb->data); 
     226-       if (ni == NULL) { 
     227-               DPRINTF(sc, ATH_DEBUG_BEACON, "Dropping; node unknown.\n"); 
     228-               return; 
     229-       } 
     230- 
     231        switch (subtype) { 
     232        case IEEE80211_FC0_SUBTYPE_BEACON: 
     233                /* update RSSI statistics for use by the HAL */ 
     234@@ -6654,11 +6646,9 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
     235                         * we do the IBSS merging in software. Also do not merge 
    67236                         * if the difference it too small. Otherwise we are playing 
    68237                         * tsf-pingpong with other vendors drivers */ 
    69                         beacon_tsf = le64_to_cpu(ni->ni_tstamp.tsf); 
     238-                       beacon_tsf = le64_to_cpu(ni->ni_tstamp.tsf); 
    70239-                       if (beacon_tsf > rtsf + 0xffff) { 
     240+                       beacon_tsf = le64_to_cpu(SKB_CB(skb)->beacon_tsf); 
    71241+                       if (beacon_tsf > rtsf + 0xffff) 
    72242                                ath_hal_settsf64(sc->sc_ah, beacon_tsf - rtsf); 
     
    76246                } 
    77247                /* NB: Fall Through */ 
     248@@ -6680,13 +6670,21 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
     249                        hw_tsf = ath_hal_gettsf64(sc->sc_ah); 
     250                        hw_tu  = hw_tsf >> 10; 
     251  
     252-                       beacon_tsf = le64_to_cpu(ni->ni_tstamp.tsf); 
     253+                       beacon_tsf = le64_to_cpu(SKB_CB(skb)->beacon_tsf); 
     254                        beacon_tu  = beacon_tsf >> 10; 
     255  
     256+                       if (!beacon_tsf) 
     257+                               break; 
     258+ 
     259+                       if (IEEE80211_ADDR_EQ(wh->i_addr3, vap->iv_bssid)) 
     260+                               break; 
     261+ 
     262                        DPRINTF(sc, ATH_DEBUG_BEACON, 
     263-                                       "Beacon transmitted at %10llx, " 
     264+                                       "Beacon transmitted from "MAC_FMT" ("MAC_FMT") at %10llx, " 
     265                                        "received at %10llx(%lld), hw TSF " 
     266                                        "%10llx(%lld)\n", 
     267+                                       MAC_ADDR(wh->i_addr3), 
     268+                                       MAC_ADDR(vap->iv_bssid), 
     269                                        beacon_tsf, 
     270                                        rtsf, rtsf - beacon_tsf, 
     271                                        hw_tsf, hw_tsf - beacon_tsf); 
     272@@ -6699,39 +6697,13 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
     273                                do_merge = 1; 
     274                        } 
     275  
     276-                       /* Check sc_nexttbtt */ 
     277-                       if (sc->sc_nexttbtt < hw_tu) { 
     278-                               DPRINTF(sc, ATH_DEBUG_BEACON, 
     279-                                       "sc_nexttbtt (%8x TU) is in the past " 
     280-                                       "(tsf %8x TU), updating timers\n", 
     281-                                       sc->sc_nexttbtt, hw_tu); 
     282-                               do_merge = 1; 
     283-                       } 
     284- 
     285-                       intval = ni->ni_intval & HAL_BEACON_PERIOD; 
     286-#if 0 
     287-                       /* This code is disabled since it would produce 
     288-                        * unwanted merge. For instance, in a two nodes network 
     289-                        * A & B, A can merge to B and at the same time, B will 
     290-                        * merge to A, still having a split */ 
     291-                       if (intval != 0) { 
     292-                               if ((sc->sc_nexttbtt % intval) != 
     293-                                               (beacon_tu % intval)) { 
     294-                                       DPRINTF(sc, ATH_DEBUG_BEACON, 
     295-                                                       "ibss merge: " 
     296-                                                       "sc_nexttbtt %10x TU " 
     297-                                                       "(%3d) beacon %10x TU " 
     298-                                                       "(%3d)\n", 
     299-                                                       sc->sc_nexttbtt, 
     300-                                                       sc->sc_nexttbtt % intval, 
     301-                                                       beacon_tu, 
     302-                                                       beacon_tu % intval); 
     303-                                       do_merge = 1; 
     304-                               } 
     305-                       } 
     306-#endif 
     307-                       if (do_merge) 
     308+                       if (do_merge) { 
     309+                               /* Lookup the new node if any (this grabs a reference to it) */ 
     310+                               ni = ieee80211_find_txnode(vap, wh->i_addr2); 
     311+                               memcpy(ni->ni_bssid, wh->i_addr3, IEEE80211_ADDR_LEN); 
     312                                ieee80211_ibss_merge(ni); 
     313+                               ieee80211_unref_node(&ni); 
     314+                       } 
     315  
     316                        if ((sc->sc_opmode == HAL_M_IBSS) && 
     317                                        ath_hw_check_atim(sc, 1, vap->iv_bss->ni_intval)) 
     318@@ -6739,8 +6711,6 @@ ath_recv_mgmt(struct ieee80211vap * vap, 
     319                } 
     320                break; 
     321        } 
     322- 
     323-       ieee80211_unref_node(&ni); 
     324 } 
     325  
     326 static void 
     327--- a/net80211/ieee80211_linux.h 
     328+++ b/net80211/ieee80211_linux.h 
     329@@ -411,7 +411,7 @@ typedef spinlock_t acl_lock_t; 
     330  *     8 bytes so we reserve/avoid it. 
     331  */ 
     332        struct ieee80211_cb { 
     333-       u_int8_t vlan[8];                       /* reserve for vlan tag info */ 
     334+       u_int64_t beacon_tsf; 
     335        struct ieee80211_node *ni; 
     336        u_int32_t flags; 
     337 #define        M_LINK0         0x01                    /* frame needs WEP encryption */ 
     338--- a/net80211/ieee80211_scan_sta.c 
     339+++ b/net80211/ieee80211_scan_sta.c 
     340@@ -1125,11 +1125,8 @@ adhoc_default_action(struct ieee80211vap 
     341        u_int8_t zeroMacAddr[IEEE80211_ADDR_LEN]; 
     342  
     343        memset(&zeroMacAddr, 0, IEEE80211_ADDR_LEN); 
     344-       if (IEEE80211_ADDR_EQ(se->se_bssid, &zeroMacAddr[0])) { 
     345-               ieee80211_create_ibss(vap, se->se_chan); 
     346-               return 1; 
     347-       } else 
     348-               return ieee80211_sta_join(vap, se); 
     349+       ieee80211_create_ibss(vap, se->se_chan); 
     350+       return 1; 
     351 } 
     352  
     353 static const struct ieee80211_scanner adhoc_default = { 
Note: See TracChangeset for help on using the changeset viewer.