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;
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;
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");
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:
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 {
*/
#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
#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)
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 */
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 */
}
+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)
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;