[PATCH v3 36/36] PR: Event to generate params to initate ranging
Peddolla Harshavardhan Reddy
peddolla at qti.qualcomm.com
Thu Aug 28 08:43:11 PDT 2025
Add changes to 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 <peddolla at qti.qualcomm.com>
---
src/common/proximity_ranging.c | 56 ++++++++++++++++++++++++++++++++++
src/common/proximity_ranging.h | 5 +++
src/common/wpa_ctrl.h | 4 +++
wpa_supplicant/notify.c | 13 ++++++++
wpa_supplicant/notify.h | 3 ++
wpa_supplicant/pr_supplicant.c | 20 ++++++++++++
6 files changed, 101 insertions(+)
diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c
index f763c065d..82eba29a6 100644
--- a/src/common/proximity_ranging.c
+++ b/src/common/proximity_ranging.c
@@ -1956,6 +1956,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;
@@ -1972,6 +1973,7 @@ int pr_pasn_auth_tx_status(struct pr_data *pr, const u8 *data, size_t data_len,
MAC2STR(mgmt->da));
ret = wpa_pasn_auth_tx_status(pasn, data, data_len, acked);
+
if (ret != 1 && !acked && pasn->frame)
return pasn->send_mgmt(pasn->cb_ctx, wpabuf_head(pasn->frame),
wpabuf_len(pasn->frame), 0, pasn->freq,
@@ -1980,6 +1982,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_DEBUG, "PR PASN: Invalid Protocol type set: %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;
@@ -2371,6 +2399,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)
return -1;
@@ -2390,6 +2420,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_DEBUG, "PR PASN: Invalid Protocol type set: %u",
+ dev->protocol_type);
+ return -1;
+ }
+
+ 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 bf1f84333..7c65f12cc 100644
--- a/src/common/proximity_ranging.h
+++ b/src/common/proximity_ranging.h
@@ -423,6 +423,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, u8 *dev_addr, 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 63e2c176a..d8a1b7019 100644
--- a/src/common/wpa_ctrl.h
+++ b/src/common/wpa_ctrl.h
@@ -476,6 +476,10 @@ extern "C" {
*/
#define PR_PASN_RESULT "PR-PASN-RESULT "
+/* Proximity Ranging params 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 8203d146f..da71439c0 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -1218,3 +1218,16 @@ void wpas_notify_pr_pasn_result(struct wpa_supplicant *wpa_s, u8 role,
"SUCCESS role=%u, protocol=%u, opclass=%u, channel=%u, cc=%s",
role, protocol_type, op_class, op_channel, country);
}
+
+
+void wpas_notify_pr_ranging_params(struct wpa_supplicant *wpa_s, u8 *dev_addr,
+ 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);
+}
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index ea27875f5..edd580eed 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -207,4 +207,7 @@ 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, u8 *dev_addr,
+ 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 788d059c4..eae2e791a 100644
--- a/wpa_supplicant/pr_supplicant.c
+++ b/wpa_supplicant/pr_supplicant.c
@@ -256,6 +256,25 @@ static void wpas_pr_pasn_result(void *ctx, u8 role, u8 protocol_type,
}
+static void wpas_pr_ranging_params(void *ctx, u8 *dev_addr, u8 *peer_addr,
+ u8 ranging_role, u8 protocol_type,
+ u8 op_class, u8 op_channel,
+ u8 self_format_bw, u8 peer_format_bw)
+{
+ int bw, format_bw, freq;
+ struct wpa_supplicant *wpa_s = ctx;
+
+ 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)
@@ -345,6 +364,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;
--
2.34.1
More information about the Hostap
mailing list