mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-03 22:08:28 +00:00 
			
		
		
		
	1. Fix crash while cancelling NAN service 2. Avoid possible crash scenarios while forming datapath 3. Modify peer records structure thus fixing issues in datapath establishment 4. Fix timer out of bound issue causing "No timer handle" warning 5. Fix miscellaneous service discovery and datapath issues
		
			
				
	
	
		
			205 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
 | 
						|
 *
 | 
						|
 * SPDX-License-Identifier: Apache-2.0
 | 
						|
 */
 | 
						|
 | 
						|
#pragma once
 | 
						|
 | 
						|
#include "esp_log.h"
 | 
						|
#include "esp_err.h"
 | 
						|
#include "lwip/inet.h"
 | 
						|
#include "esp_wifi_types.h"
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
extern "C" {
 | 
						|
#endif
 | 
						|
 | 
						|
#define WIFI_NAN_CONFIG_DEFAULT() { \
 | 
						|
    .op_channel = 6, \
 | 
						|
    .master_pref = 2, \
 | 
						|
    .scan_time = 3, \
 | 
						|
    .warm_up_sec = 5, \
 | 
						|
};
 | 
						|
 | 
						|
#define NDP_STATUS_ACCEPTED     1
 | 
						|
#define NDP_STATUS_REJECTED     2
 | 
						|
 | 
						|
#define NAN_MAX_PEERS_RECORD    15
 | 
						|
#define ESP_NAN_PUBLISH         1
 | 
						|
#define ESP_NAN_SUBSCRIBE       2
 | 
						|
 | 
						|
/** Parameters of a peer service record */
 | 
						|
struct nan_peer_record {
 | 
						|
    uint8_t peer_svc_id;   /**< Identifier of Peer's service */
 | 
						|
    uint8_t own_svc_id;    /**< Identifier of own service associated with Peer */
 | 
						|
    uint8_t peer_nmi[6];   /**< Peer's NAN Management Interface address */
 | 
						|
    uint8_t peer_svc_type; /**< Peer's service type (Publish/Subscribe) */
 | 
						|
    uint8_t ndp_id;        /**< Specifies if the peer has any active datapath */
 | 
						|
    uint8_t peer_ndi[6];   /**< Peer's NAN Data Interface address, only valid when ndp_id is non-zero */
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Start NAN Discovery with provided configuration
 | 
						|
  *
 | 
						|
  * @attention  This API should be called after esp_wifi_init().
 | 
						|
  *
 | 
						|
  * @param      nan_cfg  NAN related parameters to be configured.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - ESP_OK: succeed
 | 
						|
  *    - others: failed
 | 
						|
  */
 | 
						|
esp_err_t esp_wifi_nan_start(const wifi_nan_config_t *nan_cfg);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Stop NAN Discovery, end NAN Services and Datapaths
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - ESP_OK: succeed
 | 
						|
  *    - others: failed
 | 
						|
  */
 | 
						|
esp_err_t esp_wifi_nan_stop(void);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Start Publishing a service to the NAN Peers in vicinity
 | 
						|
  *
 | 
						|
  * @attention  This API should be called after esp_wifi_nan_start().
 | 
						|
  *
 | 
						|
  * @param      publish_cfg  Configuration parameters for publishing a service.
 | 
						|
  * @param      ndp_resp_needed Setting this true will require user response for every NDP Req using esp_wifi_nan_datapath_resp API.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - non-zero: Publish service identifier
 | 
						|
  *    - zero: failed
 | 
						|
  */
 | 
						|
uint8_t esp_wifi_nan_publish_service(const wifi_nan_publish_cfg_t *publish_cfg, bool ndp_resp_needed);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Subscribe for a service within the NAN cluster
 | 
						|
  *
 | 
						|
  * @attention  This API should be called after esp_wifi_nan_start().
 | 
						|
  *
 | 
						|
  * @param      subscribe_cfg  Configuration parameters for subscribing for a service.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - non-zero: Subscribe service identifier
 | 
						|
  *    - zero: failed
 | 
						|
  */
 | 
						|
uint8_t esp_wifi_nan_subscribe_service(const wifi_nan_subscribe_cfg_t *subscribe_cfg);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Send a follow-up message to the NAN Peer with matched service
 | 
						|
  *
 | 
						|
  * @attention  This API should be called after a NAN service is discovered due to a match.
 | 
						|
  *
 | 
						|
  * @param      fup_params  Configuration parameters for sending a Follow-up message.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - ESP_OK: succeed
 | 
						|
  *    - others: failed
 | 
						|
  */
 | 
						|
esp_err_t esp_wifi_nan_send_message(wifi_nan_followup_params_t *fup_params);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Cancel a NAN service
 | 
						|
  *
 | 
						|
  * @param      service_id Publish/Subscribe service id to be cancelled.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - ESP_OK: succeed
 | 
						|
  *    - others: failed
 | 
						|
  */
 | 
						|
esp_err_t esp_wifi_nan_cancel_service(uint8_t service_id);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Send NAN Datapath Request to a NAN Publisher with matched service
 | 
						|
  *
 | 
						|
  * @attention  This API should be called by the Subscriber after a match occurs with a Publisher.
 | 
						|
  *
 | 
						|
  * @param      req  NAN Datapath Request parameters.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - non-zero NAN Datapath identifier: If NAN datapath req was accepted by publisher
 | 
						|
  *    - zero: If NAN datapath req was rejected by publisher or a timeout occurs
 | 
						|
  */
 | 
						|
uint8_t esp_wifi_nan_datapath_req(wifi_nan_datapath_req_t *req);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Respond to a NAN Datapath request with Accept or Reject
 | 
						|
  *
 | 
						|
  * @attention  This API should be called if ndp_resp_needed is set True by the Publisher and
 | 
						|
  *             a WIFI_EVENT_NDP_INDICATION event is received due to an incoming NDP request.
 | 
						|
  *
 | 
						|
  * @param      resp  NAN Datapath Response parameters.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - ESP_OK: succeed
 | 
						|
  *    - others: failed
 | 
						|
  */
 | 
						|
esp_err_t esp_wifi_nan_datapath_resp(wifi_nan_datapath_resp_t *resp);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Terminate a NAN Datapath
 | 
						|
  *
 | 
						|
  * @param      req  NAN Datapath end request parameters.
 | 
						|
  *
 | 
						|
  * @return
 | 
						|
  *    - ESP_OK: succeed
 | 
						|
  *    - others: failed
 | 
						|
  */
 | 
						|
esp_err_t esp_wifi_nan_datapath_end(wifi_nan_datapath_end_req_t *req);
 | 
						|
 | 
						|
/**
 | 
						|
  * @brief      Get IPv6 Link Local address using MAC address
 | 
						|
  *
 | 
						|
  * @param[out]      ip6  Derived IPv6 Link Local address.
 | 
						|
  * @param[in]       mac_addr  Input MAC Address.
 | 
						|
  */
 | 
						|
void esp_wifi_nan_get_ipv6_linklocal_from_mac(ip6_addr_t *ip6, uint8_t *mac_addr);
 | 
						|
 | 
						|
/**
 | 
						|
 * brief         Get own Service information from Service ID OR Name.
 | 
						|
 *
 | 
						|
 * @attention    If service information is to be fetched from service name, set own_svc_id as zero.
 | 
						|
 *
 | 
						|
 * @param[inout] own_svc_id As input, it indicates Service ID to search for.
 | 
						|
 *                          As output, it indicates Service ID of the service found using Service Name.
 | 
						|
 * @param[inout] svc_name   As input, it indicates Service Name to search for.
 | 
						|
 *                          As output, it indicates Service Name of the service found using Service ID.
 | 
						|
 * @param[out]   num_peer_records  Number of peers discovered by corresponding service.
 | 
						|
 * @return
 | 
						|
 *   - ESP_OK: succeed
 | 
						|
 *   - ESP_FAIL: failed
 | 
						|
 */
 | 
						|
esp_err_t esp_wifi_nan_get_own_svc_info(uint8_t *own_svc_id, char *svc_name, int *num_peer_records);
 | 
						|
 | 
						|
/**
 | 
						|
 * brief         Get a list of Peers discovered by the given Service.
 | 
						|
 *
 | 
						|
 * @param[inout] num_peer_records As input param, it stores max peers peer_record can hold.
 | 
						|
 *               As output param, it specifies the actual number of peers this API returns.
 | 
						|
 * @param        own_svc_id  Service ID of own service.
 | 
						|
 * @param[out]   peer_record Pointer to first peer record.
 | 
						|
 * @return
 | 
						|
 *   - ESP_OK: succeed
 | 
						|
 *   - ESP_FAIL: failed
 | 
						|
 */
 | 
						|
esp_err_t esp_wifi_nan_get_peer_records(int *num_peer_records, uint8_t own_svc_id, struct nan_peer_record *peer_record);
 | 
						|
 | 
						|
/**
 | 
						|
 * brief         Find Peer's Service information using Peer MAC and optionally Service Name.
 | 
						|
 *
 | 
						|
 * @param       svc_name    Service Name of the published/subscribed service.
 | 
						|
 * @param       peer_mac    Peer's NAN Management Interface MAC address.
 | 
						|
 * @param[out]  peer_info   Peer's service information structure.
 | 
						|
 * @return
 | 
						|
 *   - ESP_OK: succeed
 | 
						|
 *   - ESP_FAIL: failed
 | 
						|
 */
 | 
						|
esp_err_t esp_wifi_nan_get_peer_info(char *svc_name, uint8_t *peer_mac, struct nan_peer_record *peer_info);
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 |