Signed-off-by: Peddolla Harshavardhan Reddy <peddolla@xxxxxxxxxxxxxxxx> --- src/common/proximity_ranging.c | 173 +++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) diff --git a/src/common/proximity_ranging.c b/src/common/proximity_ranging.c index 2290369ec..b20b4daf6 100644 --- a/src/common/proximity_ranging.c +++ b/src/common/proximity_ranging.c @@ -1303,6 +1303,136 @@ static int pr_pasn_get_best_op_mode(struct pr_data *pr, u8 supp_roles, } +static void pr_choose_best_channel(struct pr_channels *common_channel, + u8 *op_class, u8 *op_channel) +{ + *op_class = common_channel->reg_class[0].reg_class; + *op_channel = common_channel->reg_class[0].channel[0]; +} + + +static int pr_pasn_get_final_op_mode(struct pr_data *pr, u8 supp_roles, + struct operation_mode *op_mode, + struct operation_mode *res_op_mode) +{ + int status = -1; + u8 op_class, op_channel; + struct pr_channels common_chan; + + if (op_mode->protocol_type & PR_NTB_SECURE_LTF_BASED_RANGING || + op_mode->protocol_type & PR_NTB_OPEN_BASED_RANGING) { + if (!pr->cfg->ntb_ista_support && !pr->cfg->ntb_rsta_support) { + wpa_printf(MSG_DEBUG, + "PR: Device can't fulfill requested NTB Role"); + return -1; + } + + if (op_mode->protocol_type & PR_NTB_SECURE_LTF_BASED_RANGING && + !pr->cfg->secure_he_ltf) { + wpa_printf(MSG_DEBUG, "PR: Secure HE-LTF not supported"); + return -1; + } + + pr_channels_intersect(&pr->cfg->ntb_channels, + &op_mode->channels, &common_chan); + if (!common_chan.reg_classes) { + wpa_printf(MSG_DEBUG, + "PR: No common channels to perform ranging"); + return -1; + } + + pr_choose_best_channel(&common_chan, &op_class, &op_channel); + if (!op_class || !op_channel) { + wpa_printf(MSG_DEBUG, + "PR: Couldn't choose a common channel for ranging"); + return -1; + } + + if (op_mode->role == PR_ISTA_SUPPORT && + !pr->cfg->ntb_rsta_support && + !(supp_roles & PR_RSTA_SUPPORT)) { + wpa_printf(MSG_DEBUG, "PR: Device cannot act as NTB RSTA"); + return -1; + } else if (op_mode->role == PR_RSTA_SUPPORT && + !pr->cfg->ntb_ista_support && + !(supp_roles & PR_ISTA_SUPPORT)) { + wpa_printf(MSG_DEBUG, "PR: Device cannot act as NTB ISTA"); + return -1; + } + + if (op_mode->role == PR_ISTA_SUPPORT && + pr->cfg->ntb_rsta_support) { + res_op_mode->role = PR_RSTA_SUPPORT; + status = 0; + } else if (op_mode->role == PR_RSTA_SUPPORT && + pr->cfg->ntb_ista_support) { + res_op_mode->role = PR_ISTA_SUPPORT; + status = 0; + } + + res_op_mode->protocol_type = op_mode->protocol_type; + os_memcpy(res_op_mode->country, pr->cfg->country, 3); + res_op_mode->channels.reg_classes = 1; + res_op_mode->channels.reg_class[0].channels = 1; + res_op_mode->channels.reg_class[0].channel[0] = op_channel; + res_op_mode->channels.reg_class[0].reg_class = op_class; + + return status; + } else if (op_mode->protocol_type & PR_EDCA_BASED_RANGING) { + if (!pr->cfg->edca_ista_support && + !pr->cfg->edca_rsta_support) { + wpa_printf(MSG_DEBUG, + "PR: Device can't fulfill EDCA role"); + return -1; + } + pr_channels_intersect(&pr->cfg->edca_channels, + &op_mode->channels, &common_chan); + if (!common_chan.reg_classes) { + wpa_printf(MSG_DEBUG, + "PR: No common channels to perform ranging"); + return -1; + } + + pr_choose_best_channel(&common_chan, &op_class, &op_channel); + if (!op_class || !op_channel) { + wpa_printf(MSG_DEBUG, + "PR: Couldn't choose a common channel for ranging"); + return -1; + } + + if (op_mode->role == PR_ISTA_SUPPORT && + !pr->cfg->edca_rsta_support && + !(supp_roles & PR_RSTA_SUPPORT)) { + wpa_printf(MSG_DEBUG, "PR: Device cannot act as NTB RSTA"); + return -1; + } else if (op_mode->role == PR_RSTA_SUPPORT && + !pr->cfg->edca_ista_support && + !(supp_roles & PR_ISTA_SUPPORT)) { + wpa_printf(MSG_DEBUG, "PR: Device cannot act as NTB ISTA"); + return -1; + } + + if (op_mode->role == PR_ISTA_SUPPORT && + pr->cfg->edca_rsta_support) { + res_op_mode->role = PR_RSTA_SUPPORT; + status = 0; + } else if (op_mode->role == PR_RSTA_SUPPORT && + pr->cfg->edca_ista_support) { + res_op_mode->role = PR_ISTA_SUPPORT; + status = 0; + } + + res_op_mode->protocol_type = op_mode->protocol_type; + os_memcpy(res_op_mode->country, pr->cfg->country, 3); + res_op_mode->channels.reg_classes = 1; + res_op_mode->channels.reg_class[0].channels = 1; + res_op_mode->channels.reg_class[0].channel[0] = op_channel; + res_op_mode->channels.reg_class[0].reg_class = op_class; + } + return status; +} + + static int pr_prepare_pasn_pr_ie(struct pr_data *pr, struct wpabuf *extra_ies, bool add_dira, u8 ranging_role, u8 ranging_type, int forced_pr_freq) @@ -1872,6 +2002,9 @@ static int pr_process_pasn_ranging_wrapper(struct pr_data *pr, if (trans_seq == 1) status = pr_pasn_get_best_op_mode(pr, supp_ranging_role, &op_mode, &res_op_mode); + else if (trans_seq == 2) + status = pr_pasn_get_final_op_mode(pr, supp_ranging_role, + &op_mode, &res_op_mode); if (status != 0 && status != 1) { wpa_printf(MSG_DEBUG, "PR: Couldn't derive suitable operation mode"); @@ -1983,6 +2116,44 @@ fail: } +static int pr_pasn_handle_auth_2(struct pr_data *pr, struct pr_device *dev, + const struct ieee80211_mgmt *mgmt, size_t len) +{ + int ret = -1; + struct wpa_pasn_params_data pasn_data; + + if (dev->pasn_role != PR_ROLE_PASN_INITIATOR) { + wpa_printf(MSG_ERROR, "PR PASN: Auth2 not expected on responder"); + return -1; + } + + if (!dev->pasn) + return -1; + + if (pr_process_pasn_ranging_wrapper(pr, dev, mgmt, len, 2)) { + wpa_printf(MSG_ERROR, + "PR PASN: Handle Auth2 action wrapper failed"); + return -1; + } + pasn_set_extra_ies(dev->pasn, wpabuf_head_u8(dev->ranging_wrapper), + wpabuf_len(dev->ranging_wrapper)); + + if (wpa_pasn_auth_rx(dev->pasn, (const u8 *) mgmt, len, + &pasn_data) < 0) { + wpa_printf(MSG_ERROR, "PR PASN: wpa_pasn_auth_rx() failed"); + dev->pasn_role = PR_ROLE_IDLE; + goto fail; + } + + ret = 0; + +fail: + wpabuf_free(dev->ranging_wrapper); + dev->ranging_wrapper = NULL; + return ret; +} + + int pr_pasn_auth_rx(struct pr_data *pr, const struct ieee80211_mgmt *mgmt, size_t len, int freq) { @@ -2015,6 +2186,8 @@ int pr_pasn_auth_rx(struct pr_data *pr, const struct ieee80211_mgmt *mgmt, if (auth_transaction == 1) return pr_pasn_handle_auth_1(pr, dev, mgmt, len, freq); + else if (auth_transaction == 2) + return pr_pasn_handle_auth_2(pr, dev, mgmt, len); return -1; } -- 2.34.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap