]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: cfg80211: add PD-specific preamble and bandwidth capabilities
authorPeddolla Harshavardhan Reddy <peddolla.reddy@oss.qualcomm.com>
Mon, 20 Apr 2026 09:08:53 +0000 (14:38 +0530)
committerJohannes Berg <johannes.berg@intel.com>
Tue, 5 May 2026 11:45:51 +0000 (13:45 +0200)
Devices may support different preamble and bandwidth configurations
for proximity detection (PD) ranging versus standard ranging. Add
separate pd_preambles and pd_bandwidths fields to
cfg80211_pmsr_capabilities to allow drivers to advertise PD-specific
capabilities.

Expose these over nl80211 using new attributes
NL80211_PMSR_FTM_CAPA_ATTR_PD_PREAMBLES and
NL80211_PMSR_FTM_CAPA_ATTR_PD_BANDWIDTHS, advertised only when
pd_support is set.

For PD requests, validate bandwidth and preamble against pd_bandwidths
and pd_preambles. For non-PD requests, validate against the existing
bandwidths and preambles fields.

Signed-off-by: Peddolla Harshavardhan Reddy <peddolla.reddy@oss.qualcomm.com>
Link: https://patch.msgid.link/20260420090856.2152905-11-peddolla.reddy@oss.qualcomm.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/wireless/nl80211.c
net/wireless/pmsr.c

index 87e8487503396dbde97558d722ab6cb6ccbf6b02..f5a47a0c75329f3f15e2ed34a12b620f6db468b7 100644 (file)
@@ -6053,6 +6053,10 @@ cfg80211_get_iftype_ext_capa(struct wiphy *wiphy, enum nl80211_iftype type);
  * @ftm.concurrent_ista_rsta_support: indicates if the device can
  *     simultaneously act as initiator and responder in a multi-peer
  *     measurement request. Only valid if @ftm.rsta_support is set.
+ * @ftm.pd_preambles: bitmap of preambles supported (&enum nl80211_preamble)
+ *     for PD ranging requests. Ignored if @ftm.type.pd_support is not set.
+ * @ftm.pd_bandwidths: bitmap of bandwidths supported (&enum nl80211_chan_width)
+ *     for PD ranging requests. Ignored if @ftm.type.pd_support is not set.
  */
 struct cfg80211_pmsr_capabilities {
        unsigned int max_peers;
@@ -6099,6 +6103,8 @@ struct cfg80211_pmsr_capabilities {
                           pd_support:1;
                } type;
                u8 concurrent_ista_rsta_support:1;
+               u32 pd_preambles;
+               u32 pd_bandwidths;
        } ftm;
 };
 
index 02fe42b4f29c1ed6ab32511c5931a91a29beff2f..5bef8fd252709a09408321ab644f96042ca797d5 100644 (file)
@@ -8189,6 +8189,14 @@ enum nl80211_peer_measurement_attrs {
  *     to estimate the burst period to be given in the FTM request for the
  *     NTB ranging case. If non-zero, this value will be used to validate
  *     the nominal time in the FTM request.
+ * @NL80211_PMSR_FTM_CAPA_ATTR_PD_PREAMBLES: u32 bitmap of values from
+ *     &enum nl80211_preamble indicating the supported preambles for PD
+ *     ranging requests. Only valid if %NL80211_PMSR_FTM_TYPE_CAPA_ATTR_PD_SUPPORT
+ *     is set.
+ * @NL80211_PMSR_FTM_CAPA_ATTR_PD_BANDWIDTHS: u32 bitmap of values from
+ *     &enum nl80211_chan_width indicating the supported channel bandwidths
+ *     for PD ranging requests. Only valid if
+ *     %NL80211_PMSR_FTM_TYPE_CAPA_ATTR_PD_SUPPORT is set.
  *
  * @NUM_NL80211_PMSR_FTM_CAPA_ATTR: internal
  * @NL80211_PMSR_FTM_CAPA_ATTR_MAX: highest attribute number
@@ -8225,6 +8233,8 @@ enum nl80211_peer_measurement_ftm_capa {
        NL80211_PMSR_FTM_CAPA_ATTR_MAX_NUM_RX_ANTENNAS,
        NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_EDCA,
        NL80211_PMSR_FTM_CAPA_ATTR_MIN_INTERVAL_NTB,
+       NL80211_PMSR_FTM_CAPA_ATTR_PD_PREAMBLES,
+       NL80211_PMSR_FTM_CAPA_ATTR_PD_BANDWIDTHS,
 
        /* keep last */
        NUM_NL80211_PMSR_FTM_CAPA_ATTR,
index ae968d53fcea33f582124ddd102f0dee58f4746f..84f17032fdd928013b6fe5382aaba5c9c5ac32a2 100644 (file)
@@ -2615,6 +2615,18 @@ nl80211_send_pmsr_ftm_capa(const struct cfg80211_pmsr_capabilities *cap,
        if (cap->ftm.concurrent_ista_rsta_support &&
            nla_put_flag(msg, NL80211_PMSR_FTM_CAPA_ATTR_CONCURRENT_ISTA_RSTA_SUPPORT))
                return -ENOBUFS;
+
+       if (cap->ftm.type.pd_support) {
+               if (cap->ftm.pd_preambles &&
+                   nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_PREAMBLES,
+                               cap->ftm.pd_preambles))
+                       return -ENOBUFS;
+               if (cap->ftm.pd_bandwidths &&
+                   nla_put_u32(msg, NL80211_PMSR_FTM_CAPA_ATTR_PD_BANDWIDTHS,
+                               cap->ftm.pd_bandwidths))
+                       return -ENOBUFS;
+       }
+
        nla_nest_end(msg, ftm);
        return 0;
 }
index 2d6ace7f048dd74e13c67ca42bda1866f8e3cdf7..8b7843f75db2f335ef70dc58fb0b42269977df0c 100644 (file)
@@ -17,11 +17,19 @@ static int pmsr_parse_ftm(struct cfg80211_registered_device *rdev,
        u32 preamble = NL80211_PREAMBLE_DMG; /* only optional in DMG */
 
        /* validate existing data */
-       if (!(rdev->wiphy.pmsr_capa->ftm.bandwidths & BIT(out->chandef.width))) {
+       if (out->ftm.request_type == NL80211_PMSR_FTM_REQ_TYPE_INFRA &&
+           !(capa->ftm.bandwidths & BIT(out->chandef.width))) {
                NL_SET_ERR_MSG(info->extack, "FTM: unsupported bandwidth");
                return -EINVAL;
        }
 
+       if (out->ftm.request_type == NL80211_PMSR_FTM_REQ_TYPE_PD &&
+           !(capa->ftm.pd_bandwidths & BIT(out->chandef.width))) {
+               NL_SET_ERR_MSG(info->extack,
+                              "FTM: unsupported bandwidth for PD request");
+               return -EINVAL;
+       }
+
        /* no validation needed - was already done via nested policy */
        nla_parse_nested_deprecated(tb, NL80211_PMSR_FTM_REQ_ATTR_MAX, ftmreq,
                                    NULL, NULL);
@@ -44,13 +52,22 @@ static int pmsr_parse_ftm(struct cfg80211_registered_device *rdev,
                }
        }
 
-       if (!(capa->ftm.preambles & BIT(preamble))) {
+       if (out->ftm.request_type == NL80211_PMSR_FTM_REQ_TYPE_INFRA &&
+           !(capa->ftm.preambles & BIT(preamble))) {
                NL_SET_ERR_MSG_ATTR(info->extack,
                                    tb[NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE],
                                    "FTM: invalid preamble");
                return -EINVAL;
        }
 
+       if (out->ftm.request_type == NL80211_PMSR_FTM_REQ_TYPE_PD &&
+           !(capa->ftm.pd_preambles & BIT(preamble))) {
+               NL_SET_ERR_MSG_ATTR(info->extack,
+                                   tb[NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE],
+                                   "FTM: invalid preamble for PD request");
+               return -EINVAL;
+       }
+
        out->ftm.preamble = preamble;
 
        out->ftm.burst_period = 0;