diff mbox series

[v2,11/13] wifi: mac80211: fix advertised TTLM scheduling

Message ID 20231220133549.15079c34e5c8.I0dd50bcceff5953080cdd7aee5118b72c78c6507@changeid
State Superseded
Headers show
Series [v2,01/13] wifi: cfg80211: reg: Support P2P operation on DFS channels | expand

Commit Message

Miri Korenblit Dec. 20, 2023, 11:41 a.m. UTC
From: Ayala Beker <ayala.beker@intel.com>

Handle a case of time overflow, where the switch time might
be smaller than the partial TSF in the beacon.
Additionally, apply advertised TTLM earlier in order to be
ready on time on the newly activated links.

Fixes: 702e80470a33 ("wifi: mac80211: support handling of advertised TID-to-link mapping")
Signed-off-by: Ayala Beker <ayala.beker@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
---
v2: Fix wrong email addresses
---
 net/mac80211/mlme.c | 49 ++++++++++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 9 deletions(-)

Comments

Ben Greear Feb. 29, 2024, 9:41 p.m. UTC | #1
On 12/20/23 03:41, Miri Korenblit wrote:
> From: Ayala Beker <ayala.beker@intel.com>
> 
> Handle a case of time overflow, where the switch time might
> be smaller than the partial TSF in the beacon.
> Additionally, apply advertised TTLM earlier in order to be
> ready on time on the newly activated links.
> 
> Fixes: 702e80470a33 ("wifi: mac80211: support handling of advertised TID-to-link mapping")
> Signed-off-by: Ayala Beker <ayala.beker@intel.com>
> Reviewed-by: Johannes Berg <johannes.berg@intel.com>
> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>

While rebasing my 6.7 tree on 6.8, I notice this patch applied, which I think means
it was not applied to 6.8 upstream.  Was that on purpose?

Thanks,
Ben

> ---
> v2: Fix wrong email addresses
> ---
>   net/mac80211/mlme.c | 49 ++++++++++++++++++++++++++++++++++++---------
>   1 file changed, 40 insertions(+), 9 deletions(-)
> 
> diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
> index fe0be3e5731b..b526ce589d4d 100644
> --- a/net/mac80211/mlme.c
> +++ b/net/mac80211/mlme.c
> @@ -43,6 +43,9 @@
>   #define IEEE80211_ASSOC_TIMEOUT_SHORT	(HZ / 10)
>   #define IEEE80211_ASSOC_MAX_TRIES	3
>   
> +#define IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS msecs_to_jiffies(100)
> +#define IEEE80211_ADV_TTLM_ST_UNDERFLOW 0xff00
> +
>   static int max_nullfunc_tries = 2;
>   module_param(max_nullfunc_tries, int, 0644);
>   MODULE_PARM_DESC(max_nullfunc_tries,
> @@ -5965,6 +5968,13 @@ ieee80211_parse_adv_t2l(struct ieee80211_sub_if_data *sdata,
>   	pos++;
>   
>   	ttlm_info->switch_time = get_unaligned_le16(pos);
> +
> +	/* Since ttlm_info->switch_time == 0 means no switch time, bump it
> +	 * by 1.
> +	 */
> +	if (!ttlm_info->switch_time)
> +		ttlm_info->switch_time = 1;
> +
>   	pos += 2;
>   
>   	if (control & IEEE80211_TTLM_CONTROL_EXPECTED_DUR_PRESENT) {
> @@ -6059,25 +6069,46 @@ static void ieee80211_process_adv_ttlm(struct ieee80211_sub_if_data *sdata,
>   		}
>   
>   		if (ttlm_info.switch_time) {
> -			u32 st_us, delay = 0;
> -			u32 ts_l26 = beacon_ts & GENMASK(25, 0);
> +			u16 beacon_ts_tu, st_tu, delay;
> +			u32 delay_jiffies;
> +			u64 mask;
>   
>   			/* The t2l map switch time is indicated with a partial
> -			 * TSF value, convert it to TSF and calc the delay
> -			 * to the start time.
> +			 * TSF value (bits 10 to 25), get the partial beacon TS
> +			 * as well, and calc the delay to the start time.
> +			 */
> +			mask = GENMASK_ULL(25, 10);
> +			beacon_ts_tu = (beacon_ts & mask) >> 10;
> +			st_tu = ttlm_info.switch_time;
> +			delay = st_tu - beacon_ts_tu;
> +
> +			/*
> +			 * If the switch time is far in the future, then it
> +			 * could also be the previous switch still being
> +			 * announced.
> +			 * We can simply ignore it for now, if it is a future
> +			 * switch the AP will continue to announce it anyway.
> +			 */
> +			if (delay > IEEE80211_ADV_TTLM_ST_UNDERFLOW)
> +				return;
> +
> +			delay_jiffies = TU_TO_JIFFIES(delay);
> +
> +			/* Link switching can take time, so schedule it
> +			 * 100ms before to be ready on time
>   			 */
> -			st_us = ieee80211_tu_to_usec(ttlm_info.switch_time);
> -			if (st_us > ts_l26)
> -				delay = st_us - ts_l26;
> +			if (delay_jiffies > IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS)
> +				delay_jiffies -=
> +					IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS;
>   			else
> -				continue;
> +				delay_jiffies = 0;
>   
>   			sdata->u.mgd.ttlm_info = ttlm_info;
>   			wiphy_delayed_work_cancel(sdata->local->hw.wiphy,
>   						  &sdata->u.mgd.ttlm_work);
>   			wiphy_delayed_work_queue(sdata->local->hw.wiphy,
>   						 &sdata->u.mgd.ttlm_work,
> -						 usecs_to_jiffies(delay));
> +						 delay_jiffies);
>   			return;
>   		}
>   	}
Johannes Berg Feb. 29, 2024, 10:47 p.m. UTC | #2
On Thu, 2024-02-29 at 13:41 -0800, Ben Greear wrote:
> On 12/20/23 03:41, Miri Korenblit wrote:
> > From: Ayala Beker <ayala.beker@intel.com>
> > 
> > Handle a case of time overflow, where the switch time might
> > be smaller than the partial TSF in the beacon.
> > Additionally, apply advertised TTLM earlier in order to be
> > ready on time on the newly activated links.
> > 
> > Fixes: 702e80470a33 ("wifi: mac80211: support handling of advertised TID-to-link mapping")
> > Signed-off-by: Ayala Beker <ayala.beker@intel.com>
> > Reviewed-by: Johannes Berg <johannes.berg@intel.com>
> > Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
> 
> While rebasing my 6.7 tree on 6.8, I notice this patch applied, which I think means
> it was not applied to 6.8 upstream.  Was that on purpose?
> 

It's there as far as I can tell?


commit b1a23f8ae0d76ad32fe36682730c050251275b0b
Author: Ayala Beker <ayala.beker@intel.com>
Date:   Wed Dec 20 13:41:44 2023 +0200

    wifi: mac80211: fix advertised TTLM scheduling


Maybe git rebase reduced yours to some whitespace changes or something
:)

johannes
Ben Greear Feb. 29, 2024, 10:53 p.m. UTC | #3
On 2/29/24 14:47, Johannes Berg wrote:
> On Thu, 2024-02-29 at 13:41 -0800, Ben Greear wrote:
>> On 12/20/23 03:41, Miri Korenblit wrote:
>>> From: Ayala Beker <ayala.beker@intel.com>
>>>
>>> Handle a case of time overflow, where the switch time might
>>> be smaller than the partial TSF in the beacon.
>>> Additionally, apply advertised TTLM earlier in order to be
>>> ready on time on the newly activated links.
>>>
>>> Fixes: 702e80470a33 ("wifi: mac80211: support handling of advertised TID-to-link mapping")
>>> Signed-off-by: Ayala Beker <ayala.beker@intel.com>
>>> Reviewed-by: Johannes Berg <johannes.berg@intel.com>
>>> Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
>>
>> While rebasing my 6.7 tree on 6.8, I notice this patch applied, which I think means
>> it was not applied to 6.8 upstream.  Was that on purpose?
>>
> 
> It's there as far as I can tell?

Yes, sorry about that.  I even did a grep but my eyes saw only what they
expected to see.  I just ended up with it double-applied, and will fix
that in my tree.

Thanks,
Ben

> 
> 
> commit b1a23f8ae0d76ad32fe36682730c050251275b0b
> Author: Ayala Beker <ayala.beker@intel.com>
> Date:   Wed Dec 20 13:41:44 2023 +0200
> 
>      wifi: mac80211: fix advertised TTLM scheduling
> 
> 
> Maybe git rebase reduced yours to some whitespace changes or something
> :)
> 
> johannes
>
diff mbox series

Patch

diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index fe0be3e5731b..b526ce589d4d 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -43,6 +43,9 @@ 
 #define IEEE80211_ASSOC_TIMEOUT_SHORT	(HZ / 10)
 #define IEEE80211_ASSOC_MAX_TRIES	3
 
+#define IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS msecs_to_jiffies(100)
+#define IEEE80211_ADV_TTLM_ST_UNDERFLOW 0xff00
+
 static int max_nullfunc_tries = 2;
 module_param(max_nullfunc_tries, int, 0644);
 MODULE_PARM_DESC(max_nullfunc_tries,
@@ -5965,6 +5968,13 @@  ieee80211_parse_adv_t2l(struct ieee80211_sub_if_data *sdata,
 	pos++;
 
 	ttlm_info->switch_time = get_unaligned_le16(pos);
+
+	/* Since ttlm_info->switch_time == 0 means no switch time, bump it
+	 * by 1.
+	 */
+	if (!ttlm_info->switch_time)
+		ttlm_info->switch_time = 1;
+
 	pos += 2;
 
 	if (control & IEEE80211_TTLM_CONTROL_EXPECTED_DUR_PRESENT) {
@@ -6059,25 +6069,46 @@  static void ieee80211_process_adv_ttlm(struct ieee80211_sub_if_data *sdata,
 		}
 
 		if (ttlm_info.switch_time) {
-			u32 st_us, delay = 0;
-			u32 ts_l26 = beacon_ts & GENMASK(25, 0);
+			u16 beacon_ts_tu, st_tu, delay;
+			u32 delay_jiffies;
+			u64 mask;
 
 			/* The t2l map switch time is indicated with a partial
-			 * TSF value, convert it to TSF and calc the delay
-			 * to the start time.
+			 * TSF value (bits 10 to 25), get the partial beacon TS
+			 * as well, and calc the delay to the start time.
+			 */
+			mask = GENMASK_ULL(25, 10);
+			beacon_ts_tu = (beacon_ts & mask) >> 10;
+			st_tu = ttlm_info.switch_time;
+			delay = st_tu - beacon_ts_tu;
+
+			/*
+			 * If the switch time is far in the future, then it
+			 * could also be the previous switch still being
+			 * announced.
+			 * We can simply ignore it for now, if it is a future
+			 * switch the AP will continue to announce it anyway.
+			 */
+			if (delay > IEEE80211_ADV_TTLM_ST_UNDERFLOW)
+				return;
+
+			delay_jiffies = TU_TO_JIFFIES(delay);
+
+			/* Link switching can take time, so schedule it
+			 * 100ms before to be ready on time
 			 */
-			st_us = ieee80211_tu_to_usec(ttlm_info.switch_time);
-			if (st_us > ts_l26)
-				delay = st_us - ts_l26;
+			if (delay_jiffies > IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS)
+				delay_jiffies -=
+					IEEE80211_ADV_TTLM_SAFETY_BUFFER_MS;
 			else
-				continue;
+				delay_jiffies = 0;
 
 			sdata->u.mgd.ttlm_info = ttlm_info;
 			wiphy_delayed_work_cancel(sdata->local->hw.wiphy,
 						  &sdata->u.mgd.ttlm_work);
 			wiphy_delayed_work_queue(sdata->local->hw.wiphy,
 						 &sdata->u.mgd.ttlm_work,
-						 usecs_to_jiffies(delay));
+						 delay_jiffies);
 			return;
 		}
 	}