Commit bc192f8918ab8e41ba53b9ef881bc425ae92ed1b

Authored by Felix Fietkau
Committed by John W. Linville
1 parent 5ccc32ff46

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
... ... @@ -112,7 +112,7 @@
112 112 int i;
113 113  
114 114 rcu_read_lock();
115   - sta = sta_info_get(sdata, addr);
  115 + sta = sta_info_get_bss(sdata, addr);
116 116 if (!sta) {
117 117 rcu_read_unlock();
118 118 return;
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)