]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
PR: USD for Proximity Ranging
authorPeddolla Harshavardhan Reddy <peddolla@qti.qualcomm.com>
Sat, 26 Apr 2025 17:52:36 +0000 (23:22 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 17 Oct 2025 10:22:26 +0000 (13:22 +0300)
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 <peddolla@qti.qualcomm.com>
src/common/nan_de.c
src/common/nan_de.h
wpa_supplicant/nan_usd.c
wpa_supplicant/pr_supplicant.c
wpa_supplicant/pr_supplicant.h

index 6300ac28769f319475dab30280eee0228f8a4081..110fba8a1ef29b4a72d41958598699b58543d34b 100644 (file)
@@ -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;
index 6f8161ba46d4f17941ce73d94dd34242887176c9..ceb13c1a82b04c5173d8ce295d62d1ada44d64fc 100644 (file)
@@ -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 */
index 14253b89cb6f7a2bf5e0ab38598cb18432b682e0..52eee206ef74dc02bcf40f031d812e2d5eb8932a 100644 (file)
@@ -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,
index c8ce63a42da4a6233e84aa5bb70b1a8aef314807..7028af9132e9d827eec7904b4386d81280953c1f 100644 (file)
@@ -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)
 {
index 9969c276ba0734d19411377822ba00795ecd43a7..ec68cae03dc89faae62a50542ded1fdce9d8c91f 100644 (file)
@@ -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 */