diff --git a/components/esp_ot_cli_extension/CMakeLists.txt b/components/esp_ot_cli_extension/CMakeLists.txt index e3b85db..55d93bc 100644 --- a/components/esp_ot_cli_extension/CMakeLists.txt +++ b/components/esp_ot_cli_extension/CMakeLists.txt @@ -1,4 +1,4 @@ -set(srcs "src/esp_ot_cli_extension.c") +set(srcs src/esp_ot_cli_extension.c src/esp_ot_ip.c src/esp_ot_loglevel.c) if(CONFIG_OPENTHREAD_CLI_IPERF) list(APPEND srcs "src/esp_ot_iperf.c") @@ -25,8 +25,6 @@ if(CONFIG_OPENTHREAD_CLI_CURL) list(APPEND srcs "src/esp_ot_curl.c") endif() -list(APPEND srcs "src/esp_ot_ip.c") - set(include "include") idf_component_register(SRCS "${srcs}" INCLUDE_DIRS "${include}" diff --git a/components/esp_ot_cli_extension/idf_component.yml b/components/esp_ot_cli_extension/idf_component.yml index a445a3b..ea91fb7 100644 --- a/components/esp_ot_cli_extension/idf_component.yml +++ b/components/esp_ot_cli_extension/idf_component.yml @@ -1,4 +1,4 @@ -version: "0.4.7" +version: "0.5.0" description: Espressif OpenThread CLI Extension url: https://github.com/espressif/esp-thread-br/tree/main/components/esp_ot_cli_extension dependencies: diff --git a/components/esp_ot_cli_extension/include/esp_ot_cli_extension.h b/components/esp_ot_cli_extension/include/esp_ot_cli_extension.h index 7d97deb..69993ce 100644 --- a/components/esp_ot_cli_extension/include/esp_ot_cli_extension.h +++ b/components/esp_ot_cli_extension/include/esp_ot_cli_extension.h @@ -26,6 +26,8 @@ typedef enum { */ void esp_cli_custom_command_init(void); +#define OT_EXT_CLI_TAG "ot_ext_cli" + #ifdef __cplusplus } #endif diff --git a/components/esp_ot_cli_extension/include/esp_ot_loglevel.h b/components/esp_ot_cli_extension/include/esp_ot_loglevel.h new file mode 100644 index 0000000..7c44818 --- /dev/null +++ b/components/esp_ot_cli_extension/include/esp_ot_loglevel.h @@ -0,0 +1,23 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "stdint.h" +#include + +#ifdef __cplusplus +extern "C" { +#endif +/** + * @brief User command "loglevel" process. + * + */ +otError esp_ot_process_logset(void *aContext, uint8_t aArgsLength, char *aArgs[]); + +#ifdef __cplusplus +} +#endif diff --git a/components/esp_ot_cli_extension/src/esp_ot_cli_extension.c b/components/esp_ot_cli_extension/src/esp_ot_cli_extension.c index 1e29e63..2ec3a82 100644 --- a/components/esp_ot_cli_extension/src/esp_ot_cli_extension.c +++ b/components/esp_ot_cli_extension/src/esp_ot_cli_extension.c @@ -10,6 +10,7 @@ #include "esp_ot_dns64.h" #include "esp_ot_ip.h" #include "esp_ot_iperf.h" +#include "esp_ot_loglevel.h" #include "esp_ot_ota_commands.h" #include "esp_ot_tcp_socket.h" #include "esp_ot_udp_socket.h" @@ -42,7 +43,8 @@ static const otCliCommand kCommands[] = { #if CONFIG_OPENTHREAD_DNS64_CLIENT {"dns64server", esp_openthread_process_dns64_server}, #endif // CONFIG_OPENTHREAD_DNS64_CLIENT - {"ip", esp_ot_process_ip}}; + {"ip", esp_ot_process_ip}, + {"loglevel", esp_ot_process_logset}}; void esp_cli_custom_command_init() { diff --git a/components/esp_ot_cli_extension/src/esp_ot_curl.c b/components/esp_ot_cli_extension/src/esp_ot_curl.c index 410aef9..fe487ab 100644 --- a/components/esp_ot_cli_extension/src/esp_ot_curl.c +++ b/components/esp_ot_cli_extension/src/esp_ot_curl.c @@ -8,23 +8,22 @@ #include "esp_http_client.h" #include "esp_log.h" #include "esp_openthread.h" +#include "esp_ot_cli_extension.h" #include "http_parser.h" #include "openthread/cli.h" -#define TAG "curl" - static char s_arg_buf[128]; static esp_err_t _http_handle_response_code(esp_http_client_handle_t http_client, int status_code) { if (status_code == HttpStatus_NotFound || status_code == HttpStatus_Forbidden) { - ESP_LOGE(TAG, "File not found(%d)", status_code); + ESP_LOGE(OT_EXT_CLI_TAG, "File not found(%d)", status_code); return ESP_FAIL; } else if (status_code >= HttpStatus_BadRequest && status_code < HttpStatus_InternalError) { - ESP_LOGE(TAG, "Client error (%d)", status_code); + ESP_LOGE(OT_EXT_CLI_TAG, "Client error (%d)", status_code); return ESP_FAIL; } else if (status_code >= HttpStatus_InternalError) { - ESP_LOGE(TAG, "Server error (%d)", status_code); + ESP_LOGE(OT_EXT_CLI_TAG, "Server error (%d)", status_code); return ESP_FAIL; } @@ -43,7 +42,7 @@ static esp_err_t _http_connect(esp_http_client_handle_t http_client) int post_len = esp_http_client_get_post_field(http_client, &post_data); err = esp_http_client_open(http_client, post_len); if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); + ESP_LOGE(OT_EXT_CLI_TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err)); return err; } if (post_len) { @@ -51,7 +50,7 @@ static esp_err_t _http_connect(esp_http_client_handle_t http_client) while (post_len > 0) { write_len = esp_http_client_write(http_client, post_data, post_len); if (write_len < 0) { - ESP_LOGE(TAG, "Write failed"); + ESP_LOGE(OT_EXT_CLI_TAG, "Write failed"); return ESP_FAIL; } post_len -= write_len; @@ -79,12 +78,12 @@ static void curl_task(void *pvParameters) esp_http_client_handle_t http_client = esp_http_client_init(&config); if (http_client == NULL) { - ESP_LOGE(TAG, "Failed to initialize HTTP client"); + ESP_LOGE(OT_EXT_CLI_TAG, "Failed to initialize HTTP client"); vTaskDelete(NULL); return; } if (_http_connect(http_client) != ESP_OK) { - ESP_LOGE(TAG, "Failed to connect to HTTP server"); + ESP_LOGE(OT_EXT_CLI_TAG, "Failed to connect to HTTP server"); vTaskDelete(NULL); return; } @@ -93,7 +92,7 @@ static void curl_task(void *pvParameters) char data_buf[1024]; int len = esp_http_client_read(http_client, data_buf, sizeof(data_buf)); if (len < 0 || (len == 0 && (errno == ENOTCONN || errno == ECONNRESET || errno == ECONNABORTED))) { - ESP_LOGE(TAG, "Connection closed, errno = %d", errno); + ESP_LOGE(OT_EXT_CLI_TAG, "Connection closed, errno = %d", errno); vTaskDelete(NULL); return; } diff --git a/components/esp_ot_cli_extension/src/esp_ot_dns64.c b/components/esp_ot_cli_extension/src/esp_ot_dns64.c index feda070..4d7b7a2 100644 --- a/components/esp_ot_cli_extension/src/esp_ot_dns64.c +++ b/components/esp_ot_cli_extension/src/esp_ot_dns64.c @@ -11,11 +11,11 @@ #include "esp_event.h" #include "esp_openthread.h" #include "esp_openthread_dns64.h" +#include "esp_ot_cli_extension.h" #include "lwip/dns.h" #include "openthread/cli.h" #include "openthread/netdata.h" -#define OT_CLI_LOG_TAG "OT_CLI" #define DNS_SERVER_ALTERNATIVE_INDEX 1 static esp_err_t set_dns64(const ip4_addr_t *dns_server) @@ -25,23 +25,24 @@ static esp_err_t set_dns64(const ip4_addr_t *dns_server) dns_server_addr.type = IPADDR_TYPE_V6; ESP_RETURN_ON_FALSE(esp_openthread_get_nat64_prefix(&dns_server_addr.u_addr.ip6) == ESP_OK, ESP_ERR_NOT_FOUND, - OT_CLI_LOG_TAG, "Cannot find NAT64 prefix\n"); + OT_EXT_CLI_TAG, "Cannot find NAT64 prefix"); dns_server_addr.u_addr.ip6.addr[3] = dns_server->addr; dns_setserver(DNS_SERVER_ALTERNATIVE_INDEX, &dns_server_addr); - ESP_RETURN_ON_ERROR(esp_event_post(OPENTHREAD_EVENT, OPENTHREAD_EVENT_SET_DNS_SERVER, NULL, 0, 0), OT_CLI_LOG_TAG, + ESP_RETURN_ON_ERROR(esp_event_post(OPENTHREAD_EVENT, OPENTHREAD_EVENT_SET_DNS_SERVER, NULL, 0, 0), OT_EXT_CLI_TAG, "Failed to post OpenThread set DNS server event"); return ESP_OK; } otError esp_openthread_process_dns64_server(void *aContext, uint8_t aArgsLength, char *aArgs[]) { - ESP_RETURN_ON_FALSE(aArgsLength != 0, OT_ERROR_INVALID_ARGS, OT_CLI_LOG_TAG, "dns64server DNS_SERVER_URL\n"); + ESP_RETURN_ON_FALSE(aArgsLength != 0, OT_ERROR_INVALID_ARGS, OT_EXT_CLI_TAG, "dns64server DNS_SERVER_URL"); ip4_addr_t server_addr; - ESP_RETURN_ON_FALSE(ip4addr_aton(aArgs[0], &server_addr) == 1, OT_ERROR_INVALID_ARGS, OT_CLI_LOG_TAG, - "Invalid DNS server\n"); - ESP_RETURN_ON_ERROR(set_dns64(&server_addr), OT_CLI_LOG_TAG, "Failed to set DNS server\n"); + ESP_RETURN_ON_FALSE(ip4addr_aton(aArgs[0], &server_addr) == 1, OT_ERROR_INVALID_ARGS, OT_EXT_CLI_TAG, + "Invalid DNS server"); + ESP_RETURN_ON_FALSE(set_dns64(&server_addr) == ESP_OK, OT_ERROR_INVALID_ARGS, OT_EXT_CLI_TAG, + "Failed to set DNS server"); return OT_ERROR_NONE; } diff --git a/components/esp_ot_cli_extension/src/esp_ot_iperf.c b/components/esp_ot_cli_extension/src/esp_ot_iperf.c index 94fbfbe..60ace85 100644 --- a/components/esp_ot_cli_extension/src/esp_ot_iperf.c +++ b/components/esp_ot_cli_extension/src/esp_ot_iperf.c @@ -7,6 +7,7 @@ #include "esp_ot_iperf.h" #include "esp_check.h" #include "esp_log.h" +#include "esp_ot_cli_extension.h" #include "iperf.h" #include #include @@ -14,7 +15,6 @@ #include "lwip/inet.h" #include "openthread/cli.h" -#define TAG "ot-iperf" static char s_dest_ip_addr[50]; otError esp_ot_process_iperf(void *aContext, uint8_t aArgsLength, char *aArgs[]) @@ -91,7 +91,7 @@ otError esp_ot_process_iperf(void *aContext, uint8_t aArgsLength, char *aArgs[]) } else if (strcmp(aArgs[i], "-l") == 0) { i++; if (atoi(aArgs[i]) <= 0) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); } else { cfg.len_send_buf = atoi(aArgs[i]); } diff --git a/components/esp_ot_cli_extension/src/esp_ot_loglevel.c b/components/esp_ot_cli_extension/src/esp_ot_loglevel.c new file mode 100644 index 0000000..df44203 --- /dev/null +++ b/components/esp_ot_cli_extension/src/esp_ot_loglevel.c @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "esp_ot_loglevel.h" +#include "esp_check.h" +#include "esp_err.h" +#include "esp_log.h" +#include "esp_ot_cli_extension.h" +#include "string.h" +#include +#include "openthread/cli.h" +#include "openthread/error.h" + +esp_err_t ext_loglevel_set(const char *tag, const char *level) +{ + int levelset = atoi(level); + if (levelset < ESP_LOG_NONE || levelset > ESP_LOG_VERBOSE || (levelset == ESP_LOG_NONE && strcmp(level, "0"))) { + otCliOutputFormat("A wrong log level \"%s\"\n", level); + return ESP_FAIL; + } + esp_log_level_set(tag, (esp_log_level_t)levelset); + return ESP_OK; +} + +otError esp_ot_process_logset(void *aContext, uint8_t aArgsLength, char *aArgs[]) +{ + (void)(aContext); + if (aArgsLength == 0) { + otCliOutputFormat("---loglevel---\n"); + otCliOutputFormat("set : set log level of the to \n"); + otCliOutputFormat("---example---\n"); + otCliOutputFormat("loglevel set * 3 : set log level of all the tags to INFO\n"); + otCliOutputFormat("loglevel set OPENTHREAD 0 : set log level of OpenThread to None\n"); + otCliOutputFormat("loglevel set wifi 4 : set log level of Wi-Fi to DEBUG\n"); + otCliOutputFormat("----Note----\n"); + otCliOutputFormat( + "Support 6 levels : 0(NONE), 1(ERROR), 2(WARN), 3(INFO), 4(DEBUG), 5(VERBOSE)\n"); + otCliOutputFormat("The log level of the tags cannot be bigger than the maximum log level\n"); + otCliOutputFormat("You can set the maximum log level via:\n"); + otCliOutputFormat("idf.py menuconfig > Component config---> Log output---> Maximum log verbosity\n"); + } else { + if (strcmp(aArgs[0], "set") == 0 && aArgsLength == 3) { + ESP_RETURN_ON_FALSE(ext_loglevel_set(aArgs[1], aArgs[2]) == ESP_OK, OT_ERROR_INVALID_ARGS, OT_EXT_CLI_TAG, + "Failed to set log level"); + } else { + return OT_ERROR_INVALID_ARGS; + } + } + return OT_ERROR_NONE; +} diff --git a/components/esp_ot_cli_extension/src/esp_ot_tcp_socket.c b/components/esp_ot_cli_extension/src/esp_ot_tcp_socket.c index 14d74c6..be95d8c 100644 --- a/components/esp_ot_cli_extension/src/esp_ot_tcp_socket.c +++ b/components/esp_ot_cli_extension/src/esp_ot_tcp_socket.c @@ -10,6 +10,7 @@ #include "esp_err.h" #include "esp_log.h" +#include "esp_ot_cli_extension.h" #include #include "freertos/FreeRTOS.h" #include "freertos/event_groups.h" @@ -18,8 +19,6 @@ #include "lwip/sockets.h" #include "openthread/cli.h" -#define TAG "ot_socket" - static EventGroupHandle_t tcp_client_event_group; static EventGroupHandle_t tcp_server_event_group; @@ -37,22 +36,22 @@ static void tcp_client_receive_task(void *pvParameters) receive_error_nums++; if (receive_error_nums >= 5 && !set_exit && tcp_client_member->sock != -1) { set_exit = 1; - ESP_LOGW(TAG, "TCP client fail when receiving message"); + ESP_LOGW(OT_EXT_CLI_TAG, "TCP client fail when receiving message"); xEventGroupSetBits(tcp_client_event_group, TCP_CLIENT_DELETE_BIT); } } if (len > 0) { receive_error_nums = 0; - ESP_LOGI(TAG, "sock %d Received %d bytes from %s", tcp_client_member->sock, len, + ESP_LOGI(OT_EXT_CLI_TAG, "sock %d Received %d bytes from %s", tcp_client_member->sock, len, tcp_client_member->remote_ipaddr); rx_buffer[len] = '\0'; - ESP_LOGI(TAG, "%s", rx_buffer); + ESP_LOGI(OT_EXT_CLI_TAG, "%s", rx_buffer); } if (tcp_client_member->exist == 0 && tcp_client_member->sock == -1) { break; } } - ESP_LOGI(TAG, "TCP client receive task exiting"); + ESP_LOGI(OT_EXT_CLI_TAG, "TCP client receive task exiting"); vTaskDelete(NULL); } @@ -75,18 +74,20 @@ static void tcp_client_add(TCP_CLIENT *tcp_client_member) tcp_client_member->sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_IPV6); err_flag = 1; - ESP_GOTO_ON_FALSE((tcp_client_member->sock >= 0), ESP_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); + ESP_GOTO_ON_FALSE((tcp_client_member->sock >= 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, + "Unable to create socket: errno %d", errno); - ESP_LOGI(TAG, "Socket created, connecting to %s:%d", tcp_client_member->remote_ipaddr, + ESP_LOGI(OT_EXT_CLI_TAG, "Socket created, connecting to %s:%d", tcp_client_member->remote_ipaddr, tcp_client_member->remote_port); err = connect(tcp_client_member->sock, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6)); - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "Socket unable to connect: errno %d", errno); - ESP_LOGI(TAG, "Successfully connected"); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Socket unable to connect: errno %d", errno); + ESP_LOGI(OT_EXT_CLI_TAG, "Successfully connected"); if (pdPASS != xTaskCreate(tcp_client_receive_task, "tcp_client_receive", 4096, tcp_client_member, 4, NULL)) { err = -1; } - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "The TCP client is unable to receive: errno %d", errno); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "The TCP client is unable to receive: errno %d", + errno); exit: if (ret != ESP_OK) { @@ -95,7 +96,7 @@ static void tcp_client_add(TCP_CLIENT *tcp_client_member) close(tcp_client_member->sock); tcp_client_member->sock = -1; } - ESP_LOGI(TAG, "Fail to create TCP client"); + ESP_LOGI(OT_EXT_CLI_TAG, "Fail to create TCP client"); } else { tcp_client_member->exist = 1; } @@ -106,13 +107,13 @@ static void tcp_client_send(TCP_CLIENT *tcp_client_member) int len = 0; len = send(tcp_client_member->sock, tcp_client_member->message, strlen(tcp_client_member->message), 0); if (len < 0) { - ESP_LOGI(TAG, "Fail to send message"); + ESP_LOGI(OT_EXT_CLI_TAG, "Fail to send message"); } } static void tcp_client_delete(TCP_CLIENT *tcp_client_member) { - ESP_LOGI(TAG, "TCP client is disconnecting with %s", tcp_client_member->remote_ipaddr); + ESP_LOGI(OT_EXT_CLI_TAG, "TCP client is disconnecting with %s", tcp_client_member->remote_ipaddr); tcp_client_member->exist = 0; shutdown(tcp_client_member->sock, 0); close(tcp_client_member->sock); @@ -146,7 +147,7 @@ static void tcp_socket_client_task(void *pvParameters) break; } } - ESP_LOGI(TAG, "Closed TCP client successfully"); + ESP_LOGI(OT_EXT_CLI_TAG, "Closed TCP client successfully"); vEventGroupDelete(tcp_client_event_group); vTaskDelete(NULL); } @@ -182,14 +183,15 @@ otError esp_ot_process_tcp_client(void *aContext, uint8_t aArgsLength, char *aAr } else if (strcmp(aArgs[0], "open") == 0) { if (tcp_client_handle == NULL) { tcp_client_event_group = xEventGroupCreate(); - ESP_RETURN_ON_FALSE(tcp_client_event_group != NULL, OT_ERROR_FAILED, TAG, "Fail to open tcp client"); + ESP_RETURN_ON_FALSE(tcp_client_event_group != NULL, OT_ERROR_FAILED, OT_EXT_CLI_TAG, + "Fail to open tcp client"); if (pdPASS != xTaskCreate(tcp_socket_client_task, "tcp_socket_client", 4096, &tcp_client_member, 4, &tcp_client_handle)) { tcp_client_handle = NULL; vEventGroupDelete(tcp_client_event_group); tcp_client_event_group = NULL; - ESP_LOGE(TAG, "Fail to open tcp client"); + ESP_LOGE(OT_EXT_CLI_TAG, "Fail to open tcp client"); return OT_ERROR_FAILED; } } else { @@ -205,7 +207,7 @@ otError esp_ot_process_tcp_client(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 3) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } strncpy(tcp_client_member.remote_ipaddr, aArgs[1], sizeof(tcp_client_member.remote_ipaddr)); @@ -221,7 +223,7 @@ otError esp_ot_process_tcp_client(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 2) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } strncpy(tcp_client_member.message, aArgs[1], sizeof(tcp_client_member.message)); @@ -253,7 +255,7 @@ static void tcp_server_task(void *pvParameters) socklen_t addr_len = sizeof(source_addr); connect_sock = accept(tcp_server_member->listen_sock, (struct sockaddr *)&source_addr, &addr_len); if (connect_sock < 0) { - ESP_LOGE(TAG, "Unable to accept connection: errno %d", errno); + ESP_LOGE(OT_EXT_CLI_TAG, "Unable to accept connection: errno %d", errno); if (tcp_server_member->listen_sock != -1) { xEventGroupSetBits(tcp_server_event_group, TCP_SERVER_DELETE_BIT); } @@ -265,30 +267,30 @@ static void tcp_server_task(void *pvParameters) } else { tcp_server_member->connect_sock = connect_sock; inet6_ntoa_r(((struct sockaddr_in6 *)&source_addr)->sin6_addr, addr_str, sizeof(addr_str) - 1); - ESP_LOGI(TAG, "Socket accepted ip address: %s", addr_str); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket accepted ip address: %s", addr_str); strncpy(tcp_server_member->remote_ipaddr, addr_str, strlen(addr_str) + 1); while (true) { len = recv(connect_sock, rx_buffer, sizeof(rx_buffer) - 1, 0); if (len < 0) { receive_error_nums++; if (receive_error_nums >= 5 && !set_exit && tcp_server_member->connect_sock != -1) { - ESP_LOGW(TAG, "TCP server fail when receiving message"); + ESP_LOGW(OT_EXT_CLI_TAG, "TCP server fail when receiving message"); xEventGroupSetBits(tcp_server_event_group, TCP_SERVER_DELETE_BIT); set_exit = 1; } } if (len > 0) { receive_error_nums = 0; - ESP_LOGI(TAG, "sock %d Received %d bytes from %s", connect_sock, len, addr_str); + ESP_LOGI(OT_EXT_CLI_TAG, "sock %d Received %d bytes from %s", connect_sock, len, addr_str); rx_buffer[len] = '\0'; - ESP_LOGI(TAG, "%s", rx_buffer); + ESP_LOGI(OT_EXT_CLI_TAG, "%s", rx_buffer); } if (tcp_server_member->exist == 0 && tcp_server_member->connect_sock == -1) { break; } } } - ESP_LOGI(TAG, "TCP server receive task exiting"); + ESP_LOGI(OT_EXT_CLI_TAG, "TCP server receive task exiting"); vTaskDelete(NULL); } @@ -306,23 +308,25 @@ static void tcp_server_add(TCP_SERVER *tcp_server_member) listen_addr.sin6_port = htons(tcp_server_member->local_port); listen_sock = socket(AF_INET6, SOCK_STREAM, IPPROTO_IPV6); - ESP_GOTO_ON_FALSE((listen_sock >= 0), ESP_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); - ESP_LOGI(TAG, "Socket created"); + ESP_GOTO_ON_FALSE((listen_sock >= 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Unable to create socket: errno %d", errno); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket created"); tcp_server_member->listen_sock = listen_sock; err_flag = 1; err = bind(listen_sock, (struct sockaddr *)&listen_addr, sizeof(struct sockaddr_in6)); - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "Socket unable to bind: errno %d, IPPROTO: %d", errno, AF_INET6); - ESP_LOGI(TAG, "Socket bound, port %d", tcp_server_member->local_port); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Socket unable to bind: errno %d, IPPROTO: %d", errno, + AF_INET6); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket bound, port %d", tcp_server_member->local_port); err = listen(listen_sock, 1); - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "Error occurred during listen: errno %d", errno); - ESP_LOGI(TAG, "Socket listening"); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Error occurred during listen: errno %d", errno); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket listening"); if (pdPASS != xTaskCreate(tcp_server_task, "tcp_server_receive", 4096, tcp_server_member, 4, NULL)) { err = -1; } - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "The TCP server is unable to accept: errno %d", errno); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "The TCP server is unable to accept: errno %d", + errno); exit: if (ret != ESP_OK) { @@ -331,9 +335,9 @@ static void tcp_server_add(TCP_SERVER *tcp_server_member) close(listen_sock); tcp_server_member->listen_sock = -1; } - ESP_LOGI(TAG, "Fail to create a TCP server"); + ESP_LOGI(OT_EXT_CLI_TAG, "Fail to create a TCP server"); } else { - ESP_LOGI(TAG, "Successfully created"); + ESP_LOGI(OT_EXT_CLI_TAG, "Successfully created"); tcp_server_member->exist = 1; } } @@ -343,7 +347,7 @@ static void tcp_server_send(TCP_SERVER *tcp_server_member) int len = 0; len = send(tcp_server_member->connect_sock, tcp_server_member->message, strlen(tcp_server_member->message), 0); if (len < 0) { - ESP_LOGI(TAG, "Fail to send message"); + ESP_LOGI(OT_EXT_CLI_TAG, "Fail to send message"); } } @@ -360,7 +364,7 @@ static void tcp_server_delete(TCP_SERVER *tcp_server_member) if (connect_sock >= 0) { shutdown(connect_sock, 0); close(connect_sock); - ESP_LOGI(TAG, "TCP server is disconnecting with %s", tcp_server_member->remote_ipaddr); + ESP_LOGI(OT_EXT_CLI_TAG, "TCP server is disconnecting with %s", tcp_server_member->remote_ipaddr); } } @@ -391,7 +395,7 @@ static void tcp_socket_server_task(void *pvParameters) break; } } - ESP_LOGI(TAG, "Closed TCP server successfully"); + ESP_LOGI(OT_EXT_CLI_TAG, "Closed TCP server successfully"); vEventGroupDelete(tcp_server_event_group); vTaskDelete(NULL); } @@ -431,14 +435,15 @@ otError esp_ot_process_tcp_server(void *aContext, uint8_t aArgsLength, char *aAr } else if (strcmp(aArgs[0], "open") == 0) { if (tcp_server_handle == NULL) { tcp_server_event_group = xEventGroupCreate(); - ESP_RETURN_ON_FALSE(tcp_server_event_group != NULL, OT_ERROR_FAILED, TAG, "Fail to open tcp server"); + ESP_RETURN_ON_FALSE(tcp_server_event_group != NULL, OT_ERROR_FAILED, OT_EXT_CLI_TAG, + "Fail to open tcp server"); if (pdPASS != xTaskCreate(tcp_socket_server_task, "tcp_socket_server", 4096, &tcp_server_member, 4, &tcp_server_handle)) { tcp_server_handle = NULL; vEventGroupDelete(tcp_server_event_group); tcp_server_event_group = NULL; - ESP_LOGE(TAG, "Fail to open tcp server"); + ESP_LOGE(OT_EXT_CLI_TAG, "Fail to open tcp server"); return OT_ERROR_FAILED; } } else { @@ -454,7 +459,7 @@ otError esp_ot_process_tcp_server(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 3) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } strncpy(tcp_server_member.local_ipaddr, aArgs[1], sizeof(tcp_server_member.local_ipaddr)); @@ -470,7 +475,7 @@ otError esp_ot_process_tcp_server(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 2) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } strncpy(tcp_server_member.message, aArgs[1], sizeof(tcp_server_member.message)); diff --git a/components/esp_ot_cli_extension/src/esp_ot_udp_socket.c b/components/esp_ot_cli_extension/src/esp_ot_udp_socket.c index 3aaa085..af55e87 100644 --- a/components/esp_ot_cli_extension/src/esp_ot_udp_socket.c +++ b/components/esp_ot_cli_extension/src/esp_ot_udp_socket.c @@ -13,6 +13,7 @@ #include "esp_netif.h" #include "esp_netif_net_stack.h" #include "esp_openthread_lock.h" +#include "esp_ot_cli_extension.h" #include #include "freertos/FreeRTOS.h" #include "freertos/event_groups.h" @@ -22,8 +23,6 @@ #include "lwip/sockets.h" #include "openthread/cli.h" -#define TAG "ot_socket" - static EventGroupHandle_t udp_server_event_group; static EventGroupHandle_t udp_client_event_group; @@ -41,20 +40,21 @@ static void udp_server_receive_task(void *pvParameters) len = recvfrom(udp_server_member->sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); if (len < 0) { - ESP_LOGW(TAG, "UDP server fail when receiving message"); + ESP_LOGW(OT_EXT_CLI_TAG, "UDP server fail when receiving message"); } if (len > 0) { inet6_ntoa_r(((struct sockaddr_in6 *)&source_addr)->sin6_addr, addr_str, sizeof(addr_str) - 1); port = ntohs(((struct sockaddr_in6 *)&source_addr)->sin6_port); - ESP_LOGI(TAG, "sock %d Received %d bytes from %s : %d", udp_server_member->sock, len, addr_str, port); + ESP_LOGI(OT_EXT_CLI_TAG, "sock %d Received %d bytes from %s : %d", udp_server_member->sock, len, addr_str, + port); rx_buffer[len] = '\0'; - ESP_LOGI(TAG, "%s", rx_buffer); + ESP_LOGI(OT_EXT_CLI_TAG, "%s", rx_buffer); } if (udp_server_member->exist == 0) { break; } } - ESP_LOGI(TAG, "UDP server receive task exiting"); + ESP_LOGI(OT_EXT_CLI_TAG, "UDP server receive task exiting"); vTaskDelete(NULL); } @@ -74,19 +74,22 @@ static void udp_server_bind(UDP_SERVER *udp_server_member) listen_addr.sin6_port = htons(udp_server_member->local_port); sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_IPV6); - ESP_GOTO_ON_FALSE((sock >= 0), ESP_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); - ESP_LOGI(TAG, "Socket created"); + ESP_GOTO_ON_FALSE((sock >= 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Unable to create socket: errno %d", errno); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket created"); udp_server_member->sock = sock; err_flag = 1; err = bind(sock, (struct sockaddr *)&listen_addr, sizeof(struct sockaddr_in6)); - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "Socket unable to bind: errno %d, IPPROTO: %d", errno, AF_INET6); - ESP_LOGI(TAG, "Socket bound, ipaddr %s, port %d", udp_server_member->local_ipaddr, udp_server_member->local_port); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Socket unable to bind: errno %d, IPPROTO: %d", errno, + AF_INET6); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket bound, ipaddr %s, port %d", udp_server_member->local_ipaddr, + udp_server_member->local_port); if (pdPASS != xTaskCreate(udp_server_receive_task, "udp_server_receive", 4096, udp_server_member, 4, NULL)) { err = -1; } - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "The UDP server is unable to receive: errno %d", errno); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "The UDP server is unable to receive: errno %d", + errno); exit: if (ret != ESP_OK) { @@ -95,9 +98,9 @@ static void udp_server_bind(UDP_SERVER *udp_server_member) close(sock); udp_server_member->sock = -1; } - ESP_LOGI(TAG, "Fail to create a UDP server"); + ESP_LOGI(OT_EXT_CLI_TAG, "Fail to create a UDP server"); } else { - ESP_LOGI(TAG, "Successfully created"); + ESP_LOGI(OT_EXT_CLI_TAG, "Successfully created"); udp_server_member->exist = 1; } } @@ -110,12 +113,13 @@ static void udp_server_send(UDP_SERVER *udp_server_member) inet6_aton(udp_server_member->messagesend.ipaddr, &dest_addr.sin6_addr); dest_addr.sin6_family = AF_INET6; dest_addr.sin6_port = htons(udp_server_member->messagesend.port); - ESP_LOGI(TAG, "Sending to %s : %d", udp_server_member->messagesend.ipaddr, udp_server_member->messagesend.port); + ESP_LOGI(OT_EXT_CLI_TAG, "Sending to %s : %d", udp_server_member->messagesend.ipaddr, + udp_server_member->messagesend.port); len = sendto(udp_server_member->sock, udp_server_member->messagesend.message, strlen(udp_server_member->messagesend.message), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)); if (len < 0) { - ESP_LOGW(TAG, "Fail to send message"); + ESP_LOGW(OT_EXT_CLI_TAG, "Fail to send message"); } } @@ -148,7 +152,7 @@ static void udp_socket_server_task(void *pvParameters) break; } } - ESP_LOGI(TAG, "Closed UDP server successfully"); + ESP_LOGI(OT_EXT_CLI_TAG, "Closed UDP server successfully"); vEventGroupDelete(udp_server_event_group); vTaskDelete(NULL); } @@ -186,14 +190,15 @@ otError esp_ot_process_udp_server(void *aContext, uint8_t aArgsLength, char *aAr } else if (strcmp(aArgs[0], "open") == 0) { if (udp_server_handle == NULL) { udp_server_event_group = xEventGroupCreate(); - ESP_RETURN_ON_FALSE(udp_server_event_group != NULL, OT_ERROR_FAILED, TAG, "Fail to open udp server"); + ESP_RETURN_ON_FALSE(udp_server_event_group != NULL, OT_ERROR_FAILED, OT_EXT_CLI_TAG, + "Fail to open udp server"); if (pdPASS != xTaskCreate(udp_socket_server_task, "udp_socket_server", 4096, &udp_server_member, 4, &udp_server_handle)) { udp_server_handle = NULL; vEventGroupDelete(udp_server_event_group); udp_server_event_group = NULL; - ESP_LOGE(TAG, "Fail to open udp server"); + ESP_LOGE(OT_EXT_CLI_TAG, "Fail to open udp server"); return OT_ERROR_FAILED; } } else { @@ -209,7 +214,7 @@ otError esp_ot_process_udp_server(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 2) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } strncpy(udp_server_member.local_ipaddr, "::", sizeof(udp_server_member.local_ipaddr)); @@ -225,7 +230,7 @@ otError esp_ot_process_udp_server(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 4) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } strncpy(udp_server_member.messagesend.ipaddr, aArgs[1], sizeof(udp_server_member.messagesend.ipaddr)); @@ -259,20 +264,21 @@ static void udp_client_receive_task(void *pvParameters) len = recvfrom(udp_client_member->sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); if (len < 0) { - ESP_LOGW(TAG, "UDP client fail when receiving message"); + ESP_LOGW(OT_EXT_CLI_TAG, "UDP client fail when receiving message"); } if (len > 0) { inet6_ntoa_r(((struct sockaddr_in6 *)&source_addr)->sin6_addr, addr_str, sizeof(addr_str) - 1); port = ntohs(((struct sockaddr_in6 *)&source_addr)->sin6_port); - ESP_LOGI(TAG, "sock %d Received %d bytes from %s : %d", udp_client_member->sock, len, addr_str, port); + ESP_LOGI(OT_EXT_CLI_TAG, "sock %d Received %d bytes from %s : %d", udp_client_member->sock, len, addr_str, + port); rx_buffer[len] = '\0'; - ESP_LOGI(TAG, "%s", rx_buffer); + ESP_LOGI(OT_EXT_CLI_TAG, "%s", rx_buffer); } if (udp_client_member->exist == 0) { break; } } - ESP_LOGI(TAG, "UDP client receive task exiting"); + ESP_LOGI(OT_EXT_CLI_TAG, "UDP client receive task exiting"); vTaskDelete(NULL); } @@ -284,12 +290,13 @@ static void udp_client_send(UDP_CLIENT *udp_client_member) inet6_aton(udp_client_member->messagesend.ipaddr, &dest_addr.sin6_addr); dest_addr.sin6_family = AF_INET6; dest_addr.sin6_port = htons(udp_client_member->messagesend.port); - ESP_LOGI(TAG, "Sending to %s : %d", udp_client_member->messagesend.ipaddr, udp_client_member->messagesend.port); + ESP_LOGI(OT_EXT_CLI_TAG, "Sending to %s : %d", udp_client_member->messagesend.ipaddr, + udp_client_member->messagesend.port); len = sendto(udp_client_member->sock, udp_client_member->messagesend.message, strlen(udp_client_member->messagesend.message), 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)); if (len < 0) { - ESP_LOGW(TAG, "Fail to send message"); + ESP_LOGW(OT_EXT_CLI_TAG, "Fail to send message"); } } @@ -313,8 +320,8 @@ static void udp_socket_client_task(void *pvParameters) struct sockaddr_in6 bind_addr = {0}; sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_IPV6); - ESP_GOTO_ON_FALSE((sock >= 0), ESP_FAIL, exit, TAG, "Unable to create socket: errno %d", errno); - ESP_LOGI(TAG, "Socket created"); + ESP_GOTO_ON_FALSE((sock >= 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Unable to create socket: errno %d", errno); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket created"); udp_client_member->sock = sock; err_flag = 1; @@ -326,16 +333,17 @@ static void udp_socket_client_task(void *pvParameters) bind_addr.sin6_port = htons(udp_client_member->local_port); err = bind(sock, (struct sockaddr *)&bind_addr, sizeof(bind_addr)); - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "Socket unable to bind: errno %d", errno); - ESP_LOGI(TAG, "Socket bound, port %d", udp_client_member->local_port); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "Socket unable to bind: errno %d", errno); + ESP_LOGI(OT_EXT_CLI_TAG, "Socket bound, port %d", udp_client_member->local_port); } if (pdPASS != xTaskCreate(udp_client_receive_task, "udp_client_receive", 4096, udp_client_member, 4, NULL)) { err = -1; } - ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, TAG, "The UDP client is unable to receive: errno %d", errno); + ESP_GOTO_ON_FALSE((err == 0), ESP_FAIL, exit, OT_EXT_CLI_TAG, "The UDP client is unable to receive: errno %d", + errno); udp_client_member->exist = 1; - ESP_LOGI(TAG, "Successfully created"); + ESP_LOGI(OT_EXT_CLI_TAG, "Successfully created"); while (true) { int bits = xEventGroupWaitBits(udp_client_event_group, UDP_CLIENT_SEND_BIT | UDP_CLIENT_CLOSE_BIT, pdFALSE, @@ -350,7 +358,7 @@ static void udp_socket_client_task(void *pvParameters) break; } } - ESP_LOGI(TAG, "Closed UDP client successfully"); + ESP_LOGI(OT_EXT_CLI_TAG, "Closed UDP client successfully"); exit: if (ret != ESP_OK) { @@ -360,7 +368,7 @@ static void udp_socket_client_task(void *pvParameters) close(sock); } udp_client_member->local_port = -1; - ESP_LOGI(TAG, "Fail to create a UDP client"); + ESP_LOGI(OT_EXT_CLI_TAG, "Fail to create a UDP client"); } vEventGroupDelete(udp_client_event_group); vTaskDelete(NULL); @@ -398,7 +406,7 @@ otError esp_ot_process_udp_client(void *aContext, uint8_t aArgsLength, char *aAr } else if (strcmp(aArgs[0], "open") == 0) { if (aArgsLength != 1 && aArgsLength != 2) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } if (udp_client_handle == NULL) { @@ -406,7 +414,8 @@ otError esp_ot_process_udp_client(void *aContext, uint8_t aArgsLength, char *aAr udp_client_member.local_port = atoi(aArgs[1]); } udp_client_event_group = xEventGroupCreate(); - ESP_RETURN_ON_FALSE(udp_client_event_group != NULL, OT_ERROR_FAILED, TAG, "Fail to open udp client"); + ESP_RETURN_ON_FALSE(udp_client_event_group != NULL, OT_ERROR_FAILED, OT_EXT_CLI_TAG, + "Fail to open udp client"); if (pdPASS != xTaskCreate(udp_socket_client_task, "udp_socket_client", 4096, &udp_client_member, 4, &udp_client_handle)) { @@ -414,7 +423,7 @@ otError esp_ot_process_udp_client(void *aContext, uint8_t aArgsLength, char *aAr udp_client_member.local_port = -1; vEventGroupDelete(udp_client_event_group); udp_client_event_group = NULL; - ESP_LOGE(TAG, "Fail to open udp client"); + ESP_LOGE(OT_EXT_CLI_TAG, "Fail to open udp client"); return OT_ERROR_FAILED; } } else { @@ -431,7 +440,7 @@ otError esp_ot_process_udp_client(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 2) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } @@ -445,7 +454,7 @@ otError esp_ot_process_udp_client(void *aContext, uint8_t aArgsLength, char *aAr return OT_ERROR_NONE; } if (aArgsLength != 4) { - ESP_LOGE(TAG, "Invalid arguments."); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments."); return OT_ERROR_INVALID_ARGS; } strncpy(udp_client_member.messagesend.ipaddr, aArgs[1], sizeof(udp_client_member.messagesend.ipaddr)); @@ -481,7 +490,7 @@ esp_err_t leave_ip6_mcast(void *ctx) otError esp_ot_process_mcast_group(void *aContext, uint8_t aArgsLength, char *aArgs[]) { if (aArgsLength != 2 || (strncmp(aArgs[0], "join", 4) != 0 && strncmp(aArgs[0], "leave", 5) != 0)) { - ESP_LOGE(TAG, "Invalid arguments: mcast [join|leave] group_address"); + ESP_LOGE(OT_EXT_CLI_TAG, "Invalid arguments: mcast [join|leave] group_address"); return OT_ERROR_INVALID_ARGS; } otError ret = OT_ERROR_NONE; @@ -491,12 +500,12 @@ otError esp_ot_process_mcast_group(void *aContext, uint8_t aArgsLength, char *aA inet6_aton(aArgs[1], &group); if (strncmp(aArgs[0], "join", 4) == 0) { if (esp_netif_tcpip_exec(join_ip6_mcast, &group) != ESP_OK) { - ESP_LOGE(TAG, "Failed to join group"); + ESP_LOGE(OT_EXT_CLI_TAG, "Failed to join group"); ret = OT_ERROR_FAILED; } } else { if (esp_netif_tcpip_exec(leave_ip6_mcast, &group) != ESP_OK) { - ESP_LOGE(TAG, "Failed to leave group"); + ESP_LOGE(OT_EXT_CLI_TAG, "Failed to leave group"); ret = OT_ERROR_FAILED; } } diff --git a/examples/basic_thread_border_router/main/idf_component.yml b/examples/basic_thread_border_router/main/idf_component.yml index acb64aa..7a02e76 100644 --- a/examples/basic_thread_border_router/main/idf_component.yml +++ b/examples/basic_thread_border_router/main/idf_component.yml @@ -1,7 +1,7 @@ ## IDF Component Manager Manifest File dependencies: espressif/mdns: "^1.0.0" - espressif/esp_ot_cli_extension: "~0.3.0" + espressif/esp_ot_cli_extension: "~0.4.0" espressif/esp_rcp_update: "~0.3.0" espressif/esp-serial-flasher: "~0.0.0" ## Required IDF version diff --git a/examples/basic_thread_border_router/sdkconfig.defaults b/examples/basic_thread_border_router/sdkconfig.defaults index 082b0ea..1be388e 100644 --- a/examples/basic_thread_border_router/sdkconfig.defaults +++ b/examples/basic_thread_border_router/sdkconfig.defaults @@ -61,6 +61,7 @@ CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT=y CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT=y CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM=y CONFIG_LWIP_IPV6_AUTOCONFIG=y +CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM=y # end of lwIP #