Home | History | Annotate | Line # | Download | only in common
      1 /*
      2  * NAN Discovery Engine
      3  * Copyright (c) 2024, Qualcomm Innovation Center, Inc.
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #include "utils/includes.h"
     10 
     11 #include "utils/common.h"
     12 #include "utils/eloop.h"
     13 #include "crypto/crypto.h"
     14 #include "crypto/sha256.h"
     15 #include "ieee802_11_defs.h"
     16 #include "nan.h"
     17 #include "nan_de.h"
     18 
     19 static const u8 nan_network_id[ETH_ALEN] =
     20 { 0x51, 0x6f, 0x9a, 0x01, 0x00, 0x00 };
     21 static const u8 wildcard_bssid[ETH_ALEN] =
     22 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
     23 
     24 enum nan_de_service_type {
     25 	NAN_DE_PUBLISH,
     26 	NAN_DE_SUBSCRIBE,
     27 };
     28 
     29 struct nan_de_service {
     30 	int id;
     31 	enum nan_de_service_type type;
     32 	char *service_name;
     33 	u8 service_id[NAN_SERVICE_ID_LEN];
     34 	struct nan_publish_params publish;
     35 	struct nan_subscribe_params subscribe;
     36 	enum nan_service_protocol_type srv_proto_type;
     37 	struct wpabuf *ssi;
     38 	struct wpabuf *elems;
     39 	struct os_reltime time_started;
     40 	struct os_reltime end_time;
     41 	struct os_reltime last_multicast;
     42 	struct os_reltime first_discovered;
     43 	struct os_reltime last_followup;
     44 	bool needs_fsd;
     45 	unsigned int freq;
     46 	unsigned int default_freq;
     47 	int *freq_list;
     48 
     49 	/* pauseState information for Publish function */
     50 	struct os_reltime pause_state_end;
     51 	u8 sel_peer_id;
     52 	u8 sel_peer_addr[ETH_ALEN];
     53 
     54 	/* Publish state - channel iteration */
     55 	bool in_multi_chan;
     56 	bool first_multi_chan;
     57 	int multi_chan_idx; /* index to freq_list[] */
     58 	struct os_reltime next_publish_state;
     59 	struct os_reltime next_publish_chan;
     60 	unsigned int next_publish_duration;
     61 };
     62 
     63 struct nan_de {
     64 	u8 nmi[ETH_ALEN];
     65 	bool ap;
     66 	struct nan_callbacks cb;
     67 
     68 	struct nan_de_service *service[NAN_DE_MAX_SERVICE];
     69 	unsigned int num_service;
     70 
     71 	int next_handle;
     72 
     73 	unsigned int ext_listen_freq;
     74 	unsigned int listen_freq;
     75 	unsigned int tx_wait_status_freq;
     76 	unsigned int tx_wait_end_freq;
     77 };
     78 
     79 
     80 struct nan_de * nan_de_init(const u8 *nmi, bool ap,
     81 			    const struct nan_callbacks *cb)
     82 {
     83 	struct nan_de *de;
     84 
     85 	de = os_zalloc(sizeof(*de));
     86 	if (!de)
     87 		return NULL;
     88 
     89 	os_memcpy(de->nmi, nmi, ETH_ALEN);
     90 	de->ap = ap;
     91 	os_memcpy(&de->cb, cb, sizeof(*cb));
     92 
     93 	return de;
     94 }
     95 
     96 
     97 static void nan_de_service_free(struct nan_de_service *srv)
     98 {
     99 	os_free(srv->service_name);
    100 	wpabuf_free(srv->ssi);
    101 	wpabuf_free(srv->elems);
    102 	os_free(srv->freq_list);
    103 	os_free(srv);
    104 }
    105 
    106 
    107 static void nan_de_service_deinit(struct nan_de *de, struct nan_de_service *srv,
    108 				  enum nan_de_reason reason)
    109 {
    110 	if (!srv)
    111 		return;
    112 	if (srv->type == NAN_DE_PUBLISH && de->cb.publish_terminated)
    113 		de->cb.publish_terminated(de->cb.ctx, srv->id, reason);
    114 	if (srv->type == NAN_DE_SUBSCRIBE && de->cb.subscribe_terminated)
    115 		de->cb.subscribe_terminated(de->cb.ctx, srv->id, reason);
    116 	nan_de_service_free(srv);
    117 }
    118 
    119 
    120 static void nan_de_clear_pending(struct nan_de *de)
    121 {
    122 	de->listen_freq = 0;
    123 	de->tx_wait_status_freq = 0;
    124 	de->tx_wait_end_freq = 0;
    125 }
    126 
    127 
    128 void nan_de_flush(struct nan_de *de)
    129 {
    130 	unsigned int i;
    131 
    132 	if (!de)
    133 		return;
    134 
    135 	for (i = 0; i < NAN_DE_MAX_SERVICE; i++) {
    136 		nan_de_service_deinit(de, de->service[i],
    137 				      NAN_DE_REASON_USER_REQUEST);
    138 		de->service[i] = NULL;
    139 	}
    140 
    141 	de->num_service = 0;
    142 	nan_de_clear_pending(de);
    143 }
    144 
    145 
    146 static void nan_de_pause_state(struct nan_de_service *srv, const u8 *peer_addr,
    147 			       u8 peer_id)
    148 {
    149 	wpa_printf(MSG_DEBUG, "NAN: Start pauseState");
    150 	os_get_reltime(&srv->pause_state_end);
    151 	srv->pause_state_end.sec += 60;
    152 	os_memcpy(srv->sel_peer_addr, peer_addr, ETH_ALEN);
    153 	srv->sel_peer_id = peer_id;
    154 }
    155 
    156 
    157 static void nan_de_unpause_state(struct nan_de_service *srv)
    158 {
    159 	wpa_printf(MSG_DEBUG, "NAN: Stop pauseState");
    160 	srv->pause_state_end.sec = 0;
    161 	srv->pause_state_end.usec = 0;
    162 	os_memset(srv->sel_peer_addr, 0, ETH_ALEN);
    163 	srv->sel_peer_id = 0;
    164 }
    165 
    166 
    167 static struct wpabuf * nan_de_alloc_sdf(size_t len)
    168 {
    169 	struct wpabuf *buf;
    170 
    171 	buf = wpabuf_alloc(2 + 4 + len);
    172 	if (buf) {
    173 		wpabuf_put_u8(buf, WLAN_ACTION_PUBLIC);
    174 		wpabuf_put_u8(buf, WLAN_PA_VENDOR_SPECIFIC);
    175 		wpabuf_put_be32(buf, NAN_SDF_VENDOR_TYPE);
    176 	}
    177 
    178 	return buf;
    179 }
    180 
    181 
    182 static int nan_de_tx(struct nan_de *de, unsigned int freq,
    183 		     unsigned int wait_time,
    184 		     const u8 *dst, const u8 *src, const u8 *bssid,
    185 		     const struct wpabuf *buf)
    186 {
    187 	int res;
    188 
    189 	if (!de->cb.tx)
    190 		return -1;
    191 
    192 	res = de->cb.tx(de->cb.ctx, freq, wait_time, dst, src, bssid, buf);
    193 	if (res < 0)
    194 		return res;
    195 
    196 	de->tx_wait_status_freq = freq;
    197 	de->tx_wait_end_freq = wait_time ? freq : 0;
    198 
    199 	return res;
    200 }
    201 
    202 
    203 static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,
    204 			  unsigned int wait_time,
    205 			  enum nan_service_control_type type,
    206 			  const u8 *dst, u8 req_instance_id,
    207 			  const struct wpabuf *ssi)
    208 {
    209 	struct wpabuf *buf;
    210 	size_t len = 0, sda_len, sdea_len;
    211 	u8 ctrl = type;
    212 	u16 sdea_ctrl = 0;
    213 
    214 	/* Service Descriptor attribute */
    215 	sda_len = NAN_SERVICE_ID_LEN + 1 + 1 + 1;
    216 	len += NAN_ATTR_HDR_LEN + sda_len;
    217 
    218 	/* Service Descriptor Extension attribute */
    219 	sdea_len = 1 + 2;
    220 	if (ssi)
    221 		sdea_len += 2 + 4 + wpabuf_len(ssi);
    222 	len += NAN_ATTR_HDR_LEN + sdea_len;
    223 
    224 	/* Element Container attribute */
    225 	if (srv->elems)
    226 		len += NAN_ATTR_HDR_LEN + 1 + wpabuf_len(srv->elems);
    227 
    228 	buf = nan_de_alloc_sdf(len);
    229 	if (!buf)
    230 		return;
    231 
    232 	/* Service Descriptor attribute */
    233 	wpabuf_put_u8(buf, NAN_ATTR_SDA);
    234 	wpabuf_put_le16(buf, sda_len);
    235 	wpabuf_put_data(buf, srv->service_id, NAN_SERVICE_ID_LEN);
    236 	wpabuf_put_u8(buf, srv->id); /* Instance ID */
    237 	wpabuf_put_u8(buf, req_instance_id); /* Requestor Instance ID */
    238 	wpabuf_put_u8(buf, ctrl);
    239 
    240 	/* Service Descriptor Extension attribute */
    241 	if (srv->type == NAN_DE_PUBLISH || ssi) {
    242 		wpabuf_put_u8(buf, NAN_ATTR_SDEA);
    243 		wpabuf_put_le16(buf, sdea_len);
    244 		wpabuf_put_u8(buf, srv->id); /* Instance ID */
    245 		if (srv->type == NAN_DE_PUBLISH) {
    246 			if (srv->publish.fsd)
    247 				sdea_ctrl |= NAN_SDEA_CTRL_FSD_REQ;
    248 			if (srv->publish.fsd_gas)
    249 				sdea_ctrl |= NAN_SDEA_CTRL_FSD_GAS;
    250 		}
    251 		wpabuf_put_le16(buf, sdea_ctrl);
    252 		if (ssi) {
    253 			wpabuf_put_le16(buf, 4 + wpabuf_len(ssi));
    254 			wpabuf_put_be24(buf, OUI_WFA);
    255 			wpabuf_put_u8(buf, srv->srv_proto_type);
    256 			wpabuf_put_buf(buf, ssi);
    257 		}
    258 	}
    259 
    260 	/* Element Container attribute */
    261 	if (srv->elems) {
    262 		wpabuf_put_u8(buf, NAN_ATTR_ELEM_CONTAINER);
    263 		wpabuf_put_le16(buf, 1 + wpabuf_len(srv->elems));
    264 		wpabuf_put_u8(buf, 0); /* Map ID */
    265 		wpabuf_put_buf(buf, srv->elems);
    266 	}
    267 
    268 	/* Wi-Fi Aware specification v4.0 uses NAN Cluster ID as A3 for USD,
    269 	 * but there is no synchronization in USD as as such, no NAN Cluster
    270 	 * either. Use Wildcard BSSID instead. */
    271 	nan_de_tx(de, srv->freq, wait_time, dst, de->nmi, wildcard_bssid, buf);
    272 	wpabuf_free(buf);
    273 }
    274 
    275 
    276 static int nan_de_time_to_next_chan_change(struct nan_de_service *srv)
    277 {
    278 	struct os_reltime tmp, diff, now;
    279 
    280 	if (os_reltime_before(&srv->next_publish_state,
    281 			      &srv->next_publish_chan))
    282 		tmp = srv->next_publish_state;
    283 	else if (srv->in_multi_chan)
    284 		tmp = srv->next_publish_chan;
    285 	else
    286 		tmp = srv->next_publish_state;
    287 
    288 	os_get_reltime(&now);
    289 	os_reltime_sub(&tmp, &now, &diff);
    290 	return os_reltime_in_ms(&diff);
    291 }
    292 
    293 
    294 static void nan_de_set_publish_times(struct nan_de_service *srv)
    295 {
    296 	os_get_reltime(&srv->next_publish_state);
    297 	srv->next_publish_chan = srv->next_publish_state;
    298 	/* Swap single/multi channel state in N * 100 TU */
    299 	os_reltime_add_ms(&srv->next_publish_state,
    300 			  srv->next_publish_duration * 1024 / 1000);
    301 
    302 	/* Swap channel in multi channel state after 150 ms */
    303 	os_reltime_add_ms(&srv->next_publish_chan, 150);
    304 }
    305 
    306 
    307 static void nan_de_check_chan_change(struct nan_de_service *srv)
    308 {
    309 	if (srv->next_publish_duration) {
    310 		/* Update end times for the first operation of the publish
    311 		 * iteration */
    312 		nan_de_set_publish_times(srv);
    313 		srv->next_publish_duration = 0;
    314 	} else if (srv->in_multi_chan) {
    315 		if (!os_reltime_initialized(&srv->pause_state_end)) {
    316 			srv->multi_chan_idx++;
    317 			if (srv->freq_list[srv->multi_chan_idx] == 0)
    318 				srv->multi_chan_idx = 0;
    319 			srv->freq = srv->freq_list[srv->multi_chan_idx];
    320 			wpa_printf(MSG_DEBUG,
    321 				   "NAN: Publish multi-channel change to %u MHz",
    322 				   srv->freq);
    323 		}
    324 		os_get_reltime(&srv->next_publish_chan);
    325 		os_reltime_add_ms(&srv->next_publish_chan, 150);
    326 	}
    327 }
    328 
    329 
    330 static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv,
    331 				u8 req_instance_id)
    332 {
    333 	enum nan_service_control_type type;
    334 	unsigned int wait_time = 100;
    335 
    336 	if (srv->type == NAN_DE_PUBLISH) {
    337 		int ms;
    338 
    339 		type = NAN_SRV_CTRL_PUBLISH;
    340 
    341 		nan_de_check_chan_change(srv);
    342 		ms = nan_de_time_to_next_chan_change(srv);
    343 		if (ms < 100)
    344 			ms = 100;
    345 		wait_time = ms;
    346 	} else if (srv->type == NAN_DE_SUBSCRIBE) {
    347 		type = NAN_SRV_CTRL_SUBSCRIBE;
    348 	} else {
    349 		return;
    350 	}
    351 
    352 	nan_de_tx_sdf(de, srv, wait_time, type, nan_network_id,
    353 		      req_instance_id, srv->ssi);
    354 	os_get_reltime(&srv->last_multicast);
    355 }
    356 
    357 
    358 static void nan_de_add_srv(struct nan_de *de, struct nan_de_service *srv)
    359 {
    360 	int ttl;
    361 
    362 	os_get_reltime(&srv->time_started);
    363 	ttl = srv->type == NAN_DE_PUBLISH ? srv->publish.ttl :
    364 		srv->subscribe.ttl;
    365 	if (ttl) {
    366 		srv->end_time = srv->time_started;
    367 		srv->end_time.sec += ttl;
    368 	}
    369 
    370 	de->service[srv->id - 1] = srv;
    371 	de->num_service++;
    372 }
    373 
    374 
    375 static void nan_de_del_srv(struct nan_de *de, struct nan_de_service *srv,
    376 			   enum nan_de_reason reason)
    377 {
    378 	de->service[srv->id - 1] = NULL;
    379 	nan_de_service_deinit(de, srv, reason);
    380 	de->num_service--;
    381 	if (de->num_service == 0)
    382 		nan_de_clear_pending(de);
    383 }
    384 
    385 
    386 static bool nan_de_srv_expired(struct nan_de_service *srv,
    387 			       struct os_reltime *now)
    388 {
    389 	if (os_reltime_initialized(&srv->end_time))
    390 		return os_reltime_before(&srv->end_time, now);
    391 
    392 	if (srv->type == NAN_DE_PUBLISH) {
    393 		/* Time out after one transmission (and wait for FSD) */
    394 		if (!os_reltime_initialized(&srv->last_multicast))
    395 			return false;
    396 		if (!srv->publish.fsd)
    397 			return true;
    398 		if (os_reltime_initialized(&srv->last_followup) &&
    399 		    !os_reltime_expired(now, &srv->last_followup, 1))
    400 			return false;
    401 		if (os_reltime_expired(now, &srv->last_multicast, 1))
    402 			return true;
    403 	}
    404 
    405 	if (srv->type == NAN_DE_SUBSCRIBE) {
    406 		/* Time out after first DiscoveryResult event (and wait for
    407 		 * FSD) */
    408 		if (!os_reltime_initialized(&srv->first_discovered))
    409 			return false;
    410 		if (!srv->needs_fsd)
    411 			return true;
    412 		if (os_reltime_initialized(&srv->last_followup) &&
    413 		    !os_reltime_expired(now, &srv->last_followup, 1))
    414 			return false;
    415 		if (os_reltime_expired(now, &srv->first_discovered, 1))
    416 			return true;
    417 	}
    418 
    419 	return false;
    420 }
    421 
    422 
    423 static int nan_de_next_multicast(struct nan_de *de, struct nan_de_service *srv,
    424 				 struct os_reltime *now)
    425 {
    426 	unsigned int period;
    427 	struct os_reltime next, diff;
    428 
    429 	if (srv->type == NAN_DE_PUBLISH && !srv->publish.unsolicited)
    430 		return -1;
    431 	if (srv->type == NAN_DE_SUBSCRIBE && !srv->subscribe.active)
    432 		return -1;
    433 
    434 	if (!os_reltime_initialized(&srv->last_multicast))
    435 		return 0;
    436 
    437 	if (srv->type == NAN_DE_PUBLISH && srv->publish.ttl == 0)
    438 		return -1;
    439 
    440 	if (srv->type == NAN_DE_PUBLISH &&
    441 	    os_reltime_initialized(&srv->pause_state_end))
    442 		return -1;
    443 
    444 	period = srv->type == NAN_DE_PUBLISH ?
    445 		srv->publish.announcement_period :
    446 		srv->subscribe.query_period;
    447 	if (period == 0)
    448 		period = 100;
    449 	next = srv->last_multicast;
    450 	os_reltime_add_ms(&next, period);
    451 
    452 	if (srv->type == NAN_DE_PUBLISH) {
    453 		if (!de->tx_wait_end_freq && srv->publish.unsolicited &&
    454 		    os_reltime_before(&next, now))
    455 			return 0;
    456 		next = srv->next_publish_state;
    457 	}
    458 
    459 	if (os_reltime_before(&next, now))
    460 		return 0;
    461 
    462 	os_reltime_sub(&next, now, &diff);
    463 	return os_reltime_in_ms(&diff);
    464 }
    465 
    466 
    467 static int nan_de_srv_time_to_next(struct nan_de *de,
    468 				   struct nan_de_service *srv,
    469 				   struct os_reltime *now)
    470 {
    471 	struct os_reltime diff;
    472 	int next = -1, tmp;
    473 
    474 	if (os_reltime_initialized(&srv->end_time)) {
    475 		os_reltime_sub(&srv->end_time, now, &diff);
    476 		tmp = os_reltime_in_ms(&diff);
    477 		if (next == -1 || tmp < next)
    478 			next = tmp;
    479 	}
    480 
    481 	tmp = nan_de_next_multicast(de, srv, now);
    482 	if (tmp >= 0 && (next == -1 || tmp < next))
    483 		next = tmp;
    484 
    485 	if (srv->type == NAN_DE_PUBLISH &&
    486 	    os_reltime_initialized(&srv->last_multicast)) {
    487 		/* Time out after one transmission (and wait for FSD) */
    488 		tmp = srv->publish.fsd ? 1000 : 100;
    489 		if (next == -1 || tmp < next)
    490 			next = tmp;
    491 	}
    492 
    493 	if (srv->type == NAN_DE_SUBSCRIBE &&
    494 	    os_reltime_initialized(&srv->first_discovered)) {
    495 		/* Time out after first DiscoveryResult event (and wait for
    496 		 * FSD) */
    497 		tmp = srv->needs_fsd ? 1000 : 100;
    498 		if (next == -1 || tmp < next)
    499 			next = tmp;
    500 	}
    501 
    502 	if (os_reltime_initialized(&srv->next_publish_state)) {
    503 		os_reltime_sub(&srv->next_publish_state, now, &diff);
    504 		if (diff.sec < 0 || (diff.sec == 0 && diff.usec < 0))
    505 			tmp = 0;
    506 		else
    507 			tmp = os_reltime_in_ms(&diff);
    508 		if (next == -1 || tmp < next)
    509 			next = tmp;
    510 	}
    511 
    512 	return next;
    513 }
    514 
    515 
    516 static void nan_de_start_new_publish_state(struct nan_de_service *srv,
    517 					   bool force_single)
    518 {
    519 	unsigned int n;
    520 
    521 	if (force_single || !srv->freq_list || srv->freq_list[0] == 0)
    522 		srv->in_multi_chan = false;
    523 	else
    524 		srv->in_multi_chan = !srv->in_multi_chan;
    525 
    526 	/* Use hardcoded Nmin=5 and Nmax=10 and pick a random N from that range.
    527 	 * Use same values for M. */
    528 	n = 5 + os_random() % 5;
    529 	srv->next_publish_duration = n * 100;
    530 
    531 	nan_de_set_publish_times(srv);
    532 
    533 	if (os_reltime_initialized(&srv->pause_state_end))
    534 		return;
    535 
    536 	if (srv->in_multi_chan && srv->freq_list && srv->freq_list[0]) {
    537 		if (!srv->first_multi_chan)
    538 			srv->multi_chan_idx++;
    539 		if (srv->freq_list[srv->multi_chan_idx] == 0)
    540 			srv->multi_chan_idx = 0;
    541 		srv->first_multi_chan = false;
    542 		srv->freq = srv->freq_list[srv->multi_chan_idx];
    543 	} else {
    544 		srv->freq = srv->default_freq;
    545 	}
    546 
    547 	wpa_printf(MSG_DEBUG,
    548 		   "NAN: Publish in %s channel state for %u TU; starting with %u MHz",
    549 		   srv->in_multi_chan ? "multi" : "single", n * 100, srv->freq);
    550 }
    551 
    552 
    553 static void nan_de_timer(void *eloop_ctx, void *timeout_ctx)
    554 {
    555 	struct nan_de *de = eloop_ctx;
    556 	unsigned int i;
    557 	int next = -1;
    558 	bool started = false;
    559 	struct os_reltime now;
    560 
    561 	os_get_reltime(&now);
    562 
    563 	for (i = 0; i < NAN_DE_MAX_SERVICE; i++) {
    564 		struct nan_de_service *srv = de->service[i];
    565 		int srv_next;
    566 
    567 		if (!srv)
    568 			continue;
    569 
    570 		if (nan_de_srv_expired(srv, &now)) {
    571 			wpa_printf(MSG_DEBUG, "NAN: Service id %d expired",
    572 				   srv->id);
    573 			nan_de_del_srv(de, srv, NAN_DE_REASON_TIMEOUT);
    574 			continue;
    575 		}
    576 
    577 		if (os_reltime_initialized(&srv->next_publish_state) &&
    578 		    os_reltime_before(&srv->next_publish_state, &now))
    579 			nan_de_start_new_publish_state(srv, false);
    580 
    581 		if (srv->type == NAN_DE_PUBLISH &&
    582 		    os_reltime_initialized(&srv->pause_state_end) &&
    583 		    (os_reltime_before(&srv->pause_state_end, &now) ||
    584 		     (srv->publish.fsd &&
    585 		      os_reltime_initialized(&srv->last_followup) &&
    586 		      os_reltime_expired(&now, &srv->last_followup, 1))))
    587 			nan_de_unpause_state(srv);
    588 
    589 		srv_next = nan_de_srv_time_to_next(de, srv, &now);
    590 		if (srv_next >= 0 && (next == -1 || srv_next < next))
    591 			next = srv_next;
    592 
    593 		if (srv_next == 0 && !started &&
    594 		    de->listen_freq == 0 && de->ext_listen_freq == 0 &&
    595 		    de->tx_wait_end_freq == 0 &&
    596 		    nan_de_next_multicast(de, srv, &now) == 0) {
    597 			started = true;
    598 			nan_de_tx_multicast(de, srv, 0);
    599 		}
    600 
    601 		if (!started && de->cb.listen &&
    602 		    de->listen_freq == 0 && de->ext_listen_freq == 0 &&
    603 		    de->tx_wait_end_freq == 0 &&
    604 		    ((srv->type == NAN_DE_PUBLISH &&
    605 		      !srv->publish.unsolicited && srv->publish.solicited) ||
    606 		     (srv->type == NAN_DE_SUBSCRIBE &&
    607 		      !srv->subscribe.active))) {
    608 			int duration = 1000;
    609 
    610 			if (srv->type == NAN_DE_PUBLISH) {
    611 				nan_de_check_chan_change(srv);
    612 				duration = nan_de_time_to_next_chan_change(srv);
    613 				if (duration < 150)
    614 					duration = 150;
    615 			}
    616 
    617 			started = true;
    618 			if (de->cb.listen(de->cb.ctx, srv->freq, duration) == 0)
    619 				de->listen_freq = srv->freq;
    620 		}
    621 
    622 	}
    623 
    624 	if (next < 0)
    625 		return;
    626 
    627 	if (next == 0)
    628 		next = 1;
    629 	wpa_printf(MSG_DEBUG, "NAN: Next timer in %u ms", next);
    630 	eloop_register_timeout(next / 1000, (next % 1000) * 1000, nan_de_timer,
    631 			       de, NULL);
    632 }
    633 
    634 
    635 static void nan_de_run_timer(struct nan_de *de)
    636 {
    637 	eloop_cancel_timeout(nan_de_timer, de, NULL);
    638 	eloop_register_timeout(0, 0, nan_de_timer, de, NULL);
    639 }
    640 
    641 
    642 void nan_de_deinit(struct nan_de *de)
    643 {
    644 	eloop_cancel_timeout(nan_de_timer, de, NULL);
    645 	nan_de_flush(de);
    646 	os_free(de);
    647 }
    648 
    649 
    650 void nan_de_listen_started(struct nan_de *de, unsigned int freq,
    651 			   unsigned int duration)
    652 {
    653 	if (freq != de->listen_freq)
    654 		de->ext_listen_freq = freq;
    655 }
    656 
    657 
    658 void nan_de_listen_ended(struct nan_de *de, unsigned int freq)
    659 {
    660 	if (freq == de->ext_listen_freq)
    661 		de->ext_listen_freq = 0;
    662 
    663 	if (freq == de->listen_freq) {
    664 		de->listen_freq = 0;
    665 		nan_de_run_timer(de);
    666 	}
    667 }
    668 
    669 
    670 void nan_de_tx_status(struct nan_de *de, unsigned int freq, const u8 *dst)
    671 {
    672 	if (freq == de->tx_wait_status_freq)
    673 		de->tx_wait_status_freq = 0;
    674 }
    675 
    676 
    677 void nan_de_tx_wait_ended(struct nan_de *de)
    678 {
    679 	de->tx_wait_end_freq = 0;
    680 	nan_de_run_timer(de);
    681 }
    682 
    683 
    684 static const u8 *
    685 nan_de_get_attr(const u8 *buf, size_t len, enum nan_attr_id id,
    686 		unsigned int skip)
    687 {
    688 	const u8 *pos = buf, *end = buf + len;
    689 
    690 	while (end - pos >= NAN_ATTR_HDR_LEN) {
    691 		const u8 *attr = pos;
    692 		u8 attr_id;
    693 		u16 attr_len;
    694 
    695 		attr_id = *pos++;
    696 		attr_len = WPA_GET_LE16(pos);
    697 		pos += 2;
    698 		if (attr_len > end - pos) {
    699 			wpa_printf(MSG_DEBUG,
    700 				   "NAN: Truncated attribute %u (len %u; left %zu)",
    701 				   attr_id, attr_len, end - pos);
    702 			break;
    703 		}
    704 
    705 		if (attr_id == id) {
    706 			if (skip == 0)
    707 				return attr;
    708 			skip--;
    709 		}
    710 
    711 		pos += attr_len;
    712 	}
    713 
    714 	return NULL;
    715 }
    716 
    717 
    718 static void nan_de_get_sdea(const u8 *buf, size_t len, u8 instance_id,
    719 			    u16 *sdea_control,
    720 			    enum nan_service_protocol_type *srv_proto_type,
    721 			    const u8 **ssi, size_t *ssi_len)
    722 {
    723 	unsigned int skip;
    724 	const u8 *sdea, *end;
    725 	u16 sdea_len;
    726 
    727 	for (skip = 0; ; skip++) {
    728 		sdea = nan_de_get_attr(buf, len, NAN_ATTR_SDEA, skip);
    729 		if (!sdea)
    730 			break;
    731 
    732 		sdea++;
    733 		sdea_len = WPA_GET_LE16(sdea);
    734 		sdea += 2;
    735 		if (sdea_len < 1 + 2)
    736 			continue;
    737 		end = sdea + sdea_len;
    738 
    739 		if (instance_id != *sdea++)
    740 			continue; /* Mismatching Instance ID */
    741 
    742 		*sdea_control = WPA_GET_LE16(sdea);
    743 		sdea += 2;
    744 
    745 		if (*sdea_control & NAN_SDEA_CTRL_RANGE_LIMIT) {
    746 			if (end - sdea < 4)
    747 				continue;
    748 			sdea += 4;
    749 		}
    750 
    751 		if (*sdea_control & NAN_SDEA_CTRL_SRV_UPD_INDIC) {
    752 			if (end - sdea < 1)
    753 				continue;
    754 			sdea++;
    755 		}
    756 
    757 		if (end - sdea >= 2) {
    758 			u16 srv_info_len;
    759 
    760 			srv_info_len = WPA_GET_LE16(sdea);
    761 			sdea += 2;
    762 
    763 			if (srv_info_len > end - sdea)
    764 				continue;
    765 
    766 			if (srv_info_len >= 4 &&
    767 			    WPA_GET_BE24(sdea) == OUI_WFA) {
    768 				*srv_proto_type = sdea[3];
    769 				*ssi = sdea + 4;
    770 				*ssi_len = srv_info_len - 4;
    771 			}
    772 		}
    773 	}
    774 }
    775 
    776 
    777 static void nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
    778 			      const u8 *peer_addr, u8 instance_id,
    779 			      u8 req_instance_id, u16 sdea_control,
    780 			      enum nan_service_protocol_type srv_proto_type,
    781 			      const u8 *ssi, size_t ssi_len)
    782 {
    783 	/* Subscribe function processing of a receive Publish message */
    784 	if (!os_reltime_initialized(&srv->first_discovered)) {
    785 		os_get_reltime(&srv->first_discovered);
    786 		srv->needs_fsd = sdea_control & NAN_SDEA_CTRL_FSD_REQ;
    787 		nan_de_run_timer(de);
    788 	}
    789 
    790 	if (srv->subscribe.active && req_instance_id == 0) {
    791 		/* Active subscriber replies with a Subscribe message if it
    792 		 * received a matching unsolicited Publish message. */
    793 		nan_de_tx_multicast(de, srv, instance_id);
    794 	}
    795 
    796 	if (!srv->subscribe.active && req_instance_id == 0) {
    797 		/* Passive subscriber replies with a Follow-up message without
    798 		 * Service Specific Info field if it received a matching
    799 		 * unsolicited Publish message. */
    800 		nan_de_transmit(de, srv->id, NULL, NULL, peer_addr,
    801 				instance_id);
    802 	}
    803 
    804 	if (de->cb.discovery_result)
    805 		de->cb.discovery_result(
    806 			de->cb.ctx, srv->id, srv_proto_type,
    807 			ssi, ssi_len, instance_id,
    808 			peer_addr,
    809 			sdea_control & NAN_SDEA_CTRL_FSD_REQ,
    810 			sdea_control & NAN_SDEA_CTRL_FSD_GAS);
    811 }
    812 
    813 
    814 static bool nan_de_filter_match(struct nan_de_service *srv,
    815 				const u8 *matching_filter,
    816 				size_t matching_filter_len)
    817 {
    818 	const u8 *pos, *end;
    819 
    820 	/* Since we do not currently support matching_filter_rx values for the
    821 	 * local Publish function, any matching filter with at least one
    822 	 * <length,value> pair with length larger than zero implies a mismatch.
    823 	 */
    824 
    825 	if (!matching_filter)
    826 		return true;
    827 
    828 	pos = matching_filter;
    829 	end = matching_filter + matching_filter_len;
    830 
    831 	while (pos < end) {
    832 		u8 len;
    833 
    834 		len = *pos++;
    835 		if (len > end - pos)
    836 			break;
    837 		if (len) {
    838 			/* A non-empty Matching Filter entry: no match since
    839 			 * there is no local matching_filter_rx. */
    840 			return false;
    841 		}
    842 	}
    843 
    844 	return true;
    845 }
    846 
    847 
    848 static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
    849 				const u8 *peer_addr, u8 instance_id,
    850 				const u8 *matching_filter,
    851 				size_t matching_filter_len,
    852 				enum nan_service_protocol_type srv_proto_type,
    853 				const u8 *ssi, size_t ssi_len)
    854 {
    855 	struct wpabuf *buf;
    856 	size_t len = 0, sda_len, sdea_len;
    857 	u8 ctrl = 0;
    858 	u16 sdea_ctrl = 0;
    859 
    860 	/* Publish function processing of a receive Subscribe message */
    861 
    862 	if (!nan_de_filter_match(srv, matching_filter, matching_filter_len))
    863 		return;
    864 
    865 	if (!srv->publish.solicited)
    866 		return;
    867 
    868 	if (os_reltime_initialized(&srv->pause_state_end) &&
    869 	    (!ether_addr_equal(peer_addr, srv->sel_peer_addr) ||
    870 	     instance_id != srv->sel_peer_id)) {
    871 		wpa_printf(MSG_DEBUG,
    872 			   "NAN: In pauseState - ignore Subscribe message from another subscriber");
    873 		return;
    874 	}
    875 
    876 	/* Reply with a solicited Publish message */
    877 	/* Service Descriptor attribute */
    878 	sda_len = NAN_SERVICE_ID_LEN + 1 + 1 + 1;
    879 	len += NAN_ATTR_HDR_LEN + sda_len;
    880 
    881 	/* Service Descriptor Extension attribute */
    882 	sdea_len = 1 + 2;
    883 	if (srv->ssi)
    884 		sdea_len += 2 + 4 + wpabuf_len(srv->ssi);
    885 	len += NAN_ATTR_HDR_LEN + sdea_len;
    886 
    887 	/* Element Container attribute */
    888 	if (srv->elems)
    889 		len += NAN_ATTR_HDR_LEN + 1 + wpabuf_len(srv->elems);
    890 
    891 	buf = nan_de_alloc_sdf(len);
    892 	if (!buf)
    893 		return;
    894 
    895 	/* Service Descriptor attribute */
    896 	wpabuf_put_u8(buf, NAN_ATTR_SDA);
    897 	wpabuf_put_le16(buf, sda_len);
    898 	wpabuf_put_data(buf, srv->service_id, NAN_SERVICE_ID_LEN);
    899 	wpabuf_put_u8(buf, srv->id); /* Instance ID */
    900 	wpabuf_put_u8(buf, instance_id); /* Requestor Instance ID */
    901 	ctrl |= NAN_SRV_CTRL_PUBLISH;
    902 	wpabuf_put_u8(buf, ctrl);
    903 
    904 	/* Service Descriptor Extension attribute */
    905 	if (srv->type == NAN_DE_PUBLISH || srv->ssi) {
    906 		wpabuf_put_u8(buf, NAN_ATTR_SDEA);
    907 		wpabuf_put_le16(buf, sdea_len);
    908 		wpabuf_put_u8(buf, srv->id); /* Instance ID */
    909 		if (srv->type == NAN_DE_PUBLISH) {
    910 			if (srv->publish.fsd)
    911 				sdea_ctrl |= NAN_SDEA_CTRL_FSD_REQ;
    912 			if (srv->publish.fsd_gas)
    913 				sdea_ctrl |= NAN_SDEA_CTRL_FSD_GAS;
    914 		}
    915 		wpabuf_put_le16(buf, sdea_ctrl);
    916 		if (srv->ssi) {
    917 			wpabuf_put_le16(buf, 4 + wpabuf_len(srv->ssi));
    918 			wpabuf_put_be24(buf, OUI_WFA);
    919 			wpabuf_put_u8(buf, srv->srv_proto_type);
    920 			wpabuf_put_buf(buf, srv->ssi);
    921 		}
    922 	}
    923 
    924 	/* Element Container attribute */
    925 	if (srv->elems) {
    926 		wpabuf_put_u8(buf, NAN_ATTR_ELEM_CONTAINER);
    927 		wpabuf_put_le16(buf, 1 + wpabuf_len(srv->elems));
    928 		wpabuf_put_u8(buf, 0); /* Map ID */
    929 		wpabuf_put_buf(buf, srv->elems);
    930 	}
    931 
    932 	/* Wi-Fi Aware specification v4.0 uses NAN Cluster ID as A3 for USD,
    933 	 * but there is no synchronization in USD as as such, no NAN Cluster
    934 	 * either. Use Wildcard BSSID instead. */
    935 	nan_de_tx(de, srv->freq, 100,
    936 		  srv->publish.solicited_multicast ? nan_network_id : peer_addr,
    937 		  de->nmi, wildcard_bssid, buf);
    938 	wpabuf_free(buf);
    939 
    940 	nan_de_pause_state(srv, peer_addr, instance_id);
    941 
    942 	if (!srv->publish.disable_events && de->cb.replied)
    943 		de->cb.replied(de->cb.ctx, srv->id, peer_addr, instance_id,
    944 			       srv_proto_type, ssi, ssi_len);
    945 }
    946 
    947 
    948 static void nan_de_rx_follow_up(struct nan_de *de, struct nan_de_service *srv,
    949 				const u8 *peer_addr, u8 instance_id,
    950 				const u8 *ssi, size_t ssi_len)
    951 {
    952 	/* Follow-up function processing of a receive Follow-up message for a
    953 	 * Subscribe or Publish instance */
    954 
    955 	if (srv->type == NAN_DE_PUBLISH &&
    956 	    os_reltime_initialized(&srv->pause_state_end) &&
    957 	    (!ether_addr_equal(peer_addr, srv->sel_peer_addr) ||
    958 	     instance_id != srv->sel_peer_id ||
    959 	     !ssi)) {
    960 		wpa_printf(MSG_DEBUG,
    961 			   "NAN: In pauseState - ignore Follow-up message from another subscriber or without ssi");
    962 		return;
    963 	}
    964 
    965 	os_get_reltime(&srv->last_followup);
    966 
    967 	if (srv->type == NAN_DE_PUBLISH && !ssi)
    968 		nan_de_pause_state(srv, peer_addr, instance_id);
    969 
    970 	if (de->cb.receive)
    971 		de->cb.receive(de->cb.ctx, srv->id, instance_id, ssi, ssi_len,
    972 			       peer_addr);
    973 }
    974 
    975 
    976 static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr,
    977 			  unsigned int freq, const u8 *buf, size_t len,
    978 			  const u8 *sda, size_t sda_len)
    979 {
    980 	const u8 *service_id;
    981 	u8 instance_id, req_instance_id, ctrl;
    982 	u16 sdea_control = 0;
    983 	unsigned int i;
    984 	enum nan_service_control_type type = 0;
    985 	enum nan_service_protocol_type srv_proto_type = 0;
    986 	const u8 *ssi = NULL;
    987 	size_t ssi_len = 0;
    988 	bool first = true;
    989 	const u8 *end;
    990 	const u8 *matching_filter = NULL;
    991 	size_t matching_filter_len = 0;
    992 
    993 	if (sda_len < NAN_SERVICE_ID_LEN + 1 + 1 + 1)
    994 		return;
    995 	end = sda + sda_len;
    996 
    997 	service_id = sda;
    998 	sda += NAN_SERVICE_ID_LEN;
    999 	instance_id = *sda++;
   1000 	req_instance_id = *sda++;
   1001 	ctrl = *sda;
   1002 	type = ctrl & NAN_SRV_CTRL_TYPE_MASK;
   1003 	wpa_printf(MSG_DEBUG,
   1004 		   "NAN: SDA - Service ID %02x%02x%02x%02x%02x%02x Instance ID %u Requestor Instance ID %u Service Control 0x%x (Service Control Type %u)",
   1005 		   MAC2STR(service_id), instance_id, req_instance_id,
   1006 		   ctrl, type);
   1007 	if (type != NAN_SRV_CTRL_PUBLISH &&
   1008 	    type != NAN_SRV_CTRL_SUBSCRIBE &&
   1009 	    type != NAN_SRV_CTRL_FOLLOW_UP) {
   1010 		wpa_printf(MSG_DEBUG,
   1011 			   "NAN: Discard SDF with unknown Service Control Type %u",
   1012 			   type);
   1013 		return;
   1014 	}
   1015 
   1016 	if (ctrl & NAN_SRV_CTRL_BINDING_BITMAP) {
   1017 		if (end - sda < 2)
   1018 			return;
   1019 		sda += 2;
   1020 	}
   1021 
   1022 	if (ctrl & NAN_SRV_CTRL_MATCHING_FILTER) {
   1023 		u8 flen;
   1024 
   1025 		if (end - sda < 1)
   1026 			return;
   1027 		flen = *sda++;
   1028 		if (end - sda < flen)
   1029 			return;
   1030 		matching_filter = sda;
   1031 		matching_filter_len = flen;
   1032 		sda += flen;
   1033 	}
   1034 
   1035 	if (ctrl & NAN_SRV_CTRL_RESP_FILTER) {
   1036 		u8 flen;
   1037 
   1038 		if (end - sda < 1)
   1039 			return;
   1040 		flen = *sda++;
   1041 		if (end - sda < flen)
   1042 			return;
   1043 		sda += flen;
   1044 	}
   1045 
   1046 	if (ctrl & NAN_SRV_CTRL_SRV_INFO) {
   1047 		u8 flen;
   1048 
   1049 		if (end - sda < 1)
   1050 			return;
   1051 		flen = *sda++;
   1052 		if (end - sda < flen)
   1053 			return;
   1054 		if (flen >= 4 && WPA_GET_BE24(sda) == OUI_WFA) {
   1055 			srv_proto_type = sda[3];
   1056 			ssi = sda + 4;
   1057 			ssi_len = flen - 4;
   1058 			wpa_printf(MSG_DEBUG, "NAN: Service Protocol Type %d",
   1059 				   srv_proto_type);
   1060 			wpa_hexdump(MSG_MSGDUMP, "NAN: ssi", ssi, ssi_len);
   1061 		}
   1062 		sda += flen;
   1063 	}
   1064 
   1065 	for (i = 0; i < NAN_DE_MAX_SERVICE; i++) {
   1066 		struct nan_de_service *srv = de->service[i];
   1067 
   1068 		if (!srv)
   1069 			continue;
   1070 		if (os_memcmp(srv->service_id, service_id,
   1071 			      NAN_SERVICE_ID_LEN) != 0)
   1072 			continue;
   1073 		if (type == NAN_SRV_CTRL_PUBLISH) {
   1074 			if (srv->type == NAN_DE_PUBLISH)
   1075 				continue;
   1076 			if (req_instance_id && srv->id != req_instance_id)
   1077 				continue;
   1078 		}
   1079 		if (type == NAN_SRV_CTRL_SUBSCRIBE &&
   1080 		    srv->type == NAN_DE_SUBSCRIBE)
   1081 			continue;
   1082 		wpa_printf(MSG_DEBUG, "NAN: Received SDF matches service ID %u",
   1083 			   i + 1);
   1084 
   1085 		if (first) {
   1086 			first = false;
   1087 			nan_de_get_sdea(buf, len, instance_id, &sdea_control,
   1088 					&srv_proto_type, &ssi, &ssi_len);
   1089 
   1090 			if (ssi) {
   1091 				wpa_printf(MSG_DEBUG,
   1092 					   "NAN: Service Protocol Type %d",
   1093 					   srv_proto_type);
   1094 				wpa_hexdump(MSG_MSGDUMP, "NAN: ssi",
   1095 					    ssi, ssi_len);
   1096 			}
   1097 		}
   1098 
   1099 		switch (type) {
   1100 		case NAN_SRV_CTRL_PUBLISH:
   1101 			nan_de_rx_publish(de, srv, peer_addr, instance_id,
   1102 					  req_instance_id,
   1103 					  sdea_control, srv_proto_type,
   1104 					  ssi, ssi_len);
   1105 			break;
   1106 		case NAN_SRV_CTRL_SUBSCRIBE:
   1107 			nan_de_rx_subscribe(de, srv, peer_addr, instance_id,
   1108 					    matching_filter,
   1109 					    matching_filter_len,
   1110 					    srv_proto_type,
   1111 					    ssi, ssi_len);
   1112 			break;
   1113 		case NAN_SRV_CTRL_FOLLOW_UP:
   1114 			nan_de_rx_follow_up(de, srv, peer_addr, instance_id,
   1115 					    ssi, ssi_len);
   1116 			break;
   1117 		}
   1118 	}
   1119 }
   1120 
   1121 
   1122 void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, unsigned int freq,
   1123 		   const u8 *buf, size_t len)
   1124 {
   1125 	const u8 *sda;
   1126 	u16 sda_len;
   1127 	unsigned int skip;
   1128 
   1129 	if (!de->num_service)
   1130 		return;
   1131 
   1132 	wpa_printf(MSG_DEBUG, "NAN: RX SDF from " MACSTR " freq=%u len=%zu",
   1133 		   MAC2STR(peer_addr), freq, len);
   1134 
   1135 	wpa_hexdump(MSG_MSGDUMP, "NAN: SDF payload", buf, len);
   1136 
   1137 	for (skip = 0; ; skip++) {
   1138 		sda = nan_de_get_attr(buf, len, NAN_ATTR_SDA, skip);
   1139 		if (!sda)
   1140 			break;
   1141 
   1142 		sda++;
   1143 		sda_len = WPA_GET_LE16(sda);
   1144 		sda += 2;
   1145 		nan_de_rx_sda(de, peer_addr, freq, buf, len, sda, sda_len);
   1146 	}
   1147 }
   1148 
   1149 
   1150 static int nan_de_get_handle(struct nan_de *de)
   1151 {
   1152 	int i = de->next_handle;
   1153 
   1154 	if (de->num_service >= NAN_DE_MAX_SERVICE)
   1155 		goto fail;
   1156 
   1157 	do {
   1158 		if (!de->service[i]) {
   1159 			de->next_handle = (i + 1) % NAN_DE_MAX_SERVICE;
   1160 			return i + 1;
   1161 		}
   1162 		i = (i + 1) % NAN_DE_MAX_SERVICE;
   1163 	} while (i != de->next_handle);
   1164 
   1165 fail:
   1166 	wpa_printf(MSG_DEBUG, "NAN: No more room for a new service");
   1167 	return -1;
   1168 }
   1169 
   1170 
   1171 static int nan_de_derive_service_id(struct nan_de_service *srv)
   1172 {
   1173 	u8 hash[SHA256_MAC_LEN];
   1174 	char *name, *pos;
   1175 	int ret;
   1176 	const u8 *addr[1];
   1177 	size_t len[1];
   1178 
   1179 	name = os_strdup(srv->service_name);
   1180 	if (!name)
   1181 		return -1;
   1182 	pos = name;
   1183 	while (*pos) {
   1184 		*pos = tolower(*pos);
   1185 		pos++;
   1186 	}
   1187 
   1188 	addr[0] = (u8 *) name;
   1189 	len[0] = os_strlen(name);
   1190 	ret = sha256_vector(1, addr, len, hash);
   1191 	os_free(name);
   1192 	if (ret == 0)
   1193 		os_memcpy(srv->service_id, hash, NAN_SERVICE_ID_LEN);
   1194 
   1195 	return ret;
   1196 }
   1197 
   1198 
   1199 int nan_de_publish(struct nan_de *de, const char *service_name,
   1200 		   enum nan_service_protocol_type srv_proto_type,
   1201 		   const struct wpabuf *ssi, const struct wpabuf *elems,
   1202 		   struct nan_publish_params *params)
   1203 {
   1204 	int publish_id;
   1205 	struct nan_de_service *srv;
   1206 
   1207 	if (!service_name) {
   1208 		wpa_printf(MSG_DEBUG, "NAN: Publish() - no service_name");
   1209 		return -1;
   1210 	}
   1211 
   1212 	if (!params->unsolicited && !params->solicited) {
   1213 		wpa_printf(MSG_INFO,
   1214 			   "NAN: Publish() - both unsolicited and solicited disabled is invalid");
   1215 		return -1;
   1216 	}
   1217 
   1218 	publish_id = nan_de_get_handle(de);
   1219 	if (publish_id < 1)
   1220 		return -1;
   1221 
   1222 	srv = os_zalloc(sizeof(*srv));
   1223 	if (!srv)
   1224 		return -1;
   1225 	srv->type = NAN_DE_PUBLISH;
   1226 	srv->freq = srv->default_freq = params->freq;
   1227 	srv->service_name = os_strdup(service_name);
   1228 	if (!srv->service_name)
   1229 		goto fail;
   1230 	if (nan_de_derive_service_id(srv) < 0)
   1231 		goto fail;
   1232 	os_memcpy(&srv->publish, params, sizeof(*params));
   1233 
   1234 	if (params->freq_list) {
   1235 		size_t len;
   1236 
   1237 		len = (int_array_len(params->freq_list) + 1) * sizeof(int);
   1238 		srv->freq_list = os_memdup(params->freq_list, len);
   1239 		if (!srv->freq_list)
   1240 			goto fail;
   1241 	}
   1242 	srv->publish.freq_list = NULL;
   1243 
   1244 	srv->srv_proto_type = srv_proto_type;
   1245 	if (ssi) {
   1246 		srv->ssi = wpabuf_dup(ssi);
   1247 		if (!srv->ssi)
   1248 			goto fail;
   1249 	}
   1250 	if (elems) {
   1251 		srv->elems = wpabuf_dup(elems);
   1252 		if (!srv->elems)
   1253 			goto fail;
   1254 	}
   1255 
   1256 	/* Prepare for single and multi-channel states; starting with
   1257 	 * single channel */
   1258 	srv->first_multi_chan = true;
   1259 	nan_de_start_new_publish_state(srv, true);
   1260 
   1261 	wpa_printf(MSG_DEBUG, "NAN: Assigned new publish handle %d for %s",
   1262 		   publish_id, service_name);
   1263 	srv->id = publish_id;
   1264 	nan_de_add_srv(de, srv);
   1265 	nan_de_run_timer(de);
   1266 	return publish_id;
   1267 fail:
   1268 	nan_de_service_free(srv);
   1269 	return -1;
   1270 }
   1271 
   1272 
   1273 void nan_de_cancel_publish(struct nan_de *de, int publish_id)
   1274 {
   1275 	struct nan_de_service *srv;
   1276 
   1277 	wpa_printf(MSG_DEBUG, "NAN: CancelPublish(publish_id=%d)", publish_id);
   1278 
   1279 	if (publish_id < 1 || publish_id > NAN_DE_MAX_SERVICE)
   1280 		return;
   1281 	srv = de->service[publish_id - 1];
   1282 	if (!srv || srv->type != NAN_DE_PUBLISH)
   1283 		return;
   1284 	nan_de_del_srv(de, srv, NAN_DE_REASON_USER_REQUEST);
   1285 }
   1286 
   1287 
   1288 int nan_de_update_publish(struct nan_de *de, int publish_id,
   1289 			  const struct wpabuf *ssi)
   1290 {
   1291 	struct nan_de_service *srv;
   1292 
   1293 	wpa_printf(MSG_DEBUG, "NAN: UpdatePublish(publish_id=%d)", publish_id);
   1294 
   1295 	if (publish_id < 1 || publish_id > NAN_DE_MAX_SERVICE)
   1296 		return -1;
   1297 	srv = de->service[publish_id - 1];
   1298 	if (!srv || srv->type != NAN_DE_PUBLISH)
   1299 		return -1;
   1300 
   1301 	wpabuf_free(srv->ssi);
   1302 	srv->ssi = NULL;
   1303 	if (!ssi)
   1304 		return 0;
   1305 	srv->ssi = wpabuf_dup(ssi);
   1306 	if (!srv->ssi)
   1307 		return -1;
   1308 	return 0;
   1309 }
   1310 
   1311 
   1312 int nan_de_subscribe(struct nan_de *de, const char *service_name,
   1313 		     enum nan_service_protocol_type srv_proto_type,
   1314 		     const struct wpabuf *ssi, const struct wpabuf *elems,
   1315 		     struct nan_subscribe_params *params)
   1316 {
   1317 	int subscribe_id;
   1318 	struct nan_de_service *srv;
   1319 
   1320 	if (!service_name) {
   1321 		wpa_printf(MSG_DEBUG, "NAN: Subscribe() - no service_name");
   1322 		return -1;
   1323 	}
   1324 
   1325 	subscribe_id = nan_de_get_handle(de);
   1326 	if (subscribe_id < 1)
   1327 		return -1;
   1328 
   1329 	srv = os_zalloc(sizeof(*srv));
   1330 	if (!srv)
   1331 		return -1;
   1332 	srv->type = NAN_DE_SUBSCRIBE;
   1333 	srv->freq = params->freq;
   1334 	srv->service_name = os_strdup(service_name);
   1335 	if (!srv->service_name)
   1336 		goto fail;
   1337 	if (nan_de_derive_service_id(srv) < 0)
   1338 		goto fail;
   1339 	os_memcpy(&srv->subscribe, params, sizeof(*params));
   1340 	srv->srv_proto_type = srv_proto_type;
   1341 	if (ssi) {
   1342 		srv->ssi = wpabuf_dup(ssi);
   1343 		if (!srv->ssi)
   1344 			goto fail;
   1345 	}
   1346 	if (elems) {
   1347 		srv->elems = wpabuf_dup(elems);
   1348 		if (!srv->elems)
   1349 			goto fail;
   1350 	}
   1351 
   1352 	wpa_printf(MSG_DEBUG, "NAN: Assigned new subscribe handle %d for %s",
   1353 		   subscribe_id, service_name);
   1354 	srv->id = subscribe_id;
   1355 	nan_de_add_srv(de, srv);
   1356 	nan_de_run_timer(de);
   1357 	return subscribe_id;
   1358 fail:
   1359 	nan_de_service_free(srv);
   1360 	return -1;
   1361 }
   1362 
   1363 
   1364 void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id)
   1365 {
   1366 	struct nan_de_service *srv;
   1367 
   1368 	if (subscribe_id < 1 || subscribe_id > NAN_DE_MAX_SERVICE)
   1369 		return;
   1370 	srv = de->service[subscribe_id - 1];
   1371 	if (!srv || srv->type != NAN_DE_SUBSCRIBE)
   1372 		return;
   1373 	nan_de_del_srv(de, srv, NAN_DE_REASON_USER_REQUEST);
   1374 }
   1375 
   1376 
   1377 int nan_de_transmit(struct nan_de *de, int handle,
   1378 		    const struct wpabuf *ssi, const struct wpabuf *elems,
   1379 		    const u8 *peer_addr, u8 req_instance_id)
   1380 {
   1381 	struct nan_de_service *srv;
   1382 
   1383 	if (handle < 1 || handle > NAN_DE_MAX_SERVICE)
   1384 		return -1;
   1385 
   1386 	srv = de->service[handle - 1];
   1387 	if (!srv)
   1388 		return -1;
   1389 
   1390 	nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_FOLLOW_UP,
   1391 		      peer_addr, req_instance_id, ssi);
   1392 
   1393 	os_get_reltime(&srv->last_followup);
   1394 	return 0;
   1395 }
   1396