]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
PR: Update PR device configs and capabilities from driver
authorPeddolla Harshavardhan Reddy <peddolla@qti.qualcomm.com>
Sat, 26 Apr 2025 18:44:48 +0000 (00:14 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 17 Oct 2025 10:21:03 +0000 (13:21 +0300)
Fetch device configurations, capabilities, and supported channels for
ranging and store them in Proximity Ranging global context. This
includes propagation of Enhanced Distributed channel Access
(EDCA-802.11mc) based ranging capabilities as well as Non-Trigger Based
(NTB-802.11az) ranging capabilities.

This commit does not include the actual driver interface specific
changes to fill in the values.

Signed-off-by: Peddolla Harshavardhan Reddy <peddolla@qti.qualcomm.com>
src/common/proximity_ranging.h
src/drivers/driver.h
wpa_supplicant/config.c
wpa_supplicant/config.h
wpa_supplicant/config_file.c
wpa_supplicant/pr_supplicant.c
wpa_supplicant/pr_supplicant.h
wpa_supplicant/wpa_supplicant.c

index 70436d52fce097a731214b36bcd86ae941f6b09b..6be3c4401e81f142314587d5768dabcba16dae63 100644 (file)
@@ -31,6 +31,12 @@ struct pr_device {
 
 
 struct pr_config {
+       u8 pasn_type;
+
+       int preferred_ranging_role;
+
+       char country[3];
+
        u8 dev_addr[ETH_ALEN];
 
        /**
@@ -38,6 +44,42 @@ struct pr_config {
         */
        char *dev_name;
 
+       bool edca_ista_support;
+
+       bool edca_rsta_support;
+
+       u8 edca_format_and_bw;
+
+       u8 max_tx_antenna;
+
+       u8 max_rx_antenna;
+
+       bool ntb_ista_support;
+
+       bool ntb_rsta_support;
+
+       bool secure_he_ltf;
+
+       u8 max_tx_ltf_repetations;
+
+       u8 max_rx_ltf_repetations;
+
+       u8 max_tx_ltf_total;
+
+       u8 max_rx_ltf_total;
+
+       u8 max_rx_sts_le_80;
+
+       u8 max_rx_sts_gt_80;
+
+       u8 max_tx_sts_le_80;
+
+       u8 max_tx_sts_gt_80;
+
+       u8 ntb_format_and_bw;
+
+       bool support_6ghz;
+
        /**
         * cb_ctx - Context to use with callback functions
         */
index 95bb2557e7886b3f1223fa0153aed3c7a8d0d6e7..9edd569d71ba6ab64323368a56d5629838f3b8c5 100644 (file)
@@ -2424,6 +2424,12 @@ struct wpa_driver_capa {
 #define WPA_DRIVER_FLAGS2_P2P_FEATURE_PCC_MODE 0x0000000004000000ULL
 /** Driver supports arbitrary channel width changes in AP mode */
 #define WPA_DRIVER_FLAGS2_AP_CHANWIDTH_CHANGE  0x0000000008000000ULL
+/** Driver supports FTM initiator functionality */
+#define WPA_DRIVER_FLAGS2_FTM_INITIATOR                0x0000000010000000ULL
+/** Driver supports non-trigger based ranging responder functionality */
+#define WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_RESPONDER   0x0000000020000000ULL
+/** Driver supports non-trigger based ranging initiator functionality */
+#define WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_INITIATOR  0x0000000040000000ULL
 
        u64 flags2;
 
@@ -2549,6 +2555,22 @@ struct wpa_driver_capa {
        /* Maximum number of bytes of extra IE(s) that can be added to Probe
         * Request frames */
        size_t max_probe_req_ie_len;
+
+       /* EDCA based ranging capabilities */
+       u8 edca_format_and_bw;
+       u8 max_tx_antenna;
+       u8 max_rx_antenna;
+
+       /* NTB based ranging capabilities */
+       u8 ntb_format_and_bw;
+       u8 max_tx_ltf_repetations;
+       u8 max_rx_ltf_repetations;
+       u8 max_tx_ltf_total;
+       u8 max_rx_ltf_total;
+       u8 max_rx_sts_le_80;
+       u8 max_rx_sts_gt_80;
+       u8 max_tx_sts_le_80;
+       u8 max_tx_sts_gt_80;
 };
 
 
index 4aa54c24f1b2584b98a8ae9bbaace53ec2500a03..37381f5974054b4bc99c58469f084432940cac9e 100644 (file)
@@ -5795,6 +5795,8 @@ static const struct global_parse_data global_fields[] = {
        { BIN(wfa_gen_capa_supp), 0 },
        { BIN(wfa_gen_capa_cert), 0 },
        { BOOL(disable_op_classes_80_80_mhz), 0 },
+       { INT(pr_pasn_type), 0 },
+       { INT_RANGE(pr_preferred_role, 0, 1), 0},
        /* NOTE: When adding new parameters here, add_interface() in
         * wpa_supplicant/dbus_new_introspect.c may need to be modified to
         * increase the size of the iface->xml buffer. */
index 3feef1fcb23774d3c7fc4da3ac58fe3e9c063c48..38d0f9fc41fa1016c9f891e0ed97ab981d28c5d7 100644 (file)
@@ -1909,6 +1909,15 @@ struct wpa_config {
         * supports this.
        */
        bool disable_op_classes_80_80_mhz;
+
+       /* Indicates the types of PASN supported for Proximity Ranging */
+       int pr_pasn_type;
+
+       /* Indicates the preferred Proximity Ranging Role
+        * 0: Prefer ranging initiator role (default)
+        * 1: Prefer ranging responder role
+        */
+       int pr_preferred_role;
 };
 
 
index fdc39a9d4d9a24cf4b2f06f25a231ade518b5648..d2ccfa1a127f9ff1034f6fcc944018d17244bb0b 100644 (file)
@@ -1766,6 +1766,10 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        if (config->disable_op_classes_80_80_mhz)
                fprintf(f, "disable_op_classes_80_80_mhz=%d\n",
                        config->disable_op_classes_80_80_mhz);
+       if (config->pr_pasn_type)
+               fprintf(f, "pr_pasn_type=%d\n", config->pr_pasn_type);
+       if (config->pr_preferred_role)
+               fprintf(f, "pr_preferred_role=%d\n", config->pr_preferred_role);
 }
 
 static void wpa_config_write_identity(FILE *f, struct wpa_dev_ik *dev_ik)
index d5672dc57e6e7c6b2b2b01aedd0cf96dfbbfcec8..f0b00cd04233c90f70e085a0dc54af4549c15a69 100644 (file)
@@ -15,7 +15,8 @@
 #include "pr_supplicant.h"
 
 
-int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
+int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s,
+                const struct wpa_driver_capa *capa)
 {
        struct pr_config pr;
 
@@ -27,6 +28,41 @@ int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
        os_memcpy(pr.dev_addr, wpa_s->own_addr, ETH_ALEN);
        pr.cb_ctx = wpa_s;
        pr.dev_name = wpa_s->conf->device_name;
+       pr.pasn_type = wpa_s->conf->pr_pasn_type;
+       pr.preferred_ranging_role = wpa_s->conf->pr_preferred_role;
+
+       pr.edca_ista_support = wpa_s->drv_flags2 &
+               WPA_DRIVER_FLAGS2_FTM_INITIATOR;
+       pr.edca_rsta_support = wpa_s->drv_flags &
+               WPA_DRIVER_FLAGS_FTM_RESPONDER;
+       pr.edca_format_and_bw = capa->edca_format_and_bw;
+       pr.max_rx_antenna = capa->max_rx_antenna;
+       pr.max_tx_antenna = capa->max_tx_antenna;
+
+       pr.ntb_ista_support = wpa_s->drv_flags2 &
+               WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_INITIATOR;
+       pr.ntb_rsta_support = wpa_s->drv_flags2 &
+               WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_RESPONDER;
+       pr.ntb_format_and_bw = capa->ntb_format_and_bw;
+       pr.max_tx_ltf_repetations = capa->max_tx_ltf_repetations;
+       pr.max_rx_ltf_repetations = capa->max_rx_ltf_repetations;
+       pr.max_tx_ltf_total = capa->max_tx_ltf_total;
+       pr.max_rx_ltf_total = capa->max_rx_ltf_total;
+       pr.max_rx_sts_le_80 = capa->max_rx_sts_le_80;
+       pr.max_rx_sts_gt_80 = capa->max_rx_sts_gt_80;
+       pr.max_tx_sts_le_80 = capa->max_tx_sts_le_80;
+       pr.max_tx_sts_gt_80 = capa->max_tx_sts_gt_80;
+
+       pr.support_6ghz = wpas_is_6ghz_supported(wpa_s, true);
+
+       pr.secure_he_ltf = wpa_s->drv_flags2 & WPA_DRIVER_FLAGS2_SEC_LTF_STA;
+
+       if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
+               os_memcpy(pr.country, wpa_s->conf->country, 2);
+               pr.country[2] = 0x04;
+       } else {
+               os_memcpy(pr.country, "XX\x04", 3);
+       }
 
        global->pr = pr_init(&pr);
        if (!global->pr) {
index 46cd285536c4b4def88f52a64035443bd6825e3e..9969c276ba0734d19411377822ba00795ecd43a7 100644 (file)
 
 #ifdef CONFIG_PR
 
-int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s);
+int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s,
+                const struct wpa_driver_capa *capa);
 void wpas_pr_deinit(struct wpa_supplicant *wpa_s);
 
 #else /* CONFIG_PR */
 
 static inline int wpas_pr_init(struct wpa_global *global,
-                              struct wpa_supplicant *wpa_s)
+                              struct wpa_supplicant *wpa_s,
+                              const struct wpa_driver_capa *capa)
 {
        return -1;
 }
index 27047d185841748c4a84ab88ebe91068c2c01a04..1c17fe188e1e5ff37985b3b1dd64b9b4a5ee052d 100644 (file)
@@ -7972,7 +7972,7 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
                return -1;
        }
 
-       if (wpas_pr_init(wpa_s->global, wpa_s) < 0)
+       if (wpas_pr_init(wpa_s->global, wpa_s, &capa) < 0)
                return -1;
 
        if (wpa_bss_init(wpa_s) < 0)