mac80211: add missing change for encap offload on devices with sw rate control
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
f04c0ead33
commit
0f6887972a
@ -7,24 +7,6 @@ The software rate control cannot deal with encap offload, so fix it.
|
|||||||
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||||
---
|
---
|
||||||
|
|
||||||
--- a/net/mac80211/ieee80211_i.h
|
|
||||||
+++ b/net/mac80211/ieee80211_i.h
|
|
||||||
@@ -2024,6 +2024,15 @@ static inline void ieee80211_tx_skb(stru
|
|
||||||
ieee80211_tx_skb_tid(sdata, skb, 7);
|
|
||||||
}
|
|
||||||
|
|
||||||
+static inline bool ieee80211_is_tx_data(struct sk_buff *skb)
|
|
||||||
+{
|
|
||||||
+ struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
|
||||||
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
|
||||||
+
|
|
||||||
+ return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
|
|
||||||
+ ieee80211_is_data(hdr->frame_control);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
|
|
||||||
struct ieee802_11_elems *elems,
|
|
||||||
u64 filter, u32 crc, u8 *transmitter_bssid,
|
|
||||||
--- a/net/mac80211/rate.c
|
--- a/net/mac80211/rate.c
|
||||||
+++ b/net/mac80211/rate.c
|
+++ b/net/mac80211/rate.c
|
||||||
@@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ie
|
@@ -297,15 +297,11 @@ void ieee80211_check_rate_mask(struct ie
|
||||||
@ -44,7 +26,18 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void rc_send_low_basicrate(struct ieee80211_tx_rate *rate,
|
static void rc_send_low_basicrate(struct ieee80211_tx_rate *rate,
|
||||||
@@ -870,7 +866,6 @@ void ieee80211_get_tx_rates(struct ieee8
|
@@ -396,6 +392,10 @@ static bool rate_control_send_low(struct
|
||||||
|
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);
|
||||||
|
@@ -870,7 +870,6 @@ void ieee80211_get_tx_rates(struct ieee8
|
||||||
int max_rates)
|
int max_rates)
|
||||||
{
|
{
|
||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
@ -52,7 +45,7 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
|||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
|
||||||
@@ -882,7 +877,7 @@ void ieee80211_get_tx_rates(struct ieee8
|
@@ -882,7 +881,7 @@ void ieee80211_get_tx_rates(struct ieee8
|
||||||
sdata = vif_to_sdata(vif);
|
sdata = vif_to_sdata(vif);
|
||||||
sband = sdata->local->hw.wiphy->bands[info->band];
|
sband = sdata->local->hw.wiphy->bands[info->band];
|
||||||
|
|
||||||
@ -117,3 +110,28 @@ Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
|||||||
|
|
||||||
if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
|
if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
|
||||||
struct sta_info *sta = container_of(txq->sta, struct sta_info,
|
struct sta_info *sta = container_of(txq->sta, struct sta_info,
|
||||||
|
--- a/include/net/mac80211.h
|
||||||
|
+++ b/include/net/mac80211.h
|
||||||
|
@@ -6728,4 +6728,22 @@ struct sk_buff *ieee80211_get_fils_disco
|
||||||
|
struct sk_buff *
|
||||||
|
ieee80211_get_unsol_bcast_probe_resp_tmpl(struct ieee80211_hw *hw,
|
||||||
|
struct ieee80211_vif *vif);
|
||||||
|
+
|
||||||
|
+/**
|
||||||
|
+ * ieee80211_is_tx_data - check if frame is a data frame
|
||||||
|
+ *
|
||||||
|
+ * The function is used to check if a frame is a data frame. Frames with
|
||||||
|
+ * hardware encapsulation enabled are data frames.
|
||||||
|
+ *
|
||||||
|
+ * @skb: the frame to be transmitted.
|
||||||
|
+ */
|
||||||
|
+static inline bool ieee80211_is_tx_data(struct sk_buff *skb)
|
||||||
|
+{
|
||||||
|
+ struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
|
+ struct ieee80211_hdr *hdr = (void *) skb->data;
|
||||||
|
+
|
||||||
|
+ return info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP ||
|
||||||
|
+ ieee80211_is_data(hdr->frame_control);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
#endif /* MAC80211_H */
|
||||||
|
@ -48,7 +48,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|||||||
if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
|
if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
|
||||||
--- a/net/mac80211/ieee80211_i.h
|
--- a/net/mac80211/ieee80211_i.h
|
||||||
+++ b/net/mac80211/ieee80211_i.h
|
+++ b/net/mac80211/ieee80211_i.h
|
||||||
@@ -2224,6 +2224,8 @@ void ieee80211_dynamic_ps_timer(struct t
|
@@ -2215,6 +2215,8 @@ void ieee80211_dynamic_ps_timer(struct t
|
||||||
void ieee80211_send_nullfunc(struct ieee80211_local *local,
|
void ieee80211_send_nullfunc(struct ieee80211_local *local,
|
||||||
struct ieee80211_sub_if_data *sdata,
|
struct ieee80211_sub_if_data *sdata,
|
||||||
bool powersave);
|
bool powersave);
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
From: Ryder Lee <ryder.lee@mediatek.com>
|
||||||
|
Date: Fri, 18 Jun 2021 04:38:59 +0800
|
||||||
|
Subject: [PATCH] mac80211: check per vif offload_flags in Tx path
|
||||||
|
|
||||||
|
offload_flags has been introduced to indicate encap status of each interface.
|
||||||
|
An interface can encap offload at runtime, or if it has some extra limitations
|
||||||
|
it can simply override the flags, so it's more flexible to check offload_flags
|
||||||
|
in Tx path.
|
||||||
|
|
||||||
|
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
|
||||||
|
Link: https://lore.kernel.org/r/177785418cf407808bf3a44760302d0647076990.1623961575.git.ryder.lee@mediatek.com
|
||||||
|
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
|
||||||
|
---
|
||||||
|
|
||||||
|
--- a/net/mac80211/tx.c
|
||||||
|
+++ b/net/mac80211/tx.c
|
||||||
|
@@ -3309,6 +3309,9 @@ static bool ieee80211_amsdu_aggregate(st
|
||||||
|
if (!ieee80211_hw_check(&local->hw, TX_AMSDU))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
+ if (sdata->vif.offload_flags & IEEE80211_OFFLOAD_ENCAP_ENABLED)
|
||||||
|
+ return false;
|
||||||
|
+
|
||||||
|
if (skb_is_gso(skb))
|
||||||
|
return false;
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user