]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
PR: Control interface event to generate parameters to initiate ranging
authorPeddolla Harshavardhan Reddy <peddolla@qti.qualcomm.com>
Wed, 9 Jul 2025 15:39:29 +0000 (21:09 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 17 Oct 2025 10:24:19 +0000 (13:24 +0300)
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@qti.qualcomm.com>
src/common/proximity_ranging.c
src/common/proximity_ranging.h
src/common/wpa_ctrl.h
wpa_supplicant/notify.c
wpa_supplicant/notify.h
wpa_supplicant/pr_supplicant.c

index d18e2dac1e1ab3a37e3ffc8937299a2502675f30..a0175828cea13c3b14de1def60cea218b3936a46 100644 (file)
@@ -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:
index af9676f1c8e4891e679cbfc65d807828be62beab..284b5707ec220f4f8ff27f9db61ec0f53ab685a8 100644 (file)
@@ -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 {
index 2cb81d3405bf7d444d88b224f52af6d0c39efda1..3d1735eca58bb3c1d84f1dc9d9bb69c93955eef7 100644 (file)
@@ -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
index f5d80f877239a5521bf9e353a65ad2fbd07150c1..1d8d6bf4e5cedd0bfca19ad916bd8d6c5d899141 100644 (file)
@@ -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 */
index 284a518abbf0b376aa5e698f5d9bdb0ab1b35433..b3c204e4f75f38fae06be719664752d32154ad48 100644 (file)
@@ -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 */
index 4bdff8971a6a58aa8930e1accb7321b405c8be77..5b9591be7e749e1b0849679f9a27cf3ab394e860 100644 (file)
@@ -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;