diff mbox series

wifi: cfg80211: validate AP phy operation before starting it

Message ID 20230905064857.1503-1-quic_adisi@quicinc.com (mailing list archive)
State Accepted
Delegated to: Johannes Berg
Headers show
Series wifi: cfg80211: validate AP phy operation before starting it | expand

Commit Message

Aditya Kumar Singh Sept. 5, 2023, 6:48 a.m. UTC
Many regulatories can have HE/EHT Operation as not permitted. In such
cases, AP should not be allowed to start if it is using a channel
having the no operation flag set. However, currently there is no such
check in place.

Fix this issue by validating such IEs sent during start AP against the
channel flags.

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
---
 net/wireless/nl80211.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)


base-commit: dae4464939025d38940a6bc6b80734adad0ff944

Comments

Jeff Johnson Sept. 5, 2023, 4:18 p.m. UTC | #1
On 9/4/2023 11:48 PM, Aditya Kumar Singh wrote:
> Many regulatories can have HE/EHT Operation as not permitted. In such
> cases, AP should not be allowed to start if it is using a channel
> having the no operation flag set. However, currently there is no such
> check in place.
> 
> Fix this issue by validating such IEs sent during start AP against the
> channel flags.
> 
> Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>

Reviewed-by: Jeff Johnson <quic_jjohnson@quicinc.com>

> ---
>   net/wireless/nl80211.c | 19 +++++++++++++++++++
>   1 file changed, 19 insertions(+)
> 
> diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
> index de47838aca4f..0c989a839e56 100644
> --- a/net/wireless/nl80211.c
> +++ b/net/wireless/nl80211.c
> @@ -5909,6 +5909,21 @@ static void nl80211_send_ap_started(struct wireless_dev *wdev,
>   	nlmsg_free(msg);
>   }
>   
> +static int nl80211_validate_ap_phy_operation(struct cfg80211_ap_settings *params)
> +{
> +	struct ieee80211_channel *channel = params->chandef.chan;
> +
> +	if ((params->he_cap ||  params->he_oper) &&
> +	    (channel->flags & IEEE80211_CHAN_NO_HE))
> +		return -EOPNOTSUPP;
> +
> +	if ((params->eht_cap || params->eht_oper) &&
> +	    (channel->flags & IEEE80211_CHAN_NO_EHT))
> +		return -EOPNOTSUPP;
> +
> +	return 0;
> +}
> +
>   static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
>   {
>   	struct cfg80211_registered_device *rdev = info->user_ptr[0];
> @@ -6178,6 +6193,10 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
>   	if (err)
>   		goto out_unlock;
>   
> +	err = nl80211_validate_ap_phy_operation(params);
> +	if (err)
> +		goto out_unlock;
> +
>   	if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS])
>   		params->flags = nla_get_u32(
>   			info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]);
> 
> base-commit: dae4464939025d38940a6bc6b80734adad0ff944
diff mbox series

Patch

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index de47838aca4f..0c989a839e56 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5909,6 +5909,21 @@  static void nl80211_send_ap_started(struct wireless_dev *wdev,
 	nlmsg_free(msg);
 }
 
+static int nl80211_validate_ap_phy_operation(struct cfg80211_ap_settings *params)
+{
+	struct ieee80211_channel *channel = params->chandef.chan;
+
+	if ((params->he_cap ||  params->he_oper) &&
+	    (channel->flags & IEEE80211_CHAN_NO_HE))
+		return -EOPNOTSUPP;
+
+	if ((params->eht_cap || params->eht_oper) &&
+	    (channel->flags & IEEE80211_CHAN_NO_EHT))
+		return -EOPNOTSUPP;
+
+	return 0;
+}
+
 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
 {
 	struct cfg80211_registered_device *rdev = info->user_ptr[0];
@@ -6178,6 +6193,10 @@  static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
 	if (err)
 		goto out_unlock;
 
+	err = nl80211_validate_ap_phy_operation(params);
+	if (err)
+		goto out_unlock;
+
 	if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS])
 		params->flags = nla_get_u32(
 			info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]);