2018-02-27 18:22:20 +08:00
// Copyright 2017-2018 Espressif Systems (Shanghai) PTE LTD
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/*
* Software Stack demonstrated:
* |------------------------------------------------------------------------------|
* | | |
* | | Application |
* | |-----------------------------------------------------------------|
* | | | Protocols: | | | | |
* | | Mesh Stack | HTTP, DNS, | | | Other | |
* | RTOS: | (Networking, | DHCP, ... | | | Components | |
* | (freeRTOS) | self-healing, |------------| | | | |
* | | flow control, | Network Stack: | | | |
* | | ...) | (LwIP) | | | |
* | |-----------------------------------| |---------------| |
* | | | |
2018-06-26 20:48:47 +08:00
* | | Wi-Fi Driver | |
2018-02-27 18:22:20 +08:00
* | |--------------------------------------------------| |
* | | |
* | | Platform HAL |
* |------------------------------------------------------------------------------|
*
* System Events delivery:
*
* |---------------|
* | | default handler
2018-06-26 20:48:47 +08:00
* | Wi-Fi stack | events |---------------------|
2018-02-27 18:22:20 +08:00
* | | -------------> | |
* |---------------| | |
* | event task |
* |---------------| events | |
* | | -------------> | |
* | LwIP stack | |---------------------|
* | |--------|
* |---------------| |
* | mesh event callback handler
* | |----------------------------|
* |-----> | |
* |---------------| | application |
* | | events | task |
* | mesh stack | -------------> | |
* | | |----------------------------|
* |---------------|
*
*
* Mesh Stack
*
* Mesh event defines almost all system events applications tasks need.
2018-06-26 20:48:47 +08:00
* Mesh event contains Wi-Fi connection states on station interface, children connection states on softAP interface and etc..
2018-02-27 18:22:20 +08:00
* Applications need to register a mesh event callback handler by API esp_mesh_set_config() firstly.
* This handler is to receive events posted from mesh stack and LwIP stack.
* Applications could add relative handler for each event.
* Examples:
2018-06-26 20:48:47 +08:00
* (1) Applications could use Wi-Fi station connect states to decide when to send data to its parent, to the root or to external IP network;
* (2) Applications could use Wi-Fi softAP states to decide when to send data to its children.
2018-02-27 18:22:20 +08:00
*
* In present implementation, applications are able to access mesh stack directly without having to go through LwIP stack.
* Applications use esp_mesh_send() and esp_mesh_recv() to send and receive messages over the mesh network.
2018-05-21 17:22:04 +08:00
* In mesh stack design, normal devices don't require LwIP stack. But since IDF hasn't supported system without initializing LwIP stack yet,
2018-02-27 18:22:20 +08:00
* applications still need to do LwIP initialization and two more things are required to be done
2018-06-26 20:48:47 +08:00
* (1) stop DHCP server on softAP interface by default
* (2) stop DHCP client on station interface by default.
2018-02-27 18:22:20 +08:00
* Examples:
* tcpip_adapter_init();
* tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_AP);
* tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
*
2018-06-26 20:48:47 +08:00
* Over the mesh network, only the root is able to access external IP network.
* In application mesh event handler, once a device becomes a root, start DHCP client immediately whether DHCP is chosen.
2018-02-27 18:22:20 +08:00
*/
# ifndef __ESP_MESH_H__
# define __ESP_MESH_H__
# include "esp_err.h"
# include "esp_wifi.h"
# include "esp_wifi_types.h"
# include "esp_mesh_internal.h"
# ifdef __cplusplus
extern " C " {
# endif
/*******************************************************
* Constants
*******************************************************/
# define MESH_ROOT_LAYER (1) /**< root layer value */
# define MESH_MTU (1500) /**< max transmit unit(in bytes) */
# define MESH_MPS (1472) /**< max payload size(in bytes) */
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh error code definition
2018-02-27 18:22:20 +08:00
*/
2018-06-26 20:48:47 +08:00
# define ESP_ERR_MESH_WIFI_NOT_START (ESP_ERR_MESH_BASE + 1) /**< Wi-Fi isn't started */
2018-02-27 18:22:20 +08:00
# define ESP_ERR_MESH_NOT_INIT (ESP_ERR_MESH_BASE + 2) /**< mesh isn't initialized */
# define ESP_ERR_MESH_NOT_CONFIG (ESP_ERR_MESH_BASE + 3) /**< mesh isn't configured */
# define ESP_ERR_MESH_NOT_START (ESP_ERR_MESH_BASE + 4) /**< mesh isn't started */
# define ESP_ERR_MESH_NOT_SUPPORT (ESP_ERR_MESH_BASE + 5) /**< not supported yet */
# define ESP_ERR_MESH_NOT_ALLOWED (ESP_ERR_MESH_BASE + 6) /**< operation is not allowed */
# define ESP_ERR_MESH_NO_MEMORY (ESP_ERR_MESH_BASE + 7) /**< out of memory */
# define ESP_ERR_MESH_ARGUMENT (ESP_ERR_MESH_BASE + 8) /**< illegal argument */
# define ESP_ERR_MESH_EXCEED_MTU (ESP_ERR_MESH_BASE + 9) /**< packet size exceeds MTU */
# define ESP_ERR_MESH_TIMEOUT (ESP_ERR_MESH_BASE + 10) /**< timeout */
# define ESP_ERR_MESH_DISCONNECTED (ESP_ERR_MESH_BASE + 11) /**< disconnected with parent on station interface */
# define ESP_ERR_MESH_QUEUE_FAIL (ESP_ERR_MESH_BASE + 12) /**< queue fail */
# define ESP_ERR_MESH_QUEUE_FULL (ESP_ERR_MESH_BASE + 13) /**< queue full */
# define ESP_ERR_MESH_NO_PARENT_FOUND (ESP_ERR_MESH_BASE + 14) /**< no parent found to join the mesh network */
# define ESP_ERR_MESH_NO_ROUTE_FOUND (ESP_ERR_MESH_BASE + 15) /**< no route found to forward the packet */
# define ESP_ERR_MESH_OPTION_NULL (ESP_ERR_MESH_BASE + 16) /**< no option found */
# define ESP_ERR_MESH_OPTION_UNKNOWN (ESP_ERR_MESH_BASE + 17) /**< unknown option */
# define ESP_ERR_MESH_XON_NO_WINDOW (ESP_ERR_MESH_BASE + 18) /**< no window for software flow control on upstream */
2018-06-26 20:48:47 +08:00
# define ESP_ERR_MESH_INTERFACE (ESP_ERR_MESH_BASE + 19) /**< low-level Wi-Fi interface error */
2018-02-27 18:22:20 +08:00
# define ESP_ERR_MESH_DISCARD_DUPLICATE (ESP_ERR_MESH_BASE + 20) /**< discard the packet due to the duplicate sequence number */
# define ESP_ERR_MESH_DISCARD (ESP_ERR_MESH_BASE + 21) /**< discard the packet */
2018-05-18 12:25:52 +08:00
# define ESP_ERR_MESH_VOTING (ESP_ERR_MESH_BASE + 22) /**< vote in progress */
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Flags bitmap for esp_mesh_send() and esp_mesh_recv()
2018-02-27 18:22:20 +08:00
*/
2018-06-26 20:48:47 +08:00
# define MESH_DATA_ENC (0x01) /**< data encrypted (Unimplemented) */
2018-02-27 18:22:20 +08:00
# define MESH_DATA_P2P (0x02) /**< point-to-point delivery over the mesh network */
# define MESH_DATA_FROMDS (0x04) /**< receive from external IP network */
# define MESH_DATA_TODS (0x08) /**< identify this packet is target to external IP network */
# define MESH_DATA_NONBLOCK (0x10) /**< esp_mesh_send() non-block */
2018-06-26 20:48:47 +08:00
# define MESH_DATA_DROP (0x20) /**< in the situation of the root having been changed, identify this packet can be dropped by new root */
2018-02-27 18:22:20 +08:00
# define MESH_DATA_GROUP (0x40) /**< identify this packet is target to a group address */
/**
2018-06-26 20:48:47 +08:00
* @brief Option definitions for esp_mesh_send() and esp_mesh_recv()
2018-02-27 18:22:20 +08:00
*/
2018-05-18 12:25:52 +08:00
# define MESH_OPT_SEND_GROUP (7) /**< data transmission by group; used with esp_mesh_send() and shall have payload */
2018-02-27 18:22:20 +08:00
# define MESH_OPT_RECV_DS_ADDR (8) /**< return a remote IP address; used with esp_mesh_send() and esp_mesh_recv() */
2018-05-21 17:22:04 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Flag of mesh networking IE
2018-05-21 17:22:04 +08:00
*/
# define MESH_ASSOC_FLAG_VOTE_IN_PROGRESS (0x02) /**< vote in progress */
# define MESH_ASSOC_FLAG_NETWORK_FREE (0x08) /**< no root in current network */
# define MESH_ASSOC_FLAG_ROOTS_FOUND (0x20) /**< root conflict is found */
2018-06-26 20:48:47 +08:00
# define MESH_ASSOC_FLAG_ROOT_FIXED (0x40) /**< fixed root */
2018-05-21 17:22:04 +08:00
2018-02-27 18:22:20 +08:00
/*******************************************************
* Enumerations
*******************************************************/
/**
2018-06-26 20:48:47 +08:00
* @brief Enumerated list of mesh event id
2018-02-27 18:22:20 +08:00
*/
typedef enum {
MESH_EVENT_STARTED , /**< mesh is started */
MESH_EVENT_STOPPED , /**< mesh is stopped */
MESH_EVENT_CHANNEL_SWITCH , /**< channel switch */
MESH_EVENT_CHILD_CONNECTED , /**< a child is connected on softAP interface */
MESH_EVENT_CHILD_DISCONNECTED , /**< a child is disconnected on softAP interface */
MESH_EVENT_ROUTING_TABLE_ADD , /**< routing table is changed by adding newly joined children */
MESH_EVENT_ROUTING_TABLE_REMOVE , /**< routing table is changed by removing leave children */
MESH_EVENT_PARENT_CONNECTED , /**< parent is connected on station interface */
MESH_EVENT_PARENT_DISCONNECTED , /**< parent is disconnected on station interface */
2018-08-27 15:08:54 +08:00
MESH_EVENT_NO_PARENT_FOUND , /**< no parent found */
2018-02-27 18:22:20 +08:00
MESH_EVENT_LAYER_CHANGE , /**< layer changes over the mesh network */
2018-06-26 20:48:47 +08:00
MESH_EVENT_TODS_STATE , /**< state represents whether the root is able to access external IP network */
MESH_EVENT_VOTE_STARTED , /**< the process of voting a new root is started either by children or by the root */
2018-02-27 18:22:20 +08:00
MESH_EVENT_VOTE_STOPPED , /**< the process of voting a new root is stopped */
MESH_EVENT_ROOT_ADDRESS , /**< the root address is obtained. It is posted by mesh stack automatically. */
MESH_EVENT_ROOT_SWITCH_REQ , /**< root switch request sent from a new voted root candidate */
MESH_EVENT_ROOT_SWITCH_ACK , /**< root switch acknowledgment responds the above request sent from current root */
2018-06-26 20:48:47 +08:00
MESH_EVENT_ROOT_GOT_IP , /**< the root obtains the IP address. It is posted by LwIP stack automatically */
MESH_EVENT_ROOT_LOST_IP , /**< the root loses the IP address. It is posted by LwIP stack automatically */
MESH_EVENT_ROOT_ASKED_YIELD , /**< the root is asked yield by a more powerful existing root. If self organized is disabled
2018-02-27 18:22:20 +08:00
and this device is specified to be a root by users, users should set a new parent
for this device. if self organized is enabled, this device will find a new parent
by itself, users could ignore this event. */
2018-05-21 17:22:04 +08:00
MESH_EVENT_ROOT_FIXED , /**< when devices join a network, if the setting of Fixed Root for one device is different
from that of its parent, the device will update the setting the same as its parent's.
2018-06-26 20:48:47 +08:00
Fixed Root Setting of each device is variable as that setting changes of the root. */
2018-05-21 17:22:04 +08:00
MESH_EVENT_SCAN_DONE , /**< if self-organized networking is disabled, user can call esp_wifi_scan_start() to trigger
this event, and add the corresponding scan done handler in this event. */
2018-02-27 18:22:20 +08:00
MESH_EVENT_MAX ,
} mesh_event_id_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Device type
2018-02-27 18:22:20 +08:00
*/
typedef enum {
MESH_IDLE , /**< hasn't joined the mesh network yet */
MESH_ROOT , /**< the only sink of the mesh network. Has the ability to access external IP network */
2018-05-21 17:22:04 +08:00
MESH_NODE , /**< intermediate device. Has the ability to forward packets over the mesh network */
2018-02-27 18:22:20 +08:00
MESH_LEAF , /**< has no forwarding ability */
} mesh_type_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Protocol of transmitted application data
2018-02-27 18:22:20 +08:00
*/
typedef enum {
MESH_PROTO_BIN , /**< binary */
MESH_PROTO_HTTP , /**< HTTP protocol */
MESH_PROTO_JSON , /**< JSON format */
MESH_PROTO_MQTT , /**< MQTT protocol */
} mesh_proto_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief For reliable transmission, mesh stack provides three type of services
2018-02-27 18:22:20 +08:00
*/
typedef enum {
2018-06-26 20:48:47 +08:00
MESH_TOS_P2P , /**< provide P2P (point-to-point) retransmission on mesh stack by default */
MESH_TOS_E2E , /**< provide E2E (end-to-end) retransmission on mesh stack (Unimplemented) */
2018-02-27 18:22:20 +08:00
MESH_TOS_DEF , /**< no retransmission on mesh stack */
} mesh_tos_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Vote reason
2018-02-27 18:22:20 +08:00
*/
typedef enum {
2018-06-26 20:48:47 +08:00
MESH_VOTE_REASON_ROOT_INITIATED = 1 , /**< vote is initiated by the root */
2018-02-27 18:22:20 +08:00
MESH_VOTE_REASON_CHILD_INITIATED , /**< vote is initiated by children */
} mesh_vote_reason_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh disconnect reason code
2018-02-27 18:22:20 +08:00
*/
typedef enum {
MESH_REASON_CYCLIC = 100 , /**< cyclic is detected */
MESH_REASON_PARENT_IDLE , /**< parent is idle */
2018-05-21 17:22:04 +08:00
MESH_REASON_LEAF , /**< the connected device is changed to a leaf */
2018-02-27 18:22:20 +08:00
MESH_REASON_DIFF_ID , /**< in different mesh ID */
MESH_REASON_ROOTS , /**< root conflict is detected */
MESH_REASON_PARENT_STOPPED , /**< parent has stopped the mesh */
MESH_REASON_SCAN_FAIL , /**< scan fail */
} mesh_disconnect_reason_t ;
/*******************************************************
* Structures
*******************************************************/
/**
* @brief IP address and port
*/
typedef struct {
ip4_addr_t ip4 ; /**< IP address */
uint16_t port ; /**< port */
} __attribute__ ( ( packed ) ) mip_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh address
2018-02-27 18:22:20 +08:00
*/
typedef union {
uint8_t addr [ 6 ] ; /**< mac address */
mip_t mip ; /**< mip address */
} mesh_addr_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Channel switch information
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint8_t channel ; /**< new channel */
} mesh_event_channel_switch_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Parent connected information
2018-02-27 18:22:20 +08:00
*/
typedef struct {
2018-06-26 20:48:47 +08:00
system_event_sta_connected_t connected ; /**< parent information, same as Wi-Fi event SYSTEM_EVENT_STA_CONNECTED does */
2018-02-27 18:22:20 +08:00
uint8_t self_layer ; /**< layer */
} mesh_event_connected_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief No parent found information
2018-02-27 18:22:20 +08:00
*/
typedef struct {
int scan_times ; /**< scan times being through */
} mesh_event_no_parent_found_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Layer change information
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint8_t new_layer ; /**< new layer */
} mesh_event_layer_change_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief The reachability of the root to a DS (distribute system)
2018-02-27 18:22:20 +08:00
*/
typedef enum {
2018-06-26 20:48:47 +08:00
MESH_TODS_UNREACHABLE , /**< the root isn't able to access external IP network */
MESH_TODS_REACHABLE , /**< the root is able to access external IP network */
2018-02-27 18:22:20 +08:00
} mesh_event_toDS_state_t ;
/**
* @brief vote started information
*/
typedef struct {
2018-06-26 20:48:47 +08:00
int reason ; /**< vote reason, vote could be initiated by children or by the root itself */
2018-02-27 18:22:20 +08:00
int attempts ; /**< max vote attempts before stopped */
mesh_addr_t rc_addr ; /**< root address specified by users via API esp_mesh_waive_root() */
} mesh_event_vote_started_t ;
/**
* @brief IP settings from LwIP stack
*/
typedef system_event_sta_got_ip_t mesh_event_root_got_ip_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Root address
2018-02-27 18:22:20 +08:00
*/
typedef mesh_addr_t mesh_event_root_address_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Parent disconnected information
2018-02-27 18:22:20 +08:00
*/
typedef system_event_sta_disconnected_t mesh_event_disconnected_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Child connected information
2018-02-27 18:22:20 +08:00
*/
typedef system_event_ap_staconnected_t mesh_event_child_connected_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Child disconnected information
2018-02-27 18:22:20 +08:00
*/
typedef system_event_ap_stadisconnected_t mesh_event_child_disconnected_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Root switch request information
2018-02-27 18:22:20 +08:00
*/
typedef struct {
int reason ; /**< root switch reason, generally root switch is initialized by users via API esp_mesh_waive_root() */
mesh_addr_t rc_addr ; /**< the address of root switch requester */
} mesh_event_root_switch_req_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Other powerful root address
2018-02-27 18:22:20 +08:00
*/
typedef struct {
int8_t rssi ; /**< rssi with router */
2018-05-21 17:22:04 +08:00
uint16_t capacity ; /**< the number of devices in current network */
2018-02-27 18:22:20 +08:00
uint8_t addr [ 6 ] ; /**< other powerful root address */
} mesh_event_root_conflict_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Routing table change
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint16_t rt_size_new ; /**< the new value */
uint16_t rt_size_change ; /**< the changed value */
} mesh_event_routing_table_change_t ;
2018-04-26 00:13:53 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Root fixed
2018-04-26 00:13:53 +08:00
*/
typedef struct {
bool is_fixed ; /**< status */
} mesh_event_root_fixed_t ;
2018-05-21 17:22:04 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Scan done event information
2018-05-21 17:22:04 +08:00
*/
typedef struct {
2018-06-26 20:48:47 +08:00
uint8_t number ; /**< the number of APs scanned */
2018-05-21 17:22:04 +08:00
} mesh_event_scan_done_t ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh event information
2018-02-27 18:22:20 +08:00
*/
typedef union {
mesh_event_channel_switch_t channel_switch ; /**< channel switch */
mesh_event_child_connected_t child_connected ; /**< child connected */
mesh_event_child_disconnected_t child_disconnected ; /**< child disconnected */
mesh_event_routing_table_change_t routing_table ; /**< routing table change */
mesh_event_connected_t connected ; /**< parent connected */
mesh_event_disconnected_t disconnected ; /**< parent disconnected */
mesh_event_no_parent_found_t no_parent ; /**< no parent found */
mesh_event_layer_change_t layer_change ; /**< layer change */
2018-05-21 17:22:04 +08:00
mesh_event_toDS_state_t toDS_state ; /**< toDS state, devices shall check this state firstly before trying to send packets to
2018-06-26 20:48:47 +08:00
external IP network. This state indicates right now whether the root is capable of sending
2018-05-21 17:22:04 +08:00
packets out. If not, devices had better to wait until this state changes to be
MESH_TODS_REACHABLE. */
2018-02-27 18:22:20 +08:00
mesh_event_vote_started_t vote_started ; /**< vote started */
mesh_event_root_got_ip_t got_ip ; /**< root obtains IP address */
mesh_event_root_address_t root_addr ; /**< root address */
mesh_event_root_switch_req_t switch_req ; /**< root switch request */
mesh_event_root_conflict_t root_conflict ; /**< other powerful root */
2018-06-26 20:48:47 +08:00
mesh_event_root_fixed_t root_fixed ; /**< fixed root */
2018-05-21 17:22:04 +08:00
mesh_event_scan_done_t scan_done ; /**< scan done */
2018-02-27 18:22:20 +08:00
} mesh_event_info_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh event
2018-02-27 18:22:20 +08:00
*/
typedef struct {
mesh_event_id_t id ; /**< mesh event id */
mesh_event_info_t info ; /**< mesh event info */
} mesh_event_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh event callback handler prototype definition
2018-02-27 18:22:20 +08:00
*
* @param event mesh_event_t
*/
typedef void ( * mesh_event_cb_t ) ( mesh_event_t event ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh option
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint8_t type ; /**< option type */
uint16_t len ; /**< option length */
uint8_t * val ; /**< option value */
} __attribute__ ( ( packed ) ) mesh_opt_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh data for esp_mesh_send() and esp_mesh_recv()
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint8_t * data ; /**< data */
uint16_t size ; /**< data size */
mesh_proto_t proto ; /**< data protocol */
mesh_tos_t tos ; /**< data type of service */
} mesh_data_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Router configuration
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint8_t ssid [ 32 ] ; /**< SSID */
uint8_t ssid_len ; /**< length of SSID */
uint8_t bssid [ 6 ] ; /**< BSSID, if router is hidden, this value is mandatory */
uint8_t password [ 64 ] ; /**< password */
} mesh_router_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh softAP configuration
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint8_t password [ 64 ] ; /**< mesh softAP password */
uint8_t max_connection ; /**< max number of stations allowed to connect in, max 10 */
} mesh_ap_cfg_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh initialization configuration
2018-02-27 18:22:20 +08:00
*/
typedef struct {
uint8_t channel ; /**< channel, the mesh network on */
mesh_event_cb_t event_cb ; /**< mesh event callback */
mesh_addr_t mesh_id ; /**< mesh network identification */
mesh_router_t router ; /**< router configuration */
mesh_ap_cfg_t mesh_ap ; /**< mesh softAP configuration */
const mesh_crypto_funcs_t * crypto_funcs ; /**< crypto functions */
} mesh_cfg_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Vote address configuration
2018-02-27 18:22:20 +08:00
*/
typedef union {
2018-05-18 12:25:52 +08:00
int attempts ; /**< max vote attempts before a new root is elected automatically by mesh network. (min:15, 15 by default) */
mesh_addr_t rc_addr ; /**< a new root address specified by users for API esp_mesh_waive_root() */
} mesh_rc_config_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief Vote
2018-05-18 12:25:52 +08:00
*/
typedef struct {
float percentage ; /**< vote percentage threshold for approval of being a root */
2018-06-26 20:48:47 +08:00
bool is_rc_specified ; /**< if true, rc_addr shall be specified (Unimplemented).
2018-05-18 12:25:52 +08:00
if false, attempts value shall be specified to make network start root election. */
mesh_rc_config_t config ; /**< vote address configuration */
2018-02-27 18:22:20 +08:00
} mesh_vote_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief The number of packets pending in the queue waiting to be sent by the mesh stack
2018-02-27 18:22:20 +08:00
*/
typedef struct {
int to_parent ; /**< to parent queue */
2018-06-26 20:48:47 +08:00
int to_parent_p2p ; /**< to parent (P2P) queue */
2018-02-27 18:22:20 +08:00
int to_child ; /**< to child queue */
2018-06-26 20:48:47 +08:00
int to_child_p2p ; /**< to child (P2P) queue */
2018-02-27 18:22:20 +08:00
int mgmt ; /**< management queue */
int broadcast ; /**< broadcast and multicast queue */
} mesh_tx_pending_t ;
/**
2018-06-26 20:48:47 +08:00
* @brief The number of packets available in the queue waiting to be received by applications
2018-02-27 18:22:20 +08:00
*/
typedef struct {
int toDS ; /**< to external DS */
int toSelf ; /**< to self */
} mesh_rx_pending_t ;
/*******************************************************
* Variable Declaration
*******************************************************/
2018-06-26 20:48:47 +08:00
/* mesh IE crypto callback function */
2018-02-27 18:22:20 +08:00
extern const mesh_crypto_funcs_t g_wifi_default_mesh_crypto_funcs ;
/* mesh event callback handler */
extern mesh_event_cb_t g_mesh_event_cb ;
# define MESH_INIT_CONFIG_DEFAULT() { \
.crypto_funcs = &g_wifi_default_mesh_crypto_funcs, \
}
/*******************************************************
* Function Definitions
*******************************************************/
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh initialization
* - Check whether Wi-Fi is started.
* - Initialize mesh global variables with default values.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @attention This API shall be called after Wi-Fi is started.
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_mesh_init ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Mesh de-initialization
*
* - Release resources and stop the mesh
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_mesh_deinit ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Start mesh
* - Initialize mesh IE.
* - Start mesh network management service.
* - Create TX and RX queues according to the configuration.
* - Register mesh packets receive callback.
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called after mesh initialization and configuration.
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
* - ESP_ERR_MESH_NOT_INIT
* - ESP_ERR_MESH_NOT_CONFIG
* - ESP_ERR_MESH_NO_MEMORY
*/
esp_err_t esp_mesh_start ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Stop mesh
* - Deinitialize mesh IE.
* - Disconnect with current parent.
* - Disassociate all currently associated children.
* - Stop mesh network management service.
* - Unregister mesh packets receive callback.
* - Delete TX and RX queues.
* - Release resources.
* - Restore Wi-Fi softAP to default settings if Wi-Fi dual mode is enabled.
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_mesh_stop ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Send a packet over the mesh network
* - Send a packet to any device in the mesh network.
* - Send a packet to external IP network.
*
* @attention This API is not reentrant.
*
* @param[in] to the address of the final destination of the packet
* - If the packet is to the root, set this parameter to NULL.
* - If the packet is to an external IP network, set this parameter to the IPv4:PORT combination.
* This packet will be delivered to the root firstly, then the root will forward this packet to the final IP server address.
* @param[in] data pointer to a sending mesh packet
* - Field proto should be set to data protocol in use (default is MESH_PROTO_BIN for binary).
* - Field tos should be set to transmission tos (type of service) in use (default is MESH_TOS_P2P for point-to-point reliable).
* @param[in] flag bitmap for data sent
* - Speed up the route search
* - If the packet is to the root and "to" parameter is NULL, set this parameter to 0.
* - If the packet is to an internal device, MESH_DATA_P2P should be set.
* - If the packet is to the root ("to" parameter isn't NULL) or to external IP network, MESH_DATA_TODS should be set.
* - If the packet is from the root to an internal device, MESH_DATA_FROMDS should be set.
* - Specify whether this API is block or non-block, block by default
* - If needs non-block, MESH_DATA_NONBLOCK should be set.
* - In the situation of the root change, MESH_DATA_DROP identifies this packet can be dropped by the new root
* for upstream data to external IP network, we try our best to avoid data loss caused by the root change, but
* there is a risk that the new root is running out of memory because most of memory is occupied by the pending data which
* isn't read out in time by esp_mesh_recv_toDS().
*
* Generally, we suggest esp_mesh_recv_toDS() is called after a connection with IP network is created. Thus data outgoing
* to external IP network via socket is just from reading esp_mesh_recv_toDS() which avoids unnecessary memory copy.
*
* @param[in] opt options
* - In case of sending a packet to a certain group, MESH_OPT_SEND_GROUP is a good choice.
* In this option, the value field should be set to the target receiver addresses in this group.
* - Root sends a packet to an internal device, this packet is from external IP network in case the receiver device responds
* this packet, MESH_OPT_RECV_DS_ADDR is required to attach the target DS address.
* @param[in] opt_count option count
* - Currently, this API only takes one option, so opt_count is only supported to be 1.
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
* - ESP_ERR_MESH_ARGUMENT
* - ESP_ERR_MESH_NOT_START
* - ESP_ERR_MESH_DISCONNECTED
* - ESP_ERR_MESH_OPT_UNKNOWN
* - ESP_ERR_MESH_EXCEED_MTU
* - ESP_ERR_MESH_NO_MEMORY
* - ESP_ERR_MESH_TIMEOUT
* - ESP_ERR_MESH_QUEUE_FULL
* - ESP_ERR_MESH_NO_ROUTE_FOUND
* - ESP_ERR_MESH_DISCARD
*/
esp_err_t esp_mesh_send ( const mesh_addr_t * to , const mesh_data_t * data ,
2018-05-21 17:22:04 +08:00
int flag , const mesh_opt_t opt [ ] , int opt_count ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Receive a packet targeted to self over the mesh network
*
* @attention Mesh RX queue should be checked regularly to avoid running out of memory.
* - Use esp_mesh_get_rx_pending() to check the number of packets available in the queue waiting
* to be received by applications.
*
* @param[out] from the address of the original source of the packet
* @param[out] data pointer to the received mesh packet
* - Field proto is the data protocol in use. Should follow it to parse the received data.
* - Field tos is the transmission tos (type of service) in use.
* @param[in] timeout_ms wait time if a packet isn't immediately available (0:no wait, portMAX_DELAY:wait forever)
* @param[out] flag bitmap for data received
* - MESH_DATA_FROMDS represents data from external IP network
* - MESH_DATA_TODS represents data directed upward within the mesh network
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* flag could be MESH_DATA_FROMDS or MESH_DATA_TODS.
* @param[out] opt options desired to receive
* - MESH_OPT_RECV_DS_ADDR attaches the DS address
* @param[in] opt_count option count desired to receive
* - Currently, this API only takes one option, so opt_count is only supported to be 1.
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
* - ESP_ERR_MESH_NOT_START
* - ESP_ERR_MESH_TIMEOUT
* - ESP_ERR_MESH_DISCARD
*/
esp_err_t esp_mesh_recv ( mesh_addr_t * from , mesh_data_t * data , int timeout_ms ,
int * flag , mesh_opt_t opt [ ] , int opt_count ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Receive a packet targeted to external IP network
* - Root uses this API to receive packets destined to external IP network
* - Root forwards the received packets to the final destination via socket.
* - If no socket connection is ready to send out the received packets and this esp_mesh_recv_toDS()
* hasn't been called by applications, packets from the whole mesh network will be pending in toDS queue.
*
* Use esp_mesh_get_rx_pending() to check the number of packets available in the queue waiting
* to be received by applications in case of running out of memory in the root.
*
* Using esp_mesh_set_xon_qsize() users may configure the RX queue size, default:32. If this size is too large,
* and esp_mesh_recv_toDS() isn't called in time, there is a risk that a great deal of memory is occupied
* by the pending packets. If this size is too small, it will impact the efficiency on upstream. How to
* decide this value depends on the specific application scenarios.
*
* @attention This API is only called by the root.
*
* @param[out] from the address of the original source of the packet
* @param[out] to the address contains remote IP address and port (IPv4:PORT)
* @param[out] data pointer to the received packet
* - Contain the protocol and applications should follow it to parse the data.
* @param[in] timeout_ms wait time if a packet isn't immediately available (0:no wait, portMAX_DELAY:wait forever)
* @param[out] flag bitmap for data received
* - MESH_DATA_TODS represents the received data target to external IP network. Root shall forward this data to external IP network via the association with router.
*
* flag could be MESH_DATA_TODS.
* @param[out] opt options desired to receive
* @param[in] opt_count option count desired to receive
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
* - ESP_ERR_MESH_NOT_START
* - ESP_ERR_MESH_TIMEOUT
* - ESP_ERR_MESH_DISCARD
*/
esp_err_t esp_mesh_recv_toDS ( mesh_addr_t * from , mesh_addr_t * to ,
mesh_data_t * data , int timeout_ms , int * flag , mesh_opt_t opt [ ] ,
int opt_count ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh stack configuration
* - Use MESH_INIT_CONFIG_DEFAULT() to initialize the default values, mesh IE is encrypted by default.
* - Mesh network is established on a fixed channel (1-14).
* - Mesh event callback is mandatory.
* - Mesh ID is an identifier of an MBSS. Nodes with the same mesh ID can communicate with each other.
* - Regarding to the router configuration, if the router is hidden, BSSID field is mandatory.
*
* If BSSID field isn't set and there exists more than one router with same SSID, there is a risk that more
* roots than one connected with different BSSID will appear. It means more than one mesh network is established
* with the same mesh ID.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* Root conflict function could eliminate redundant roots connected with the same BSSID, but couldn't handle roots
* connected with different BSSID. Because users might have such requirements of setting up routers with same SSID
* for the future replacement. But in that case, if the above situations happen, please make sure applications
2018-09-23 21:09:59 +08:00
* implement forward functions on the root to guarantee devices in different mesh networks can communicate with each other.
2018-06-26 20:48:47 +08:00
* max_connection of mesh softAP is limited by the max number of Wi-Fi softAP supported (max:10).
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started after mesh is initialized.
2018-06-26 20:48:47 +08:00
*
* @param[in] config pointer to mesh stack configuration
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
* - ESP_ERR_MESH_NOT_ALLOWED
*/
esp_err_t esp_mesh_set_config ( const mesh_cfg_t * config ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get mesh stack configuration
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] config pointer to mesh stack configuration
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
*/
esp_err_t esp_mesh_get_config ( mesh_cfg_t * config ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get router configuration
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API is used to dynamically modify the router configuration after mesh is configured.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] router pointer to router configuration
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
*/
esp_err_t esp_mesh_set_router ( const mesh_router_t * router ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get router configuration
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] router pointer to router configuration
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
*/
esp_err_t esp_mesh_get_router ( mesh_router_t * router ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh network ID
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API is used to dynamically modify the mesh network ID.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] id pointer to mesh network ID
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT: invalid argument
*/
esp_err_t esp_mesh_set_id ( const mesh_addr_t * id ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get mesh network ID
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] id pointer to mesh network ID
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
*/
esp_err_t esp_mesh_get_id ( mesh_addr_t * id ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Designate device type over the mesh network
2018-09-23 21:09:59 +08:00
* - MESH_ROOT: designates the root node for a mesh network
* - MESH_LEAF: designates a device as a standalone Wi-Fi station
2018-08-27 15:08:54 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] type device type
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_NOT_ALLOWED
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_type ( mesh_type_t type ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get device type over mesh network
*
* @attention This API shall be called after having received the event MESH_EVENT_PARENT_CONNECTED.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return mesh type
2018-02-27 18:22:20 +08:00
*
*/
mesh_type_t esp_mesh_get_type ( void ) ;
/**
2018-09-23 21:09:59 +08:00
* @brief Set network max layer value (max:25, default:25)
2018-06-26 20:48:47 +08:00
* - Network max layer limits the max hop count.
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] max_layer max layer value
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
* - ESP_ERR_MESH_NOT_ALLOWED
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_max_layer ( int max_layer ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get max layer value
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return max layer value
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_max_layer ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh softAP password
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] pwd pointer to the password
* @param[in] len password length
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
* - ESP_ERR_MESH_NOT_ALLOWED
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_ap_password ( const uint8_t * pwd , int len ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh softAP authentication mode
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] authmode authentication mode
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
* - ESP_ERR_MESH_NOT_ALLOWED
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_ap_authmode ( wifi_auth_mode_t authmode ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get mesh softAP authentication mode
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return authentication mode
2018-02-27 18:22:20 +08:00
*/
wifi_auth_mode_t esp_mesh_get_ap_authmode ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh softAP max connection value
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] connections the number of max connections
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_ap_connections ( int connections ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get mesh softAP max connection configuration
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return the number of max connections
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_ap_connections ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get current layer value over the mesh network
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @attention This API shall be called after having received the event MESH_EVENT_PARENT_CONNECTED.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return layer value
2018-02-27 18:22:20 +08:00
*
*/
int esp_mesh_get_layer ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get the parent BSSID
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @attention This API shall be called after having received the event MESH_EVENT_PARENT_CONNECTED.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] bssid pointer to parent BSSID
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_mesh_get_parent_bssid ( mesh_addr_t * bssid ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Return whether the device is the root node of the network
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return true/false
2018-02-27 18:22:20 +08:00
*/
bool esp_mesh_is_root ( void ) ;
/**
2018-09-23 21:09:59 +08:00
* @brief Enable/disable self-organized networking
* - Self-organized networking has three main functions:
* select the root node;
* find a preferred parent;
* initiate reconnection if a disconnection is detected.
* - Self-organized networking is enabled by default.
* - If self-organized is disabled, users should set a parent for the device via esp_mesh_set_parent().
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API is used to dynamically modify whether to enable the self organizing.
2018-05-21 17:22:04 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] enable enable or disable self-organized networking
* @param[in] select_parent
* - If self-organized networking is enabled, let the device search for a new parent or
2018-05-21 17:22:04 +08:00
* keep connecting to the previous parent.
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_self_organized ( bool enable , bool select_parent ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Return whether enable self-organized networking or not
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return true/false
2018-02-27 18:22:20 +08:00
*/
bool esp_mesh_get_self_organized ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Cause the root device to give up (waive) its mesh root status
* - A device is elected root primarily based on RSSI from the external router.
* - If external router conditions change, users can call this API to perform a root switch.
* - In this API, users could specify a desired root address to replace itself or specify an attempts value
* to ask current root to initiate a new round of voting. During the voting, a better root candidate would
* be expected to find to replace the current one.
* - If no desired root candidate, the vote will try a specified number of attempts (at least 15). If no better
* root candidate is found, keep the current one. If a better candidate is found, the new better one will
* send a root switch request to the current root, current root will respond with a root switch acknowledgment.
* - After that, the new candidate will connect to the router to be a new root, the previous root will disconnect
* with the router and choose another parent instead.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* Root switch is completed with minimal disruption to the whole mesh network.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @attention This API is only called by the root.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] vote vote configuration
* - If this parameter is set NULL, the vote will perform the default 15 times.
*
* - Field percentage threshold is 0.9 by default.
* - Field is_rc_specified shall be false.
* - Field attempts shall be at least 15 times.
* @param[in] reason only accept MESH_VOTE_REASON_ROOT_INITIATED for now
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
2018-06-14 18:33:35 +08:00
* - ESP_ERR_MESH_QUEUE_FULL
* - ESP_ERR_MESH_DISCARD
2018-02-27 18:22:20 +08:00
* - ESP_FAIL
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_waive_root ( const mesh_vote_t * vote , int reason ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Set vote percentage threshold for approval of being a root
* - During the networking, only obtaining vote percentage reaches this threshold,
* the device could be a root.
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] percentage vote percentage threshold
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_vote_percentage ( float percentage ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get vote percentage threshold for approval of being a root
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return percentage threshold
2018-02-27 18:22:20 +08:00
*/
float esp_mesh_get_vote_percentage ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh softAP associate expired time
* - If mesh softAP hasn't received any data from an associated child within this time,
* mesh softAP will take this child inactive and disassociate it.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] seconds the expired time
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_ap_assoc_expire ( int seconds ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get mesh softAP associate expired time
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return seconds
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_ap_assoc_expire ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get total number of devices in current network (including the root)
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @attention The returned value might be incorrect when the network is changing.
2018-02-27 18:22:20 +08:00
**
2018-06-26 20:48:47 +08:00
* @return total number of devices (including the root)
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_total_node_num ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get the number of devices in this device's sub-network (including self)
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return the number of devices over this device's sub-network (including self)
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_routing_table_size ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get routing table of this device's sub-network (including itself)
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] mac pointer to routing table
* @param[in] len routing table size(in bytes)
* @param[out] size pointer to the number of devices in routing table (including itself)
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_ARGUMENT
*/
esp_err_t esp_mesh_get_routing_table ( mesh_addr_t * mac , int len , int * size ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Post the toDS state to the mesh stack
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @attention This API is only for the root.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] reachable this state represents whether the root is able to access external IP network
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_post_toDS_state ( bool reachable ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Return the number of packets pending in the queue waiting to be sent by the mesh stack
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] pending pointer to the TX pending
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_mesh_get_tx_pending ( mesh_tx_pending_t * pending ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Return the number of packets available in the queue waiting to be received by applications
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] pending pointer to the RX pending
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_mesh_get_rx_pending ( mesh_rx_pending_t * pending ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Return the number of packets could be accepted from the specified address
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] addr self address or an associate children address
* @param[out] xseqno_in sequence number of the last received packet from the specified address
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return the number of upQ for a certain address
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_available_txupQ_num ( const mesh_addr_t * addr , uint32_t * xseqno_in ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set the number of queue
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] qsize default:32 (min:16)
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_FAIL
*/
esp_err_t esp_mesh_set_xon_qsize ( int qsize ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get queue size
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return the number of queue
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_xon_qsize ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set whether allow more than one root existing in one network
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] allowed allow or not
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_WIFI_ERR_NOT_INIT
* - ESP_WIFI_ERR_NOT_START
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_allow_root_conflicts ( bool allowed ) ;
2018-02-27 18:22:20 +08:00
2018-04-26 00:13:53 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Check whether allow more than one root to exist in one network
2018-04-26 00:13:53 +08:00
*
2018-06-26 20:48:47 +08:00
* @return true/false
2018-04-26 00:13:53 +08:00
*/
bool esp_mesh_is_root_conflicts_allowed ( void ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Set group ID addresses
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] addr pointer to new group ID addresses
* @param[in] num the number of group ID addresses
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_MESH_ERR_ARGUMENT
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_group_id ( const mesh_addr_t * addr , int num ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Delete group ID addresses
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] addr pointer to deleted group ID address
* @param[in] num the number of group ID addresses
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_MESH_ERR_ARGUMENT
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_delete_group_id ( const mesh_addr_t * addr , int num ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get the number of group ID addresses
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return the number of group ID addresses
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_group_num ( void ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get group ID addresses
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] addr pointer to group ID addresses
* @param[in] num the number of group ID addresses
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_MESH_ERR_ARGUMENT
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_get_group_list ( mesh_addr_t * addr , int num ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Check whether the specified group address is my group
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return true/false
2018-02-27 18:22:20 +08:00
*/
bool esp_mesh_is_my_group ( const mesh_addr_t * addr ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh network capacity
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API shall be called before mesh is started.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] num mesh network capacity
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_NOT_ALLOWED
* - ESP_MESH_ERR_ARGUMENT
*/
esp_err_t esp_mesh_set_capacity_num ( int num ) ;
/**
2018-09-23 21:09:59 +08:00
* @brief Get mesh network capacity
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @return mesh network capacity
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_capacity_num ( void ) ;
/**
2018-09-23 21:09:59 +08:00
* @brief Set mesh IE crypto functions
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API can be called at any time after mesh is initialized.
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @param[in] crypto_funcs crypto functions for mesh IE
* - If crypto_funcs is set to NULL, mesh IE is no longer encrypted.
2018-02-27 18:22:20 +08:00
* @return
* - ESP_OK
*/
esp_err_t esp_mesh_set_ie_crypto_funcs ( const mesh_crypto_funcs_t * crypto_funcs ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Set mesh IE crypto key
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @attention This API can be called at any time after mesh is initialized.
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] key ASCII crypto key
* @param[in] len length in bytes, range:8~64
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_MESH_ERR_ARGUMENT
*/
2018-05-18 12:25:52 +08:00
esp_err_t esp_mesh_set_ie_crypto_key ( const char * key , int len ) ;
2018-02-27 18:22:20 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get mesh IE crypto key
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] key ASCII crypto key
* @param[in] len length in bytes, range:8~64
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
* - ESP_MESH_ERR_ARGUMENT
*/
2018-05-18 12:25:52 +08:00
esp_err_t esp_mesh_get_ie_crypto_key ( char * key , int len ) ;
2018-02-27 18:22:20 +08:00
/**
2018-09-23 21:09:59 +08:00
* @brief Set delay time before starting root healing
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @param[in] delay_ms delay time in milliseconds
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
*/
esp_err_t esp_mesh_set_root_healing_delay ( int delay_ms ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get delay time before network starts root healing
2018-02-27 18:22:20 +08:00
*
2018-06-26 20:48:47 +08:00
* @return delay time in milliseconds
2018-02-27 18:22:20 +08:00
*/
int esp_mesh_get_root_healing_delay ( void ) ;
/**
2018-09-23 21:09:59 +08:00
* @brief Set mesh event callback
2018-02-27 18:22:20 +08:00
*
2018-09-23 21:09:59 +08:00
* @param[in] event_cb mesh event call back
2018-02-27 18:22:20 +08:00
*
* @return
* - ESP_OK
*/
esp_err_t esp_mesh_set_event_cb ( const mesh_event_cb_t event_cb ) ;
2018-04-26 00:13:53 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Enable network Fixed Root Setting
* - Enabling fixed root disables automatic election of the root node via voting.
* - All devices in the network shall use the same Fixed Root Setting (enabled or disabled).
* - If Fixed Root is enabled, users should make sure a root node is designated for the network.
2018-04-26 00:13:53 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] enable enable or not
2018-04-26 00:13:53 +08:00
*
* @return
* - ESP_OK
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_fix_root ( bool enable ) ;
2018-04-26 00:13:53 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Check whether network Fixed Root Setting is enabled
* - Enable/disable network Fixed Root Setting by API esp_mesh_fix_root().
* - Network Fixed Root Setting also changes with the "flag" value in parent networking IE.
2018-04-26 00:13:53 +08:00
*
2018-06-26 20:48:47 +08:00
* @return true/false
2018-04-26 00:13:53 +08:00
*/
bool esp_mesh_is_root_fixed ( void ) ;
/**
2018-09-23 21:09:59 +08:00
* @brief Set a specified parent for the device
*
* @attention This API can be called at any time after mesh is configured.
2018-04-26 00:13:53 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[in] parent parent configuration, the SSID and the channel of the parent are mandatory.
2018-09-23 21:09:59 +08:00
* - If the BSSID is set, make sure that the SSID and BSSID represent the same parent,
* otherwise the device will never find this specified parent.
* @param[in] parent_mesh_id parent mesh ID,
* - If this value is not set, the original mesh ID is used.
* @param[in] my_type mesh type
* - If the parent set for the device is the same as the router in the network configuration,
* then my_type shall set MESH_ROOT and my_layer shall set MESH_ROOT_LAYER.
* @param[in] my_layer mesh layer
* - my_layer of the device may change after joining the network.
* - If my_type is set MESH_NODE, my_layer shall be greater than MESH_ROOT_LAYER.
* - If my_type is set MESH_LEAF, the device becomes a standalone Wi-Fi station and no longer
* has the ability to extend the network.
2018-04-26 00:13:53 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_ARGUMENT
* - ESP_ERR_MESH_NOT_CONFIG
*/
2018-05-21 17:22:04 +08:00
esp_err_t esp_mesh_set_parent ( const wifi_config_t * parent , const mesh_addr_t * parent_mesh_id , mesh_type_t my_type , int my_layer ) ;
2018-04-26 00:13:53 +08:00
2018-05-21 17:22:04 +08:00
/**
2018-06-26 20:48:47 +08:00
* @brief Get mesh networking IE length of one AP
2018-05-21 17:22:04 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] len mesh networking IE length
2018-05-21 17:22:04 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_WIFI_NOT_INIT
* - ESP_ERR_WIFI_ARG
* - ESP_ERR_WIFI_FAIL
*/
esp_err_t esp_mesh_scan_get_ap_ie_len ( int * len ) ;
/**
2018-06-26 20:48:47 +08:00
* @brief Get AP record
*
* @attention Different from esp_wifi_scan_get_ap_records(), this API only gets one of APs scanned each time.
* See "manual_networking" example.
2018-05-21 17:22:04 +08:00
*
2018-06-26 20:48:47 +08:00
* @param[out] ap_record pointer to one AP record
* @param[out] buffer pointer to the mesh networking IE of this AP
2018-05-21 17:22:04 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_WIFI_NOT_INIT
* - ESP_ERR_WIFI_ARG
* - ESP_ERR_WIFI_FAIL
*/
esp_err_t esp_mesh_scan_get_ap_record ( wifi_ap_record_t * ap_record , void * buffer ) ;
2018-02-27 18:22:20 +08:00
2018-08-08 13:08:41 +08:00
/**
2018-09-23 21:09:59 +08:00
* @brief Flush upstream packets pending in to_parent queue and to_parent_p2p queue
2018-08-08 13:08:41 +08:00
*
* @return
* - ESP_OK
*/
esp_err_t esp_mesh_flush_upstream_packets ( void ) ;
2018-08-27 15:08:54 +08:00
/**
2018-09-23 21:09:59 +08:00
* @brief Get the number of nodes in the subnet of a specific child
2018-08-27 15:08:54 +08:00
*
2018-09-23 21:09:59 +08:00
* @param[in] child_mac an associated child address of this device
* @param[out] nodes_num pointer to the number of nodes in the subnet of a specific child
2018-08-27 15:08:54 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_NOT_START
* - ESP_ERR_MESH_ARGUMENT
*/
esp_err_t esp_mesh_get_subnet_nodes_num ( const mesh_addr_t * child_mac , int * nodes_num ) ;
/**
2018-09-23 21:09:59 +08:00
* @brief Get nodes in the subnet of a specific child
2018-08-27 15:08:54 +08:00
*
2018-09-23 21:09:59 +08:00
* @param[in] child_mac an associated child address of this device
* @param[out] nodes pointer to nodes in the subnet of a specific child
* @param[in] nodes_num the number of nodes in the subnet of a specific child
2018-08-27 15:08:54 +08:00
*
* @return
* - ESP_OK
* - ESP_ERR_MESH_NOT_START
* - ESP_ERR_MESH_ARGUMENT
*/
esp_err_t esp_mesh_get_subnet_nodes_list ( const mesh_addr_t * child_mac , mesh_addr_t * nodes , int nodes_num ) ;
2018-02-27 18:22:20 +08:00
# ifdef __cplusplus
}
# endif
# endif /* __ESP_MESH_H__ */