NAN USD: Add publishChannelList option for Subscriber

Add frequency list to active NAN USD Subscriber to search for a
Publisher on multiple channels. This is the publish channel list used by
the Subscriber to periodically search for a service on these channels.
publishChannelList was already supported in the Publisher and this
commit extends that to the Subscriber.

This is needed for a P2P2 seeker that is an active subscriber looking
for an advertiser on a list of publish channels.

Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com>
This commit is contained in:
Shivani Baranwal 2024-08-05 15:03:04 +05:30 committed by Jouni Malinen
parent bcab29a78c
commit 25c6598f30
3 changed files with 37 additions and 0 deletions

View file

@ -1358,6 +1358,17 @@ int nan_de_subscribe(struct nan_de *de, const char *service_name,
if (nan_de_derive_service_id(srv) < 0) if (nan_de_derive_service_id(srv) < 0)
goto fail; goto fail;
os_memcpy(&srv->subscribe, params, sizeof(*params)); os_memcpy(&srv->subscribe, params, sizeof(*params));
if (params->freq_list) {
size_t len;
len = (int_array_len(params->freq_list) + 1) * sizeof(int);
srv->freq_list = os_memdup(params->freq_list, len);
if (!srv->freq_list)
goto fail;
}
srv->subscribe.freq_list = NULL;
srv->srv_proto_type = srv_proto_type; srv->srv_proto_type = srv_proto_type;
if (ssi) { if (ssi) {
srv->ssi = wpabuf_dup(ssi); srv->ssi = wpabuf_dup(ssi);

View file

@ -125,6 +125,9 @@ struct nan_subscribe_params {
/* Selected frequency */ /* Selected frequency */
unsigned int freq; unsigned int freq;
/* Multi-channel frequencies (publishChannelList) */
const int *freq_list;
/* Query period in ms; 0 = use default */ /* Query period in ms; 0 = use default */
unsigned int query_period; unsigned int query_period;
}; };

View file

@ -12373,6 +12373,7 @@ static int wpas_ctrl_nan_subscribe(struct wpa_supplicant *wpa_s, char *cmd,
struct wpabuf *ssi = NULL; struct wpabuf *ssi = NULL;
int ret = -1; int ret = -1;
enum nan_service_protocol_type srv_proto_type = 0; enum nan_service_protocol_type srv_proto_type = 0;
int *freq_list = NULL;
bool p2p = false; bool p2p = false;
os_memset(&params, 0, sizeof(params)); os_memset(&params, 0, sizeof(params));
@ -12399,6 +12400,27 @@ static int wpas_ctrl_nan_subscribe(struct wpa_supplicant *wpa_s, char *cmd,
continue; continue;
} }
if (os_strncmp(token, "freq_list=", 10) == 0) {
char *pos = token + 10;
if (os_strcmp(pos, "all") == 0) {
os_free(freq_list);
freq_list = wpas_nan_usd_all_freqs(wpa_s);
params.freq_list = freq_list;
continue;
}
while (pos && pos[0]) {
int_array_add_unique(&freq_list, atoi(pos));
pos = os_strchr(pos, ',');
if (pos)
pos++;
}
params.freq_list = freq_list;
continue;
}
if (os_strncmp(token, "srv_proto_type=", 15) == 0) { if (os_strncmp(token, "srv_proto_type=", 15) == 0) {
srv_proto_type = atoi(token + 15); srv_proto_type = atoi(token + 15);
continue; continue;
@ -12431,6 +12453,7 @@ static int wpas_ctrl_nan_subscribe(struct wpa_supplicant *wpa_s, char *cmd,
ret = os_snprintf(buf, buflen, "%d", subscribe_id); ret = os_snprintf(buf, buflen, "%d", subscribe_id);
fail: fail:
wpabuf_free(ssi); wpabuf_free(ssi);
os_free(freq_list);
return ret; return ret;
} }