aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/mac80211/agg-rx.c3
-rw-r--r--net/mac80211/agg-tx.c16
-rw-r--r--net/mac80211/ht.c3
-rw-r--r--net/mac80211/rx.c11
4 files changed, 30 insertions, 3 deletions
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
index 62b9feb3c804..d7afd0956970 100644
--- a/net/mac80211/agg-rx.c
+++ b/net/mac80211/agg-rx.c
@@ -134,7 +134,8 @@ static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *d
134 memset(mgmt, 0, 24); 134 memset(mgmt, 0, 24);
135 memcpy(mgmt->da, da, ETH_ALEN); 135 memcpy(mgmt->da, da, ETH_ALEN);
136 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); 136 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
137 if (sdata->vif.type == NL80211_IFTYPE_AP) 137 if (sdata->vif.type == NL80211_IFTYPE_AP ||
138 sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
138 memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN); 139 memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN);
139 else 140 else
140 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN); 141 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c
index 6ab731fecc20..c91b32a3f0e7 100644
--- a/net/mac80211/agg-tx.c
+++ b/net/mac80211/agg-tx.c
@@ -41,7 +41,8 @@ static void ieee80211_send_addba_request(struct ieee80211_sub_if_data *sdata,
41 memset(mgmt, 0, 24); 41 memset(mgmt, 0, 24);
42 memcpy(mgmt->da, da, ETH_ALEN); 42 memcpy(mgmt->da, da, ETH_ALEN);
43 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); 43 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
44 if (sdata->vif.type == NL80211_IFTYPE_AP) 44 if (sdata->vif.type == NL80211_IFTYPE_AP ||
45 sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
45 memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN); 46 memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN);
46 else 47 else
47 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN); 48 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
@@ -180,6 +181,19 @@ int ieee80211_start_tx_ba_session(struct ieee80211_hw *hw, u8 *ra, u16 tid)
180 goto exit; 181 goto exit;
181 } 182 }
182 183
184 /*
185 * The aggregation code is not prepared to handle
186 * anything but STA/AP due to the BSSID handling.
187 * IBSS could work in the code but isn't supported
188 * by drivers or the standard.
189 */
190 if (sta->sdata->vif.type != NL80211_IFTYPE_STATION &&
191 sta->sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
192 sta->sdata->vif.type != NL80211_IFTYPE_AP) {
193 ret = -EINVAL;
194 goto exit;
195 }
196
183 spin_lock_bh(&sta->lock); 197 spin_lock_bh(&sta->lock);
184 198
185 /* we have tried too many times, receiver does not want A-MPDU */ 199 /* we have tried too many times, receiver does not want A-MPDU */
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
index 869ea5fd3f51..a49a8a5828bf 100644
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -190,7 +190,8 @@ void ieee80211_send_delba(struct ieee80211_sub_if_data *sdata,
190 memset(mgmt, 0, 24); 190 memset(mgmt, 0, 24);
191 memcpy(mgmt->da, da, ETH_ALEN); 191 memcpy(mgmt->da, da, ETH_ALEN);
192 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN); 192 memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
193 if (sdata->vif.type == NL80211_IFTYPE_AP) 193 if (sdata->vif.type == NL80211_IFTYPE_AP ||
194 sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
194 memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN); 195 memcpy(mgmt->bssid, sdata->dev->dev_addr, ETH_ALEN);
195 else 196 else
196 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN); 197 memcpy(mgmt->bssid, ifsta->bssid, ETH_ALEN);
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index f34cc66d3f4b..1327d424bf31 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1768,6 +1768,17 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
1768 1768
1769 switch (mgmt->u.action.category) { 1769 switch (mgmt->u.action.category) {
1770 case WLAN_CATEGORY_BACK: 1770 case WLAN_CATEGORY_BACK:
1771 /*
1772 * The aggregation code is not prepared to handle
1773 * anything but STA/AP due to the BSSID handling;
1774 * IBSS could work in the code but isn't supported
1775 * by drivers or the standard.
1776 */
1777 if (sdata->vif.type != NL80211_IFTYPE_STATION &&
1778 sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
1779 sdata->vif.type != NL80211_IFTYPE_AP)
1780 return RX_DROP_MONITOR;
1781
1771 switch (mgmt->u.action.u.addba_req.action_code) { 1782 switch (mgmt->u.action.u.addba_req.action_code) {
1772 case WLAN_ACTION_ADDBA_REQ: 1783 case WLAN_ACTION_ADDBA_REQ:
1773 if (len < (IEEE80211_MIN_ACTION_SIZE + 1784 if (len < (IEEE80211_MIN_ACTION_SIZE +