diff mbox series

[2/2] wiphy: add better handling for rate estimation errors

Message ID 20240328134725.1484257-2-prestwoj@gmail.com (mailing list archive)
State New
Headers show
Series [1/2] band: make HE/no-HT rate estimators return more descriptive | expand

Checks

Context Check Description
tedd_an/pre-ci_am success Success
prestwoj/iwd-ci-gitlint success GitLint

Commit Message

James Prestwood March 28, 2024, 1:47 p.m. UTC
In most cases any failure here is likely just due to the AP not
supporting the feature, whether its HE/VHT/HE. This should result
in the estimation returning -ENOTSUP in which case we move down
the list. Any other non-zero return we will now warn to make it
clear the IEs did exist, but were not properly formatted.

In addition HE specifically has an extra validation function which,
if failed, was bailing out of the estimation function entirely.
Instead this is now treated as if there was no HE capabilities and
the logic can move down to VHT, HT, or basic rates.
---
 src/wiphy.c | 34 +++++++++++++++++++++++++---------
 1 file changed, 25 insertions(+), 9 deletions(-)

Comments

Denis Kenzior March 28, 2024, 2:15 p.m. UTC | #1
Hi James,

On 3/28/24 08:47, James Prestwood wrote:
> In most cases any failure here is likely just due to the AP not
> supporting the feature, whether its HE/VHT/HE. This should result
> in the estimation returning -ENOTSUP in which case we move down
> the list. Any other non-zero return we will now warn to make it
> clear the IEs did exist, but were not properly formatted.
> 
> In addition HE specifically has an extra validation function which,
> if failed, was bailing out of the estimation function entirely.
> Instead this is now treated as if there was no HE capabilities and
> the logic can move down to VHT, HT, or basic rates.
> ---
>   src/wiphy.c | 34 +++++++++++++++++++++++++---------
>   1 file changed, 25 insertions(+), 9 deletions(-)
> 

<snip>

> @@ -1037,8 +1038,10 @@ int wiphy_estimate_data_rate(struct wiphy *wiphy,
>   			vht_operation = iter.data - 2;
>   			break;
>   		case IE_TYPE_HE_CAPABILITIES:
> -			if (!ie_validate_he_capabilities(iter.data, iter.len))
> -				return -EBADMSG;
> +			if (!ie_validate_he_capabilities(iter.data, iter.len)) {
> +				l_warn("invalid HE capabilities");
> +				continue;
> +			}

I guess you would want to treat all IEs this way?  Suppose VHT Capabilities is 
somehow the wrong size?

>   
>   			he_capabilities = iter.data;
>   			break;

Regards,
-Denis
James Prestwood March 28, 2024, 2:19 p.m. UTC | #2
On 3/28/24 7:15 AM, Denis Kenzior wrote:
> Hi James,
>
> On 3/28/24 08:47, James Prestwood wrote:
>> In most cases any failure here is likely just due to the AP not
>> supporting the feature, whether its HE/VHT/HE. This should result
>> in the estimation returning -ENOTSUP in which case we move down
>> the list. Any other non-zero return we will now warn to make it
>> clear the IEs did exist, but were not properly formatted.
>>
>> In addition HE specifically has an extra validation function which,
>> if failed, was bailing out of the estimation function entirely.
>> Instead this is now treated as if there was no HE capabilities and
>> the logic can move down to VHT, HT, or basic rates.
>> ---
>>   src/wiphy.c | 34 +++++++++++++++++++++++++---------
>>   1 file changed, 25 insertions(+), 9 deletions(-)
>>
>
> <snip>
>
>> @@ -1037,8 +1038,10 @@ int wiphy_estimate_data_rate(struct wiphy *wiphy,
>>               vht_operation = iter.data - 2;
>>               break;
>>           case IE_TYPE_HE_CAPABILITIES:
>> -            if (!ie_validate_he_capabilities(iter.data, iter.len))
>> -                return -EBADMSG;
>> +            if (!ie_validate_he_capabilities(iter.data, iter.len)) {
>> +                l_warn("invalid HE capabilities");
>> +                continue;
>> +            }
>
> I guess you would want to treat all IEs this way?  Suppose VHT 
> Capabilities is somehow the wrong size?
Sure, that sounds good to me.
>
>>                 he_capabilities = iter.data;
>>               break;
>
> Regards,
> -Denis
>
diff mbox series

Patch

diff --git a/src/wiphy.c b/src/wiphy.c
index 0d64b1b3..705fb9cc 100644
--- a/src/wiphy.c
+++ b/src/wiphy.c
@@ -989,6 +989,7 @@  int wiphy_estimate_data_rate(struct wiphy *wiphy,
 	const void *he_capabilities = NULL;
 	const struct band *bandp;
 	enum band_freq band;
+	int ret;
 
 	if (band_freq_to_channel(bss->frequency, &band) == 0)
 		return -ENOTSUP;
@@ -1037,8 +1038,10 @@  int wiphy_estimate_data_rate(struct wiphy *wiphy,
 			vht_operation = iter.data - 2;
 			break;
 		case IE_TYPE_HE_CAPABILITIES:
-			if (!ie_validate_he_capabilities(iter.data, iter.len))
-				return -EBADMSG;
+			if (!ie_validate_he_capabilities(iter.data, iter.len)) {
+				l_warn("invalid HE capabilities");
+				continue;
+			}
 
 			he_capabilities = iter.data;
 			break;
@@ -1047,26 +1050,39 @@  int wiphy_estimate_data_rate(struct wiphy *wiphy,
 		}
 	}
 
-	if (!band_estimate_he_rx_rate(bandp, he_capabilities,
+	ret = band_estimate_he_rx_rate(bandp, he_capabilities,
 					bss->signal_strength / 100,
-					out_data_rate))
+					out_data_rate);
+	if (!ret)
 		return 0;
+	else if (ret != -ENOTSUP)
+		l_warn("error parsing HE capabilities");
 
-	if (!band_estimate_vht_rx_rate(bandp, vht_capabilities, vht_operation,
+	ret = band_estimate_vht_rx_rate(bandp, vht_capabilities, vht_operation,
 					ht_capabilities, ht_operation,
 					bss->signal_strength / 100,
-					out_data_rate))
+					out_data_rate);
+	if (!ret)
 		return 0;
+	else if (ret != -ENOTSUP)
+		l_warn("error parsing VHT capabilities");
 
-	if (!band_estimate_ht_rx_rate(bandp, ht_capabilities, ht_operation,
+	ret = band_estimate_ht_rx_rate(bandp, ht_capabilities, ht_operation,
 					bss->signal_strength / 100,
-					out_data_rate))
+					out_data_rate);
+	if (!ret)
 		return 0;
+	else if (ret != -ENOTSUP)
+		l_warn("error parsing HT capabilities");
 
-	return band_estimate_nonht_rate(bandp, supported_rates,
+	ret = band_estimate_nonht_rate(bandp, supported_rates,
 						ext_supported_rates,
 						bss->signal_strength / 100,
 						out_data_rate);
+	if (ret != 0 && ret != -ENOTSUP)
+		l_warn("error parsing non-HT rates");
+
+	return ret;
 }
 
 bool wiphy_regdom_is_updating(struct wiphy *wiphy)