]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
NAN: Update A3 for USD to use NAN Network ID or NAN Cluster ID in A3
authorJouni Malinen <quic_jouni@quicinc.com>
Fri, 13 Sep 2024 18:58:51 +0000 (21:58 +0300)
committerJouni Malinen <j@w1.fi>
Fri, 13 Sep 2024 19:11:54 +0000 (22:11 +0300)
Wi-Fi Aware spec v4.0 was not clear on all cases and used a bit unclear
definition of A3 use in Table 5 (Address field definiton for NAN SDF
frames in USD). That resulted in the initial implementation using
Wildcard BSSID to comply with the IEEE 802.11 rules on Public Action
frame addressing.

For USD to have chances of working with synchronized NNA devices, A3
needs to be set to the NAN Cluster ID when replying to a frame received
from a synchronized NAN device. While there is no cluster ID for USD,
this can be done by copying the A3 from the received frame. For the
cases where sending out an unsolicited multicast frame, the NAN Network
ID should be used instead of the Wildcard BSSID.

While this behavior is not strictly speaking compliant with the IEEE
802.11 standard, this is the expected behavior for NAN devices, so
update the USD implementation to match.

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
13 files changed:
hostapd/ctrl_iface.c
src/ap/drv_callbacks.c
src/ap/ieee802_11.c
src/ap/nan_usd_ap.c
src/ap/nan_usd_ap.h
src/common/nan_de.c
src/common/nan_de.h
wpa_supplicant/ctrl_iface.c
wpa_supplicant/events.c
wpa_supplicant/nan_usd.c
wpa_supplicant/nan_usd.h
wpa_supplicant/notify.c
wpa_supplicant/notify.h

index 2f581be0bae07c2e34a3e8e934173e7c458058ba..d5a906691c7eef24c6dd793f839f6e1488be25de 100644 (file)
@@ -3976,10 +3976,12 @@ static int hostapd_ctrl_nan_transmit(struct hostapd_data *hapd, char *cmd)
        int handle = 0;
        int req_instance_id = 0;
        struct wpabuf *ssi = NULL;
-       u8 peer_addr[ETH_ALEN];
+       u8 peer_addr[ETH_ALEN], a3[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)
@@ -3994,6 +3996,13 @@ static int hostapd_ctrl_nan_transmit(struct hostapd_data *hapd, char *cmd)
                        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;
@@ -4022,7 +4031,7 @@ static int hostapd_ctrl_nan_transmit(struct hostapd_data *hapd, char *cmd)
        }
 
        ret = hostapd_nan_usd_transmit(hapd, handle, ssi, NULL, peer_addr,
-                                   req_instance_id);
+                                      a3_set ? a3 : NULL, req_instance_id);
 fail:
        wpabuf_free(ssi);
        return ret;
index 4862c4f4f62b90bb836134b48f60bc9fa01bc742..ab76a5fc62c5fb1838b68676ff233c3d11a2b6be 100644 (file)
@@ -1788,8 +1788,8 @@ static void hostapd_action_rx(struct hostapd_data *hapd,
                pos = mgmt->u.action.u.vs_public_action.variable;
                end = drv_mgmt->frame + drv_mgmt->frame_len;
                pos++;
-               hostapd_nan_usd_rx_sdf(hapd, mgmt->sa, drv_mgmt->freq,
-                                      pos, end - pos);
+               hostapd_nan_usd_rx_sdf(hapd, mgmt->sa, mgmt->bssid,
+                                      drv_mgmt->freq, pos, end - pos);
                return;
        }
 #endif /* CONFIG_NAN_USD */
index 281d18dc60a0977a362c19dbb668014255582218..10b59348f743d5a179f36328cf054cdd669bd34c 100644 (file)
@@ -6149,8 +6149,8 @@ static int handle_action(struct hostapd_data *hapd,
                        pos = mgmt->u.action.u.vs_public_action.variable;
                        end = ((const u8 *) mgmt) + len;
                        pos++;
-                       hostapd_nan_usd_rx_sdf(hapd, mgmt->sa, freq,
-                                              pos, end - pos);
+                       hostapd_nan_usd_rx_sdf(hapd, mgmt->sa, mgmt->bssid,
+                                              freq, pos, end - pos);
                        return 1;
                }
 #endif /* CONFIG_NAN_USD */
index 570abfce017c84b43d7661537fe40696fca6bcf6..c908d6da8661937f38e4bcbd60e13b306ae5aee0 100644 (file)
@@ -29,8 +29,10 @@ static int hostapd_nan_de_tx(void *ctx, unsigned int freq,
                   wpabuf_len(buf));
 
        /* TODO: Force use of OFDM */
-       return hostapd_drv_send_action(hapd, hapd->iface->freq, 0, dst,
-                                      wpabuf_head(buf), wpabuf_len(buf));
+       return hostapd_drv_send_action_forced_addr3(hapd, hapd->iface->freq, 0,
+                                                   dst, bssid,
+                                                   wpabuf_head(buf),
+                                                   wpabuf_len(buf));
 }
 
 
@@ -127,7 +129,7 @@ static void hostapd_nan_de_subscribe_terminated(void *ctx, int subscribe_id,
 
 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 *peer_addr, const u8 *a3)
 {
        struct hostapd_data *hapd = ctx;
        char *ssi_hex;
@@ -138,8 +140,9 @@ static void hostapd_nan_de_receive(void *ctx, int id, int peer_instance_id,
        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 " ssi=%s",
-               id, peer_instance_id, MAC2STR(peer_addr), ssi_hex);
+               "id=%d peer_instance_id=%d address=" MACSTR " a3=" MACSTR
+               " ssi=%s",
+               id, peer_instance_id, MAC2STR(peer_addr), MAC2STR(a3), ssi_hex);
        os_free(ssi_hex);
 }
 
@@ -173,11 +176,12 @@ void hostapd_nan_usd_deinit(struct hostapd_data *hapd)
 
 
 void hostapd_nan_usd_rx_sdf(struct hostapd_data *hapd, const u8 *src,
-                           unsigned int freq, const u8 *buf, size_t len)
+                           const u8 *a3, unsigned int freq,
+                           const u8 *buf, size_t len)
 {
        if (!hapd->nan_de)
                return;
-       nan_de_rx_sdf(hapd->nan_de, src, freq, buf, len);
+       nan_de_rx_sdf(hapd->nan_de, src, a3, freq, buf, len);
 }
 
 
@@ -258,10 +262,11 @@ void hostapd_nan_usd_cancel_subscribe(struct hostapd_data *hapd,
 int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle,
                             const struct wpabuf *ssi,
                             const struct wpabuf *elems,
-                            const u8 *peer_addr, u8 req_instance_id)
+                            const u8 *peer_addr, const u8 *a3,
+                            u8 req_instance_id)
 {
        if (!hapd->nan_de)
                return -1;
-       return nan_de_transmit(hapd->nan_de, handle, ssi, elems, peer_addr,
+       return nan_de_transmit(hapd->nan_de, handle, ssi, elems, peer_addr, a3,
                               req_instance_id);
 }
index 0571643c63e9e10acee1a7dd58136caa9c1b6937..59a164aa596c95f69a4282bf6731b1e468641322 100644 (file)
@@ -16,6 +16,7 @@ enum nan_service_protocol_type;
 int hostapd_nan_usd_init(struct hostapd_data *hapd);
 void hostapd_nan_usd_deinit(struct hostapd_data *hapd);
 void hostapd_nan_usd_rx_sdf(struct hostapd_data *hapd, const u8 *src,
+                           const u8 *a3,
                            unsigned int freq, const u8 *buf, size_t len);
 void hostapd_nan_usd_flush(struct hostapd_data *hapd);
 int hostapd_nan_usd_publish(struct hostapd_data *hapd, const char *service_name,
@@ -35,7 +36,8 @@ void hostapd_nan_usd_cancel_subscribe(struct hostapd_data *hapd,
 int hostapd_nan_usd_transmit(struct hostapd_data *hapd, int handle,
                             const struct wpabuf *ssi,
                             const struct wpabuf *elems,
-                            const u8 *peer_addr, u8 req_instance_id);
+                            const u8 *peer_addr, const u8 *a3,
+                            u8 req_instance_id);
 void hostapd_nan_usd_remain_on_channel_cb(struct hostapd_data *hapd,
                                          unsigned int freq,
                                          unsigned int duration);
index 6051cb85832469f8c7b4786732e9580e83246c64..7f2a796801e9a34b1e6e0f87bcca425be44c67eb 100644 (file)
@@ -18,8 +18,6 @@
 
 static const u8 nan_network_id[ETH_ALEN] =
 { 0x51, 0x6f, 0x9a, 0x01, 0x00, 0x00 };
-static const u8 wildcard_bssid[ETH_ALEN] =
-{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
 
 enum nan_de_service_type {
        NAN_DE_PUBLISH,
@@ -212,7 +210,7 @@ static int nan_de_tx(struct nan_de *de, unsigned int freq,
 static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,
                          unsigned int wait_time,
                          enum nan_service_control_type type,
-                         const u8 *dst, u8 req_instance_id,
+                         const u8 *dst, const u8 *a3, u8 req_instance_id,
                          const struct wpabuf *ssi)
 {
        struct wpabuf *buf;
@@ -274,10 +272,7 @@ static void nan_de_tx_sdf(struct nan_de *de, struct nan_de_service *srv,
                wpabuf_put_buf(buf, srv->elems);
        }
 
-       /* Wi-Fi Aware specification v4.0 uses NAN Cluster ID as A3 for USD,
-        * but there is no synchronization in USD as as such, no NAN Cluster
-        * either. Use Wildcard BSSID instead. */
-       nan_de_tx(de, srv->freq, wait_time, dst, de->nmi, wildcard_bssid, buf);
+       nan_de_tx(de, srv->freq, wait_time, dst, de->nmi, a3, buf);
        wpabuf_free(buf);
 }
 
@@ -358,7 +353,7 @@ static void nan_de_tx_multicast(struct nan_de *de, struct nan_de_service *srv,
                return;
        }
 
-       nan_de_tx_sdf(de, srv, wait_time, type, nan_network_id,
+       nan_de_tx_sdf(de, srv, wait_time, type, nan_network_id, nan_network_id,
                      req_instance_id, srv->ssi);
        os_get_reltime(&srv->last_multicast);
 }
@@ -812,7 +807,7 @@ static void nan_de_process_elem_container(struct nan_de *de, const u8 *buf,
 
 
 static void nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
-                             const u8 *peer_addr, u8 instance_id,
+                             const u8 *peer_addr, const u8 *a3, u8 instance_id,
                              u8 req_instance_id, u16 sdea_control,
                              enum nan_service_protocol_type srv_proto_type,
                              const u8 *ssi, size_t ssi_len)
@@ -834,7 +829,7 @@ static void nan_de_rx_publish(struct nan_de *de, struct nan_de_service *srv,
                /* 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,
+               nan_de_transmit(de, srv->id, NULL, NULL, peer_addr, a3,
                                instance_id);
        }
 
@@ -883,7 +878,8 @@ static bool nan_de_filter_match(struct nan_de_service *srv,
 
 
 static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
-                               const u8 *peer_addr, u8 instance_id,
+                               const u8 *peer_addr, const u8 *a3,
+                               u8 instance_id,
                                const u8 *matching_filter,
                                size_t matching_filter_len,
                                enum nan_service_protocol_type srv_proto_type,
@@ -969,12 +965,12 @@ static void nan_de_rx_subscribe(struct nan_de *de, struct nan_de_service *srv,
                wpabuf_put_buf(buf, srv->elems);
        }
 
-       /* Wi-Fi Aware specification v4.0 uses NAN Cluster ID as A3 for USD,
-        * but there is no synchronization in USD as as such, no NAN Cluster
-        * either. Use Wildcard BSSID instead. */
+       if (srv->publish.solicited_multicast || !a3)
+               a3 = nan_network_id;
+
        nan_de_tx(de, srv->freq, 100,
                  srv->publish.solicited_multicast ? nan_network_id : peer_addr,
-                 de->nmi, wildcard_bssid, buf);
+                 de->nmi, a3, buf);
        wpabuf_free(buf);
 
        nan_de_pause_state(srv, peer_addr, instance_id);
@@ -987,8 +983,8 @@ offload:
 
 
 static void nan_de_rx_follow_up(struct nan_de *de, struct nan_de_service *srv,
-                               const u8 *peer_addr, u8 instance_id,
-                               const u8 *ssi, size_t ssi_len)
+                               const u8 *peer_addr, const u8 *a3,
+                               u8 instance_id, const u8 *ssi, size_t ssi_len)
 {
        /* Follow-up function processing of a receive Follow-up message for a
         * Subscribe or Publish instance */
@@ -1010,11 +1006,11 @@ static void nan_de_rx_follow_up(struct nan_de *de, struct nan_de_service *srv,
 
        if (de->cb.receive)
                de->cb.receive(de->cb.ctx, srv->id, instance_id, ssi, ssi_len,
-                              peer_addr);
+                              peer_addr, a3);
 }
 
 
-static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr,
+static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
                          unsigned int freq, const u8 *buf, size_t len,
                          const u8 *sda, size_t sda_len)
 {
@@ -1141,20 +1137,20 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr,
 
                switch (type) {
                case NAN_SRV_CTRL_PUBLISH:
-                       nan_de_rx_publish(de, srv, peer_addr, instance_id,
+                       nan_de_rx_publish(de, srv, peer_addr, a3, instance_id,
                                          req_instance_id,
                                          sdea_control, srv_proto_type,
                                          ssi, ssi_len);
                        break;
                case NAN_SRV_CTRL_SUBSCRIBE:
-                       nan_de_rx_subscribe(de, srv, peer_addr, instance_id,
+                       nan_de_rx_subscribe(de, srv, peer_addr, a3, instance_id,
                                            matching_filter,
                                            matching_filter_len,
                                            srv_proto_type,
                                            ssi, ssi_len);
                        break;
                case NAN_SRV_CTRL_FOLLOW_UP:
-                       nan_de_rx_follow_up(de, srv, peer_addr, instance_id,
+                       nan_de_rx_follow_up(de, srv, peer_addr, a3, instance_id,
                                            ssi, ssi_len);
                        break;
                }
@@ -1162,8 +1158,8 @@ static void nan_de_rx_sda(struct nan_de *de, const u8 *peer_addr,
 }
 
 
-void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, unsigned int freq,
-                  const u8 *buf, size_t len)
+void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
+                  unsigned int freq, const u8 *buf, size_t len)
 {
        const u8 *sda;
        u16 sda_len;
@@ -1185,7 +1181,7 @@ void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, unsigned int freq,
                sda++;
                sda_len = WPA_GET_LE16(sda);
                sda += 2;
-               nan_de_rx_sda(de, peer_addr, freq, buf, len, sda, sda_len);
+               nan_de_rx_sda(de, peer_addr, a3, freq, buf, len, sda, sda_len);
        }
 }
 
@@ -1445,7 +1441,7 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id)
 
 int nan_de_transmit(struct nan_de *de, int handle,
                    const struct wpabuf *ssi, const struct wpabuf *elems,
-                   const u8 *peer_addr, u8 req_instance_id)
+                   const u8 *peer_addr, const u8 *a3, u8 req_instance_id)
 {
        struct nan_de_service *srv;
 
@@ -1456,8 +1452,10 @@ int nan_de_transmit(struct nan_de *de, int handle,
        if (!srv)
                return -1;
 
+       if (!a3)
+               a3 = nan_network_id;
        nan_de_tx_sdf(de, srv, 100, NAN_SRV_CTRL_FOLLOW_UP,
-                     peer_addr, req_instance_id, ssi);
+                     peer_addr, a3, req_instance_id, ssi);
 
        os_get_reltime(&srv->last_followup);
        return 0;
index 8e5282f981596712f59b61f7c3457cdb5703feea..5d803ef59e30e66d5ed75c34c1286889331788c8 100644 (file)
@@ -52,7 +52,7 @@ struct nan_callbacks {
 
        void (*receive)(void *ctx, int id, int peer_instance_id,
                        const u8 *ssi, size_t ssi_len,
-                       const u8 *peer_addr);
+                       const u8 *peer_addr, const u8 *a3);
 
        void (*process_p2p_usd_elems)(void *ctx, const u8 *buf,
                                      u16 buf_len, const u8 *peer_addr,
@@ -71,8 +71,8 @@ void nan_de_listen_ended(struct nan_de *de, unsigned int freq);
 void nan_de_tx_status(struct nan_de *de, unsigned int freq, const u8 *dst);
 void nan_de_tx_wait_ended(struct nan_de *de);
 
-void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, unsigned int freq,
-                  const u8 *buf, size_t len);
+void nan_de_rx_sdf(struct nan_de *de, const u8 *peer_addr, const u8 *a3,
+                  unsigned int freq, const u8 *buf, size_t len);
 const u8 * nan_de_get_service_id(struct nan_de *de, int id);
 
 struct nan_publish_params {
@@ -149,6 +149,6 @@ void nan_de_cancel_subscribe(struct nan_de *de, int subscribe_id);
  * 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, u8 req_instance_id);
+                   const u8 *peer_addr, const u8 *a3, u8 req_instance_id);
 
 #endif /* NAN_DE_H */
index 6dba46898d505f04e232f8eadf790235d907622b..4b49b72cd04f8f6fbf39f6455a68967219966901 100644 (file)
@@ -12514,10 +12514,12 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd)
        int handle = 0;
        int req_instance_id = 0;
        struct wpabuf *ssi = NULL;
-       u8 peer_addr[ETH_ALEN];
+       u8 peer_addr[ETH_ALEN], a3[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)
@@ -12532,6 +12534,13 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd)
                        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;
@@ -12560,7 +12569,7 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd)
        }
 
        ret = wpas_nan_usd_transmit(wpa_s, handle, ssi, NULL, peer_addr,
-                                   req_instance_id);
+                                   a3_set ? a3 : NULL, req_instance_id);
 fail:
        wpabuf_free(ssi);
        return ret;
index 9e767e010d1a814de976605e5f34e51f3ecf92ab..90e1c7b9fbe6f80edeb72232de4b64dffd27a8ab 100644 (file)
@@ -5540,7 +5540,8 @@ static void wpas_event_rx_mgmt_action(struct wpa_supplicant *wpa_s,
            WPA_GET_BE32(&payload[1]) == NAN_SDF_VENDOR_TYPE) {
                payload += 5;
                plen -= 5;
-               wpas_nan_usd_rx_sdf(wpa_s, mgmt->sa, freq, payload, plen);
+               wpas_nan_usd_rx_sdf(wpa_s, mgmt->sa, mgmt->bssid, freq,
+                                   payload, plen);
                return;
        }
 #endif /* CONFIG_NAN_USD */
index 1125f950f882e081fb018b13386933431e7c2f70..7faa2e508a886d0cc6b68ddfc4f180f6eebae67d 100644 (file)
@@ -282,11 +282,11 @@ static void wpas_nan_de_subscribe_terminated(void *ctx, int subscribe_id,
 
 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 *peer_addr, const u8 *a3)
 {
        struct wpa_supplicant *wpa_s = ctx;
 
-       wpas_notify_nan_receive(wpa_s, id, peer_instance_id, peer_addr,
+       wpas_notify_nan_receive(wpa_s, id, peer_instance_id, peer_addr, a3,
                                ssi, ssi_len);
 }
 
@@ -336,11 +336,12 @@ void wpas_nan_usd_deinit(struct wpa_supplicant *wpa_s)
 
 
 void wpas_nan_usd_rx_sdf(struct wpa_supplicant *wpa_s, const u8 *src,
+                        const u8 *a3,
                         unsigned int freq, const u8 *buf, size_t len)
 {
        if (!wpa_s->nan_de)
                return;
-       nan_de_rx_sdf(wpa_s->nan_de, src, freq, buf, len);
+       nan_de_rx_sdf(wpa_s->nan_de, src, a3, freq, buf, len);
 }
 
 
@@ -466,11 +467,11 @@ void wpas_nan_usd_cancel_subscribe(struct wpa_supplicant *wpa_s,
 
 int wpas_nan_usd_transmit(struct wpa_supplicant *wpa_s, int handle,
                          const struct wpabuf *ssi, const struct wpabuf *elems,
-                         const u8 *peer_addr, u8 req_instance_id)
+                         const u8 *peer_addr, const u8 *a3, u8 req_instance_id)
 {
        if (!wpa_s->nan_de)
                return -1;
-       return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr,
+       return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr, a3,
                               req_instance_id);
 }
 
index ecb4973c47260265b9558ce79f125837e8d67ff7..7ff7eaa5018ace2f2eeab28ff96744229cc21508 100644 (file)
@@ -16,6 +16,7 @@ enum nan_service_protocol_type;
 int wpas_nan_usd_init(struct wpa_supplicant *wpa_s);
 void wpas_nan_usd_deinit(struct wpa_supplicant *wpa_s);
 void wpas_nan_usd_rx_sdf(struct wpa_supplicant *wpa_s, const u8 *src,
+                        const u8 *a3,
                         unsigned int freq, const u8 *buf, size_t len);
 void wpas_nan_usd_flush(struct wpa_supplicant *wpa_s);
 int wpas_nan_usd_publish(struct wpa_supplicant *wpa_s, const char *service_name,
@@ -34,7 +35,8 @@ void wpas_nan_usd_cancel_subscribe(struct wpa_supplicant *wpa_s,
                                   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, u8 req_instance_id);
+                         const u8 *peer_addr, const u8 *a3,
+                         u8 req_instance_id);
 void wpas_nan_usd_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
                                       unsigned int freq,
                                       unsigned int duration);
index 8c1a817f9f899b447ac82c272c1e20fb2fc891eb..cdde7fd6ca498bd91be95f758643b5ae4a94ccc7 100644 (file)
@@ -1121,6 +1121,7 @@ void wpas_notify_nan_replied(struct wpa_supplicant *wpa_s,
 
 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;
@@ -1131,8 +1132,9 @@ void wpas_notify_nan_receive(struct wpa_supplicant *wpa_s, int id,
        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 " ssi=%s",
-               id, peer_instance_id, MAC2STR(peer_addr), ssi_hex);
+               "id=%d peer_instance_id=%d address=" MACSTR " a3=" MACSTR
+               " ssi=%s",
+               id, peer_instance_id, MAC2STR(peer_addr), MAC2STR(a3), ssi_hex);
        os_free(ssi_hex);
 }
 
index 56fe7c58e2fd90d114e0fb4af20082be711d058a..728952bfac9e59b3c2d2c24b5acd58bc03486335 100644 (file)
@@ -192,6 +192,7 @@ void wpas_notify_nan_replied(struct wpa_supplicant *wpa_s,
                             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,