From 6fbc3d0df8f7d36a735c62ce54cbb39140e58f17 Mon Sep 17 00:00:00 2001 From: Allen Ye Date: Mon, 22 Jan 2024 15:47:23 +0800 Subject: [PATCH] mac80211: mtk: Add cert mode for disable ba timeout and fix SMPS cap check Signed-off-by: Allen Ye --- include/net/mac80211.h | 7 ++++++ net/mac80211/agg-tx.c | 5 ++++- net/mac80211/debugfs.c | 49 ++++++++++++++++++++++++++++++++++++++++++ net/mac80211/rx.c | 3 ++- 4 files changed, 62 insertions(+), 2 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 41d57e7..415dcfe 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -2654,8 +2654,15 @@ struct ieee80211_hw { u8 tx_sk_pacing_shift; u8 weight_multiplier; u32 max_mtu; + bool cert_mode; }; +static inline bool ieee80211_is_cert_mode(struct ieee80211_hw *hw) +{ + return hw->cert_mode; +} + + static inline bool _ieee80211_hw_check(struct ieee80211_hw *hw, enum ieee80211_hw_flags flg) { diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index ad0c0d6..6ea3676 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c @@ -1052,7 +1052,10 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local, tid_tx->timeout = le16_to_cpu(mgmt->u.action.u.addba_resp.timeout); - if (tid_tx->timeout) { + /* In the case of certification env, testbed STA cannot accept frequent DelBA. + * Therefore, we remove the session timer check here to avoid crashing testbed STA. + */ + if (tid_tx->timeout && !ieee80211_is_cert_mode(&local->hw)) { mod_timer(&tid_tx->session_timer, TU_TO_EXP_TIME(tid_tx->timeout)); tid_tx->last_tx = jiffies; diff --git a/net/mac80211/debugfs.c b/net/mac80211/debugfs.c index 46f6c82..7a4ce05 100644 --- a/net/mac80211/debugfs.c +++ b/net/mac80211/debugfs.c @@ -440,6 +440,54 @@ static const struct file_operations reset_ops = { }; #endif +static ssize_t cert_mode_read(struct file *file, + char __user *user_buf, + size_t count, + loff_t *ppos) +{ + struct ieee80211_local *local = file->private_data; + char buf[32]; + int len = 0; + + len = scnprintf(buf, sizeof(buf), "cert_mode: %d\n", + local->hw.cert_mode); + + return simple_read_from_buffer(user_buf, count, ppos, + buf, len); +} + +static ssize_t cert_mode_write(struct file *file, + const char __user *user_buf, + size_t count, + loff_t *ppos) +{ + struct ieee80211_local *local = file->private_data; + char buf[16]; + + if (count >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(buf, user_buf, count)) + return -EFAULT; + + if (count && buf[count - 1] == '\n') + buf[count - 1] = '\0'; + else + buf[count] = '\0'; + + if (kstrtobool(buf, &local->hw.cert_mode)) + return -EINVAL; + + return count; +} + +static const struct file_operations cert_mode_ops = { + .write = cert_mode_write, + .read = cert_mode_read, + .open = simple_open, + .llseek = noop_llseek, +}; + static const char *hw_flag_names[] = { #define FLAG(F) [IEEE80211_HW_##F] = #F FLAG(HAS_RATE_CONTROL), @@ -670,6 +718,7 @@ void debugfs_hw_add(struct ieee80211_local *local) debugfs_create_u32("aql_threshold", 0600, phyd, &local->aql_threshold); + DEBUGFS_ADD_MODE(cert_mode, 0644); statsd = debugfs_create_dir("statistics", phyd); /* if the dir failed, don't put all the other things into the root! */ diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index a9fcc7a..de2dc66 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -3366,7 +3366,8 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) switch (mgmt->u.action.category) { case WLAN_CATEGORY_HT: /* reject HT action frames from stations not supporting HT */ - if (!rx->sta->sta.ht_cap.ht_supported) + if (!rx->sta->sta.ht_cap.ht_supported && + !rx->sta->sta.he_cap.has_he) goto invalid; if (sdata->vif.type != NL80211_IFTYPE_STATION && -- 2.18.0