2021-05-19 19:30:53

by Philipp Borgers

[permalink] [raw]
Subject: [PATCH v2 0/3] mac80211: do not use low data rates for data frames with no ack flag

Version 2 of this patch set adds a helper function that checks if a frame is a
data frame taking hardware encapsulation into account. Suggested by Johannes
Berg and Felix Fietkau.

The refactoring of the rc_no_data_or_no_ack_use_min function makes use of this
new function too. I added a comment about the refactoring too. Suggested by
Kalle Valo.

Best Regards

Philipp Borgers

Philipp Borgers (3):
mac80211: add ieee80211_is_tx_data helper function
mac80211: do not use low data rates for data frames with no ack flag
mac80211: refactor rc_no_data_or_no_ack_use_min function

include/net/mac80211.h | 18 ++++++++++++++++++
net/mac80211/rate.c | 10 +++++-----
2 files changed, 23 insertions(+), 5 deletions(-)

--
2.31.1



2021-05-19 19:30:56

by Philipp Borgers

[permalink] [raw]
Subject: [PATCH v2 3/3] mac80211: refactor rc_no_data_or_no_ack_use_min function

Use newly introduced helper function ieee80211_is_tx_data to check if
frame is a data frame. Takes into account that hardware encapsulation
can be enabled for a frame and therefore no ieee80211 header is present.

Signed-off-by: Philipp Borgers <[email protected]>
---
net/mac80211/rate.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
index fa1c73d0ceff..208bd0c2b671 100644
--- a/net/mac80211/rate.c
+++ b/net/mac80211/rate.c
@@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ieee80211_sub_if_data *sdata)
static bool rc_no_data_or_no_ack_use_min(struct ieee80211_tx_rate_control *txrc)
{
struct sk_buff *skb = txrc->skb;
- struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
- __le16 fc;
-
- fc = hdr->frame_control;

return (info->flags & (IEEE80211_TX_CTL_NO_ACK |
IEEE80211_TX_CTL_USE_MINRATE)) ||
- !ieee80211_is_data(fc);
+ !ieee80211_is_tx_data(skb);
}

static void rc_send_low_basicrate(struct ieee80211_tx_rate *rate,
--
2.31.1


2021-05-19 19:32:45

by Philipp Borgers

[permalink] [raw]
Subject: [PATCH v2 2/3] mac80211: do not use low data rates for data frames with no ack flag

Data Frames with no ack flag set should be handled by the rate
controler. Make sure we reach the rate controler by returning early
from rate_control_send_low if the frame is a data frame with no ack
flag.

Signed-off-by: Philipp Borgers <[email protected]>
---
net/mac80211/rate.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c
index 63652c39c8e0..fa1c73d0ceff 100644
--- a/net/mac80211/rate.c
+++ b/net/mac80211/rate.c
@@ -396,6 +396,10 @@ static bool rate_control_send_low(struct ieee80211_sta *pubsta,
int mcast_rate;
bool use_basicrate = false;

+ if (ieee80211_is_tx_data(txrc->skb) &&
+ (info->flags & IEEE80211_TX_CTL_NO_ACK))
+ return false;
+
if (!pubsta || rc_no_data_or_no_ack_use_min(txrc)) {
__rate_control_send_low(txrc->hw, sband, pubsta, info,
txrc->rate_idx_mask);
--
2.31.1