mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-23 20:31:59 +00:00
77 lines
2.8 KiB
Diff
77 lines
2.8 KiB
Diff
From bc043dd0138c79c8add16e08eb3c6c032106aab6 Mon Sep 17 00:00:00 2001
|
|
From: Mordechay Goodstein <mordechay.goodstein@intel.com>
|
|
Date: Mon, 14 Feb 2022 17:30:05 +0100
|
|
Subject: [PATCH 18/19] mac80211: parse AddBA request with extended AddBA
|
|
element
|
|
|
|
In EHT requesting aggregation with 1K needs the use of extended
|
|
the AddBA element for the buffer size, so add the logic to parse
|
|
it and make sure it's in limits of the EHT aggregation size.
|
|
|
|
Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com>
|
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
|
---
|
|
net/mac80211/agg-rx.c | 18 +++++++++++++++---
|
|
1 file changed, 15 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c
|
|
index 0d2bab9d351c..218cdc554d71 100644
|
|
--- a/net/mac80211/agg-rx.c
|
|
+++ b/net/mac80211/agg-rx.c
|
|
@@ -180,7 +180,8 @@ static void sta_rx_agg_reorder_timer_expired(struct timer_list *t)
|
|
|
|
static void ieee80211_add_addbaext(struct ieee80211_sub_if_data *sdata,
|
|
struct sk_buff *skb,
|
|
- const struct ieee80211_addba_ext_ie *req)
|
|
+ const struct ieee80211_addba_ext_ie *req,
|
|
+ u16 buf_size)
|
|
{
|
|
struct ieee80211_supported_band *sband;
|
|
struct ieee80211_addba_ext_ie *resp;
|
|
@@ -210,6 +211,8 @@ static void ieee80211_add_addbaext(struct ieee80211_sub_if_data *sdata,
|
|
frag_level = cap_frag_level;
|
|
resp->data |= u8_encode_bits(frag_level,
|
|
IEEE80211_ADDBA_EXT_FRAG_LEVEL_MASK);
|
|
+ resp->data |= u8_encode_bits(buf_size >> IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT,
|
|
+ IEEE80211_ADDBA_EXT_BUF_SIZE_MASK);
|
|
}
|
|
|
|
static void ieee80211_send_addba_resp(struct sta_info *sta, u8 *da, u16 tid,
|
|
@@ -261,7 +264,7 @@ static void ieee80211_send_addba_resp(struct sta_info *sta, u8 *da, u16 tid,
|
|
mgmt->u.action.u.addba_resp.status = cpu_to_le16(status);
|
|
|
|
if (sta->sta.he_cap.has_he && addbaext)
|
|
- ieee80211_add_addbaext(sdata, skb, addbaext);
|
|
+ ieee80211_add_addbaext(sdata, skb, addbaext, buf_size);
|
|
|
|
ieee80211_tx_skb(sdata, skb);
|
|
}
|
|
@@ -309,7 +312,9 @@ void ___ieee80211_start_rx_ba_session(struct sta_info *sta,
|
|
goto end;
|
|
}
|
|
|
|
- if (sta->sta.he_cap.has_he)
|
|
+ if (sta->sta.eht_cap.has_eht)
|
|
+ max_buf_size = IEEE80211_MAX_AMPDU_BUF_EHT;
|
|
+ else if (sta->sta.he_cap.has_he)
|
|
max_buf_size = IEEE80211_MAX_AMPDU_BUF_HE;
|
|
else
|
|
max_buf_size = IEEE80211_MAX_AMPDU_BUF_HT;
|
|
@@ -502,6 +507,13 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
|
|
goto free;
|
|
}
|
|
|
|
+ if (sta->sta.eht_cap.has_eht && elems && elems->addba_ext_ie) {
|
|
+ u8 buf_size_1k = u8_get_bits(elems->addba_ext_ie->data,
|
|
+ IEEE80211_ADDBA_EXT_BUF_SIZE_MASK);
|
|
+
|
|
+ buf_size |= buf_size_1k << IEEE80211_ADDBA_EXT_BUF_SIZE_SHIFT;
|
|
+ }
|
|
+
|
|
__ieee80211_start_rx_ba_session(sta, dialog_token, timeout,
|
|
start_seq_num, ba_policy, tid,
|
|
buf_size, true, false,
|
|
--
|
|
2.31.1
|
|
|