@@ -246,6 +246,7 @@ extern "C" {
#define NAN_PUBLISH_TERMINATED "NAN-PUBLISH-TERMINATED "
#define NAN_SUBSCRIBE_TERMINATED "NAN-SUBSCRIBE-TERMINATED "
#define NAN_RECEIVE "NAN-RECEIVE "
+#define NAN_TRANSMIT_STATUS "NAN-TRANSMIT-STATUS "
#define NAN_CLUSTER_JOIN "NAN-CLUSTER-JOIN "
#define NAN_NDP_REQUEST "NAN-NDP-REQUEST "
#define NAN_NDP_COUNTER_REQUEST "NAN-NDP-COUNTER-REQUEST "
@@ -13266,6 +13266,8 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd)
struct wpabuf *ssi = NULL;
u8 peer_addr[ETH_ALEN];
int ret = -1;
+ u32 cookie = 0;
+ u32 *cookie_ptr = NULL;
os_memset(peer_addr, 0, ETH_ALEN);
@@ -13291,6 +13293,19 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd)
continue;
}
+ if (os_strncmp(token, "cookie=", 7) == 0) {
+ cookie = strtoul(token + 7, NULL, 0);
+ if (!cookie) {
+ wpa_printf(MSG_INFO,
+ "CTRL: Invalid cookie value: %s",
+ token + 7);
+ goto fail;
+ }
+
+ cookie_ptr = &cookie;
+ continue;
+ }
+
wpa_printf(MSG_INFO,
"CTRL: Invalid NAN_TRANSMIT parameter: %s",
token);
@@ -13310,7 +13325,7 @@ static int wpas_ctrl_nan_transmit(struct wpa_supplicant *wpa_s, char *cmd)
}
ret = wpas_nan_transmit(wpa_s, handle, ssi, NULL, peer_addr,
- req_instance_id);
+ req_instance_id, cookie_ptr);
fail:
wpabuf_free(ssi);
return ret;
@@ -7035,7 +7035,7 @@ DBusMessage * wpas_dbus_handler_nan_transmit(DBusMessage *message,
goto fail;
if (wpas_nan_transmit(wpa_s, handle, ssi, NULL, peer_addr,
- req_instance_id) < 0)
+ req_instance_id, NULL) < 0)
reply = wpas_dbus_error_unknown_error(
message, "failed to transmit follow-up");
out:
@@ -4337,6 +4337,14 @@ static void wpas_nan_de_receive(void *ctx, int id, int peer_instance_id,
}
+static void wpas_nan_de_transmit_req_status(void *ctx, u32 cookie, bool ack)
+{
+ struct wpa_supplicant *wpa_s = ctx;
+
+ wpas_notify_nan_transmit_req_status(wpa_s, cookie, ack);
+}
+
+
#ifdef CONFIG_P2P
static void wpas_nan_process_p2p_usd_elems(void *ctx, const u8 *buf,
u16 buf_len, const u8 *peer_addr,
@@ -4388,6 +4396,7 @@ int wpas_nan_de_init(struct wpa_supplicant *wpa_s)
cb.offload_cancel_publish = wpas_nan_usd_offload_cancel_publish;
cb.offload_cancel_subscribe = wpas_nan_usd_offload_cancel_subscribe;
cb.receive = wpas_nan_de_receive;
+ cb.transmit_req_status = wpas_nan_de_transmit_req_status;
#ifdef CONFIG_P2P
cb.process_p2p_usd_elems = wpas_nan_process_p2p_usd_elems;
#endif /* CONFIG_P2P */
@@ -4724,12 +4733,13 @@ int wpas_nan_usd_subscribe_stop_listen(struct wpa_supplicant *wpa_s,
int wpas_nan_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, u8 req_instance_id,
+ u32 *cookie)
{
if (!wpa_s->nan_de)
return -1;
return nan_de_transmit(wpa_s->nan_de, handle, ssi, elems, peer_addr,
- req_instance_id, NULL, NULL);
+ req_instance_id, NULL, cookie);
}
@@ -4864,6 +4874,11 @@ int wpas_nan_tx_status(struct wpa_supplicant *wpa_s,
(const struct ieee80211_mgmt *) data;
wpa_s = wpas_nan_get_mgmt_iface(wpa_s);
+
+ if (wpa_s->nan_de)
+ nan_de_tx_status(wpa_s->nan_de, 0, mgmt->da, data, data_len,
+ acked);
+
if (!wpas_nan_ndp_allowed(wpa_s))
return -1;
@@ -150,7 +150,8 @@ void wpas_nan_cancel_subscribe(struct wpa_supplicant *wpa_s,
int subscribe_id);
int wpas_nan_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, u8 req_instance_id,
+ u32 *cookie);
int wpas_nan_tx_status(struct wpa_supplicant *wpa_s,
const u8 *data, size_t data_len, int acked);
@@ -1268,6 +1268,14 @@ void wpas_notify_nan_subscribe_terminated(struct wpa_supplicant *wpa_s,
}
+void wpas_notify_nan_transmit_req_status(struct wpa_supplicant *wpa_s,
+ u32 cookie, bool acked)
+{
+ wpa_msg_global(wpa_s, MSG_INFO, NAN_TRANSMIT_STATUS
+ "cookie=%u acked=%u", cookie, acked);
+}
+
+
void wpas_notify_nan_bootstrap_request(struct wpa_supplicant *wpa_s,
const u8 *peer_nmi, u16 pbm,
int handle, u8 requestor_instance_id)
@@ -201,6 +201,8 @@ void wpas_notify_nan_publish_terminated(struct wpa_supplicant *wpa_s,
void wpas_notify_nan_subscribe_terminated(struct wpa_supplicant *wpa_s,
int subscribe_id,
enum nan_de_reason reason);
+void wpas_notify_nan_transmit_req_status(struct wpa_supplicant *wpa_s,
+ u32 cookie, bool acked);
void wpas_notify_nan_nik_received(struct wpa_supplicant *wpa_s,
const u8 *nik, size_t nik_len,
int cipher_ver, int akmp,