diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/agg-rx.c | 3 | ||||
-rw-r--r-- | net/mac80211/agg-tx.c | 16 | ||||
-rw-r--r-- | net/mac80211/ht.c | 3 | ||||
-rw-r--r-- | net/mac80211/rx.c | 11 |
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 + |