1 /* 2 * SPDX-FileCopyrightText: 2017-2023 Espressif Systems (Shanghai) CO LTD 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef __ESP_MESH_INTERNAL_H__ 8 #define __ESP_MESH_INTERNAL_H__ 9 10 #include "esp_err.h" 11 #include "esp_mesh.h" 12 #include "esp_wifi.h" 13 #include "esp_wifi_types.h" 14 #include "esp_private/wifi.h" 15 #include "esp_wifi_crypto_types.h" 16 17 #ifdef __cplusplus 18 extern "C" { 19 #endif 20 21 /******************************************************* 22 * Constants 23 *******************************************************/ 24 25 /******************************************************* 26 * Structures 27 *******************************************************/ 28 /** 29 * @brief Mesh attempts 30 */ 31 typedef struct { 32 int scan; /**< minimum scan times before being a root, default:10 */ 33 int vote; /**< max vote times in self-healing, default:1000 */ 34 int fail; /**< parent selection fail times, if the scan times reach this value, 35 device will disconnect with associated children and join self-healing. default:60 */ 36 int monitor_ie; /**< acceptable times of parent networking IE change before update its own networking IE. default:3 */ 37 } mesh_attempts_t; 38 39 /** 40 * @brief Mesh switch parent 41 */ 42 typedef struct { 43 int duration_ms; /**< parent weak RSSI monitor duration, if the RSSI continues to be weak during this duration_ms, 44 device will search for a new parent. */ 45 int cnx_rssi; /**< RSSI threshold for keeping a good connection with parent. 46 If set a value greater than -120 dBm, a timer will be armed to monitor parent RSSI at a period time of duration_ms. */ 47 int select_rssi; /**< RSSI threshold for parent selection. It should be a value greater than switch_rssi. */ 48 int switch_rssi; /**< Disassociate with current parent and switch to a new parent when the RSSI is greater than this set threshold. */ 49 int backoff_rssi; /**< RSSI threshold for connecting to the root */ 50 } mesh_switch_parent_t; 51 52 /** 53 * @brief Mesh RSSI threshold 54 */ 55 typedef struct { 56 int high; /**< high RSSI threshold, used to determine whether the new parent and the current parent are in the same RSSI range */ 57 int medium; /**< medium RSSI threshold, used to determine whether the new parent and the current parent are in the same RSSI range */ 58 int low; /**< low RSSI threshold. If the parent's RSSI is lower than low for a period time of duration_ms, 59 then the mesh node will post MESH_WEAK_RSSI event. 60 Also used to determine whether the new parent and the current parent are in the same RSSI range */ 61 } mesh_rssi_threshold_t; 62 63 /** 64 * @brief Mesh networking IE 65 */ 66 typedef struct { 67 /**< mesh networking IE head */ 68 uint8_t eid; /**< element ID, vendor specific, 221 */ 69 uint8_t len; /**< element length, the length after this member */ 70 uint8_t oui[3]; /**< organization identifier, 0x18fe34 */ 71 uint8_t type; /**< ESP defined IE type, include Assoc IE, SSID IE, Ext Assoc IE, Roots IE, etc. */ 72 uint8_t encrypted : 1; /**< whether mesh networking IE is encrypted */ 73 uint8_t version : 7; /**< mesh networking IE version, equal to 2 if mesh PS is enabled, equal to 1 otherwise */ 74 /**< content */ 75 uint8_t mesh_type; /**< mesh device type, include idle, root, node, etc, refer to mesh_type_t */ 76 uint8_t mesh_id[6]; /**< mesh ID, only the same mesh id can form a unified mesh network */ 77 uint8_t layer_cap; /**< layer_cap = max_layer - layer, indicates the number of remaining available layers of the mesh network */ 78 uint8_t layer; /**< the current layer of this node */ 79 uint8_t assoc_cap; /**< the maximum connections of this mesh AP */ 80 uint8_t assoc; /**< current connections of this mesh AP */ 81 uint8_t leaf_cap; /**< the maximum number of leaves in the mesh network */ 82 uint8_t leaf_assoc; /**< the number of current connected leaves */ 83 uint16_t root_cap; /**< the capacity of the root, equal to the total child numbers plus 1, root node updates root_cap and self_cap */ 84 uint16_t self_cap; /**< the capacity of myself, total child numbers plus 1, all nodes update this member */ 85 uint16_t layer2_cap; /**< the capacity of layer2 node, total child numbers plus 1, layer2 node updates layer2_cap and self_cap, root sets this to 0 */ 86 uint16_t scan_ap_num; /**< the number of mesh APs around */ 87 int8_t rssi; /**< RSSI of the connected parent, default value is -120, root node will not update this */ 88 int8_t router_rssi; /**< RSSI of the router, default value is -120 */ 89 uint8_t flag; /**< flag of networking, indicates the status of the network, refer to MESH_ASSOC_FLAG_XXX */ 90 /**< vote related */ 91 uint8_t rc_addr[6]; /**< the address of the root candidate, i.e. the voted addesss before connection, root node will update this with self address */ 92 int8_t rc_rssi; /**< the router RSSI of the root candidate */ 93 uint8_t vote_addr[6]; /**< the voted address after connection */ 94 int8_t vote_rssi; /**< the router RSSI of the voted address */ 95 uint8_t vote_ttl; /**< vote ttl, indicate the voting is from myself or from other nodes */ 96 uint16_t votes; /**< the number of all voting nodes */ 97 uint16_t my_votes; /**< the number of nodes that voted for me */ 98 uint8_t reason; /**< the reason why the voting happens, root initiated or child initiated, refer to mesh_vote_reason_t */ 99 uint8_t child[6]; /**< child address, not used currently */ 100 uint8_t toDS; /**< state represents whether the root is able to access external IP network */ 101 } __attribute__((packed)) mesh_assoc_t; 102 103 /** 104 * @brief Mesh chain layer 105 */ 106 typedef struct { 107 uint16_t layer_cap; /**< max layer of the network */ 108 uint16_t layer; /**< current layer of this node */ 109 } mesh_chain_layer_t; 110 111 /** 112 * @brief Mesh chain assoc 113 */ 114 typedef struct { 115 mesh_assoc_t tree; /**< tree top, mesh_assoc IE */ 116 mesh_chain_layer_t chain; /**< chain top, mesh_assoc IE */ 117 } __attribute__((packed)) mesh_chain_assoc_t; 118 119 /* mesh max connections */ 120 #define MESH_MAX_CONNECTIONS (10) 121 122 /** 123 * @brief Mesh power save duties 124 */ 125 typedef struct { 126 uint8_t device; /**< device power save duty*/ 127 uint8_t parent; /**< parent power save duty*/ 128 struct { 129 bool used; /**< whether the child is joined */ 130 uint8_t duty; /**< power save duty of the child */ 131 uint8_t mac[6]; /**< mac address of the child */ 132 } child[MESH_MAX_CONNECTIONS]; /**< child */ 133 } esp_mesh_ps_duties_t; 134 135 /******************************************************* 136 * Function Definitions 137 *******************************************************/ 138 /** 139 * @brief Set mesh softAP beacon interval 140 * 141 * @param[in] interval_ms beacon interval (msecs) (100 msecs ~ 60000 msecs) 142 * 143 * @return 144 * - ESP_OK 145 * - ESP_FAIL 146 * - ESP_ERR_INVALID_ARG 147 */ 148 esp_err_t esp_mesh_set_beacon_interval(int interval_ms); 149 150 /** 151 * @brief Get mesh softAP beacon interval 152 * 153 * @param[out] interval_ms beacon interval (msecs) 154 * 155 * @return 156 * - ESP_OK 157 */ 158 esp_err_t esp_mesh_get_beacon_interval(int *interval_ms); 159 160 /** 161 * @brief Set attempts for mesh self-organized networking 162 * 163 * @param[in] attempts 164 * 165 * @return 166 * - ESP_OK 167 * - ESP_FAIL 168 */ 169 esp_err_t esp_mesh_set_attempts(mesh_attempts_t *attempts); 170 171 /** 172 * @brief Get attempts for mesh self-organized networking 173 * 174 * @param[out] attempts 175 * 176 * @return 177 * - ESP_OK 178 * - ESP_ERR_MESH_ARGUMENT 179 */ 180 esp_err_t esp_mesh_get_attempts(mesh_attempts_t *attempts); 181 182 /** 183 * @brief Set parameters for parent switch 184 * 185 * @param[in] paras parameters for parent switch 186 * 187 * @return 188 * - ESP_OK 189 * - ESP_ERR_MESH_ARGUMENT 190 */ 191 esp_err_t esp_mesh_set_switch_parent_paras(mesh_switch_parent_t *paras); 192 193 /** 194 * @brief Get parameters for parent switch 195 * 196 * @param[out] paras parameters for parent switch 197 * 198 * @return 199 * - ESP_OK 200 * - ESP_ERR_MESH_ARGUMENT 201 */ 202 esp_err_t esp_mesh_get_switch_parent_paras(mesh_switch_parent_t *paras); 203 204 /** 205 * @brief Set RSSI threshold of current parent 206 * - The default high RSSI threshold value is -78 dBm. 207 * - The default medium RSSI threshold value is -82 dBm. 208 * - The default low RSSI threshold value is -85 dBm. 209 * 210 * @param[in] threshold RSSI threshold 211 * 212 * @return 213 * - ESP_OK 214 * - ESP_ERR_MESH_ARGUMENT 215 */ 216 esp_err_t esp_mesh_set_rssi_threshold(const mesh_rssi_threshold_t *threshold); 217 218 /** 219 * @brief Get RSSI threshold of current parent 220 * 221 * @param[out] threshold RSSI threshold 222 * 223 * @return 224 * - ESP_OK 225 * - ESP_ERR_MESH_ARGUMENT 226 */ 227 esp_err_t esp_mesh_get_rssi_threshold(mesh_rssi_threshold_t *threshold); 228 229 /** 230 * @brief Enable the minimum rate to 6 Mbps 231 * 232 * @attention This API shall be called before Wi-Fi is started. 233 * 234 * @param[in] is_6m enable or not 235 * 236 * @return 237 * - ESP_OK 238 */ 239 esp_err_t esp_mesh_set_6m_rate(bool is_6m); 240 241 /** 242 * @brief Print the number of txQ waiting 243 * 244 * @return 245 * - ESP_OK 246 * - ESP_FAIL 247 */ 248 esp_err_t esp_mesh_print_txQ_waiting(void); 249 250 /** 251 * @brief Print the number of rxQ waiting 252 * 253 * @return 254 * - ESP_OK 255 * - ESP_FAIL 256 */ 257 esp_err_t esp_mesh_print_rxQ_waiting(void); 258 259 /** 260 * @brief Set passive scan time 261 * 262 * @param[in] time_ms passive scan time (msecs) 263 * 264 * @return 265 * - ESP_OK 266 * - ESP_FAIL 267 * - ESP_ERR_ARGUMENT 268 */ 269 esp_err_t esp_mesh_set_passive_scan_time(int time_ms); 270 271 /** 272 * @brief Get passive scan time 273 * 274 * @return interval_ms passive scan time (msecs) 275 */ 276 int esp_mesh_get_passive_scan_time(void); 277 278 /** 279 * @brief Set announce interval 280 * - The default short interval is 500 milliseconds. 281 * - The default long interval is 3000 milliseconds. 282 * 283 * @param[in] short_ms shall be greater than the default value 284 * @param[in] long_ms shall be greater than the default value 285 * 286 * @return 287 * - ESP_OK 288 */ 289 esp_err_t esp_mesh_set_announce_interval(int short_ms, int long_ms); 290 291 /** 292 * @brief Get announce interval 293 * 294 * @param[out] short_ms short interval 295 * @param[out] long_ms long interval 296 * 297 * @return 298 * - ESP_OK 299 */ 300 esp_err_t esp_mesh_get_announce_interval(int *short_ms, int *long_ms); 301 302 /** 303 * @brief Get the running duties of device, parent and children 304 * 305 * @param[out] ps_duties ps duties 306 * 307 * @return 308 * - ESP_OK 309 */ 310 esp_err_t esp_mesh_ps_get_duties(esp_mesh_ps_duties_t* ps_duties); 311 312 /** 313 * @brief Enable mesh print scan result 314 * 315 * @param[in] enable enable or not 316 * 317 * @return 318 * - ESP_OK 319 */ 320 esp_err_t esp_mesh_print_scan_result(bool enable); 321 #ifdef __cplusplus 322 } 323 #endif 324 #endif /* __ESP_MESH_INTERNAL_H__ */ 325