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> | 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; | ||||||
|  |   | ||||||
		Reference in New Issue
	
	Block a user
	 Felix Fietkau
					Felix Fietkau