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:
		| @@ -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> | ||||
| --- | ||||
|  | ||||
| --- 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 | ||||
| +++ b/net/mac80211/rate.c | ||||
| @@ -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, | ||||
| @@ -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) | ||||
|  { | ||||
|  	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_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); | ||||
|  	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) { | ||||
|  		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) { | ||||
| --- a/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, | ||||
|  			     struct ieee80211_sub_if_data *sdata, | ||||
|  			     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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau