From: Peddolla Harshavardhan Reddy Date: Sat, 26 Apr 2025 18:44:48 +0000 (+0530) Subject: PR: Update PR device configs and capabilities from driver X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f45cc220e4bbe541ffdacd303e653594379311e1;p=thirdparty%2Fhostap.git PR: Update PR device configs and capabilities from driver 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 --- diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h index 70436d52f..6be3c4401 100644 --- a/src/common/proximity_ranging.h +++ b/src/common/proximity_ranging.h @@ -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 */ diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 95bb2557e..9edd569d7 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -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; }; diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index 4aa54c24f..37381f597 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -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. */ diff --git a/wpa_supplicant/config.h b/wpa_supplicant/config.h index 3feef1fcb..38d0f9fc4 100644 --- a/wpa_supplicant/config.h +++ b/wpa_supplicant/config.h @@ -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; }; diff --git a/wpa_supplicant/config_file.c b/wpa_supplicant/config_file.c index fdc39a9d4..d2ccfa1a1 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -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) diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c index d5672dc57..f0b00cd04 100644 --- a/wpa_supplicant/pr_supplicant.c +++ b/wpa_supplicant/pr_supplicant.c @@ -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) { diff --git a/wpa_supplicant/pr_supplicant.h b/wpa_supplicant/pr_supplicant.h index 46cd28553..9969c276b 100644 --- a/wpa_supplicant/pr_supplicant.h +++ b/wpa_supplicant/pr_supplicant.h @@ -11,13 +11,15 @@ #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; } diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 27047d185..1c17fe188 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -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)