From: Peddolla Harshavardhan Reddy Date: Sat, 26 Apr 2025 17:52:36 +0000 (+0530) Subject: PR: USD for Proximity Ranging X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a760532f76efec033982ed52583760e00b689fe3;p=thirdparty%2Fhostap.git PR: USD for Proximity Ranging USD is used to discover peers capable of Proximity Ranging (PR). Update NAN USD implementation to cover the additional cases to encapsulate PR data with a new identifier and also to add Proximity Ranging data to USD frames. Signed-off-by: Peddolla Harshavardhan Reddy --- diff --git a/src/common/nan_de.c b/src/common/nan_de.c index 6300ac287..110fba8a1 100644 --- a/src/common/nan_de.c +++ b/src/common/nan_de.c @@ -64,6 +64,7 @@ struct nan_de_service { struct os_reltime next_publish_chan; unsigned int next_publish_duration; bool is_p2p; + bool is_pr; }; struct nan_de { @@ -1335,7 +1336,7 @@ int nan_de_publish(struct nan_de *de, const char *service_name, int publish_id; struct nan_de_service *srv; - if (!service_name) { + if (!service_name && !params->proximity_ranging) { wpa_printf(MSG_DEBUG, "NAN: Publish() - no service_name"); return -1; } @@ -1346,6 +1347,12 @@ int nan_de_publish(struct nan_de *de, const char *service_name, return -1; } + if (params->proximity_ranging && params->solicited && !elems) { + wpa_printf(MSG_INFO, + "NAN: Unable to fetch proximity ranging params"); + return -1; + } + publish_id = nan_de_get_handle(de); if (publish_id < 1) return -1; @@ -1355,11 +1362,18 @@ int nan_de_publish(struct nan_de *de, const char *service_name, return -1; srv->type = NAN_DE_PUBLISH; srv->freq = srv->default_freq = params->freq; - srv->service_name = os_strdup(service_name); - if (!srv->service_name) - goto fail; - if (nan_de_derive_service_id(srv) < 0) + + if (service_name) { + srv->service_name = os_strdup(service_name); + if (!srv->service_name) + goto fail; + } + + if (params->proximity_ranging && !service_name) + os_memset(srv->service_id, 0, NAN_SERVICE_ID_LEN); + else if (nan_de_derive_service_id(srv) < 0) goto fail; + os_memcpy(&srv->publish, params, sizeof(*params)); if (params->freq_list) { @@ -1390,9 +1404,10 @@ int nan_de_publish(struct nan_de *de, const char *service_name, nan_de_start_new_publish_state(srv, true); wpa_printf(MSG_DEBUG, "NAN: Assigned new publish handle %d for %s", - publish_id, service_name); + publish_id, service_name ? service_name : "Ranging"); srv->id = publish_id; srv->is_p2p = p2p; + srv->is_pr = params->proximity_ranging && params->solicited; nan_de_add_srv(de, srv); nan_de_run_timer(de); return publish_id; @@ -1475,11 +1490,17 @@ int nan_de_subscribe(struct nan_de *de, const char *service_name, int subscribe_id; struct nan_de_service *srv; - if (!service_name) { + if (!service_name && !params->proximity_ranging) { wpa_printf(MSG_DEBUG, "NAN: Subscribe() - no service_name"); return -1; } + if (params->proximity_ranging && params->active && !elems) { + wpa_printf(MSG_INFO, + "NAN: Unable to fetch proximity ranging params"); + return -1; + } + subscribe_id = nan_de_get_handle(de); if (subscribe_id < 1) return -1; @@ -1489,11 +1510,18 @@ int nan_de_subscribe(struct nan_de *de, const char *service_name, return -1; srv->type = NAN_DE_SUBSCRIBE; srv->freq = params->freq; - srv->service_name = os_strdup(service_name); - if (!srv->service_name) - goto fail; - if (nan_de_derive_service_id(srv) < 0) + + if (service_name) { + srv->service_name = os_strdup(service_name); + if (!srv->service_name) + goto fail; + } + + if (params->proximity_ranging && !service_name) + os_memset(srv->service_id, 0, NAN_SERVICE_ID_LEN); + else if (nan_de_derive_service_id(srv) < 0) goto fail; + os_memcpy(&srv->subscribe, params, sizeof(*params)); if (params->freq_list) { @@ -1519,9 +1547,10 @@ int nan_de_subscribe(struct nan_de *de, const char *service_name, } wpa_printf(MSG_DEBUG, "NAN: Assigned new subscribe handle %d for %s", - subscribe_id, service_name); + subscribe_id, service_name ? service_name : "Ranging"); srv->id = subscribe_id; srv->is_p2p = p2p; + srv->is_pr = params->proximity_ranging && params->active; nan_de_add_srv(de, srv); nan_de_run_timer(de); return subscribe_id; diff --git a/src/common/nan_de.h b/src/common/nan_de.h index 6f8161ba4..ceb13c1a8 100644 --- a/src/common/nan_de.h +++ b/src/common/nan_de.h @@ -111,6 +111,9 @@ struct nan_publish_params { /* Announcement period in ms; 0 = use default */ unsigned int announcement_period; + + /* Proximity ranging flag */ + bool proximity_ranging; }; /* Returns -1 on failure or >0 publish_id */ @@ -144,6 +147,9 @@ struct nan_subscribe_params { /* Query period in ms; 0 = use default */ unsigned int query_period; + + /* Proximity ranging flag */ + bool proximity_ranging; }; /* Returns -1 on failure or >0 subscribe_id */ diff --git a/wpa_supplicant/nan_usd.c b/wpa_supplicant/nan_usd.c index 14253b89c..52eee206e 100644 --- a/wpa_supplicant/nan_usd.c +++ b/wpa_supplicant/nan_usd.c @@ -17,6 +17,7 @@ #include "notify.h" #include "p2p_supplicant.h" #include "nan_usd.h" +#include "pr_supplicant.h" static const char * @@ -407,11 +408,19 @@ int wpas_nan_usd_publish(struct wpa_supplicant *wpa_s, const char *service_name, if (!wpa_s->nan_de) return -1; + if (params->proximity_ranging && !params->solicited) { + wpa_printf(MSG_INFO, + "PR unsolicited publish service discovery not allowed"); + return -1; + } + + addr = wpa_s->own_addr; + if (p2p) { elems = wpas_p2p_usd_elems(wpa_s, service_name); addr = wpa_s->global->p2p_dev_addr; - } else { - addr = wpa_s->own_addr; + } else if (params->proximity_ranging) { + elems = wpas_pr_usd_elems(wpa_s); } publish_id = nan_de_publish(wpa_s->nan_de, service_name, srv_proto_type, @@ -479,11 +488,19 @@ int wpas_nan_usd_subscribe(struct wpa_supplicant *wpa_s, if (!wpa_s->nan_de) return -1; + if (params->proximity_ranging && !params->active) { + wpa_printf(MSG_INFO, + "PR passive subscriber service discovery not allowed"); + return -1; + } + + addr = wpa_s->own_addr; + if (p2p) { elems = wpas_p2p_usd_elems(wpa_s, service_name); addr = wpa_s->global->p2p_dev_addr; - } else { - addr = wpa_s->own_addr; + } else if (params->proximity_ranging) { + elems = wpas_pr_usd_elems(wpa_s); } subscribe_id = nan_de_subscribe(wpa_s->nan_de, service_name, diff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c index c8ce63a42..7028af913 100644 --- a/wpa_supplicant/pr_supplicant.c +++ b/wpa_supplicant/pr_supplicant.c @@ -238,6 +238,12 @@ wpas_pr_setup_ntb_channels(struct wpa_supplicant *wpa_s, } +struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s) +{ + return pr_prepare_usd_elems(wpa_s->global->pr); +} + + int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s, const struct wpa_driver_capa *capa) { diff --git a/wpa_supplicant/pr_supplicant.h b/wpa_supplicant/pr_supplicant.h index 9969c276b..ec68cae03 100644 --- a/wpa_supplicant/pr_supplicant.h +++ b/wpa_supplicant/pr_supplicant.h @@ -14,6 +14,7 @@ int wpas_pr_init(struct wpa_global *global, struct wpa_supplicant *wpa_s, const struct wpa_driver_capa *capa); void wpas_pr_deinit(struct wpa_supplicant *wpa_s); +struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s); #else /* CONFIG_PR */ @@ -28,6 +29,11 @@ static inline void wpas_pr_deinit(struct wpa_supplicant *wpa_s) { } +static inline struct wpabuf * wpas_pr_usd_elems(struct wpa_supplicant *wpa_s) +{ + return NULL; +} + #endif /* CONFIG_PR */ #endif /* PR_SUPPLICANT_H */