[PATCH v3 36/36] PR: Event to generate params to initate ranging

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux