diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2015-05-13 09:16:48 +0000 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2015-05-20 15:10:11 +0200 |
commit | f9dca80b98caac8b4bfb43a2edf1e9f877ccf322 (patch) | |
tree | 121584d758c7c1425dce7d87393ed4ca37f7de79 /net/mac80211/iface.c | |
parent | 252ec2b3aa6f6a9ac29c6539027db600c11bf45e (diff) | |
download | linux-stable-f9dca80b98caac8b4bfb43a2edf1e9f877ccf322.tar.gz linux-stable-f9dca80b98caac8b4bfb43a2edf1e9f877ccf322.tar.bz2 linux-stable-f9dca80b98caac8b4bfb43a2edf1e9f877ccf322.zip |
mac80211: fix AP_VLAN crypto tailroom calculation
Some splats I was seeing:
(a) WARNING: CPU: 1 PID: 0 at /devel/src/linux/net/mac80211/wep.c:102 ieee80211_wep_add_iv
(b) WARNING: CPU: 1 PID: 0 at /devel/src/linux/net/mac80211/wpa.c:73 ieee80211_tx_h_michael_mic_add
(c) WARNING: CPU: 3 PID: 0 at /devel/src/linux/net/mac80211/wpa.c:433 ieee80211_crypto_ccmp_encrypt
I've seen (a) and (b) with ath9k hw crypto and (c)
with ath9k sw crypto. All of them were related to
insufficient skb tailroom and I was able to
trigger these with ping6 program.
AP_VLANs may inherit crypto keys from parent AP.
This wasn't considered and yielded problems in
some setups resulting in inability to transmit
data because mac80211 wouldn't resize skbs when
necessary and subsequently drop some packets due
to insufficient tailroom.
For efficiency purposes don't inspect both AP_VLAN
and AP sdata looking for tailroom counter. Instead
update AP_VLAN tailroom counters whenever their
master AP tailroom counter changes.
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r-- | net/mac80211/iface.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index bab5c63c0bad..84cef600c573 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c @@ -522,6 +522,12 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up) memcpy(sdata->vif.hw_queue, master->vif.hw_queue, sizeof(sdata->vif.hw_queue)); sdata->vif.bss_conf.chandef = master->vif.bss_conf.chandef; + + mutex_lock(&local->key_mtx); + sdata->crypto_tx_tailroom_needed_cnt += + master->crypto_tx_tailroom_needed_cnt; + mutex_unlock(&local->key_mtx); + break; } case NL80211_IFTYPE_AP: |