]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blobdiff - net/wireless/nl80211.c
cfg80211: allow requesting SMPS mode on ap start
[mirror_ubuntu-jammy-kernel.git] / net / wireless / nl80211.c
index e8114c7a37e35ba4314ca0ed8f78552e1b02589f..4cce3e17964d9f9a091933deabe551ca5e2f8e59 100644 (file)
@@ -394,6 +394,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
        [NL80211_ATTR_TSID] = { .type = NLA_U8 },
        [NL80211_ATTR_USER_PRIO] = { .type = NLA_U8 },
        [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 },
+       [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 },
 };
 
 /* policy for the key attributes */
@@ -3345,6 +3346,29 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
                        return PTR_ERR(params.acl);
        }
 
+       if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
+               params.smps_mode =
+                       nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
+               switch (params.smps_mode) {
+               case NL80211_SMPS_OFF:
+                       break;
+               case NL80211_SMPS_STATIC:
+                       if (!(rdev->wiphy.features &
+                             NL80211_FEATURE_STATIC_SMPS))
+                               return -EINVAL;
+                       break;
+               case NL80211_SMPS_DYNAMIC:
+                       if (!(rdev->wiphy.features &
+                             NL80211_FEATURE_DYNAMIC_SMPS))
+                               return -EINVAL;
+                       break;
+               default:
+                       return -EINVAL;
+               }
+       } else {
+               params.smps_mode = NL80211_SMPS_OFF;
+       }
+
        wdev_lock(wdev);
        err = rdev_start_ap(rdev, dev, &params);
        if (!err) {