int handle = 0;
int req_instance_id = 0;
struct wpabuf *ssi = NULL;
- u8 peer_addr[ETH_ALEN], a3[ETH_ALEN];
+ u8 peer_addr[ETH_ALEN];
int ret = -1;
- bool a3_set = false;
os_memset(peer_addr, 0, ETH_ALEN);
- os_memset(a3, 0, ETH_ALEN);
while ((token = str_token(cmd, " ", &context))) {
if (sscanf(token, "handle=%i", &handle) == 1)
continue;
}
- if (os_strncmp(token, "a3=", 3) == 0) {
- if (hwaddr_aton(token + 3, a3) < 0)
- return -1;
- a3_set = true;
- continue;
- }
-
if (os_strncmp(token, "ssi=", 4) == 0) {
if (ssi)
goto fail;
}
ret = hostapd_nan_usd_transmit(hapd, handle, ssi, NULL, peer_addr,
- a3_set ? a3 : NULL, req_instance_id);
+ req_instance_id);
fail:
wpabuf_free(ssi);
return ret;
static void hostapd_nan_de_receive(void *ctx, int id, int peer_instance_id,
const u8 *ssi, size_t ssi_len,
- const u8 *peer_addr, const u8 *a3)
+ const u8 *peer_addr)
{
struct hostapd_data *hapd = ctx;
char *ssi_hex;
if (ssi)
wpa_snprintf_hex(ssi_hex, 2 * ssi_len + 1, ssi, ssi_len);
wpa_msg(hapd->msg_ctx, MSG_INFO, NAN_RECEIVE
- "id=%d peer_instance_id=%d address=" MACSTR " a3=" MACSTR
- " ssi=%s",
- id, peer_instance_id, MAC2STR(peer_addr), MAC2STR(a3), ssi_hex);
+ "id=%d peer_instance_id=%d address=" MACSTR " ssi=%s",
+ id, peer_instance_id, MAC2STR(peer_addr), ssi_hex);
os_free(ssi_hex);
}
int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle,
const struct wpabuf *ssi,
const struct wpabuf *elems,
- const u8 *peer_addr, const u8 *a3,
+ const u8 *peer_addr,
u8 req_instance_id)
{
if (!hapd->nan_de)
return -1;
- return nan_de_transmit(hapd->nan_de, handle, ssi, elems, peer_addr, a3,
+ return nan_de_transmit(hapd->nan_de, handle, ssi, elems, peer_addr,
req_instance_id);
}
int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle,
const struct wpabuf *ssi,
const struct wpabuf *elems,
- const u8 *peer_addr, const u8 *a3,
- u8 req_instance_id);
+ const u8 *peer_addr, u8 req_instance_id);
void hostapd_nan_usd_remain_on_channel_cb(struct hostapd_data *hapd,
unsigned int freq,
unsigned int duration);
unsigned int freq;
unsigned int default_freq;
int *freq_list;
+ u8 a3[ETH_ALEN];
+ bool a3_set;
/* pauseState information for Publish function */
struct os_reltime pause_state_end;
/* Passive subscriber replies with a Follow-up message without
* Service Specific Info field if it received a matching
* unsolicited Publish message. */
- nan_de_transmit(de, srv->id, NULL, NULL, peer_addr, a3,
+ nan_de_transmit(de, srv->id, NULL, NULL, peer_addr,
instance_id);
}
if (srv->type == NAN_DE_PUBLISH && !ssi)
nan_de_pause_state(srv, peer_addr, instance_id);
+ os_memcpy(srv->a3, a3, ETH_ALEN);
+ srv->a3_set = true;
+
if (de->cb.receive)
de->cb.receive(de->cb.ctx, srv->id, instance_id, ssi, ssi_len,
- peer_addr, a3);
+ peer_addr);
}
int nan_de_transmit(struct nan_de *de, int handle,
const struct wpabuf *ssi, const struct wpabuf *elems,
- const u8 *peer_addr, const u8 *a3, u8 req_instance_id)
+ const u8 *peer_addr, u8 req_instance_id)
{
struct nan_de_service *srv;
+ const u8 *a3;
if (handle < 1 || handle > NAN_DE_MAX_SERVICE)
return -1;
if (!srv)
return -1;
- if (!a3)
+ if (srv->a3_set)
+ a3 = srv->a3;
+ else
a3 = nan_network_id;
nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_FOLLOW_UP,
peer_addr, a3, req_instance_id, ssi);
void (*receive)(void *ctx, int id, int peer_instance_id,
const u8 *ssi, size_t ssi_len,
- const u8 *peer_addr, const u8 *a3);
+ const u8 *peer_addr);
void (*process_p2p_usd_elems)(void *ctx, const u8 *buf,
u16 buf_len, const u8 *peer_addr,
* req_instance_id = peer publish_id or subscribe_id */
int nan_de_transmit(struct nan_de *de, int handle,
const struct wpabuf *ssi, const struct wpabuf *elems,
- const u8 *peer_addr, const u8 *a3, u8 req_instance_id);
+ const u8 *peer_addr, u8 req_instance_id);
#endif /* NAN_DE_H */
int handle = 0;
int req_instance_id = 0;
struct wpabuf *ssi = NULL;
- u8 peer_addr[ETH_ALEN], a3[ETH_ALEN];
+ u8 peer_addr[ETH_ALEN];
int ret = -1;
- bool a3_set = false;
os_memset(peer_addr, 0, ETH_ALEN);
- os_memset(a3, 0, ETH_ALEN);
while ((token = str_token(cmd, " ", &context))) {
if (sscanf(token, "handle=%i", &handle) == 1)
continue;
}
- if (os_strncmp(token, "a3=", 3) == 0) {
- if (hwaddr_aton(token + 3, a3) < 0)
- return -1;
- a3_set = true;
- continue;
- }
-
if (os_strncmp(token, "ssi=", 4) == 0) {
if (ssi)
goto fail;
}
ret = wpas_nan_usd_transmit(wpa_s, handle, ssi, NULL, peer_addr,
- a3_set ? a3 : NULL, req_instance_id);
+ req_instance_id);
fail:
wpabuf_free(ssi);
return ret;
static void wpas_nan_de_receive(void *ctx, int id, int peer_instance_id,
const u8 *ssi, size_t ssi_len,
- const u8 *peer_addr, const u8 *a3)
+ const u8 *peer_addr)
{
struct wpa_supplicant *wpa_s = ctx;
- wpas_notify_nan_receive(wpa_s, id, peer_instance_id, peer_addr, a3,
+ wpas_notify_nan_receive(wpa_s, id, peer_instance_id, peer_addr,
ssi, ssi_len);
}
int wpas_nan_usd_transmit(struct wpa_supplicant *wpa_s, int handle,
const struct wpabuf *ssi, const struct wpabuf *elems,
- const u8 *peer_addr, const u8 *a3, u8 req_instance_id)
+ const u8 *peer_addr, u8 req_instance_id)
{
if (!wpa_s->nan_de)
return -1;
- return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr, a3,
+ return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr,
req_instance_id);
}
int subscribe_id);
int wpas_nan_usd_transmit(struct wpa_supplicant *wpa_s, int handle,
const struct wpabuf *ssi, const struct wpabuf *elems,
- const u8 *peer_addr, const u8 *a3,
- u8 req_instance_id);
+ const u8 *peer_addr, u8 req_instance_id);
void wpas_nan_usd_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
unsigned int freq,
unsigned int duration);
void wpas_notify_nan_receive(struct wpa_supplicant *wpa_s, int id,
int peer_instance_id, const u8 *peer_addr,
- const u8 *a3,
const u8 *ssi, size_t ssi_len)
{
char *ssi_hex;
if (ssi)
wpa_snprintf_hex(ssi_hex, 2 * ssi_len + 1, ssi, ssi_len);
wpa_msg(wpa_s, MSG_INFO, NAN_RECEIVE
- "id=%d peer_instance_id=%d address=" MACSTR " a3=" MACSTR
- " ssi=%s",
- id, peer_instance_id, MAC2STR(peer_addr), MAC2STR(a3), ssi_hex);
+ "id=%d peer_instance_id=%d address=" MACSTR " ssi=%s",
+ id, peer_instance_id, MAC2STR(peer_addr), ssi_hex);
os_free(ssi_hex);
}
const u8 *ssi, size_t ssi_len);
void wpas_notify_nan_receive(struct wpa_supplicant *wpa_s, int id,
int peer_instance_id, const u8 *peer_addr,
- const u8 *a3,
const u8 *ssi, size_t ssi_len);
void wpas_notify_nan_publish_terminated(struct wpa_supplicant *wpa_s,
int publish_id,