Merge branch 'mesh/feature_chain_topology' into 'master'

Mesh/feature chain topology

Closes WIFI-1726

See merge request espressif/esp-idf!7215
This commit is contained in:
Jiang Jiang Jian
2020-03-10 17:41:11 +08:00
4 changed files with 68 additions and 14 deletions

View File

@@ -252,6 +252,14 @@ typedef enum {
MESH_REASON_PARENT_UNENCRYPTED, /**< connect to an unencrypted parent/router */ MESH_REASON_PARENT_UNENCRYPTED, /**< connect to an unencrypted parent/router */
} mesh_disconnect_reason_t; } mesh_disconnect_reason_t;
/**
* @brief Mesh topology
*/
typedef enum {
MESH_TOPO_TREE, /**< tree topology */
MESH_TOPO_CHAIN, /**< chain topology */
} esp_mesh_topology_t;
/******************************************************* /*******************************************************
* Structures * Structures
*******************************************************/ *******************************************************/
@@ -1454,6 +1462,28 @@ esp_err_t esp_mesh_get_router_bssid(uint8_t *router_bssid);
*/ */
int64_t esp_mesh_get_tsf_time(void); int64_t esp_mesh_get_tsf_time(void);
/**
* @brief Set mesh topology. The default value is MESH_TOPO_TREE
* - MESH_TOPO_CHAIN supports up to 1000 layers
*
* @attention This API shall be called before mesh is started
*
* @param[in] topo MESH_TOPO_TREE or MESH_TOPO_CHAIN
*
* @return
* - ESP_OK
* - ESP_MESH_ERR_ARGUMENT
* - ESP_ERR_MESH_NOT_ALLOWED
*/
esp_err_t esp_mesh_set_topology(esp_mesh_topology_t topo);
/**
* @brief Get mesh topology
*
* @return MESH_TOPO_TREE or MESH_TOPO_CHAIN
*/
esp_mesh_topology_t esp_mesh_get_topology(void);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@@ -1,5 +1,32 @@
menu "Example Configuration" menu "Example Configuration"
choice
bool "Mesh Topology"
default MESH_TOPO_TREE
help
Mesh Network Topology.
config MESH_TOPO_TREE
bool "MESH_TOPO_TREE"
config MESH_TOPO_CHAIN
bool "MESH_TOPO_CHAIN"
endchoice
config MESH_TOPOLOGY
int
default 0 if MESH_TOPO_TREE
default 1 if MESH_TOPO_CHAIN
help
Mesh Network Topology.
config MESH_MAX_LAYER
int "Mesh Max Layer"
range 1 25 if MESH_TOPO_TREE
range 1 1000 if MESH_TOPO_CHAIN
default 6
help
Max layer allowed in mesh network.
config MESH_CHANNEL config MESH_CHANNEL
int "channel" int "channel"
range 0 14 range 0 14
@@ -57,13 +84,6 @@ menu "Example Configuration"
help help
The number of stations allowed to connect in. The number of stations allowed to connect in.
config MESH_MAX_LAYER
int "Mesh Max Layer"
range 1 25
default 6
help
Max layer allowed in mesh network.
config MESH_ROUTE_TABLE_SIZE config MESH_ROUTE_TABLE_SIZE
int "Mesh Routing Table Size" int "Mesh Routing Table Size"
range 1 300 range 1 300

View File

@@ -212,16 +212,16 @@ void mesh_event_handler(void *arg, esp_event_base_t event_base,
break; break;
case MESH_EVENT_ROUTING_TABLE_ADD: { case MESH_EVENT_ROUTING_TABLE_ADD: {
mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data;
ESP_LOGW(MESH_TAG, "<MESH_EVENT_ROUTING_TABLE_ADD>add %d, new:%d", ESP_LOGW(MESH_TAG, "<MESH_EVENT_ROUTING_TABLE_ADD>add %d, new:%d, layer:%d",
routing_table->rt_size_change, routing_table->rt_size_change,
routing_table->rt_size_new); routing_table->rt_size_new, mesh_layer);
} }
break; break;
case MESH_EVENT_ROUTING_TABLE_REMOVE: { case MESH_EVENT_ROUTING_TABLE_REMOVE: {
mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data; mesh_event_routing_table_change_t *routing_table = (mesh_event_routing_table_change_t *)event_data;
ESP_LOGW(MESH_TAG, "<MESH_EVENT_ROUTING_TABLE_REMOVE>remove %d, new:%d", ESP_LOGW(MESH_TAG, "<MESH_EVENT_ROUTING_TABLE_REMOVE>remove %d, new:%d, layer:%d",
routing_table->rt_size_change, routing_table->rt_size_change,
routing_table->rt_size_new); routing_table->rt_size_new, mesh_layer);
} }
break; break;
case MESH_EVENT_NO_PARENT_FOUND: { case MESH_EVENT_NO_PARENT_FOUND: {
@@ -391,6 +391,9 @@ void app_main(void)
/* mesh initialization */ /* mesh initialization */
ESP_ERROR_CHECK(esp_mesh_init()); ESP_ERROR_CHECK(esp_mesh_init());
ESP_ERROR_CHECK(esp_event_handler_register(MESH_EVENT, ESP_EVENT_ANY_ID, &mesh_event_handler, NULL)); ESP_ERROR_CHECK(esp_event_handler_register(MESH_EVENT, ESP_EVENT_ANY_ID, &mesh_event_handler, NULL));
/* set mesh topology */
ESP_ERROR_CHECK(esp_mesh_set_topology(CONFIG_MESH_TOPOLOGY));
/* set mesh max layer according to the topology */
ESP_ERROR_CHECK(esp_mesh_set_max_layer(CONFIG_MESH_MAX_LAYER)); ESP_ERROR_CHECK(esp_mesh_set_max_layer(CONFIG_MESH_MAX_LAYER));
ESP_ERROR_CHECK(esp_mesh_set_vote_percentage(1)); ESP_ERROR_CHECK(esp_mesh_set_vote_percentage(1));
ESP_ERROR_CHECK(esp_mesh_set_ap_assoc_expire(10)); ESP_ERROR_CHECK(esp_mesh_set_ap_assoc_expire(10));
@@ -411,6 +414,7 @@ void app_main(void)
ESP_ERROR_CHECK(esp_mesh_set_config(&cfg)); ESP_ERROR_CHECK(esp_mesh_set_config(&cfg));
/* mesh start */ /* mesh start */
ESP_ERROR_CHECK(esp_mesh_start()); ESP_ERROR_CHECK(esp_mesh_start());
ESP_LOGI(MESH_TAG, "mesh starts successfully, heap:%d, %s\n", esp_get_free_heap_size(), ESP_LOGI(MESH_TAG, "mesh starts successfully, heap:%d, %s<%d>%s\n", esp_get_free_heap_size(),
esp_mesh_is_root_fixed() ? "root fixed" : "root not fixed"); esp_mesh_is_root_fixed() ? "root fixed" : "root not fixed",
esp_mesh_get_topology(), esp_mesh_get_topology() ? "(chain)":"(tree)");
} }