mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-31 19:24:33 +02:00
Merge branch 'feat/add_svc_info_in_sdf_v5.4' into 'release/v5.4'
Add extended SSI support for NAN Services (Backport v5.4) See merge request espressif/esp-idf!38302
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -799,7 +799,32 @@ typedef struct {
|
|||||||
#define ESP_WIFI_MAX_SVC_NAME_LEN 256 /**< Maximum length of NAN service name */
|
#define ESP_WIFI_MAX_SVC_NAME_LEN 256 /**< Maximum length of NAN service name */
|
||||||
#define ESP_WIFI_MAX_FILTER_LEN 256 /**< Maximum length of NAN service filter */
|
#define ESP_WIFI_MAX_FILTER_LEN 256 /**< Maximum length of NAN service filter */
|
||||||
#define ESP_WIFI_MAX_SVC_INFO_LEN 64 /**< Maximum length of NAN service info */
|
#define ESP_WIFI_MAX_SVC_INFO_LEN 64 /**< Maximum length of NAN service info */
|
||||||
|
#define ESP_WIFI_MAX_FUP_SSI_LEN 2048 /**< Maximum length of NAN Service Specific Info in a Follow-up frame */
|
||||||
|
#define ESP_WIFI_MAX_SVC_SSI_LEN 512 /**< Maximum length of NAN Service Specific Info in Publish/Subscribe SDF's */
|
||||||
#define ESP_WIFI_MAX_NEIGHBOR_REP_LEN 64 /**< Maximum length of NAN Neighbor Report */
|
#define ESP_WIFI_MAX_NEIGHBOR_REP_LEN 64 /**< Maximum length of NAN Neighbor Report */
|
||||||
|
#define WIFI_OUI_LEN 3 /**< Length of OUI bytes in IE or attributes */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Protocol types in NAN service specific info attribute
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
WIFI_SVC_PROTO_RESERVED = 0, /**< Value 0 Reserved */
|
||||||
|
WIFI_SVC_PROTO_BONJOUR = 1, /**< Bonjour Protocol */
|
||||||
|
WIFI_SVC_PROTO_GENERIC = 2, /**< Generic Service Protocol */
|
||||||
|
WIFI_SVC_PROTO_CSA_MATTER = 3, /**< CSA Matter specific protocol */
|
||||||
|
WIFI_SVC_PROTO_MAX, /**< Values 4-255 Reserved */
|
||||||
|
} wifi_nan_svc_proto_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief WFA defined Protocol types in NAN service specific info attribute
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint8_t wfa_oui[WIFI_OUI_LEN]; /**< WFA OUI - 0x50, 0x6F, 0x9A */
|
||||||
|
wifi_nan_svc_proto_t proto; /**< WFA defined protocol types */
|
||||||
|
uint8_t payload[0]; /**< Service Info payload */
|
||||||
|
} wifi_nan_wfa_ssi_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief NAN Services types
|
* @brief NAN Services types
|
||||||
@@ -820,10 +845,14 @@ typedef struct {
|
|||||||
char service_name[ESP_WIFI_MAX_SVC_NAME_LEN]; /**< Service name identifier */
|
char service_name[ESP_WIFI_MAX_SVC_NAME_LEN]; /**< Service name identifier */
|
||||||
wifi_nan_service_type_t type; /**< Service type */
|
wifi_nan_service_type_t type; /**< Service type */
|
||||||
char matching_filter[ESP_WIFI_MAX_FILTER_LEN]; /**< Comma separated filters for filtering services */
|
char matching_filter[ESP_WIFI_MAX_FILTER_LEN]; /**< Comma separated filters for filtering services */
|
||||||
char svc_info[ESP_WIFI_MAX_SVC_INFO_LEN]; /**< Service info shared in Publish frame */
|
char svc_info[ESP_WIFI_MAX_SVC_INFO_LEN]; /**< To be deprecated in next major release, use ssi instead */
|
||||||
uint8_t single_replied_event: 1; /**< Give single Replied event or every time */
|
uint8_t single_replied_event: 1; /**< Give single Replied event or every time */
|
||||||
uint8_t datapath_reqd: 1; /**< NAN Datapath required for the service */
|
uint8_t datapath_reqd: 1; /**< NAN Datapath required for the service */
|
||||||
uint8_t reserved: 6; /**< Reserved */
|
uint8_t fsd_reqd: 1; /**< Further Service Discovery(FSD) required */
|
||||||
|
uint8_t fsd_gas: 1; /**< 0 - Follow-up used for FSD, 1 - GAS used for FSD */
|
||||||
|
uint8_t reserved: 4; /**< Reserved */
|
||||||
|
uint16_t ssi_len; /**< Length of service specific info, maximum allowed length - ESP_WIFI_MAX_SVC_SSI_LEN */
|
||||||
|
uint8_t *ssi; /**< Service Specific Info of type wifi_nan_wfa_ssi_t for WFA defined protocols, otherwise proprietary and defined by Applications */
|
||||||
} wifi_nan_publish_cfg_t;
|
} wifi_nan_publish_cfg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -834,9 +863,14 @@ typedef struct {
|
|||||||
char service_name[ESP_WIFI_MAX_SVC_NAME_LEN]; /**< Service name identifier */
|
char service_name[ESP_WIFI_MAX_SVC_NAME_LEN]; /**< Service name identifier */
|
||||||
wifi_nan_service_type_t type; /**< Service type */
|
wifi_nan_service_type_t type; /**< Service type */
|
||||||
char matching_filter[ESP_WIFI_MAX_FILTER_LEN]; /**< Comma separated filters for filtering services */
|
char matching_filter[ESP_WIFI_MAX_FILTER_LEN]; /**< Comma separated filters for filtering services */
|
||||||
char svc_info[ESP_WIFI_MAX_SVC_INFO_LEN]; /**< Service info shared in Subscribe frame */
|
char svc_info[ESP_WIFI_MAX_SVC_INFO_LEN]; /**< To be deprecated in next major release, use ssi instead */
|
||||||
uint8_t single_match_event: 1; /**< Give single Match event or every time */
|
uint8_t single_match_event: 1; /**< Give single Match event(per SSI update) or every time */
|
||||||
uint8_t reserved: 7; /**< Reserved */
|
uint8_t datapath_reqd: 1; /**< NAN Datapath required for the service */
|
||||||
|
uint8_t fsd_reqd: 1; /**< Further Service Discovery(FSD) required */
|
||||||
|
uint8_t fsd_gas: 1; /**< 0 - Follow-up used for FSD, 1 - GAS used for FSD */
|
||||||
|
uint8_t reserved: 4; /**< Reserved */
|
||||||
|
uint16_t ssi_len; /**< Length of service specific info, maximum allowed length - ESP_WIFI_MAX_SVC_SSI_LEN */
|
||||||
|
uint8_t *ssi; /**< Service Specific Info of type wifi_nan_wfa_ssi_t for WFA defined protocols, otherwise proprietary and defined by Applications */
|
||||||
} wifi_nan_subscribe_cfg_t;
|
} wifi_nan_subscribe_cfg_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -847,7 +881,9 @@ typedef struct {
|
|||||||
uint8_t inst_id; /**< Own service instance id */
|
uint8_t inst_id; /**< Own service instance id */
|
||||||
uint8_t peer_inst_id; /**< Peer's service instance id */
|
uint8_t peer_inst_id; /**< Peer's service instance id */
|
||||||
uint8_t peer_mac[6]; /**< Peer's MAC address */
|
uint8_t peer_mac[6]; /**< Peer's MAC address */
|
||||||
char svc_info[ESP_WIFI_MAX_SVC_INFO_LEN];/**< Service info(or message) to be shared */
|
char svc_info[ESP_WIFI_MAX_SVC_INFO_LEN]; /**< To be deprecated in next major release, use ssi instead */
|
||||||
|
uint16_t ssi_len; /**< Length of service specific info, maximum allowed length - ESP_WIFI_MAX_FUP_SSI_LEN */
|
||||||
|
uint8_t *ssi; /**< Service Specific Info of type wifi_nan_wfa_ssi_t for WFA defined protocols, otherwise proprietary and defined by Applications */
|
||||||
} wifi_nan_followup_params_t;
|
} wifi_nan_followup_params_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1255,6 +1291,15 @@ typedef struct {
|
|||||||
uint8_t publish_id; /**< Publish Service Identifier */
|
uint8_t publish_id; /**< Publish Service Identifier */
|
||||||
uint8_t pub_if_mac[6]; /**< NAN Interface MAC of the Publisher */
|
uint8_t pub_if_mac[6]; /**< NAN Interface MAC of the Publisher */
|
||||||
bool update_pub_id; /**< Indicates whether publisher's service ID needs to be updated */
|
bool update_pub_id; /**< Indicates whether publisher's service ID needs to be updated */
|
||||||
|
uint8_t datapath_reqd: 1; /**< NAN Datapath required for the service */
|
||||||
|
uint8_t fsd_reqd: 1; /**< Further Service Discovery(FSD) required */
|
||||||
|
uint8_t fsd_gas: 1; /**< 0 - Follow-up used for FSD, 1 - GAS used for FSD */
|
||||||
|
uint8_t reserved: 5; /**< Reserved */
|
||||||
|
uint32_t reserved_1; /**< Reserved */
|
||||||
|
uint32_t reserved_2; /**< Reserved */
|
||||||
|
uint8_t ssi_version; /**< Indicates version of SSI in Publish instance, 0 if not available */
|
||||||
|
uint16_t ssi_len; /**< Length of service specific info */
|
||||||
|
uint8_t ssi[]; /**< Service specific info of Publisher */
|
||||||
} wifi_event_nan_svc_match_t;
|
} wifi_event_nan_svc_match_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1264,6 +1309,10 @@ typedef struct {
|
|||||||
uint8_t publish_id; /**< Publish Service Identifier */
|
uint8_t publish_id; /**< Publish Service Identifier */
|
||||||
uint8_t subscribe_id; /**< Subscribe Service Identifier */
|
uint8_t subscribe_id; /**< Subscribe Service Identifier */
|
||||||
uint8_t sub_if_mac[6]; /**< NAN Interface MAC of the Subscriber */
|
uint8_t sub_if_mac[6]; /**< NAN Interface MAC of the Subscriber */
|
||||||
|
uint32_t reserved_1; /**< Reserved */
|
||||||
|
uint32_t reserved_2; /**< Reserved */
|
||||||
|
uint16_t ssi_len; /**< Length of service specific info */
|
||||||
|
uint8_t ssi[]; /**< Service specific info of Subscriber */
|
||||||
} wifi_event_nan_replied_t;
|
} wifi_event_nan_replied_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1273,7 +1322,11 @@ typedef struct {
|
|||||||
uint8_t inst_id; /**< Our Service Identifier */
|
uint8_t inst_id; /**< Our Service Identifier */
|
||||||
uint8_t peer_inst_id; /**< Peer's Service Identifier */
|
uint8_t peer_inst_id; /**< Peer's Service Identifier */
|
||||||
uint8_t peer_if_mac[6]; /**< Peer's NAN Interface MAC */
|
uint8_t peer_if_mac[6]; /**< Peer's NAN Interface MAC */
|
||||||
uint8_t peer_svc_info[ESP_WIFI_MAX_SVC_INFO_LEN];/**< Peer Service Info */
|
uint8_t peer_svc_info[ESP_WIFI_MAX_SVC_INFO_LEN];/**< To be deprecated in next major release, use ssi instead */
|
||||||
|
uint32_t reserved_1; /**< Reserved */
|
||||||
|
uint32_t reserved_2; /**< Reserved */
|
||||||
|
uint16_t ssi_len; /**< Length of service specific info */
|
||||||
|
uint8_t ssi[]; /**< Service specific info from Follow-up */
|
||||||
} wifi_event_nan_receive_t;
|
} wifi_event_nan_receive_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1284,7 +1337,11 @@ typedef struct {
|
|||||||
uint8_t ndp_id; /**< NDP instance id */
|
uint8_t ndp_id; /**< NDP instance id */
|
||||||
uint8_t peer_nmi[6]; /**< Peer's NAN Management Interface MAC */
|
uint8_t peer_nmi[6]; /**< Peer's NAN Management Interface MAC */
|
||||||
uint8_t peer_ndi[6]; /**< Peer's NAN Data Interface MAC */
|
uint8_t peer_ndi[6]; /**< Peer's NAN Data Interface MAC */
|
||||||
uint8_t svc_info[ESP_WIFI_MAX_SVC_INFO_LEN];/**< Service Specific Info */
|
uint8_t svc_info[ESP_WIFI_MAX_SVC_INFO_LEN];/**< To be deprecated in next major release, use ssi instead */
|
||||||
|
uint32_t reserved_1; /**< Reserved */
|
||||||
|
uint32_t reserved_2; /**< Reserved */
|
||||||
|
uint16_t ssi_len; /**< Length of service specific info */
|
||||||
|
uint8_t ssi[]; /**< Service specific info from NDP/NDPE Attribute */
|
||||||
} wifi_event_ndp_indication_t;
|
} wifi_event_ndp_indication_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1296,7 +1353,11 @@ typedef struct {
|
|||||||
uint8_t peer_nmi[6]; /**< Peer's NAN Management Interface MAC */
|
uint8_t peer_nmi[6]; /**< Peer's NAN Management Interface MAC */
|
||||||
uint8_t peer_ndi[6]; /**< Peer's NAN Data Interface MAC */
|
uint8_t peer_ndi[6]; /**< Peer's NAN Data Interface MAC */
|
||||||
uint8_t own_ndi[6]; /**< Own NAN Data Interface MAC */
|
uint8_t own_ndi[6]; /**< Own NAN Data Interface MAC */
|
||||||
uint8_t svc_info[ESP_WIFI_MAX_SVC_INFO_LEN];/**< Service Specific Info */
|
uint8_t svc_info[ESP_WIFI_MAX_SVC_INFO_LEN];/**< To be deprecated in next major release, use ssi instead */
|
||||||
|
uint32_t reserved_1; /**< Reserved */
|
||||||
|
uint32_t reserved_2; /**< Reserved */
|
||||||
|
uint16_t ssi_len; /**< Length of Service Specific Info */
|
||||||
|
uint8_t ssi[]; /**< Service specific info from NDP/NDPE Attribute */
|
||||||
} wifi_event_ndp_confirm_t;
|
} wifi_event_ndp_confirm_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Submodule components/esp_wifi/lib updated: 76ee3bdee6...a69f93dec1
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "esp_mac.h"
|
#include "esp_mac.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "esp_nan.h"
|
#include "esp_nan.h"
|
||||||
|
#include "utils/common.h"
|
||||||
|
|
||||||
/* NAN States */
|
/* NAN States */
|
||||||
#define NAN_STARTED_BIT BIT0
|
#define NAN_STARTED_BIT BIT0
|
||||||
@@ -42,6 +43,7 @@ static EventGroupHandle_t nan_event_group;
|
|||||||
static bool s_app_default_handlers_set = false;
|
static bool s_app_default_handlers_set = false;
|
||||||
static uint8_t null_mac[MACADDR_LEN] = {0};
|
static uint8_t null_mac[MACADDR_LEN] = {0};
|
||||||
static void *s_nan_data_lock = NULL;
|
static void *s_nan_data_lock = NULL;
|
||||||
|
static const uint8_t s_wfa_oui[3] = {0x50, 0x6f, 0x9a};
|
||||||
|
|
||||||
#define NAN_DATA_LOCK() os_mutex_lock(s_nan_data_lock)
|
#define NAN_DATA_LOCK() os_mutex_lock(s_nan_data_lock)
|
||||||
#define NAN_DATA_UNLOCK() os_mutex_unlock(s_nan_data_lock)
|
#define NAN_DATA_UNLOCK() os_mutex_unlock(s_nan_data_lock)
|
||||||
@@ -371,19 +373,6 @@ static bool nan_is_datapath_active(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nan_update_peer_svc(uint8_t own_svc_id, uint8_t peer_svc_id, uint8_t peer_nmi[])
|
|
||||||
{
|
|
||||||
struct peer_svc_info *peer_info = nan_find_peer_svc(own_svc_id, 0, peer_nmi);
|
|
||||||
if (peer_info) {
|
|
||||||
peer_info->svc_id = peer_svc_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ndl_info *ndl = nan_find_ndl(0, peer_nmi);
|
|
||||||
if (ndl) {
|
|
||||||
ndl->publisher_id = peer_svc_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void nan_fill_params_from_event(void *evt_data, uint8_t event)
|
static void nan_fill_params_from_event(void *evt_data, uint8_t event)
|
||||||
{
|
{
|
||||||
switch (event) {
|
switch (event) {
|
||||||
@@ -421,12 +410,16 @@ static void nan_fill_params_from_event(void *evt_data, uint8_t event)
|
|||||||
}
|
}
|
||||||
case WIFI_EVENT_NAN_SVC_MATCH: {
|
case WIFI_EVENT_NAN_SVC_MATCH: {
|
||||||
wifi_event_nan_svc_match_t *evt = (wifi_event_nan_svc_match_t *)evt_data;
|
wifi_event_nan_svc_match_t *evt = (wifi_event_nan_svc_match_t *)evt_data;
|
||||||
|
struct peer_svc_info *peer_info = nan_find_peer_svc(evt->subscribe_id, 0, evt->pub_if_mac);
|
||||||
|
|
||||||
if (evt->update_pub_id) {
|
if (peer_info && peer_info->svc_id != evt->publish_id) {
|
||||||
nan_update_peer_svc(evt->subscribe_id, evt->publish_id, evt->pub_if_mac);
|
struct ndl_info *ndl = nan_find_ndl(0, evt->pub_if_mac);
|
||||||
|
|
||||||
|
peer_info->svc_id = evt->publish_id;
|
||||||
|
if (ndl) {
|
||||||
|
ndl->publisher_id = evt->publish_id;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
if (!nan_find_peer_svc(evt->subscribe_id, evt->publish_id, evt->pub_if_mac)) {
|
|
||||||
nan_record_peer_svc(evt->subscribe_id, evt->publish_id, evt->pub_if_mac);
|
nan_record_peer_svc(evt->subscribe_id, evt->publish_id, evt->pub_if_mac);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -446,6 +439,9 @@ static void nan_app_action_service_match(void *arg, esp_event_base_t event_base,
|
|||||||
ESP_LOGI(TAG, "Service matched with "MACSTR" [Peer Publish id - %d]",
|
ESP_LOGI(TAG, "Service matched with "MACSTR" [Peer Publish id - %d]",
|
||||||
MAC2STR(evt->pub_if_mac), evt->publish_id);
|
MAC2STR(evt->pub_if_mac), evt->publish_id);
|
||||||
|
|
||||||
|
if (evt->ssi_len) {
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP(TAG, evt->ssi, evt->ssi_len, ESP_LOG_DEBUG);
|
||||||
|
}
|
||||||
NAN_DATA_LOCK();
|
NAN_DATA_LOCK();
|
||||||
nan_fill_params_from_event(evt, WIFI_EVENT_NAN_SVC_MATCH);
|
nan_fill_params_from_event(evt, WIFI_EVENT_NAN_SVC_MATCH);
|
||||||
NAN_DATA_UNLOCK();
|
NAN_DATA_UNLOCK();
|
||||||
@@ -458,9 +454,12 @@ static void nan_app_action_replied(void *arg, esp_event_base_t event_base, int32
|
|||||||
}
|
}
|
||||||
wifi_event_nan_replied_t *evt = (wifi_event_nan_replied_t *)data;
|
wifi_event_nan_replied_t *evt = (wifi_event_nan_replied_t *)data;
|
||||||
|
|
||||||
ESP_LOGD(TAG, "Sent Publish to Peer "MACSTR" [Peer Subscribe id - %d]",
|
ESP_LOGI(TAG, "Sent Publish to Peer "MACSTR" [Peer Subscribe id - %d]",
|
||||||
MAC2STR(evt->sub_if_mac), evt->subscribe_id);
|
MAC2STR(evt->sub_if_mac), evt->subscribe_id);
|
||||||
|
|
||||||
|
if (evt->ssi_len) {
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP(TAG, evt->ssi, evt->ssi_len, ESP_LOG_DEBUG);
|
||||||
|
}
|
||||||
NAN_DATA_LOCK();
|
NAN_DATA_LOCK();
|
||||||
nan_fill_params_from_event(evt, WIFI_EVENT_NAN_REPLIED);
|
nan_fill_params_from_event(evt, WIFI_EVENT_NAN_REPLIED);
|
||||||
NAN_DATA_UNLOCK();
|
NAN_DATA_UNLOCK();
|
||||||
@@ -473,8 +472,13 @@ static void nan_app_action_receive(void *arg, esp_event_base_t event_base, int32
|
|||||||
}
|
}
|
||||||
wifi_event_nan_receive_t *evt = (wifi_event_nan_receive_t *)data;
|
wifi_event_nan_receive_t *evt = (wifi_event_nan_receive_t *)data;
|
||||||
|
|
||||||
ESP_LOGI(TAG, "Received message '%s' from Peer "MACSTR" [Peer Service id - %d]",
|
if (evt->ssi_len) {
|
||||||
|
ESP_LOGD(TAG, "Received payload from Peer "MACSTR" [Peer Service id - %d] - ", MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP(TAG, evt->ssi, evt->ssi_len, ESP_LOG_DEBUG);
|
||||||
|
} else {
|
||||||
|
ESP_LOGD(TAG, "Received message '%s' from Peer "MACSTR" [Peer Service id - %d]",
|
||||||
evt->peer_svc_info, MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
evt->peer_svc_info, MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
}
|
||||||
|
|
||||||
NAN_DATA_LOCK();
|
NAN_DATA_LOCK();
|
||||||
nan_fill_params_from_event(evt, WIFI_EVENT_NAN_RECEIVE);
|
nan_fill_params_from_event(evt, WIFI_EVENT_NAN_RECEIVE);
|
||||||
@@ -841,6 +845,20 @@ uint8_t esp_wifi_nan_publish_service(const wifi_nan_publish_cfg_t *publish_cfg,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((publish_cfg->ssi_len && publish_cfg->ssi == NULL) ||
|
||||||
|
(publish_cfg->ssi && (!publish_cfg->ssi_len || publish_cfg->ssi_len > ESP_WIFI_MAX_SVC_SSI_LEN))) {
|
||||||
|
ESP_LOGE(TAG, "Configured ssi and ssi_len(%d) incorrect", publish_cfg->ssi_len);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (publish_cfg->ssi && !memcmp(publish_cfg->ssi, s_wfa_oui, sizeof(s_wfa_oui))) {
|
||||||
|
/* WFA defined Service Specific Info */
|
||||||
|
wifi_nan_wfa_ssi_t *wfa_ssi = (wifi_nan_wfa_ssi_t *)publish_cfg->ssi;
|
||||||
|
if (wfa_ssi->proto >= WIFI_SVC_PROTO_MAX) {
|
||||||
|
ESP_LOGI(TAG, "Unrecognized WFA Defined SSI protocol (%d)", wfa_ssi->proto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (esp_nan_internal_publish_service(publish_cfg, &pub_id, false) != ESP_OK) {
|
if (esp_nan_internal_publish_service(publish_cfg, &pub_id, false) != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Failed to publish service '%s'", publish_cfg->service_name);
|
ESP_LOGE(TAG, "Failed to publish service '%s'", publish_cfg->service_name);
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -875,6 +893,20 @@ uint8_t esp_wifi_nan_subscribe_service(const wifi_nan_subscribe_cfg_t *subscribe
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((subscribe_cfg->ssi_len && subscribe_cfg->ssi == NULL) ||
|
||||||
|
(subscribe_cfg->ssi && (!subscribe_cfg->ssi_len || subscribe_cfg->ssi_len > ESP_WIFI_MAX_SVC_SSI_LEN))) {
|
||||||
|
ESP_LOGE(TAG, "Configured ssi and ssi_len(%d) incorrect", subscribe_cfg->ssi_len);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subscribe_cfg->ssi && !memcmp(subscribe_cfg->ssi, s_wfa_oui, sizeof(s_wfa_oui))) {
|
||||||
|
/* WFA defined Service Specific Info */
|
||||||
|
wifi_nan_wfa_ssi_t *wfa_ssi = (wifi_nan_wfa_ssi_t *)subscribe_cfg->ssi;
|
||||||
|
if (wfa_ssi->proto >= WIFI_SVC_PROTO_MAX) {
|
||||||
|
ESP_LOGI(TAG, "Unrecognized WFA Defined SSI protocol (%d)", wfa_ssi->proto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (esp_nan_internal_subscribe_service(subscribe_cfg, &sub_id, false) != ESP_OK) {
|
if (esp_nan_internal_subscribe_service(subscribe_cfg, &sub_id, false) != ESP_OK) {
|
||||||
ESP_LOGE(TAG, "Failed to subscribe to service '%s'", subscribe_cfg->service_name);
|
ESP_LOGE(TAG, "Failed to subscribe to service '%s'", subscribe_cfg->service_name);
|
||||||
goto fail;
|
goto fail;
|
||||||
@@ -903,6 +935,20 @@ esp_err_t esp_wifi_nan_send_message(wifi_nan_followup_params_t *fup_params)
|
|||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((fup_params->ssi_len && fup_params->ssi == NULL) ||
|
||||||
|
(fup_params->ssi && (!fup_params->ssi_len || fup_params->ssi_len > ESP_WIFI_MAX_FUP_SSI_LEN))) {
|
||||||
|
ESP_LOGE(TAG, "Configured ssi and ssi_len(%d) incorrect", fup_params->ssi_len);
|
||||||
|
return ESP_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fup_params->ssi && !memcmp(fup_params->ssi, s_wfa_oui, sizeof(s_wfa_oui))) {
|
||||||
|
/* WFA defined Service Specific Info */
|
||||||
|
wifi_nan_wfa_ssi_t *wfa_ssi = (wifi_nan_wfa_ssi_t *)fup_params->ssi;
|
||||||
|
if (wfa_ssi->proto >= WIFI_SVC_PROTO_MAX) {
|
||||||
|
ESP_LOGI(TAG, "Unrecognized WFA Defined SSI protocol (%d)", wfa_ssi->proto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!fup_params->inst_id) {
|
if (!fup_params->inst_id) {
|
||||||
fup_params->inst_id = p_peer_svc->own_svc_id;
|
fup_params->inst_id = p_peer_svc->own_svc_id;
|
||||||
}
|
}
|
||||||
@@ -918,8 +964,15 @@ esp_err_t esp_wifi_nan_send_message(wifi_nan_followup_params_t *fup_params)
|
|||||||
ESP_LOGE(TAG, "Failed to send Follow-up message!");
|
ESP_LOGE(TAG, "Failed to send Follow-up message!");
|
||||||
return ESP_FAIL;
|
return ESP_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fup_params->ssi) {
|
||||||
|
ESP_LOGD(TAG, "Sent below payload to Peer "MACSTR" with Service ID %d",
|
||||||
|
MAC2STR(fup_params->peer_mac), fup_params->peer_inst_id);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP(TAG, fup_params->ssi, fup_params->ssi_len, ESP_LOG_DEBUG);
|
||||||
|
} else {
|
||||||
ESP_LOGI(TAG, "Sent message '%s' to Peer "MACSTR" with Service ID %d", fup_params->svc_info,
|
ESP_LOGI(TAG, "Sent message '%s' to Peer "MACSTR" with Service ID %d", fup_params->svc_info,
|
||||||
MAC2STR(fup_params->peer_mac), fup_params->peer_inst_id);
|
MAC2STR(fup_params->peer_mac), fup_params->peer_inst_id);
|
||||||
|
}
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@@ -107,6 +107,19 @@ static esp_netif_t *g_nan_netif;
|
|||||||
|
|
||||||
#define NAN_EXAMPLE_SERVICE_NAME "ESP_NAN-Service"
|
#define NAN_EXAMPLE_SERVICE_NAME "ESP_NAN-Service"
|
||||||
|
|
||||||
|
static void nan_receive_event_handler(void *arg, esp_event_base_t event_base,
|
||||||
|
int32_t event_id, void *event_data)
|
||||||
|
{
|
||||||
|
wifi_event_nan_receive_t *evt = (wifi_event_nan_receive_t *)event_data;
|
||||||
|
if (evt->ssi_len) {
|
||||||
|
ESP_LOGI(TAG, "Received payload from Peer "MACSTR" [Peer Service id - %d] - ", MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP(TAG, evt->ssi, evt->ssi_len, ESP_LOG_INFO);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI(TAG, "Received message '%s' from Peer "MACSTR" [Peer Service id - %d]",
|
||||||
|
evt->peer_svc_info, MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void cmd_ping_on_ping_success(esp_ping_handle_t hdl, void *args)
|
static void cmd_ping_on_ping_success(esp_ping_handle_t hdl, void *args)
|
||||||
{
|
{
|
||||||
uint8_t ttl;
|
uint8_t ttl;
|
||||||
@@ -210,6 +223,7 @@ void initialise_wifi(void)
|
|||||||
static int wifi_cmd_nan_disc(int argc, char **argv)
|
static int wifi_cmd_nan_disc(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int nerrors = arg_parse(argc, argv, (void **) &nan_args);
|
int nerrors = arg_parse(argc, argv, (void **) &nan_args);
|
||||||
|
static esp_event_handler_instance_t s_instance_nan_receive;
|
||||||
esp_err_t ret;
|
esp_err_t ret;
|
||||||
|
|
||||||
if (nerrors != 0) {
|
if (nerrors != 0) {
|
||||||
@@ -241,6 +255,12 @@ static int wifi_cmd_nan_disc(int argc, char **argv)
|
|||||||
esp_netif_destroy_default_wifi(g_nan_netif);
|
esp_netif_destroy_default_wifi(g_nan_netif);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!s_instance_nan_receive) {
|
||||||
|
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_NAN_RECEIVE,
|
||||||
|
&nan_receive_event_handler, NULL, &s_instance_nan_receive));
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,6 +271,10 @@ static int wifi_cmd_nan_disc(int argc, char **argv)
|
|||||||
ESP_LOGI(TAG, "Failed to stop NAN");
|
ESP_LOGI(TAG, "Failed to stop NAN");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, WIFI_EVENT_NAN_RECEIVE,
|
||||||
|
s_instance_nan_receive));
|
||||||
|
s_instance_nan_receive = 0;
|
||||||
esp_netif_destroy_default_wifi(g_nan_netif);
|
esp_netif_destroy_default_wifi(g_nan_netif);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,38 +373,59 @@ static int wifi_cmd_nan_subscribe(int argc, char **argv)
|
|||||||
static int wifi_cmd_nan_followup(int argc, char **argv)
|
static int wifi_cmd_nan_followup(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int nerrors = arg_parse(argc, argv, (void **) &fup_args);
|
int nerrors = arg_parse(argc, argv, (void **) &fup_args);
|
||||||
|
uint16_t ssi_len = 0;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (nerrors != 0) {
|
if (nerrors != 0) {
|
||||||
arg_print_errors(stderr, fup_args.end, argv[0]);
|
arg_print_errors(stderr, fup_args.end, argv[0]);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
wifi_nan_followup_params_t fup = {0};
|
if (fup_args.text->count) {
|
||||||
|
ssi_len = strlen(fup_args.text->sval[0]);
|
||||||
|
if (ssi_len >= ESP_WIFI_MAX_FUP_SSI_LEN) {
|
||||||
|
ESP_LOGE(TAG, "Length(%d) too long for Service Specific Info", ssi_len);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wifi_nan_followup_params_t *fup = calloc(1, sizeof(wifi_nan_followup_params_t) + ssi_len);
|
||||||
|
|
||||||
|
if (!fup) {
|
||||||
|
ESP_LOGE(TAG, "Failed to allocate memory for Follow-up buffer");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (ssi_len) {
|
||||||
|
fup->ssi = (uint8_t *)(fup + 1);
|
||||||
|
memcpy(fup->ssi, fup_args.text->sval[0], ssi_len);
|
||||||
|
fup->ssi_len = ssi_len;
|
||||||
|
}
|
||||||
|
|
||||||
if (fup_args.own_id->count) {
|
if (fup_args.own_id->count) {
|
||||||
fup.inst_id = fup_args.own_id->ival[0];
|
fup->inst_id = fup_args.own_id->ival[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fup_args.peer_id->count && !fup_args.mac_addr->count) {
|
if (!fup_args.peer_id->count && !fup_args.mac_addr->count) {
|
||||||
ESP_LOGE(TAG, "Missing peer's service instance id or peer's MAC.");
|
ESP_LOGE(TAG, "Missing peer's service instance id or peer's MAC");
|
||||||
return 1;
|
ret = 1;
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
if (fup_args.peer_id->count) {
|
if (fup_args.peer_id->count) {
|
||||||
fup.peer_inst_id = fup_args.peer_id->ival[0];
|
fup->peer_inst_id = fup_args.peer_id->ival[0];
|
||||||
}
|
}
|
||||||
if (fup_args.mac_addr->count &&
|
if (fup_args.mac_addr->count &&
|
||||||
esp_supplicant_str_to_mac((char *)fup_args.mac_addr->sval[0], fup.peer_mac) != ESP_OK) {
|
esp_supplicant_str_to_mac((char *)fup_args.mac_addr->sval[0], fup->peer_mac) != ESP_OK) {
|
||||||
return 1;
|
ret = 1;
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fup_args.text->count) {
|
if (esp_wifi_nan_send_message(fup) != ESP_OK) {
|
||||||
strlcpy(fup.svc_info, fup_args.text->sval[0], ESP_WIFI_MAX_SVC_INFO_LEN);
|
ESP_LOGE(TAG, "Failed to send Follow-up");
|
||||||
|
ret = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (esp_wifi_nan_send_message(&fup) != ESP_OK) {
|
exit:
|
||||||
return 1;
|
free(fup);
|
||||||
}
|
return ret;
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int wifi_cmd_ndp(int argc, char **argv)
|
static int wifi_cmd_ndp(int argc, char **argv)
|
||||||
@@ -443,7 +488,7 @@ void register_nan(void)
|
|||||||
nan_args.init = arg_lit0("S", "start", "NAN Start");
|
nan_args.init = arg_lit0("S", "start", "NAN Start");
|
||||||
nan_args.deinit = arg_lit0("T", "stop", "NAN Stop");
|
nan_args.deinit = arg_lit0("T", "stop", "NAN Stop");
|
||||||
nan_args.master_pref = arg_int0("p", "mast_pref", "<1-254>", "NAN Master Preference");
|
nan_args.master_pref = arg_int0("p", "mast_pref", "<1-254>", "NAN Master Preference");
|
||||||
nan_args.op_channel = arg_int0("c", "op_chan", "<1-11>", "NAN Operating Channe");
|
nan_args.op_channel = arg_int0("c", "op_chan", "<1-11>", "NAN Operating Channel");
|
||||||
nan_args.warmup_time = arg_int0("w", "warmup", "<5-120>", "NAN Warmup Time in Sec");
|
nan_args.warmup_time = arg_int0("w", "warmup", "<5-120>", "NAN Warmup Time in Sec");
|
||||||
nan_args.end = arg_end(1);
|
nan_args.end = arg_end(1);
|
||||||
|
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@@ -30,17 +30,30 @@
|
|||||||
#else
|
#else
|
||||||
#define EXAMPLE_NAN_SVC_MSG "Welcome"
|
#define EXAMPLE_NAN_SVC_MSG "Welcome"
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef ETH_ALEN
|
||||||
|
#define ETH_ALEN 6
|
||||||
|
#endif
|
||||||
|
|
||||||
static EventGroupHandle_t nan_event_group;
|
static EventGroupHandle_t nan_event_group;
|
||||||
|
static const char *TAG = "publisher";
|
||||||
|
|
||||||
static int NAN_RECEIVE = BIT0;
|
static int NAN_RECEIVE = BIT0;
|
||||||
uint8_t g_peer_inst_id;
|
uint8_t g_peer_inst_id;
|
||||||
|
static uint8_t g_peer_mac[ETH_ALEN];
|
||||||
|
|
||||||
static void nan_receive_event_handler(void *arg, esp_event_base_t event_base,
|
static void nan_receive_event_handler(void *arg, esp_event_base_t event_base,
|
||||||
int32_t event_id, void *event_data)
|
int32_t event_id, void *event_data)
|
||||||
{
|
{
|
||||||
wifi_event_nan_receive_t *evt = (wifi_event_nan_receive_t *)event_data;
|
wifi_event_nan_receive_t *evt = (wifi_event_nan_receive_t *)event_data;
|
||||||
g_peer_inst_id = evt->peer_inst_id;
|
g_peer_inst_id = evt->peer_inst_id;
|
||||||
|
memcpy(g_peer_mac, evt->peer_if_mac, ETH_ALEN);
|
||||||
|
if (evt->ssi_len) {
|
||||||
|
ESP_LOGI(TAG, "Received payload from Peer "MACSTR" [Peer Service id - %d] - ", MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP(TAG, evt->ssi, evt->ssi_len, ESP_LOG_INFO);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI(TAG, "Received message '%s' from Peer "MACSTR" [Peer Service id - %d]",
|
||||||
|
evt->peer_svc_info, MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
}
|
||||||
xEventGroupSetBits(nan_event_group, NAN_RECEIVE);
|
xEventGroupSetBits(nan_event_group, NAN_RECEIVE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +68,7 @@ static void nan_ndp_indication_event_handler(void *arg, esp_event_base_t event_b
|
|||||||
wifi_nan_datapath_resp_t ndp_resp = {0};
|
wifi_nan_datapath_resp_t ndp_resp = {0};
|
||||||
ndp_resp.accept = true; /* Accept incoming datapath request */
|
ndp_resp.accept = true; /* Accept incoming datapath request */
|
||||||
ndp_resp.ndp_id = evt->ndp_id;
|
ndp_resp.ndp_id = evt->ndp_id;
|
||||||
memcpy(ndp_resp.peer_mac, evt->peer_nmi, 6);
|
memcpy(ndp_resp.peer_mac, evt->peer_nmi, ETH_ALEN);
|
||||||
|
|
||||||
esp_wifi_nan_datapath_resp(&ndp_resp);
|
esp_wifi_nan_datapath_resp(&ndp_resp);
|
||||||
|
|
||||||
@@ -106,20 +119,27 @@ void wifi_nan_publish(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wifi_nan_followup_params_t fup = {0};
|
||||||
|
fup.ssi_len = (strlen(EXAMPLE_NAN_SVC_MSG) < ESP_WIFI_MAX_FUP_SSI_LEN) ? strlen(EXAMPLE_NAN_SVC_MSG) : ESP_WIFI_MAX_FUP_SSI_LEN;
|
||||||
|
fup.ssi = calloc(1, fup.ssi_len);
|
||||||
|
if (!fup.ssi) {
|
||||||
|
ESP_LOGE(TAG, "Failed to allocate for Follow-up");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memcpy((char *)fup.ssi, EXAMPLE_NAN_SVC_MSG, fup.ssi_len);
|
||||||
|
fup.inst_id = pub_id;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
EventBits_t bits = xEventGroupWaitBits(nan_event_group, NAN_RECEIVE, pdFALSE, pdFALSE, portMAX_DELAY);
|
EventBits_t bits = xEventGroupWaitBits(nan_event_group, NAN_RECEIVE, pdFALSE, pdFALSE, portMAX_DELAY);
|
||||||
if (bits & NAN_RECEIVE) {
|
if (bits & NAN_RECEIVE) {
|
||||||
xEventGroupClearBits(nan_event_group, NAN_RECEIVE);
|
xEventGroupClearBits(nan_event_group, NAN_RECEIVE);
|
||||||
wifi_nan_followup_params_t fup = {0};
|
fup.peer_inst_id = g_peer_inst_id;
|
||||||
fup.inst_id = pub_id,
|
memcpy(fup.peer_mac, g_peer_mac, sizeof(fup.peer_mac));
|
||||||
fup.peer_inst_id = g_peer_inst_id,
|
|
||||||
strlcpy(fup.svc_info, EXAMPLE_NAN_SVC_MSG, ESP_WIFI_MAX_SVC_INFO_LEN);
|
|
||||||
|
|
||||||
/* Reply to the message from a subscriber */
|
/* Reply to the message from a subscriber */
|
||||||
esp_wifi_nan_send_message(&fup);
|
esp_wifi_nan_send_message(&fup);
|
||||||
}
|
}
|
||||||
vTaskDelay(10);
|
|
||||||
}
|
}
|
||||||
|
free(fup.ssi);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialise_wifi(void)
|
void initialise_wifi(void)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
* SPDX-License-Identifier: Unlicense OR CC0-1.0
|
||||||
*/
|
*/
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
#define EXAMPLE_NAN_SVC_MSG "Hello"
|
#define EXAMPLE_NAN_SVC_MSG "Hello"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char *TAG = "nan_sub";
|
static const char *TAG = "subscriber";
|
||||||
|
|
||||||
static EventGroupHandle_t nan_event_group;
|
static EventGroupHandle_t nan_event_group;
|
||||||
|
|
||||||
@@ -42,8 +42,21 @@ const int NDP_FAILED = BIT2;
|
|||||||
|
|
||||||
static wifi_event_nan_svc_match_t g_svc_match_evt;
|
static wifi_event_nan_svc_match_t g_svc_match_evt;
|
||||||
|
|
||||||
|
static void nan_receive_event_handler(void *arg, esp_event_base_t event_base,
|
||||||
|
int32_t event_id, void *event_data)
|
||||||
|
{
|
||||||
|
wifi_event_nan_receive_t *evt = (wifi_event_nan_receive_t *)event_data;
|
||||||
|
if (evt->ssi_len) {
|
||||||
|
ESP_LOGI(TAG, "Received payload from Peer "MACSTR" [Peer Service id - %d] - ", MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
ESP_LOG_BUFFER_HEXDUMP(TAG, evt->ssi, evt->ssi_len, ESP_LOG_INFO);
|
||||||
|
} else {
|
||||||
|
ESP_LOGI(TAG, "Received message '%s' from Peer "MACSTR" [Peer Service id - %d]",
|
||||||
|
evt->peer_svc_info, MAC2STR(evt->peer_if_mac), evt->peer_inst_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLE_NAN_SEND_PING
|
#ifdef CONFIG_EXAMPLE_NAN_SEND_PING
|
||||||
static uint8_t g_peer_ndi[6];
|
static uint8_t g_peer_ndi[ETH_ALEN];
|
||||||
|
|
||||||
static void cmd_ping_on_ping_success(esp_ping_handle_t hdl, void *args)
|
static void cmd_ping_on_ping_success(esp_ping_handle_t hdl, void *args)
|
||||||
{
|
{
|
||||||
@@ -149,6 +162,11 @@ void wifi_nan_subscribe(void)
|
|||||||
&nan_svc_match_event_handler,
|
&nan_svc_match_event_handler,
|
||||||
NULL,
|
NULL,
|
||||||
&instance_any_id));
|
&instance_any_id));
|
||||||
|
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
|
||||||
|
WIFI_EVENT_NAN_RECEIVE,
|
||||||
|
&nan_receive_event_handler,
|
||||||
|
NULL,
|
||||||
|
&instance_any_id));
|
||||||
|
|
||||||
#ifdef CONFIG_EXAMPLE_NAN_SEND_PING
|
#ifdef CONFIG_EXAMPLE_NAN_SEND_PING
|
||||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
|
ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT,
|
||||||
@@ -189,13 +207,20 @@ void wifi_nan_subscribe(void)
|
|||||||
wifi_nan_followup_params_t fup = {
|
wifi_nan_followup_params_t fup = {
|
||||||
.inst_id = sub_id,
|
.inst_id = sub_id,
|
||||||
.peer_inst_id = g_svc_match_evt.publish_id,
|
.peer_inst_id = g_svc_match_evt.publish_id,
|
||||||
.svc_info = EXAMPLE_NAN_SVC_MSG,
|
|
||||||
};
|
};
|
||||||
memcpy(fup.peer_mac, g_svc_match_evt.pub_if_mac, sizeof(fup.peer_mac));
|
memcpy(fup.peer_mac, g_svc_match_evt.pub_if_mac, sizeof(fup.peer_mac));
|
||||||
|
fup.ssi_len = (strlen(EXAMPLE_NAN_SVC_MSG) < ESP_WIFI_MAX_FUP_SSI_LEN) ? strlen(EXAMPLE_NAN_SVC_MSG) : ESP_WIFI_MAX_FUP_SSI_LEN;
|
||||||
|
fup.ssi = calloc(1, fup.ssi_len);
|
||||||
|
if (!fup.ssi) {
|
||||||
|
ESP_LOGE(TAG, "Failed to allocate for Follow-up");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memcpy((char *)fup.ssi, EXAMPLE_NAN_SVC_MSG, fup.ssi_len);
|
||||||
|
|
||||||
if (esp_wifi_nan_send_message(&fup) == ESP_OK)
|
if (esp_wifi_nan_send_message(&fup) == ESP_OK)
|
||||||
ESP_LOGI(TAG, "Sending message '%s' to Publisher "MACSTR" ...",
|
ESP_LOGI(TAG, "Sending message '%s' to Publisher "MACSTR" ...",
|
||||||
EXAMPLE_NAN_SVC_MSG, MAC2STR(g_svc_match_evt.pub_if_mac));
|
EXAMPLE_NAN_SVC_MSG, MAC2STR(g_svc_match_evt.pub_if_mac));
|
||||||
|
free(fup.ssi);
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_EXAMPLE_NAN_SEND_PING
|
#ifdef CONFIG_EXAMPLE_NAN_SEND_PING
|
||||||
wifi_nan_datapath_req_t ndp_req = {0};
|
wifi_nan_datapath_req_t ndp_req = {0};
|
||||||
|
Reference in New Issue
Block a user