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@xxxxxxxxxxxxxxxx> --- 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 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap