Add changes to 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. Signed-off-by: Peddolla Harshavardhan Reddy <peddolla@xxxxxxxxxxxxxxxx> --- src/common/proximity_ranging.h | 43 +++++++++++++++++++++++++++++++ src/drivers/driver.h | 23 +++++++++++++++++ wpa_supplicant/config.c | 2 ++ wpa_supplicant/config.h | 9 +++++++ wpa_supplicant/config_file.c | 4 +++ wpa_supplicant/pr_supplicant.c | 36 ++++++++++++++++++++++++++ wpa_supplicant/wpa_supplicant.c | 15 +++++++++++ wpa_supplicant/wpa_supplicant_i.h | 16 ++++++++++++ 8 files changed, 148 insertions(+) diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h index 0e597f85e..affabc19c 100644 --- a/src/common/proximity_ranging.h +++ b/src/common/proximity_ranging.h @@ -34,6 +34,12 @@ struct pr_device { struct pr_config { + u8 pasn_type; + + int preferred_ranging_role; + + char country[3]; + u8 dev_addr[ETH_ALEN]; /** @@ -41,6 +47,43 @@ 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 d943062fe..ac389ba47 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2422,6 +2422,12 @@ struct wpa_driver_capa { #define WPA_DRIVER_FLAGS2_P2P_FEATURE_V2 0x0000000002000000ULL /** Driver supports P2P PCC mode */ #define WPA_DRIVER_FLAGS2_P2P_FEATURE_PCC_MODE 0x0000000004000000ULL +/** Driver supports FTM initiator functionality */ +#define WPA_DRIVER_FLAGS2_FTM_INITIATOR 0x0000000008000000ULL +/** Driver supports non-trigger based ranging responder functionality */ +#define WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_RESPONDER 0x0000000010000000ULL +/** Driver supports non-trigger based ranging initiator functionality */ +#define WPA_DRIVER_FLAGS2_NON_TRIGGER_BASED_INITIATOR 0x0000000020000000ULL u64 flags2; #define FULL_AP_CLIENT_STATE_SUPP(drv_flags) \ @@ -2546,6 +2552,23 @@ 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 a0f71cfc6..07ca894a8 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -5706,6 +5706,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 c187d36ed..7728f8be6 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 b1ba03ac5..5dfd008eb 100644 --- a/wpa_supplicant/config_file.c +++ b/wpa_supplicant/config_file.c @@ -1756,6 +1756,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 ba8746589..a69385980 100644 --- a/wpa_supplicant/pr_supplicant.c +++ b/wpa_supplicant/pr_supplicant.c @@ -18,6 +18,7 @@ #include "common/proximity_ranging.h" #include "pr_supplicant.h" + int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s) { struct pr_config pr; @@ -30,6 +31,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 = wpa_s->edca_format_and_bw; + pr.max_rx_antenna = wpa_s->max_rx_antenna; + pr.max_tx_antenna = wpa_s->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 = wpa_s->ntb_format_and_bw; + pr.max_tx_ltf_repetations = wpa_s->max_tx_ltf_repetations; + pr.max_rx_ltf_repetations = wpa_s->max_rx_ltf_repetations; + pr.max_tx_ltf_total = wpa_s->max_tx_ltf_total; + pr.max_rx_ltf_total = wpa_s->max_rx_ltf_total; + pr.max_rx_sts_le_80 = wpa_s->max_rx_sts_le_80; + pr.max_rx_sts_gt_80 = wpa_s->max_rx_sts_gt_80; + pr.max_tx_sts_le_80 = wpa_s->max_tx_sts_le_80; + pr.max_tx_sts_gt_80 = wpa_s->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/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 3c8cc0727..719829197 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -7825,6 +7825,21 @@ static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s, wpa_s->extended_capa_len = capa.extended_capa_len; wpa_s->num_multichan_concurrent = capa.num_multichan_concurrent; + + wpa_s->edca_format_and_bw = capa.edca_format_and_bw; + wpa_s->max_tx_antenna = capa.max_tx_antenna; + wpa_s->max_rx_antenna = capa.max_rx_antenna; + + wpa_s->ntb_format_and_bw = capa.ntb_format_and_bw; + wpa_s->max_tx_ltf_repetations = capa.max_tx_ltf_repetations; + wpa_s->max_rx_ltf_repetations = capa.max_rx_ltf_repetations; + wpa_s->max_tx_ltf_total = capa.max_tx_ltf_total; + wpa_s->max_rx_ltf_total = capa.max_rx_ltf_total; + wpa_s->max_rx_sts_le_80 = capa.max_rx_sts_le_80; + wpa_s->max_rx_sts_gt_80 = capa.max_rx_sts_gt_80; + wpa_s->max_tx_sts_le_80 = capa.max_tx_sts_le_80; + wpa_s->max_tx_sts_gt_80 = capa.max_tx_sts_gt_80; + #ifndef CONFIG_NO_WMM_AC wpa_s->wmm_ac_supported = capa.wmm_ac_supported; #endif /* CONFIG_NO_WMM_AC */ diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index cc8ee34ad..3c9e02af1 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -957,6 +957,22 @@ struct wpa_supplicant { unsigned int max_stations; unsigned int max_num_akms; + /* 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; + int pending_mic_error_report; int pending_mic_error_pairwise; int mic_errors_seen; /* Michael MIC errors with the current PTK */ -- 2.34.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap