Commit bc192f8918ab8e41ba53b9ef881bc425ae92ed1b
Committed by
John W. Linville
1 parent
5ccc32ff46
Exists in
master
and in
6 other branches
mac80211: do not pass AP VLAN vif pointers to drivers
This fixes frequent WARN_ONs when using AP VLAN + aggregation, as these vifs are virtual and not registered with drivers. Use sta_info_get_bss instead of sta_info_get in aggregation callbacks, so that these callbacks can find the station entry when called with the AP vif. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Showing 4 changed files with 17 additions and 7 deletions Side-by-side Diff
net/mac80211/agg-rx.c
net/mac80211/agg-tx.c
... | ... | @@ -555,7 +555,7 @@ |
555 | 555 | } |
556 | 556 | |
557 | 557 | mutex_lock(&local->sta_mtx); |
558 | - sta = sta_info_get(sdata, ra); | |
558 | + sta = sta_info_get_bss(sdata, ra); | |
559 | 559 | if (!sta) { |
560 | 560 | mutex_unlock(&local->sta_mtx); |
561 | 561 | #ifdef CONFIG_MAC80211_HT_DEBUG |
... | ... | @@ -684,7 +684,7 @@ |
684 | 684 | |
685 | 685 | mutex_lock(&local->sta_mtx); |
686 | 686 | |
687 | - sta = sta_info_get(sdata, ra); | |
687 | + sta = sta_info_get_bss(sdata, ra); | |
688 | 688 | if (!sta) { |
689 | 689 | #ifdef CONFIG_MAC80211_HT_DEBUG |
690 | 690 | printk(KERN_DEBUG "Could not find station: %pM\n", ra); |
net/mac80211/driver-ops.h
... | ... | @@ -10,6 +10,16 @@ |
10 | 10 | WARN_ON(!(sdata->flags & IEEE80211_SDATA_IN_DRIVER)); |
11 | 11 | } |
12 | 12 | |
13 | +static inline struct ieee80211_sub_if_data * | |
14 | +get_bss_sdata(struct ieee80211_sub_if_data *sdata) | |
15 | +{ | |
16 | + if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | |
17 | + sdata = container_of(sdata->bss, struct ieee80211_sub_if_data, | |
18 | + u.ap); | |
19 | + | |
20 | + return sdata; | |
21 | +} | |
22 | + | |
13 | 23 | static inline void drv_tx(struct ieee80211_local *local, struct sk_buff *skb) |
14 | 24 | { |
15 | 25 | local->ops->tx(&local->hw, skb); |
... | ... | @@ -421,6 +431,7 @@ |
421 | 431 | enum sta_notify_cmd cmd, |
422 | 432 | struct ieee80211_sta *sta) |
423 | 433 | { |
434 | + sdata = get_bss_sdata(sdata); | |
424 | 435 | check_sdata_in_driver(sdata); |
425 | 436 | |
426 | 437 | trace_drv_sta_notify(local, sdata, cmd, sta); |
... | ... | @@ -437,6 +448,7 @@ |
437 | 448 | |
438 | 449 | might_sleep(); |
439 | 450 | |
451 | + sdata = get_bss_sdata(sdata); | |
440 | 452 | check_sdata_in_driver(sdata); |
441 | 453 | |
442 | 454 | trace_drv_sta_add(local, sdata, sta); |
... | ... | @@ -454,6 +466,7 @@ |
454 | 466 | { |
455 | 467 | might_sleep(); |
456 | 468 | |
469 | + sdata = get_bss_sdata(sdata); | |
457 | 470 | check_sdata_in_driver(sdata); |
458 | 471 | |
459 | 472 | trace_drv_sta_remove(local, sdata, sta); |
... | ... | @@ -547,6 +560,7 @@ |
547 | 560 | |
548 | 561 | might_sleep(); |
549 | 562 | |
563 | + sdata = get_bss_sdata(sdata); | |
550 | 564 | check_sdata_in_driver(sdata); |
551 | 565 | |
552 | 566 | trace_drv_ampdu_action(local, sdata, action, sta, tid, ssn, buf_size); |
net/mac80211/sta_info.c
... | ... | @@ -351,10 +351,6 @@ |
351 | 351 | |
352 | 352 | if (!sta->dummy || dummy_reinsert) { |
353 | 353 | /* notify driver */ |
354 | - if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) | |
355 | - sdata = container_of(sdata->bss, | |
356 | - struct ieee80211_sub_if_data, | |
357 | - u.ap); | |
358 | 354 | err = drv_sta_add(local, sdata, &sta->sta); |
359 | 355 | if (err) { |
360 | 356 | if (!async) |