Skip to content
This repository was archived by the owner on Feb 9, 2023. It is now read-only.

Commit ed04c46

Browse files
committed
Merge tag 'mac80211-for-davem-2018-02-22' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211
Johannes Berg says: ==================== Various fixes across the tree, the shortlog basically says it all: cfg80211: fix cfg80211_beacon_dup -> old bug in this code cfg80211: clear wep keys after disconnection -> certain ways of disconnecting left the keys mac80211: round IEEE80211_TX_STATUS_HEADROOM up to multiple of 4 -> alignment issues with using 14 bytes mac80211: Do not disconnect on invalid operating class -> if the AP has a bogus operating class, let it be mac80211: Fix sending ADDBA response for an ongoing session -> don't send the same frame twice cfg80211: use only 1Mbps for basic rates in mesh -> interop issue with old versions of our code mac80211_hwsim: don't use WQ_MEM_RECLAIM -> it causes splats because it flushes work on a non-reclaim WQ regulatory: add NUL to request alpha2 -> nla_put_string() issue from Kees mac80211: mesh: fix wrong mesh TTL offset calculation -> protocol issue mac80211: fix a possible leak of station stats -> error path might leak memory mac80211: fix calling sleeping function in atomic context -> percpu allocations need to be made with gfp flags ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents a2c0f03 + 657308f commit ed04c46

11 files changed

Lines changed: 41 additions & 27 deletions

File tree

drivers/net/wireless/mac80211_hwsim.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3516,7 +3516,7 @@ static int __init init_mac80211_hwsim(void)
35163516

35173517
spin_lock_init(&hwsim_radio_lock);
35183518

3519-
hwsim_wq = alloc_workqueue("hwsim_wq",WQ_MEM_RECLAIM,0);
3519+
hwsim_wq = alloc_workqueue("hwsim_wq", 0, 0);
35203520
if (!hwsim_wq)
35213521
return -ENOMEM;
35223522
rhashtable_init(&hwsim_radios_rht, &hwsim_rht_params);

include/net/mac80211.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4149,7 +4149,7 @@ void ieee80211_sta_uapsd_trigger(struct ieee80211_sta *sta, u8 tid);
41494149
* The TX headroom reserved by mac80211 for its own tx_status functions.
41504150
* This is enough for the radiotap header.
41514151
*/
4152-
#define IEEE80211_TX_STATUS_HEADROOM 14
4152+
#define IEEE80211_TX_STATUS_HEADROOM ALIGN(14, 4)
41534153

41544154
/**
41554155
* ieee80211_sta_set_buffered - inform mac80211 about driver-buffered frames

include/net/regulatory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ struct regulatory_request {
7878
int wiphy_idx;
7979
enum nl80211_reg_initiator initiator;
8080
enum nl80211_user_reg_hint_type user_reg_hint_type;
81-
char alpha2[2];
81+
char alpha2[3];
8282
enum nl80211_dfs_regions dfs_region;
8383
bool intersect;
8484
bool processed;

net/mac80211/agg-rx.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* Copyright 2007, Michael Wu <[email protected]>
99
* Copyright 2007-2010, Intel Corporation
1010
* Copyright(c) 2015-2017 Intel Deutschland GmbH
11+
* Copyright (C) 2018 Intel Corporation
1112
*
1213
* This program is free software; you can redistribute it and/or modify
1314
* it under the terms of the GNU General Public License version 2 as
@@ -304,9 +305,6 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
304305
* driver so reject the timeout update.
305306
*/
306307
status = WLAN_STATUS_REQUEST_DECLINED;
307-
ieee80211_send_addba_resp(sta->sdata, sta->sta.addr,
308-
tid, dialog_token, status,
309-
1, buf_size, timeout);
310308
goto end;
311309
}
312310

net/mac80211/cfg.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2892,7 +2892,7 @@ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
28922892
}
28932893
if (beacon->probe_resp_len) {
28942894
new_beacon->probe_resp_len = beacon->probe_resp_len;
2895-
beacon->probe_resp = pos;
2895+
new_beacon->probe_resp = pos;
28962896
memcpy(pos, beacon->probe_resp, beacon->probe_resp_len);
28972897
pos += beacon->probe_resp_len;
28982898
}

net/mac80211/ieee80211_i.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1467,7 +1467,7 @@ struct ieee802_11_elems {
14671467
const struct ieee80211_timeout_interval_ie *timeout_int;
14681468
const u8 *opmode_notif;
14691469
const struct ieee80211_sec_chan_offs_ie *sec_chan_offs;
1470-
const struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie;
1470+
struct ieee80211_mesh_chansw_params_ie *mesh_chansw_params_ie;
14711471
const struct ieee80211_bss_max_idle_period_ie *max_idle_period_ie;
14721472

14731473
/* length of them, respectively */

net/mac80211/mesh.c

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,27 +1255,22 @@ int ieee80211_mesh_csa_beacon(struct ieee80211_sub_if_data *sdata,
12551255
}
12561256

12571257
static int mesh_fwd_csa_frame(struct ieee80211_sub_if_data *sdata,
1258-
struct ieee80211_mgmt *mgmt, size_t len)
1258+
struct ieee80211_mgmt *mgmt, size_t len,
1259+
struct ieee802_11_elems *elems)
12591260
{
12601261
struct ieee80211_mgmt *mgmt_fwd;
12611262
struct sk_buff *skb;
12621263
struct ieee80211_local *local = sdata->local;
1263-
u8 *pos = mgmt->u.action.u.chan_switch.variable;
1264-
size_t offset_ttl;
12651264

12661265
skb = dev_alloc_skb(local->tx_headroom + len);
12671266
if (!skb)
12681267
return -ENOMEM;
12691268
skb_reserve(skb, local->tx_headroom);
12701269
mgmt_fwd = skb_put(skb, len);
12711270

1272-
/* offset_ttl is based on whether the secondary channel
1273-
* offset is available or not. Subtract 1 from the mesh TTL
1274-
* and disable the initiator flag before forwarding.
1275-
*/
1276-
offset_ttl = (len < 42) ? 7 : 10;
1277-
*(pos + offset_ttl) -= 1;
1278-
*(pos + offset_ttl + 1) &= ~WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
1271+
elems->mesh_chansw_params_ie->mesh_ttl--;
1272+
elems->mesh_chansw_params_ie->mesh_flags &=
1273+
~WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
12791274

12801275
memcpy(mgmt_fwd, mgmt, len);
12811276
eth_broadcast_addr(mgmt_fwd->da);
@@ -1323,7 +1318,7 @@ static void mesh_rx_csa_frame(struct ieee80211_sub_if_data *sdata,
13231318

13241319
/* forward or re-broadcast the CSA frame */
13251320
if (fwd_csa) {
1326-
if (mesh_fwd_csa_frame(sdata, mgmt, len) < 0)
1321+
if (mesh_fwd_csa_frame(sdata, mgmt, len, &elems) < 0)
13271322
mcsa_dbg(sdata, "Failed to forward the CSA frame");
13281323
}
13291324
}

net/mac80211/spectmgmt.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* Copyright 2007, Michael Wu <[email protected]>
99
* Copyright 2007-2008, Intel Corporation
1010
* Copyright 2008, Johannes Berg <[email protected]>
11+
* Copyright (C) 2018 Intel Corporation
1112
*
1213
* This program is free software; you can redistribute it and/or modify
1314
* it under the terms of the GNU General Public License version 2 as
@@ -27,7 +28,7 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
2728
u32 sta_flags, u8 *bssid,
2829
struct ieee80211_csa_ie *csa_ie)
2930
{
30-
enum nl80211_band new_band;
31+
enum nl80211_band new_band = current_band;
3132
int new_freq;
3233
u8 new_chan_no;
3334
struct ieee80211_channel *new_chan;
@@ -55,15 +56,13 @@ int ieee80211_parse_ch_switch_ie(struct ieee80211_sub_if_data *sdata,
5556
elems->ext_chansw_ie->new_operating_class,
5657
&new_band)) {
5758
sdata_info(sdata,
58-
"cannot understand ECSA IE operating class %d, disconnecting\n",
59+
"cannot understand ECSA IE operating class, %d, ignoring\n",
5960
elems->ext_chansw_ie->new_operating_class);
60-
return -EINVAL;
6161
}
6262
new_chan_no = elems->ext_chansw_ie->new_ch_num;
6363
csa_ie->count = elems->ext_chansw_ie->count;
6464
csa_ie->mode = elems->ext_chansw_ie->mode;
6565
} else if (elems->ch_switch_ie) {
66-
new_band = current_band;
6766
new_chan_no = elems->ch_switch_ie->new_ch_num;
6867
csa_ie->count = elems->ch_switch_ie->count;
6968
csa_ie->mode = elems->ch_switch_ie->mode;

net/mac80211/sta_info.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
314314

315315
if (ieee80211_hw_check(hw, USES_RSS)) {
316316
sta->pcpu_rx_stats =
317-
alloc_percpu(struct ieee80211_sta_rx_stats);
317+
alloc_percpu_gfp(struct ieee80211_sta_rx_stats, gfp);
318318
if (!sta->pcpu_rx_stats)
319319
goto free;
320320
}
@@ -433,6 +433,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
433433
if (sta->sta.txq[0])
434434
kfree(to_txq_info(sta->sta.txq[0]));
435435
free:
436+
free_percpu(sta->pcpu_rx_stats);
436437
#ifdef CONFIG_MAC80211_MESH
437438
kfree(sta->mesh);
438439
#endif

net/wireless/mesh.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,28 @@ int __cfg80211_join_mesh(struct cfg80211_registered_device *rdev,
170170
enum nl80211_bss_scan_width scan_width;
171171
struct ieee80211_supported_band *sband =
172172
rdev->wiphy.bands[setup->chandef.chan->band];
173-
scan_width = cfg80211_chandef_to_scan_width(&setup->chandef);
174-
setup->basic_rates = ieee80211_mandatory_rates(sband,
175-
scan_width);
173+
174+
if (setup->chandef.chan->band == NL80211_BAND_2GHZ) {
175+
int i;
176+
177+
/*
178+
* Older versions selected the mandatory rates for
179+
* 2.4 GHz as well, but were broken in that only
180+
* 1 Mbps was regarded as a mandatory rate. Keep
181+
* using just 1 Mbps as the default basic rate for
182+
* mesh to be interoperable with older versions.
183+
*/
184+
for (i = 0; i < sband->n_bitrates; i++) {
185+
if (sband->bitrates[i].bitrate == 10) {
186+
setup->basic_rates = BIT(i);
187+
break;
188+
}
189+
}
190+
} else {
191+
scan_width = cfg80211_chandef_to_scan_width(&setup->chandef);
192+
setup->basic_rates = ieee80211_mandatory_rates(sband,
193+
scan_width);
194+
}
176195
}
177196

178197
err = cfg80211_chandef_dfs_required(&rdev->wiphy,

0 commit comments

Comments
 (0)