From: Peddolla Harshavardhan Reddy Date: Wed, 9 Jul 2025 15:39:29 +0000 (+0530) Subject: PR: Control interface event to generate parameters to initiate ranging X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=efe071081da9f097dd72102986a682797a50781f;p=thirdparty%2Fhostap.git PR: Control interface event to generate parameters to initiate ranging Notify the ranging parameters that were negotiated as part of PASN, so that they can be used further to initiate ranging. Signed-off-by: Peddolla Harshavardhan Reddy --- diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c index d18e2dac1..a0175828c 100644 --- a/src/common/proximity_ranging.c +++ b/src/common/proximity_ranging.c @@ -1977,6 +1977,7 @@ int pr_pasn_auth_tx_status(struct pr_data *pr, const u8 *data, size_t data_len, struct pasn_data *pasn; const struct ieee80211_mgmt *mgmt = (const struct ieee80211_mgmt *) data; + u8 self_format_bw, peer_format_bw; if (!pr) return -1; @@ -1997,6 +1998,32 @@ int pr_pasn_auth_tx_status(struct pr_data *pr, const u8 *data, size_t data_len, pr->cfg->pasn_result(pr->cfg->cb_ctx, dev->ranging_role, dev->protocol_type, dev->final_op_class, dev->final_op_channel, pr->cfg->country); + + if (dev->protocol_type & PR_EDCA_BASED_RANGING) { + self_format_bw = pr->cfg->edca_format_and_bw; + peer_format_bw = dev->edca_caps.edca_hw_caps & + EDCA_FORMAT_AND_BW_MASK; + + } else if ((dev->protocol_type & PR_NTB_SECURE_LTF_BASED_RANGING) || + (dev->protocol_type & PR_NTB_OPEN_BASED_RANGING)) { + self_format_bw = pr->cfg->ntb_format_and_bw; + peer_format_bw = dev->ntb_caps.ntb_hw_caps & + NTB_FORMAT_AND_BW_MASK; + } else { + wpa_printf(MSG_INFO, "PR PASN: Invalid protocol type: %u", + dev->protocol_type); + return -1; + } + + if (ret == 1 && acked && pr->cfg->get_ranging_params) + pr->cfg->get_ranging_params(pr->cfg->cb_ctx, pr->cfg->dev_addr, + dev->pr_device_addr, + dev->ranging_role, + dev->protocol_type, + dev->final_op_class, + dev->final_op_channel, + self_format_bw, + peer_format_bw); wpabuf_free(pasn->frame); pasn->frame = NULL; @@ -2403,6 +2430,8 @@ fail: static int pr_pasn_handle_auth_3(struct pr_data *pr, struct pr_device *dev, const struct ieee80211_mgmt *mgmt, size_t len) { + u8 self_format_bw, peer_format_bw; + if (dev->pasn_role != PR_ROLE_PASN_RESPONDER) { wpa_printf(MSG_INFO, "PR PASN: Auth3 not expected on initiator"); @@ -2428,6 +2457,32 @@ static int pr_pasn_handle_auth_3(struct pr_data *pr, struct pr_device *dev, pr->cfg->pasn_result(pr->cfg->cb_ctx, dev->ranging_role, dev->protocol_type, dev->final_op_class, dev->final_op_channel, pr->cfg->country); + + if (dev->protocol_type & PR_EDCA_BASED_RANGING) { + self_format_bw = pr->cfg->edca_format_and_bw; + peer_format_bw = dev->edca_caps.edca_hw_caps & + EDCA_FORMAT_AND_BW_MASK; + + } else if ((dev->protocol_type & PR_NTB_SECURE_LTF_BASED_RANGING) || + (dev->protocol_type & PR_NTB_OPEN_BASED_RANGING)) { + self_format_bw = pr->cfg->ntb_format_and_bw; + peer_format_bw = dev->ntb_caps.ntb_hw_caps & + NTB_FORMAT_AND_BW_MASK; + } else { + wpa_printf(MSG_INFO, "PR PASN: Invalid protocol type: %u", + dev->protocol_type); + goto fail; + } + + if (pr->cfg->get_ranging_params) + pr->cfg->get_ranging_params(pr->cfg->cb_ctx, pr->cfg->dev_addr, + dev->pr_device_addr, + dev->ranging_role, + dev->protocol_type, + dev->final_op_class, + dev->final_op_channel, + self_format_bw, + peer_format_bw); return 0; fail: diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h index af9676f1c..284b5707e 100644 --- a/src/common/proximity_ranging.h +++ b/src/common/proximity_ranging.h @@ -432,6 +432,11 @@ struct pr_config { int cipher, int akmp, struct wpa_ptk *ptk); void (*clear_keys)(void *ctx, const u8 *own_addr, const u8 *peer_addr); + + void (*get_ranging_params)(void *ctx, const u8 *dev_addr, + const u8 *peer_addr, u8 ranging_role, + u8 protocol_type, u8 op_class, u8 op_channel, + u8 self_format_bw, u8 peer_format_bw); }; struct pr_data { diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h index 2cb81d340..3d1735eca 100644 --- a/src/common/wpa_ctrl.h +++ b/src/common/wpa_ctrl.h @@ -476,6 +476,9 @@ extern "C" { */ #define PR_PASN_RESULT "PR-PASN-RESULT " +/* Proximity Ranging parameters to use in ranging */ +#define PR_RANGING_PARAMS "PR-RANGING-PARAMS " + /* BSS command information masks */ #define WPA_BSS_MASK_ALL 0xFFFDFFFF diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index f5d80f877..1d8d6bf4e 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -1210,6 +1210,8 @@ void wpas_notify_nan_subscribe_terminated(struct wpa_supplicant *wpa_s, #endif /* CONFIG_NAN_USD */ +#ifdef CONFIG_PR + void wpas_notify_pr_pasn_result(struct wpa_supplicant *wpa_s, u8 role, u8 protocol_type, u8 op_class, u8 op_channel, const char *country) @@ -1219,3 +1221,18 @@ void wpas_notify_pr_pasn_result(struct wpa_supplicant *wpa_s, u8 role, role, protocol_type, op_class, op_channel, country[0], country[1]); } + + +void wpas_notify_pr_ranging_params(struct wpa_supplicant *wpa_s, + const u8 *dev_addr, const u8 *peer_addr, + u8 ranging_role, u8 protocol_type, int freq, + int channel, int bw, int format_bw) +{ + wpa_msg_global(wpa_s, MSG_INFO, PR_RANGING_PARAMS + "dev_addr=" MACSTR " peer_addr=" MACSTR + " role=%u protocol=%u freq=%d channel=%d bw=%d format_bw=%d", + MAC2STR(dev_addr), MAC2STR(peer_addr), ranging_role, + protocol_type, freq, channel, bw, format_bw); +} + +#endif /* CONFIG_PR */ diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h index 284a518ab..b3c204e4f 100644 --- a/wpa_supplicant/notify.h +++ b/wpa_supplicant/notify.h @@ -207,5 +207,9 @@ void wpas_notify_nan_subscribe_terminated(struct wpa_supplicant *wpa_s, void wpas_notify_pr_pasn_result(struct wpa_supplicant *wpa_s, u8 role, u8 protocol_type, u8 op_class, u8 op_channel, const char *country); +void wpas_notify_pr_ranging_params(struct wpa_supplicant *wpa_s, + const u8 *dev_addr, const u8 *peer_addr, + u8 role, u8 protocol, int freq, int channel, + int bw, int format_bw); #endif /* NOTIFY_H */ diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c index 4bdff8971..5b9591be7 100644 --- a/wpa_supplicant/pr_supplicant.c +++ b/wpa_supplicant/pr_supplicant.c @@ -267,6 +267,25 @@ static void wpas_pr_pasn_result(void *ctx, u8 role, u8 protocol_type, } +static void wpas_pr_ranging_params(void *ctx, const u8 *dev_addr, + const u8 *peer_addr, u8 ranging_role, + u8 protocol_type, u8 op_class, u8 op_channel, + u8 self_format_bw, u8 peer_format_bw) +{ + struct wpa_supplicant *wpa_s = ctx; + int bw, format_bw, freq; + + bw = oper_class_bw_to_int(get_oper_class(NULL, op_class)); + format_bw = self_format_bw < peer_format_bw ? + self_format_bw : peer_format_bw; + freq = ieee80211_chan_to_freq(NULL, op_class, op_channel); + + wpas_notify_pr_ranging_params(wpa_s, dev_addr, peer_addr, ranging_role, + protocol_type, freq, op_channel, bw, + format_bw); +} + + static void wpas_pr_pasn_set_keys(void *ctx, const u8 *own_addr, const u8 *peer_addr, int cipher, int akmp, struct wpa_ptk *ptk) @@ -357,6 +376,7 @@ int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s, pr.pasn_send_mgmt = wpas_pr_pasn_send_mgmt; pr.pasn_result = wpas_pr_pasn_result; + pr.get_ranging_params = wpas_pr_ranging_params; pr.set_keys = wpas_pr_pasn_set_keys; pr.clear_keys = wpas_pr_pasn_clear_keys;