aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes@sipsolutions.net>2009-02-10 15:25:47 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-02-13 13:45:36 -0500
commit8abd3f9bc476b5b7f6de1b6fb576b87ba338f7fd (patch)
tree1b830fde0f97686721a3843375453e03e4555c37 /net
parentb8695a8fe6d89140f8d17668e99ebd39358d7c0b (diff)
mac80211: restrict aggregation to supported interface modes
We can only support aggregation on AP/STA right now. HT isn't defined for IBSS, WDS or MESH. In the WDS/MESH cases it's not clear what to put into the IBSS field, and we don't handle that in the code at all. Also fix the code to handle VLAN correctly. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net')
-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 +