mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-29 15:43:59 +08:00
As it's been a while, we have various fixes for
* hwsim * AP mode (client powersave related) * CSA/FTM interaction * a busy loop in IE handling * and similar -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEH1e1rEeCd0AIMq6MB8qZga/fl8QFAlwH4HQACgkQB8qZga/f l8R8dw//chRfkQkj7B0hXfTia7kqstgOkJSTvJybqjKRCdk7vBzgsWYMOZ7EnpqK CI9g66U44nvSPVQ/3u2n9EOXn02eN3Z1gfFaZ9EyZRo1isrxHCwI1Crgb2/LtySd MtVd429ZRK2LqiVDCJg0sQB77wTRcmvUjbxY6DcYSanTDuJSwF+0opVbKJ4J8A8Y 34TOFWLck+QiDEO7JojMooKadg3zywBRwG7h2v8ewvIDaJvNL1S8ybCcvYcueh6f vE3dlrNCHchiVwUwpCIpdcqDfOphip69hNCvRHnLi5nE/ep7KtHBoSI7PsrAZwKT J+xlH4LV4tTPd9ZI+n5GnMfJ8X8U5eo5KMbnTjx4W5nTPHyA2qWH94HcPku5G8lI Qemc8SRYG6cFo63brnkAANIhy82gI3bn4egHzGEeLBT/mHCUwYL6UsuyXVYRFKNx 9qL9UIZ54MgVchDqTDcv2XjIg664hWvuB2M+0HWBOSok+t6a3NLqOt7Ox5mt4uel yHbVEb4UrCIeV2Vk5ZGX1SoeACTqSRFyjqPEOuR4hATPeClnfEbIuyPOOEoQt0e1 9/IDI5rEIJguU1ZgJ8Sdod6lEiHatOxaXc0U70afl8iqF+OEO8BAZacVZWR87479 Ao0W6cFymw1H8H+wcNCv7znCy4vEwU+q8UDoZQvttHy3Hg7w8DI= =MDbC -----END PGP SIGNATURE----- Merge tag 'mac80211-for-davem-2018-12-05' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211 Johannes Berg: ==================== As it's been a while, we have various fixes for * hwsim * AP mode (client powersave related) * CSA/FTM interaction * a busy loop in IE handling * and similar ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
64d47902fe
@ -2884,6 +2884,10 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
|
||||
wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
tasklet_hrtimer_init(&data->beacon_timer,
|
||||
mac80211_hwsim_beacon,
|
||||
CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
|
||||
err = ieee80211_register_hw(hw);
|
||||
if (err < 0) {
|
||||
pr_debug("mac80211_hwsim: ieee80211_register_hw failed (%d)\n",
|
||||
@ -2908,10 +2912,6 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
|
||||
data->debugfs,
|
||||
data, &hwsim_simulate_radar);
|
||||
|
||||
tasklet_hrtimer_init(&data->beacon_timer,
|
||||
mac80211_hwsim_beacon,
|
||||
CLOCK_MONOTONIC, HRTIMER_MODE_ABS);
|
||||
|
||||
spin_lock_bh(&hwsim_radio_lock);
|
||||
err = rhashtable_insert_fast(&hwsim_radios_rht, &data->rht,
|
||||
hwsim_rht_params);
|
||||
@ -3703,16 +3703,16 @@ static int __init init_mac80211_hwsim(void)
|
||||
if (err)
|
||||
goto out_unregister_pernet;
|
||||
|
||||
err = hwsim_init_netlink();
|
||||
if (err)
|
||||
goto out_unregister_driver;
|
||||
|
||||
hwsim_class = class_create(THIS_MODULE, "mac80211_hwsim");
|
||||
if (IS_ERR(hwsim_class)) {
|
||||
err = PTR_ERR(hwsim_class);
|
||||
goto out_unregister_driver;
|
||||
goto out_exit_netlink;
|
||||
}
|
||||
|
||||
err = hwsim_init_netlink();
|
||||
if (err < 0)
|
||||
goto out_unregister_driver;
|
||||
|
||||
for (i = 0; i < radios; i++) {
|
||||
struct hwsim_new_radio_params param = { 0 };
|
||||
|
||||
@ -3818,6 +3818,8 @@ out_free_mon:
|
||||
free_netdev(hwsim_mon);
|
||||
out_free_radios:
|
||||
mac80211_hwsim_free();
|
||||
out_exit_netlink:
|
||||
hwsim_exit_netlink();
|
||||
out_unregister_driver:
|
||||
platform_driver_unregister(&mac80211_hwsim_driver);
|
||||
out_unregister_pernet:
|
||||
|
@ -2891,7 +2891,7 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
|
||||
|
||||
len = beacon->head_len + beacon->tail_len + beacon->beacon_ies_len +
|
||||
beacon->proberesp_ies_len + beacon->assocresp_ies_len +
|
||||
beacon->probe_resp_len;
|
||||
beacon->probe_resp_len + beacon->lci_len + beacon->civicloc_len;
|
||||
|
||||
new_beacon = kzalloc(sizeof(*new_beacon) + len, GFP_KERNEL);
|
||||
if (!new_beacon)
|
||||
@ -2934,8 +2934,9 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
|
||||
memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
|
||||
pos += beacon->probe_resp_len;
|
||||
}
|
||||
if (beacon->ftm_responder)
|
||||
new_beacon->ftm_responder = beacon->ftm_responder;
|
||||
|
||||
/* might copy -1, meaning no changes requested */
|
||||
new_beacon->ftm_responder = beacon->ftm_responder;
|
||||
if (beacon->lci) {
|
||||
new_beacon->lci_len = beacon->lci_len;
|
||||
new_beacon->lci = pos;
|
||||
|
@ -1015,6 +1015,8 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||
if (local->open_count == 0)
|
||||
ieee80211_clear_tx_pending(local);
|
||||
|
||||
sdata->vif.bss_conf.beacon_int = 0;
|
||||
|
||||
/*
|
||||
* If the interface goes down while suspended, presumably because
|
||||
* the device was unplugged and that happens before our resume,
|
||||
|
@ -2766,6 +2766,7 @@ static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata,
|
||||
{
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
struct sta_info *sta;
|
||||
bool result = true;
|
||||
|
||||
sdata_info(sdata, "authenticated\n");
|
||||
ifmgd->auth_data->done = true;
|
||||
@ -2778,15 +2779,18 @@ static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata,
|
||||
sta = sta_info_get(sdata, bssid);
|
||||
if (!sta) {
|
||||
WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid);
|
||||
return false;
|
||||
result = false;
|
||||
goto out;
|
||||
}
|
||||
if (sta_info_move_state(sta, IEEE80211_STA_AUTH)) {
|
||||
sdata_info(sdata, "failed moving %pM to auth\n", bssid);
|
||||
return false;
|
||||
result = false;
|
||||
goto out;
|
||||
}
|
||||
mutex_unlock(&sdata->local->sta_mtx);
|
||||
|
||||
return true;
|
||||
out:
|
||||
mutex_unlock(&sdata->local->sta_mtx);
|
||||
return result;
|
||||
}
|
||||
|
||||
static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
|
||||
|
@ -1403,6 +1403,7 @@ ieee80211_rx_h_check_dup(struct ieee80211_rx_data *rx)
|
||||
return RX_CONTINUE;
|
||||
|
||||
if (ieee80211_is_ctl(hdr->frame_control) ||
|
||||
ieee80211_is_nullfunc(hdr->frame_control) ||
|
||||
ieee80211_is_qos_nullfunc(hdr->frame_control) ||
|
||||
is_multicast_ether_addr(hdr->addr1))
|
||||
return RX_CONTINUE;
|
||||
@ -3063,7 +3064,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
cfg80211_sta_opmode_change_notify(sdata->dev,
|
||||
rx->sta->addr,
|
||||
&sta_opmode,
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
goto handled;
|
||||
}
|
||||
case WLAN_HT_ACTION_NOTIFY_CHANWIDTH: {
|
||||
@ -3100,7 +3101,7 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
||||
cfg80211_sta_opmode_change_notify(sdata->dev,
|
||||
rx->sta->addr,
|
||||
&sta_opmode,
|
||||
GFP_KERNEL);
|
||||
GFP_ATOMIC);
|
||||
goto handled;
|
||||
}
|
||||
default:
|
||||
|
@ -964,6 +964,8 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
|
||||
/* Track when last TDLS packet was ACKed */
|
||||
if (test_sta_flag(sta, WLAN_STA_TDLS_PEER_AUTH))
|
||||
sta->status_stats.last_tdls_pkt_time = jiffies;
|
||||
} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
|
||||
return;
|
||||
} else {
|
||||
ieee80211_lost_packet(sta, info);
|
||||
}
|
||||
|
@ -439,8 +439,8 @@ ieee80211_tx_h_multicast_ps_buf(struct ieee80211_tx_data *tx)
|
||||
if (ieee80211_hw_check(&tx->local->hw, QUEUE_CONTROL))
|
||||
info->hw_queue = tx->sdata->vif.cab_queue;
|
||||
|
||||
/* no stations in PS mode */
|
||||
if (!atomic_read(&ps->num_sta_ps))
|
||||
/* no stations in PS mode and no buffered packets */
|
||||
if (!atomic_read(&ps->num_sta_ps) && skb_queue_empty(&ps->bc_buf))
|
||||
return TX_CONTINUE;
|
||||
|
||||
info->flags |= IEEE80211_TX_CTL_SEND_AFTER_DTIM;
|
||||
|
@ -272,11 +272,11 @@ void cfg80211_oper_and_ht_capa(struct ieee80211_ht_cap *ht_capa,
|
||||
|
||||
p1 = (u8*)(ht_capa);
|
||||
p2 = (u8*)(ht_capa_mask);
|
||||
for (i = 0; i<sizeof(*ht_capa); i++)
|
||||
for (i = 0; i < sizeof(*ht_capa); i++)
|
||||
p1[i] &= p2[i];
|
||||
}
|
||||
|
||||
/* Do a logical ht_capa &= ht_capa_mask. */
|
||||
/* Do a logical vht_capa &= vht_capa_mask. */
|
||||
void cfg80211_oper_and_vht_capa(struct ieee80211_vht_cap *vht_capa,
|
||||
const struct ieee80211_vht_cap *vht_capa_mask)
|
||||
{
|
||||
|
@ -7870,6 +7870,7 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
|
||||
}
|
||||
|
||||
memset(¶ms, 0, sizeof(params));
|
||||
params.beacon_csa.ftm_responder = -1;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
|
||||
!info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
|
||||
|
@ -642,11 +642,15 @@ static bool cfg80211_is_all_idle(void)
|
||||
* All devices must be idle as otherwise if you are actively
|
||||
* scanning some new beacon hints could be learned and would
|
||||
* count as new regulatory hints.
|
||||
* Also if there is any other active beaconing interface we
|
||||
* need not issue a disconnect hint and reset any info such
|
||||
* as chan dfs state, etc.
|
||||
*/
|
||||
list_for_each_entry(rdev, &cfg80211_rdev_list, list) {
|
||||
list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
|
||||
wdev_lock(wdev);
|
||||
if (wdev->conn || wdev->current_bss)
|
||||
if (wdev->conn || wdev->current_bss ||
|
||||
cfg80211_beaconing_iface_active(wdev))
|
||||
is_all_idle = false;
|
||||
wdev_unlock(wdev);
|
||||
}
|
||||
@ -1171,6 +1175,8 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,
|
||||
|
||||
cfg80211_oper_and_ht_capa(&connect->ht_capa_mask,
|
||||
rdev->wiphy.ht_capa_mod_mask);
|
||||
cfg80211_oper_and_vht_capa(&connect->vht_capa_mask,
|
||||
rdev->wiphy.vht_capa_mod_mask);
|
||||
|
||||
if (connkeys && connkeys->def >= 0) {
|
||||
int idx;
|
||||
|
@ -1421,6 +1421,8 @@ size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
|
||||
ies[pos + ext],
|
||||
ext == 2))
|
||||
pos = skip_ie(ies, ielen, pos);
|
||||
else
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
pos = skip_ie(ies, ielen, pos);
|
||||
|
Loading…
Reference in New Issue
Block a user