struct os_reltime next_publish_chan;
unsigned int next_publish_duration;
bool is_p2p;
+ bool is_pr;
};
struct nan_de {
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;
}
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;
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) {
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;
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;
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) {
}
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;
#include "notify.h"
#include "p2p_supplicant.h"
#include "nan_usd.h"
+#include "pr_supplicant.h"
static const char *
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,
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,