Changeset 39442


Ignore:
Timestamp:
2014-02-01T16:33:04+01:00 (4 years ago)
Author:
nbd
Message:

mac80211: merge upstream fixes

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/package/kernel/mac80211/patches
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/kernel/mac80211/patches/300-pending_work.patch

    r39427 r39442  
     1commit b9f268b5b01331c3c82179abca551429450e9417 
     2Author: Michal Kazior <michal.kazior@tieto.com> 
     3Date:   Wed Jan 29 14:22:27 2014 +0100 
     4 
     5    cfg80211: consider existing DFS interfaces 
     6     
     7    It was possible to break interface combinations in 
     8    the following way: 
     9     
     10     combo 1: iftype = AP, num_ifaces = 2, num_chans = 2, 
     11     combo 2: iftype = AP, num_ifaces = 1, num_chans = 1, radar = HT20 
     12     
     13    With the above interface combinations it was 
     14    possible to: 
     15     
     16     step 1. start AP on DFS channel by matching combo 2 
     17     step 2. start AP on non-DFS channel by matching combo 1 
     18     
     19    This was possible beacuse (step 2) did not consider 
     20    if other interfaces require radar detection. 
     21     
     22    The patch changes how cfg80211 tracks channels - 
     23    instead of channel itself now a complete chandef 
     24    is stored. 
     25     
     26    Signed-off-by: Michal Kazior <michal.kazior@tieto.com> 
     27    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     28 
     29commit bc9c62f5f511cc395c62dbf4cdd437f23db53b28 
     30Author: Antonio Quartulli <antonio@open-mesh.com> 
     31Date:   Wed Jan 29 17:53:43 2014 +0100 
     32 
     33    cfg80211: fix channel configuration in IBSS join 
     34     
     35    When receiving an IBSS_JOINED event select the BSS object 
     36    based on the {bssid, channel} couple rather than the bssid 
     37    only. 
     38    With the current approach if another cell having the same 
     39    BSSID (but using a different channel) exists then cfg80211 
     40    picks up the wrong BSS object. 
     41    The result is a mismatching channel configuration between 
     42    cfg80211 and the driver, that can lead to any sort of 
     43    problem. 
     44     
     45    The issue can be triggered by having an IBSS sitting on 
     46    given channel and then asking the driver to create a new 
     47    cell using the same BSSID but with a different frequency. 
     48    By passing the channel to cfg80211_get_bss() we can solve 
     49    this ambiguity and retrieve/create the correct BSS object. 
     50    All the users of cfg80211_ibss_joined() have been changed 
     51    accordingly. 
     52     
     53    Moreover WARN when cfg80211_ibss_joined() gets a NULL 
     54    channel as argument and remove a bogus call of the same 
     55    function in ath6kl (it does not make sense to call 
     56    cfg80211_ibss_joined() with a zero BSSID on ibss-leave). 
     57     
     58    Cc: Kalle Valo <kvalo@qca.qualcomm.com> 
     59    Cc: Arend van Spriel <arend@broadcom.com> 
     60    Cc: Bing Zhao <bzhao@marvell.com> 
     61    Cc: Jussi Kivilinna <jussi.kivilinna@iki.fi> 
     62    Cc: libertas-dev@lists.infradead.org 
     63    Acked-by: Kalle Valo <kvalo@qca.qualcomm.com> 
     64    Signed-off-by: Antonio Quartulli <antonio@open-mesh.com> 
     65    [minor code cleanup in ath6kl] 
     66    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     67 
     68commit 7e0c41cb41f215aba2c39b1c237bb4d42ec49a85 
     69Author: Johannes Berg <johannes.berg@intel.com> 
     70Date:   Fri Jan 24 14:41:44 2014 +0100 
     71 
     72    mac80211: fix bufferable MMPDU RX handling 
     73     
     74    Action, disassoc and deauth frames are bufferable, and as such don't 
     75    have the PM bit in the frame control field reserved which means we 
     76    need to react to the bit when receiving in such a frame. 
     77     
     78    Fix this by introducing a new helper ieee80211_is_bufferable_mmpdu() 
     79    and using it for the RX path that currently ignores the PM bit in 
     80    any non-data frames for doze->wake transitions, but listens to it in 
     81    all frames for wake->doze transitions, both of which are wrong. 
     82     
     83    Also use the new helper in the TX path to clean up the code. 
     84     
     85    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     86 
     87commit fc0df6d2343636e3f48a069330d5b972e3d8659d 
     88Author: Janusz Dziedzic <janusz.dziedzic@tieto.com> 
     89Date:   Fri Jan 24 14:29:21 2014 +0100 
     90 
     91    cfg80211: set preset_chandef after channel switch 
     92     
     93    Set preset_chandef in channel switch notification. 
     94    In other case we will have old preset_chandef. 
     95     
     96    Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com> 
     97    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     98 
     99commit cdec895e2344987ff171cece96e25d7407a3ebf6 
     100Author: Simon Wunderlich <simon@open-mesh.com> 
     101Date:   Fri Jan 24 23:48:29 2014 +0100 
     102 
     103    mac80211: send ibss probe responses with noack flag 
     104     
     105    Responding to probe requests for scanning clients will often create 
     106    excessive retries, as it happens quite often that the scanning client 
     107    already left the channel. Therefore do it like hostapd and send probe 
     108    responses for wildcard SSID only once by using the noack flag. 
     109     
     110    Signed-off-by: Simon Wunderlich <simon@open-mesh.com> 
     111    [fix typo & 'wildcard SSID' in commit log] 
     112    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     113 
     114commit 0b865d1e6b9c05052adae9315df7cb195dc60c3b 
     115Author: Luciano Coelho <luciano.coelho@intel.com> 
     116Date:   Tue Jan 28 17:09:08 2014 +0200 
     117 
     118    mac80211: ibss: remove unnecessary call to release channel 
     119     
     120    The ieee80211_vif_use_channel() function calls 
     121    ieee80211_vif_release_channel(), so there's no need to call it 
     122    explicitly in __ieee80211_sta_join_ibss(). 
     123     
     124    Signed-off-by: Luciano Coelho <luciano.coelho@intel.com> 
     125    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     126 
     127commit e1b6c17e971f0a51ff86c2dac2584c63cd999cd7 
     128Author: Michal Kazior <michal.kazior@tieto.com> 
     129Date:   Wed Jan 29 07:56:21 2014 +0100 
     130 
     131    mac80211: add missing CSA locking 
     132     
     133    The patch adds a missing sdata lock and adds a few 
     134    lockdeps for easier maintenance. 
     135     
     136    Signed-off-by: Michal Kazior <michal.kazior@tieto.com> 
     137    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     138 
     139commit ad17ba7d14d225b109b73c177cd446afb8050598 
     140Author: Michal Kazior <michal.kazior@tieto.com> 
     141Date:   Wed Jan 29 07:56:20 2014 +0100 
     142 
     143    mac80211: fix sdata->radar_required locking 
     144     
     145    radar_required setting wasn't protected by 
     146    local->mtx in some places. This should prevent 
     147    from scanning/radar detection/roc colliding. 
     148     
     149    Signed-off-by: Michal Kazior <michal.kazior@tieto.com> 
     150    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     151 
     152commit 5fcd5f1808813a3d9e502fd756e01bee8a79c85d 
     153Author: Michal Kazior <michal.kazior@tieto.com> 
     154Date:   Wed Jan 29 07:56:19 2014 +0100 
     155 
     156    mac80211: move csa_active setting in STA CSA 
     157     
     158    The sdata->vif.csa_active could be left set after, 
     159    e.g. channel context constraints check fail in STA 
     160    mode leaving the interface in a strange state for 
     161    a brief period of time until it is disconnected. 
     162    This was harmless but ugly. 
     163     
     164    Signed-off-by: Michal Kazior <michal.kazior@tieto.com> 
     165    Reviewed-by: Luciano Coelho <luciano.coelho@intel.com> 
     166    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     167 
     168commit e486da4b7eed71821c6b4c1bb9ac62ffd3ab13e9 
     169Author: Michal Kazior <michal.kazior@tieto.com> 
     170Date:   Wed Jan 29 07:56:18 2014 +0100 
     171 
     172    mac80211: fix possible memory leak on AP CSA failure 
     173     
     174    If CSA for AP interface failed and the interface 
     175    was not stopped afterwards another CSA request 
     176    would leak sdata->u.ap.next_beacon. 
     177     
     178    Signed-off-by: Michal Kazior <michal.kazior@tieto.com> 
     179    Reviewed-by: Luciano Coelho <luciano.coelho@intel.com> 
     180    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     181 
     182commit 3a77ba08940682bf3d52cf14f980337324af9d4a 
     183Author: Johannes Berg <johannes.berg@intel.com> 
     184Date:   Sat Feb 1 00:33:29 2014 +0100 
     185 
     186    mac80211: fix fragmentation code, particularly for encryption 
     187     
     188    The "new" fragmentation code (since my rewrite almost 5 years ago) 
     189    erroneously sets skb->len rather than using skb_trim() to adjust 
     190    the length of the first fragment after copying out all the others. 
     191    This leaves the skb tail pointer pointing to after where the data 
     192    originally ended, and thus causes the encryption MIC to be written 
     193    at that point, rather than where it belongs: immediately after the 
     194    data. 
     195     
     196    The impact of this is that if software encryption is done, then 
     197     a) encryption doesn't work for the first fragment, the connection 
     198        becomes unusable as the first fragment will never be properly 
     199        verified at the receiver, the MIC is practically guaranteed to 
     200        be wrong 
     201     b) we leak up to 8 bytes of plaintext (!) of the packet out into 
     202        the air 
     203     
     204    This is only mitigated by the fact that many devices are capable 
     205    of doing encryption in hardware, in which case this can't happen 
     206    as the tail pointer is irrelevant in that case. Additionally, 
     207    fragmentation is not used very frequently and would normally have 
     208    to be configured manually. 
     209     
     210    Fix this by using skb_trim() properly. 
     211     
     212    Cc: stable@vger.kernel.org 
     213    Fixes: 2de8e0d999b8 ("mac80211: rewrite fragmentation") 
     214    Reported-by: Jouni Malinen <j@w1.fi> 
     215    Signed-off-by: Johannes Berg <johannes.berg@intel.com> 
     216 
    1217commit de5f242e0c10e841017e37eb8c38974a642dbca8 
    2218Author: Sujith Manoharan <c_manoha@qca.qualcomm.com> 
     
    334550--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c 
    335551+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c 
    336 @@ -3256,6 +3256,15 @@ static int ath6kl_cfg80211_sscan_start(s 
     552@@ -790,7 +790,7 @@ void ath6kl_cfg80211_connect_event(struc 
     553        if (nw_type & ADHOC_NETWORK) { 
     554                ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, "ad-hoc %s selected\n", 
     555                           nw_type & ADHOC_CREATOR ? "creator" : "joiner"); 
     556-               cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL); 
     557+               cfg80211_ibss_joined(vif->ndev, bssid, chan, GFP_KERNEL); 
     558                cfg80211_put_bss(ar->wiphy, bss); 
     559                return; 
     560        } 
     561@@ -861,13 +861,9 @@ void ath6kl_cfg80211_disconnect_event(st 
     562        } 
     563  
     564        if (vif->nw_type & ADHOC_NETWORK) { 
     565-               if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) { 
     566+               if (vif->wdev.iftype != NL80211_IFTYPE_ADHOC) 
     567                        ath6kl_dbg(ATH6KL_DBG_WLAN_CFG, 
     568                                   "%s: ath6k not in ibss mode\n", __func__); 
     569-                       return; 
     570-               } 
     571-               memset(bssid, 0, ETH_ALEN); 
     572-               cfg80211_ibss_joined(vif->ndev, bssid, GFP_KERNEL); 
     573                return; 
     574        } 
     575  
     576@@ -3256,6 +3252,15 @@ static int ath6kl_cfg80211_sscan_start(s 
    337577        struct ath6kl_vif *vif = netdev_priv(dev); 
    338578        u16 interval; 
     
    350590        if (ar->state != ATH6KL_STATE_ON) 
    351591                return -EIO; 
    352 @@ -3268,11 +3277,11 @@ static int ath6kl_cfg80211_sscan_start(s 
     592@@ -3268,11 +3273,11 @@ static int ath6kl_cfg80211_sscan_start(s 
    353593        ret = ath6kl_set_probed_ssids(ar, vif, request->ssids, 
    354594                                      request->n_ssids, 
     
    364604                                               ALL_BSS_FILTER, 0); 
    365605                if (ret < 0) 
    366 @@ -3286,12 +3295,12 @@ static int ath6kl_cfg80211_sscan_start(s 
     606@@ -3286,12 +3291,12 @@ static int ath6kl_cfg80211_sscan_start(s 
    367607  
    368608        if (test_bit(ATH6KL_FW_CAPABILITY_RSSI_SCAN_THOLD, 
     
    471711--- a/include/linux/ieee80211.h 
    472712+++ b/include/linux/ieee80211.h 
    473 @@ -2192,10 +2192,10 @@ static inline u8 *ieee80211_get_DA(struc 
     713@@ -597,6 +597,20 @@ static inline int ieee80211_is_qos_nullf 
     714 } 
     715  
     716 /** 
     717+ * ieee80211_is_bufferable_mmpdu - check if frame is bufferable MMPDU 
     718+ * @fc: frame control field in little-endian byteorder 
     719+ */ 
     720+static inline bool ieee80211_is_bufferable_mmpdu(__le16 fc) 
     721+{ 
     722+       /* IEEE 802.11-2012, definition of "bufferable management frame"; 
     723+        * note that this ignores the IBSS special case. */ 
     724+       return ieee80211_is_mgmt(fc) && 
     725+              (ieee80211_is_action(fc) || 
     726+               ieee80211_is_disassoc(fc) || 
     727+               ieee80211_is_deauth(fc)); 
     728+} 
     729+ 
     730+/** 
     731  * ieee80211_is_first_frag - check if IEEE80211_SCTL_FRAG is not set 
     732  * @seq_ctrl: frame sequence control bytes in little-endian byteorder 
     733  */ 
     734@@ -2192,10 +2206,10 @@ static inline u8 *ieee80211_get_DA(struc 
    474735 } 
    475736  
     
    484745        if (ieee80211_is_disassoc(hdr->frame_control) || 
    485746            ieee80211_is_deauth(hdr->frame_control)) 
    486 @@ -2224,6 +2224,17 @@ static inline bool ieee80211_is_robust_m 
     747@@ -2224,6 +2238,17 @@ static inline bool ieee80211_is_robust_m 
    487748 } 
    488749  
     
    535796        /* internal */ 
    536797        struct wiphy *wiphy; 
     798@@ -3130,8 +3133,8 @@ struct cfg80211_cached_keys; 
     799  * @identifier: (private) Identifier used in nl80211 to identify this 
     800  *     wireless device if it has no netdev 
     801  * @current_bss: (private) Used by the internal configuration code 
     802- * @channel: (private) Used by the internal configuration code to track 
     803- *     the user-set AP, monitor and WDS channel 
     804+ * @chandef: (private) Used by the internal configuration code to track 
     805+ *     the user-set channel definition. 
     806  * @preset_chandef: (private) Used by the internal configuration code to 
     807  *     track the channel to be used for AP later 
     808  * @bssid: (private) Used by the internal configuration code 
     809@@ -3195,9 +3198,7 @@ struct wireless_dev { 
     810  
     811        struct cfg80211_internal_bss *current_bss; /* associated / joined */ 
     812        struct cfg80211_chan_def preset_chandef; 
     813- 
     814-       /* for AP and mesh channel tracking */ 
     815-       struct ieee80211_channel *channel; 
     816+       struct cfg80211_chan_def chandef; 
     817  
     818        bool ibss_fixed; 
     819        bool ibss_dfs_possible; 
     820@@ -3879,6 +3880,7 @@ void cfg80211_michael_mic_failure(struct 
     821  * 
     822  * @dev: network device 
     823  * @bssid: the BSSID of the IBSS joined 
     824+ * @channel: the channel of the IBSS joined 
     825  * @gfp: allocation flags 
     826  * 
     827  * This function notifies cfg80211 that the device joined an IBSS or 
     828@@ -3888,7 +3890,8 @@ void cfg80211_michael_mic_failure(struct 
     829  * with the locally generated beacon -- this guarantees that there is 
     830  * always a scan result for this IBSS. cfg80211 will handle the rest. 
     831  */ 
     832-void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp); 
     833+void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, 
     834+                         struct ieee80211_channel *channel, gfp_t gfp); 
     835  
     836 /** 
     837  * cfg80211_notify_new_candidate - notify cfg80211 of a new mesh peer candidate 
    537838--- a/include/uapi/linux/nl80211.h 
    538839+++ b/include/uapi/linux/nl80211.h 
     
    568869--- a/net/mac80211/cfg.c 
    569870+++ b/net/mac80211/cfg.c 
     871@@ -970,9 +970,9 @@ static int ieee80211_start_ap(struct wip 
     872        /* TODO: make hostapd tell us what it wants */ 
     873        sdata->smps_mode = IEEE80211_SMPS_OFF; 
     874        sdata->needed_rx_chains = sdata->local->rx_chains; 
     875-       sdata->radar_required = params->radar_required; 
     876  
     877        mutex_lock(&local->mtx); 
     878+       sdata->radar_required = params->radar_required; 
     879        err = ieee80211_vif_use_channel(sdata, &params->chandef, 
     880                                        IEEE80211_CHANCTX_SHARED); 
     881        mutex_unlock(&local->mtx); 
    570882@@ -1021,8 +1021,10 @@ static int ieee80211_start_ap(struct wip 
    571883                                        IEEE80211_P2P_OPPPS_ENABLE_BIT; 
     
    588900        } 
    589901  
    590 @@ -1090,8 +1093,6 @@ static int ieee80211_stop_ap(struct wiph 
     902@@ -1053,6 +1056,7 @@ static int ieee80211_change_beacon(struc 
     903        int err; 
     904  
     905        sdata = IEEE80211_DEV_TO_SUB_IF(dev); 
     906+       sdata_assert_lock(sdata); 
     907  
     908        /* don't allow changing the beacon while CSA is in place - offset 
     909         * of channel switch counter may change 
     910@@ -1080,6 +1084,8 @@ static int ieee80211_stop_ap(struct wiph 
     911        struct probe_resp *old_probe_resp; 
     912        struct cfg80211_chan_def chandef; 
     913  
     914+       sdata_assert_lock(sdata); 
     915+ 
     916        old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata); 
     917        if (!old_beacon) 
     918                return -ENOENT; 
     919@@ -1090,8 +1096,6 @@ static int ieee80211_stop_ap(struct wiph 
    591920        kfree(sdata->u.ap.next_beacon); 
    592921        sdata->u.ap.next_beacon = NULL; 
     
    597926        list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list) 
    598927                netif_carrier_off(vlan->dev); 
    599 @@ -1103,6 +1104,7 @@ static int ieee80211_stop_ap(struct wiph 
     928@@ -1103,6 +1107,7 @@ static int ieee80211_stop_ap(struct wiph 
    600929        kfree_rcu(old_beacon, rcu_head); 
    601930        if (old_probe_resp) 
     
    605934        __sta_info_flush(sdata, true); 
    606935        ieee80211_free_keys(sdata, true); 
    607 @@ -2638,6 +2640,24 @@ static int ieee80211_start_roc_work(stru 
     936@@ -2638,6 +2643,24 @@ static int ieee80211_start_roc_work(stru 
    608937        INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work); 
    609938        INIT_LIST_HEAD(&roc->dependents); 
     
    630959        if (!list_empty(&local->roc_list) || 
    631960            local->scanning || local->radar_detect_enabled) 
    632 @@ -2772,24 +2792,6 @@ static int ieee80211_start_roc_work(stru 
     961@@ -2772,24 +2795,6 @@ static int ieee80211_start_roc_work(stru 
    633962        if (!queued) 
    634963                list_add_tail(&roc->list, &local->roc_list); 
     
    655984 } 
    656985  
     986@@ -3004,8 +3009,10 @@ void ieee80211_csa_finalize_work(struct  
     987        if (!ieee80211_sdata_running(sdata)) 
     988                goto unlock; 
     989  
     990-       sdata->radar_required = sdata->csa_radar_required; 
     991+       sdata_assert_lock(sdata); 
     992+ 
     993        mutex_lock(&local->mtx); 
     994+       sdata->radar_required = sdata->csa_radar_required; 
     995        err = ieee80211_vif_change_channel(sdata, &changed); 
     996        mutex_unlock(&local->mtx); 
     997        if (WARN_ON(err < 0)) 
     998@@ -3022,13 +3029,13 @@ void ieee80211_csa_finalize_work(struct  
     999        switch (sdata->vif.type) { 
     1000        case NL80211_IFTYPE_AP: 
     1001                err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon); 
     1002+               kfree(sdata->u.ap.next_beacon); 
     1003+               sdata->u.ap.next_beacon = NULL; 
     1004+ 
     1005                if (err < 0) 
     1006                        goto unlock; 
     1007  
     1008                changed |= err; 
     1009-               kfree(sdata->u.ap.next_beacon); 
     1010-               sdata->u.ap.next_beacon = NULL; 
     1011- 
     1012                ieee80211_bss_info_change_notify(sdata, err); 
     1013                break; 
     1014        case NL80211_IFTYPE_ADHOC: 
     1015@@ -3066,7 +3073,7 @@ int ieee80211_channel_switch(struct wiph 
     1016        struct ieee80211_if_mesh __maybe_unused *ifmsh; 
     1017        int err, num_chanctx; 
     1018  
     1019-       lockdep_assert_held(&sdata->wdev.mtx); 
     1020+       sdata_assert_lock(sdata); 
     1021  
     1022        if (!list_empty(&local->roc_list) || local->scanning) 
     1023                return -EBUSY; 
    6571024--- a/net/mac80211/ht.c 
    6581025+++ b/net/mac80211/ht.c 
     
    7031070        /* 
    7041071         * Remove all stations associated with this interface. 
     1072@@ -827,7 +834,9 @@ static void ieee80211_do_stop(struct iee 
     1073        cancel_work_sync(&local->dynamic_ps_enable_work); 
     1074  
     1075        cancel_work_sync(&sdata->recalc_smps); 
     1076+       sdata_lock(sdata); 
     1077        sdata->vif.csa_active = false; 
     1078+       sdata_unlock(sdata); 
     1079        cancel_work_sync(&sdata->csa_finalize_work); 
     1080  
     1081        cancel_delayed_work_sync(&sdata->dfs_cac_timer_work); 
    7051082--- a/net/mac80211/rx.c 
    7061083+++ b/net/mac80211/rx.c 
     
    7401117  
    7411118        mmie = (struct ieee80211_mmie *) 
    742 @@ -1845,8 +1845,7 @@ static int ieee80211_drop_unencrypted_mg 
     1119@@ -1311,18 +1311,15 @@ ieee80211_rx_h_sta_process(struct ieee80 
     1120            !ieee80211_has_morefrags(hdr->frame_control) && 
     1121            !(status->rx_flags & IEEE80211_RX_DEFERRED_RELEASE) && 
     1122            (rx->sdata->vif.type == NL80211_IFTYPE_AP || 
     1123-            rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN)) { 
     1124+            rx->sdata->vif.type == NL80211_IFTYPE_AP_VLAN) && 
     1125+           /* PM bit is only checked in frames where it isn't reserved, 
     1126+            * in AP mode it's reserved in non-bufferable management frames 
     1127+            * (cf. IEEE 802.11-2012 8.2.4.1.7 Power Management field) 
     1128+            */ 
     1129+           (!ieee80211_is_mgmt(hdr->frame_control) || 
     1130+            ieee80211_is_bufferable_mmpdu(hdr->frame_control))) { 
     1131                if (test_sta_flag(sta, WLAN_STA_PS_STA)) { 
     1132-                       /* 
     1133-                        * Ignore doze->wake transitions that are 
     1134-                        * indicated by non-data frames, the standard 
     1135-                        * is unclear here, but for example going to 
     1136-                        * PS mode and then scanning would cause a 
     1137-                        * doze->wake transition for the probe request, 
     1138-                        * and that is clearly undesirable. 
     1139-                        */ 
     1140-                       if (ieee80211_is_data(hdr->frame_control) && 
     1141-                           !ieee80211_has_pm(hdr->frame_control)) 
     1142+                       if (!ieee80211_has_pm(hdr->frame_control)) 
     1143                                sta_ps_end(sta); 
     1144                } else { 
     1145                        if (ieee80211_has_pm(hdr->frame_control)) 
     1146@@ -1845,8 +1842,7 @@ static int ieee80211_drop_unencrypted_mg 
    7431147                 * having configured keys. 
    7441148                 */ 
     
    7621166  
    7631167        return 1; 
    764 @@ -567,7 +566,7 @@ ieee80211_tx_h_select_key(struct ieee802 
     1168@@ -525,9 +524,7 @@ ieee80211_tx_h_ps_buf(struct ieee80211_t 
     1169  
     1170        /* only deauth, disassoc and action are bufferable MMPDUs */ 
     1171        if (ieee80211_is_mgmt(hdr->frame_control) && 
     1172-           !ieee80211_is_deauth(hdr->frame_control) && 
     1173-           !ieee80211_is_disassoc(hdr->frame_control) && 
     1174-           !ieee80211_is_action(hdr->frame_control)) { 
     1175+           !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) { 
     1176                if (tx->flags & IEEE80211_TX_UNICAST) 
     1177                        info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER; 
     1178                return TX_CONTINUE; 
     1179@@ -567,7 +564,7 @@ ieee80211_tx_h_select_key(struct ieee802 
    7651180                tx->key = key; 
    7661181        else if (ieee80211_is_mgmt(hdr->frame_control) && 
     
    7711186                tx->key = key; 
    7721187        else if (is_multicast_ether_addr(hdr->addr1) && 
    773 @@ -582,12 +581,12 @@ ieee80211_tx_h_select_key(struct ieee802 
     1188@@ -582,12 +579,12 @@ ieee80211_tx_h_select_key(struct ieee802 
    7741189                tx->key = NULL; 
    7751190        else if (tx->skb->protocol == tx->sdata->control_port_protocol) 
     
    7861201        else { 
    7871202                I802_DEBUG_INC(tx->local->tx_handlers_drop_unencrypted); 
     1203@@ -878,7 +875,7 @@ static int ieee80211_fragment(struct iee 
     1204        } 
     1205  
     1206        /* adjust first fragment's length */ 
     1207-       skb->len = hdrlen + per_fragm; 
     1208+       skb_trim(skb, hdrlen + per_fragm); 
     1209        return 0; 
     1210 } 
     1211  
    7881212--- a/net/mac80211/wpa.c 
    7891213+++ b/net/mac80211/wpa.c 
     
    7991223--- a/net/wireless/ap.c 
    8001224+++ b/net/wireless/ap.c 
    801 @@ -30,6 +30,7 @@ static int __cfg80211_stop_ap(struct cfg 
    802                 wdev->channel = NULL; 
     1225@@ -27,9 +27,10 @@ static int __cfg80211_stop_ap(struct cfg 
     1226        err = rdev_stop_ap(rdev, dev); 
     1227        if (!err) { 
     1228                wdev->beacon_interval = 0; 
     1229-               wdev->channel = NULL; 
     1230+               memset(&wdev->chandef, 0, sizeof(wdev->chandef)); 
    8031231                wdev->ssid_len = 0; 
    8041232                rdev_set_qos_map(rdev, dev, NULL); 
     
    8571285        unsigned long suspend_at; 
    8581286        struct work_struct scan_done_wk; 
    859 @@ -361,7 +362,8 @@ int cfg80211_validate_key_settings(struc 
     1287@@ -210,6 +211,7 @@ struct cfg80211_event { 
     1288                } dc; 
     1289                struct { 
     1290                        u8 bssid[ETH_ALEN]; 
     1291+                       struct ieee80211_channel *channel; 
     1292                } ij; 
     1293        }; 
     1294 }; 
     1295@@ -257,7 +259,8 @@ int __cfg80211_leave_ibss(struct cfg8021 
     1296                          struct net_device *dev, bool nowext); 
     1297 int cfg80211_leave_ibss(struct cfg80211_registered_device *rdev, 
     1298                        struct net_device *dev, bool nowext); 
     1299-void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid); 
     1300+void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, 
     1301+                           struct ieee80211_channel *channel); 
     1302 int cfg80211_ibss_wext_join(struct cfg80211_registered_device *rdev, 
     1303                            struct wireless_dev *wdev); 
     1304  
     1305@@ -361,7 +364,8 @@ int cfg80211_validate_key_settings(struc 
    8601306                                   struct key_params *params, int key_idx, 
    8611307                                   bool pairwise, const u8 *mac_addr); 
     
    8671313 int __cfg80211_stop_sched_scan(struct cfg80211_registered_device *rdev, 
    8681314                               bool driver_initiated); 
     1315@@ -441,7 +445,8 @@ static inline unsigned int elapsed_jiffi 
     1316 void 
     1317 cfg80211_get_chan_state(struct wireless_dev *wdev, 
     1318                        struct ieee80211_channel **chan, 
     1319-                       enum cfg80211_chan_mode *chanmode); 
     1320+                       enum cfg80211_chan_mode *chanmode, 
     1321+                       u8 *radar_detect); 
     1322  
     1323 int cfg80211_set_monitor_channel(struct cfg80211_registered_device *rdev, 
     1324                                 struct cfg80211_chan_def *chandef); 
    8691325--- a/net/wireless/nl80211.c 
    8701326+++ b/net/wireless/nl80211.c 
     
    8981354                        if (result) 
    8991355                                goto bad_res; 
     1356@@ -3289,7 +3292,7 @@ static int nl80211_start_ap(struct sk_bu 
     1357        if (!err) { 
     1358                wdev->preset_chandef = params.chandef; 
     1359                wdev->beacon_interval = params.beacon_interval; 
     1360-               wdev->channel = params.chandef.chan; 
     1361+               wdev->chandef = params.chandef; 
     1362                wdev->ssid_len = params.ssid_len; 
     1363                memcpy(wdev->ssid, params.ssid, wdev->ssid_len); 
     1364        } 
    9001365@@ -5210,9 +5213,11 @@ static int nl80211_set_reg(struct sk_buf 
    9011366  
     
    10351500  
    10361501        if (info->attrs[NL80211_ATTR_IE]) { 
     1502@@ -5751,7 +5810,7 @@ static int nl80211_start_radar_detection 
     1503  
     1504        err = rdev->ops->start_radar_detection(&rdev->wiphy, dev, &chandef); 
     1505        if (!err) { 
     1506-               wdev->channel = chandef.chan; 
     1507+               wdev->chandef = chandef; 
     1508                wdev->cac_started = true; 
     1509                wdev->cac_start_time = jiffies; 
     1510        } 
    10371511@@ -7502,16 +7561,19 @@ static int nl80211_set_tx_bitrate_mask(s 
    10381512         * directly to the enum ieee80211_band values used in cfg80211. 
     
    11091583                                NL80211_MCGRP_SCAN, GFP_KERNEL); 
    11101584 } 
    1111 @@ -11673,6 +11726,35 @@ void cfg80211_crit_proto_stopped(struct  
     1585@@ -11158,7 +11211,8 @@ void cfg80211_ch_switch_notify(struct ne 
     1586                    wdev->iftype != NL80211_IFTYPE_MESH_POINT)) 
     1587                return; 
     1588  
     1589-       wdev->channel = chandef->chan; 
     1590+       wdev->chandef = *chandef; 
     1591+       wdev->preset_chandef = *chandef; 
     1592        nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL); 
     1593 } 
     1594 EXPORT_SYMBOL(cfg80211_ch_switch_notify); 
     1595@@ -11673,6 +11727,35 @@ void cfg80211_crit_proto_stopped(struct  
    11121596 } 
    11131597 EXPORT_SYMBOL(cfg80211_crit_proto_stopped); 
     
    12781762  
    12791763        if (wdev->conn->params.channel) 
     1764--- a/net/mac80211/mlme.c 
     1765+++ b/net/mac80211/mlme.c 
     1766@@ -1001,7 +1001,6 @@ ieee80211_sta_process_chanswitch(struct  
     1767        } 
     1768  
     1769        ifmgd->flags |= IEEE80211_STA_CSA_RECEIVED; 
     1770-       sdata->vif.csa_active = true; 
     1771  
     1772        mutex_lock(&local->chanctx_mtx); 
     1773        if (local->use_chanctx) { 
     1774@@ -1039,6 +1038,7 @@ ieee80211_sta_process_chanswitch(struct  
     1775        mutex_unlock(&local->chanctx_mtx); 
     1776  
     1777        sdata->csa_chandef = csa_ie.chandef; 
     1778+       sdata->vif.csa_active = true; 
     1779  
     1780        if (csa_ie.mode) 
     1781                ieee80211_stop_queues_by_reason(&local->hw, 
     1782--- a/net/mac80211/chan.c 
     1783+++ b/net/mac80211/chan.c 
     1784@@ -196,6 +196,8 @@ static bool ieee80211_is_radar_required( 
     1785 { 
     1786        struct ieee80211_sub_if_data *sdata; 
     1787  
     1788+       lockdep_assert_held(&local->mtx); 
     1789+ 
     1790        rcu_read_lock(); 
     1791        list_for_each_entry_rcu(sdata, &local->interfaces, list) { 
     1792                if (sdata->radar_required) { 
     1793--- a/net/mac80211/ibss.c 
     1794+++ b/net/mac80211/ibss.c 
     1795@@ -294,7 +294,6 @@ static void __ieee80211_sta_join_ibss(st 
     1796        } 
     1797  
     1798        mutex_lock(&local->mtx); 
     1799-       ieee80211_vif_release_channel(sdata); 
     1800        if (ieee80211_vif_use_channel(sdata, &chandef, 
     1801                                      ifibss->fixed_channel ? 
     1802                                        IEEE80211_CHANCTX_SHARED : 
     1803@@ -303,6 +302,7 @@ static void __ieee80211_sta_join_ibss(st 
     1804                mutex_unlock(&local->mtx); 
     1805                return; 
     1806        } 
     1807+       sdata->radar_required = radar_required; 
     1808        mutex_unlock(&local->mtx); 
     1809  
     1810        memcpy(ifibss->bssid, bssid, ETH_ALEN); 
     1811@@ -318,7 +318,6 @@ static void __ieee80211_sta_join_ibss(st 
     1812        rcu_assign_pointer(ifibss->presp, presp); 
     1813        mgmt = (void *)presp->head; 
     1814  
     1815-       sdata->radar_required = radar_required; 
     1816        sdata->vif.bss_conf.enable_beacon = true; 
     1817        sdata->vif.bss_conf.beacon_int = beacon_int; 
     1818        sdata->vif.bss_conf.basic_rates = basic_rates; 
     1819@@ -386,7 +385,7 @@ static void __ieee80211_sta_join_ibss(st 
     1820                                              presp->head_len, 0, GFP_KERNEL); 
     1821        cfg80211_put_bss(local->hw.wiphy, bss); 
     1822        netif_carrier_on(sdata->dev); 
     1823-       cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL); 
     1824+       cfg80211_ibss_joined(sdata->dev, ifibss->bssid, chan, GFP_KERNEL); 
     1825 } 
     1826  
     1827 static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, 
     1828@@ -802,6 +801,8 @@ ieee80211_ibss_process_chanswitch(struct 
     1829        int err; 
     1830        u32 sta_flags; 
     1831  
     1832+       sdata_assert_lock(sdata); 
     1833+ 
     1834        sta_flags = IEEE80211_STA_DISABLE_VHT; 
     1835        switch (ifibss->chandef.width) { 
     1836        case NL80211_CHAN_WIDTH_5: 
     1837@@ -1471,6 +1472,11 @@ static void ieee80211_rx_mgmt_probe_req( 
     1838        memcpy(((struct ieee80211_mgmt *) skb->data)->da, mgmt->sa, ETH_ALEN); 
     1839        ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa); 
     1840        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; 
     1841+ 
     1842+       /* avoid excessive retries for probe request to wildcard SSIDs */ 
     1843+       if (pos[1] == 0) 
     1844+               IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_NO_ACK; 
     1845+ 
     1846        ieee80211_tx_skb(sdata, skb); 
     1847 } 
     1848  
     1849--- a/net/mac80211/mesh.c 
     1850+++ b/net/mac80211/mesh.c 
     1851@@ -872,6 +872,8 @@ ieee80211_mesh_process_chnswitch(struct  
     1852        if (!ifmsh->mesh_id) 
     1853                return false; 
     1854  
     1855+       sdata_assert_lock(sdata); 
     1856+ 
     1857        sta_flags = IEEE80211_STA_DISABLE_VHT; 
     1858        switch (sdata->vif.bss_conf.chandef.width) { 
     1859        case NL80211_CHAN_WIDTH_20_NOHT: 
     1860--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c 
     1861+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c 
     1862@@ -4658,6 +4658,7 @@ brcmf_notify_connect_status(struct brcmf 
     1863        struct brcmf_cfg80211_info *cfg = ifp->drvr->config; 
     1864        struct net_device *ndev = ifp->ndev; 
     1865        struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; 
     1866+       struct ieee80211_channel *chan; 
     1867        s32 err = 0; 
     1868  
     1869        if (ifp->vif->mode == WL_MODE_AP) { 
     1870@@ -4665,9 +4666,10 @@ brcmf_notify_connect_status(struct brcmf 
     1871        } else if (brcmf_is_linkup(e)) { 
     1872                brcmf_dbg(CONN, "Linkup\n"); 
     1873                if (brcmf_is_ibssmode(ifp->vif)) { 
     1874+                       chan = ieee80211_get_channel(cfg->wiphy, cfg->channel); 
     1875                        memcpy(profile->bssid, e->addr, ETH_ALEN); 
     1876                        wl_inform_ibss(cfg, ndev, e->addr); 
     1877-                       cfg80211_ibss_joined(ndev, e->addr, GFP_KERNEL); 
     1878+                       cfg80211_ibss_joined(ndev, e->addr, chan, GFP_KERNEL); 
     1879                        clear_bit(BRCMF_VIF_STATUS_CONNECTING, 
     1880                                  &ifp->vif->sme_state); 
     1881                        set_bit(BRCMF_VIF_STATUS_CONNECTED, 
     1882--- a/drivers/net/wireless/libertas/cfg.c 
     1883+++ b/drivers/net/wireless/libertas/cfg.c 
     1884@@ -1766,7 +1766,8 @@ static void lbs_join_post(struct lbs_pri 
     1885        memcpy(priv->wdev->ssid, params->ssid, params->ssid_len); 
     1886        priv->wdev->ssid_len = params->ssid_len; 
     1887  
     1888-       cfg80211_ibss_joined(priv->dev, bssid, GFP_KERNEL); 
     1889+       cfg80211_ibss_joined(priv->dev, bssid, params->chandef.chan, 
     1890+                            GFP_KERNEL); 
     1891  
     1892        /* TODO: consider doing this at MACREG_INT_CODE_LINK_SENSED time */ 
     1893        priv->connect_status = LBS_CONNECTED; 
     1894--- a/drivers/net/wireless/mwifiex/cfg80211.c 
     1895+++ b/drivers/net/wireless/mwifiex/cfg80211.c 
     1896@@ -1881,7 +1881,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy  
     1897                                     params->privacy); 
     1898 done: 
     1899        if (!ret) { 
     1900-               cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, GFP_KERNEL); 
     1901+               cfg80211_ibss_joined(priv->netdev, priv->cfg_bssid, 
     1902+                                    params->chandef.chan, GFP_KERNEL); 
     1903                dev_dbg(priv->adapter->dev, 
     1904                        "info: joined/created adhoc network with bssid" 
     1905                        " %pM successfully\n", priv->cfg_bssid); 
     1906--- a/drivers/net/wireless/rndis_wlan.c 
     1907+++ b/drivers/net/wireless/rndis_wlan.c 
     1908@@ -2835,7 +2835,9 @@ static void rndis_wlan_do_link_up_work(s 
     1909                                        bssid, req_ie, req_ie_len, 
     1910                                        resp_ie, resp_ie_len, GFP_KERNEL); 
     1911        } else if (priv->infra_mode == NDIS_80211_INFRA_ADHOC) 
     1912-               cfg80211_ibss_joined(usbdev->net, bssid, GFP_KERNEL); 
     1913+               cfg80211_ibss_joined(usbdev->net, bssid, 
     1914+                                    get_current_channel(usbdev, NULL), 
     1915+                                    GFP_KERNEL); 
     1916  
     1917        kfree(info); 
     1918  
     1919--- a/net/wireless/ibss.c 
     1920+++ b/net/wireless/ibss.c 
     1921@@ -14,7 +14,8 @@ 
     1922 #include "rdev-ops.h" 
     1923  
     1924  
     1925-void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid) 
     1926+void __cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, 
     1927+                           struct ieee80211_channel *channel) 
     1928 { 
     1929        struct wireless_dev *wdev = dev->ieee80211_ptr; 
     1930        struct cfg80211_bss *bss; 
     1931@@ -28,8 +29,7 @@ void __cfg80211_ibss_joined(struct net_d 
     1932        if (!wdev->ssid_len) 
     1933                return; 
     1934  
     1935-       bss = cfg80211_get_bss(wdev->wiphy, NULL, bssid, 
     1936-                              wdev->ssid, wdev->ssid_len, 
     1937+       bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, NULL, 0, 
     1938                               WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS); 
     1939  
     1940        if (WARN_ON(!bss)) 
     1941@@ -54,21 +54,26 @@ void __cfg80211_ibss_joined(struct net_d 
     1942 #endif 
     1943 } 
     1944  
     1945-void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, gfp_t gfp) 
     1946+void cfg80211_ibss_joined(struct net_device *dev, const u8 *bssid, 
     1947+                         struct ieee80211_channel *channel, gfp_t gfp) 
     1948 { 
     1949        struct wireless_dev *wdev = dev->ieee80211_ptr; 
     1950        struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); 
     1951        struct cfg80211_event *ev; 
     1952        unsigned long flags; 
     1953  
     1954-       trace_cfg80211_ibss_joined(dev, bssid); 
     1955+       trace_cfg80211_ibss_joined(dev, bssid, channel); 
     1956+ 
     1957+       if (WARN_ON(!channel)) 
     1958+               return; 
     1959  
     1960        ev = kzalloc(sizeof(*ev), gfp); 
     1961        if (!ev) 
     1962                return; 
     1963  
     1964        ev->type = EVENT_IBSS_JOINED; 
     1965-       memcpy(ev->cr.bssid, bssid, ETH_ALEN); 
     1966+       memcpy(ev->ij.bssid, bssid, ETH_ALEN); 
     1967+       ev->ij.channel = channel; 
     1968  
     1969        spin_lock_irqsave(&wdev->event_lock, flags); 
     1970        list_add_tail(&ev->list, &wdev->event_list); 
     1971@@ -117,6 +122,7 @@ int __cfg80211_join_ibss(struct cfg80211 
     1972  
     1973        wdev->ibss_fixed = params->channel_fixed; 
     1974        wdev->ibss_dfs_possible = params->userspace_handles_dfs; 
     1975+       wdev->chandef = params->chandef; 
     1976 #ifdef CPTCFG_CFG80211_WEXT 
     1977        wdev->wext.ibss.chandef = params->chandef; 
     1978 #endif 
     1979@@ -200,6 +206,7 @@ static void __cfg80211_clear_ibss(struct 
     1980  
     1981        wdev->current_bss = NULL; 
     1982        wdev->ssid_len = 0; 
     1983+       memset(&wdev->chandef, 0, sizeof(wdev->chandef)); 
     1984 #ifdef CPTCFG_CFG80211_WEXT 
     1985        if (!nowext) 
     1986                wdev->wext.ibss.ssid_len = 0; 
     1987--- a/net/wireless/trace.h 
     1988+++ b/net/wireless/trace.h 
     1989@@ -2278,11 +2278,6 @@ DECLARE_EVENT_CLASS(cfg80211_rx_evt, 
     1990        TP_printk(NETDEV_PR_FMT ", " MAC_PR_FMT, NETDEV_PR_ARG, MAC_PR_ARG(addr)) 
     1991 ); 
     1992  
     1993-DEFINE_EVENT(cfg80211_rx_evt, cfg80211_ibss_joined, 
     1994-       TP_PROTO(struct net_device *netdev, const u8 *addr), 
     1995-       TP_ARGS(netdev, addr) 
     1996-); 
     1997- 
     1998 DEFINE_EVENT(cfg80211_rx_evt, cfg80211_rx_spurious_frame, 
     1999        TP_PROTO(struct net_device *netdev, const u8 *addr), 
     2000        TP_ARGS(netdev, addr) 
     2001@@ -2293,6 +2288,24 @@ DEFINE_EVENT(cfg80211_rx_evt, cfg80211_r 
     2002        TP_ARGS(netdev, addr) 
     2003 ); 
     2004  
     2005+TRACE_EVENT(cfg80211_ibss_joined, 
     2006+       TP_PROTO(struct net_device *netdev, const u8 *bssid, 
     2007+                struct ieee80211_channel *channel), 
     2008+       TP_ARGS(netdev, bssid, channel), 
     2009+       TP_STRUCT__entry( 
     2010+               NETDEV_ENTRY 
     2011+               MAC_ENTRY(bssid) 
     2012+               CHAN_ENTRY 
     2013+       ), 
     2014+       TP_fast_assign( 
     2015+               NETDEV_ASSIGN; 
     2016+               MAC_ASSIGN(bssid, bssid); 
     2017+               CHAN_ASSIGN(channel); 
     2018+       ), 
     2019+       TP_printk(NETDEV_PR_FMT ", bssid: " MAC_PR_FMT ", " CHAN_PR_FMT, 
     2020+                 NETDEV_PR_ARG, MAC_PR_ARG(bssid), CHAN_PR_ARG) 
     2021+); 
     2022+ 
     2023 TRACE_EVENT(cfg80211_probe_status, 
     2024        TP_PROTO(struct net_device *netdev, const u8 *addr, u64 cookie, 
     2025                 bool acked), 
     2026--- a/net/wireless/util.c 
     2027+++ b/net/wireless/util.c 
     2028@@ -820,7 +820,8 @@ void cfg80211_process_wdev_events(struct 
     2029                                                ev->dc.reason, true); 
     2030                        break; 
     2031                case EVENT_IBSS_JOINED: 
     2032-                       __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid); 
     2033+                       __cfg80211_ibss_joined(wdev->netdev, ev->ij.bssid, 
     2034+                                              ev->ij.channel); 
     2035                        break; 
     2036                } 
     2037                wdev_unlock(wdev); 
     2038@@ -1356,7 +1357,7 @@ int cfg80211_can_use_iftype_chan(struct  
     2039                 */ 
     2040                mutex_lock_nested(&wdev_iter->mtx, 1); 
     2041                __acquire(wdev_iter->mtx); 
     2042-               cfg80211_get_chan_state(wdev_iter, &ch, &chmode); 
     2043+               cfg80211_get_chan_state(wdev_iter, &ch, &chmode, &radar_detect); 
     2044                wdev_unlock(wdev_iter); 
     2045  
     2046                switch (chmode) { 
     2047--- a/net/wireless/chan.c 
     2048+++ b/net/wireless/chan.c 
     2049@@ -642,7 +642,8 @@ int cfg80211_set_monitor_channel(struct  
     2050 void 
     2051 cfg80211_get_chan_state(struct wireless_dev *wdev, 
     2052                        struct ieee80211_channel **chan, 
     2053-                       enum cfg80211_chan_mode *chanmode) 
     2054+                       enum cfg80211_chan_mode *chanmode, 
     2055+                       u8 *radar_detect) 
     2056 { 
     2057        *chan = NULL; 
     2058        *chanmode = CHAN_MODE_UNDEFINED; 
     2059@@ -660,6 +661,11 @@ cfg80211_get_chan_state(struct wireless_ 
     2060                                     !wdev->ibss_dfs_possible) 
     2061                                  ? CHAN_MODE_SHARED 
     2062                                  : CHAN_MODE_EXCLUSIVE; 
     2063+ 
     2064+                       /* consider worst-case - IBSS can try to return to the 
     2065+                        * original user-specified channel as creator */ 
     2066+                       if (wdev->ibss_dfs_possible) 
     2067+                               *radar_detect |= BIT(wdev->chandef.width); 
     2068                        return; 
     2069                } 
     2070                break; 
     2071@@ -674,17 +680,26 @@ cfg80211_get_chan_state(struct wireless_ 
     2072        case NL80211_IFTYPE_AP: 
     2073        case NL80211_IFTYPE_P2P_GO: 
     2074                if (wdev->cac_started) { 
     2075-                       *chan = wdev->channel; 
     2076+                       *chan = wdev->chandef.chan; 
     2077                        *chanmode = CHAN_MODE_SHARED; 
     2078+                       *radar_detect |= BIT(wdev->chandef.width); 
     2079                } else if (wdev->beacon_interval) { 
     2080-                       *chan = wdev->channel; 
     2081+                       *chan = wdev->chandef.chan; 
     2082                        *chanmode = CHAN_MODE_SHARED; 
     2083+ 
     2084+                       if (cfg80211_chandef_dfs_required(wdev->wiphy, 
     2085+                                                         &wdev->chandef)) 
     2086+                               *radar_detect |= BIT(wdev->chandef.width); 
     2087                } 
     2088                return; 
     2089        case NL80211_IFTYPE_MESH_POINT: 
     2090                if (wdev->mesh_id_len) { 
     2091-                       *chan = wdev->channel; 
     2092+                       *chan = wdev->chandef.chan; 
     2093                        *chanmode = CHAN_MODE_SHARED; 
     2094+ 
     2095+                       if (cfg80211_chandef_dfs_required(wdev->wiphy, 
     2096+                                                         &wdev->chandef)) 
     2097+                               *radar_detect |= BIT(wdev->chandef.width); 
     2098                } 
     2099                return; 
     2100        case NL80211_IFTYPE_MONITOR: 
     2101--- a/net/wireless/mesh.c 
     2102+++ b/net/wireless/mesh.c 
     2103@@ -195,7 +195,7 @@ int __cfg80211_join_mesh(struct cfg80211 
     2104        if (!err) { 
     2105                memcpy(wdev->ssid, setup->mesh_id, setup->mesh_id_len); 
     2106                wdev->mesh_id_len = setup->mesh_id_len; 
     2107-               wdev->channel = setup->chandef.chan; 
     2108+               wdev->chandef = setup->chandef; 
     2109        } 
     2110  
     2111        return err; 
     2112@@ -244,7 +244,7 @@ int cfg80211_set_mesh_channel(struct cfg 
     2113                err = rdev_libertas_set_mesh_channel(rdev, wdev->netdev, 
     2114                                                     chandef->chan); 
     2115                if (!err) 
     2116-                       wdev->channel = chandef->chan; 
     2117+                       wdev->chandef = *chandef; 
     2118  
     2119                return err; 
     2120        } 
     2121@@ -276,7 +276,7 @@ static int __cfg80211_leave_mesh(struct  
     2122        err = rdev_leave_mesh(rdev, dev); 
     2123        if (!err) { 
     2124                wdev->mesh_id_len = 0; 
     2125-               wdev->channel = NULL; 
     2126+               memset(&wdev->chandef, 0, sizeof(wdev->chandef)); 
     2127                rdev_set_qos_map(rdev, dev, NULL); 
     2128        } 
     2129  
     2130--- a/net/wireless/mlme.c 
     2131+++ b/net/wireless/mlme.c 
     2132@@ -772,7 +772,7 @@ void cfg80211_cac_event(struct net_devic 
     2133        if (WARN_ON(!wdev->cac_started)) 
     2134                return; 
     2135  
     2136-       if (WARN_ON(!wdev->channel)) 
     2137+       if (WARN_ON(!wdev->chandef.chan)) 
     2138                return; 
     2139  
     2140        switch (event) { 
  • trunk/package/kernel/mac80211/patches/310-ap_scan.patch

    r39427 r39442  
    11--- a/net/mac80211/cfg.c 
    22+++ b/net/mac80211/cfg.c 
    3 @@ -2142,7 +2142,7 @@ static int ieee80211_scan(struct wiphy * 
     3@@ -2145,7 +2145,7 @@ static int ieee80211_scan(struct wiphy * 
    44                 * the  frames sent while scanning on other channel will be 
    55                 * lost) 
  • trunk/package/kernel/mac80211/patches/520-mac80211_cur_txpower.patch

    r39428 r39442  
    1111--- a/net/mac80211/cfg.c 
    1212+++ b/net/mac80211/cfg.c 
    13 @@ -2323,7 +2323,9 @@ static int ieee80211_get_tx_power(struct 
     13@@ -2326,7 +2326,9 @@ static int ieee80211_get_tx_power(struct 
    1414        struct ieee80211_local *local = wiphy_priv(wiphy); 
    1515        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); 
  • trunk/package/kernel/mac80211/patches/522-mac80211_configure_antenna_gain.patch

    r39428 r39442  
    5858--- a/net/mac80211/cfg.c 
    5959+++ b/net/mac80211/cfg.c 
    60 @@ -2333,6 +2333,19 @@ static int ieee80211_get_tx_power(struct 
     60@@ -2336,6 +2336,19 @@ static int ieee80211_get_tx_power(struct 
    6161        return 0; 
    6262 } 
     
    7878                                  const u8 *addr) 
    7979 { 
    80 @@ -3916,6 +3929,7 @@ struct cfg80211_ops mac80211_config_ops  
     80@@ -3921,6 +3934,7 @@ struct cfg80211_ops mac80211_config_ops  
    8181        .set_wiphy_params = ieee80211_set_wiphy_params, 
    8282        .set_tx_power = ieee80211_set_tx_power, 
Note: See TracChangeset for help on using the changeset viewer.