struct pr_config {
+ u8 pasn_type;
+
+ int preferred_ranging_role;
+
+ char country[3];
+
u8 dev_addr[ETH_ALEN];
/**
*/
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
*/
#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;
/* 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;
};
{ 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. */
* 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;
};
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)
#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;
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) {
#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;
}
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)