diff --git a/targets/ESP32/_Network/CMakeLists.txt b/targets/ESP32/_Network/CMakeLists.txt index f76a1dc7ed..7e88e7429b 100644 --- a/targets/ESP32/_Network/CMakeLists.txt +++ b/targets/ESP32/_Network/CMakeLists.txt @@ -11,6 +11,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/esp32_ethernet_options.h.in ${CMAKE_BINARY_DIR}/targets/${RTOS}/${TARGET_BOARD}/esp32_ethernet_options.h @ONLY) # append networking files, if enabled +list(APPEND TARGET_ESP32_IDF_NETWORK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/NF_ESP32_Network.cpp) list(APPEND TARGET_ESP32_IDF_NETWORK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/NF_ESP32_Ethernet.cpp) list(APPEND TARGET_ESP32_IDF_NETWORK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/NF_ESP32_Wireless.cpp) list(APPEND TARGET_ESP32_IDF_NETWORK_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/NF_ESP32_SmartConfig.cpp) diff --git a/targets/ESP32/_Network/NF_ESP32_Ethernet.cpp b/targets/ESP32/_Network/NF_ESP32_Ethernet.cpp index b16214fab7..4f0cf464bb 100644 --- a/targets/ESP32/_Network/NF_ESP32_Ethernet.cpp +++ b/targets/ESP32/_Network/NF_ESP32_Ethernet.cpp @@ -219,6 +219,9 @@ esp_err_t NF_ESP32_InitialiseEthernet(uint8_t *pMacAdr) // attach Ethernet driver to TCP/IP stack ESP_ERROR_CHECK(esp_netif_attach(eth_netif, esp_eth_new_netif_glue(eth_handle))); + // Configure static address if required in config + ESP_ERROR_CHECK(NF_ESP32_ConfigureNetworkByIndex(IDF_ETH_DEF, eth_netif)); + // start Ethernet driver state machine ESP_ERROR_CHECK(esp_eth_start(eth_handle)); diff --git a/targets/ESP32/_Network/NF_ESP32_Network.cpp b/targets/ESP32/_Network/NF_ESP32_Network.cpp new file mode 100644 index 0000000000..77c0e89127 --- /dev/null +++ b/targets/ESP32/_Network/NF_ESP32_Network.cpp @@ -0,0 +1,128 @@ +// +// Copyright (c) .NET Foundation and Contributors +// See LICENSE file in the project root for full license information. +// + +// This file includes common method for networking code + +#include "NF_ESP32_Network.h" +#include "esp_netif_net_stack.h" + +// Wait for the network interface to become available +int NF_ESP32_Wait_NetNumber(int num) +{ + int number = 0; + int timeoutMs = 30000; // 30 seconds timeout + int elapsedMs = 0; + esp_netif_t *espNetif; + + while (elapsedMs < timeoutMs) + { + switch (num) + { + case IDF_WIFI_STA_DEF: + espNetif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); + break; + + case IDF_WIFI_AP_DEF: + espNetif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); + break; + + case IDF_ETH_DEF: + espNetif = esp_netif_get_handle_from_ifkey("ETH_DEF"); + break; + + case IDF_OT_DEF: + espNetif = esp_netif_get_handle_from_ifkey("OT_DEF"); + break; + + default: + // can't reach here + HAL_AssertEx(); + break; + } + + if (espNetif != NULL) + { + break; + } + + const int delayMs = 20; + vTaskDelay(delayMs / portTICK_PERIOD_MS); + elapsedMs += delayMs; + } + + if (espNetif == NULL) + { + // Return error or default value + return SOCK_SOCKET_ERROR; + } + + return espNetif->lwip_netif->num; +} + +HAL_Configuration_NetworkInterface *NF_ESP32_GetNetworkConfigBlock(int index) +{ + HAL_Configuration_NetworkInterface *networkConfig = + (HAL_Configuration_NetworkInterface *)platform_malloc(sizeof(HAL_Configuration_NetworkInterface)); + + if (networkConfig != NULL) + { + if (ConfigurationManager_GetConfigurationBlock(networkConfig, DeviceConfigurationOption_Network, index)) + { + return networkConfig; + } + platform_free(networkConfig); + } + + return NULL; +} + +// +// Configure network settings for a espressif network interface +// +esp_err_t NF_ESP32_ConfigureNetwork(esp_netif_t *netIf, HAL_Configuration_NetworkInterface *config) +{ + esp_err_t ec; + esp_netif_ip_info_t ip_info; + + ec = esp_netif_get_ip_info(netIf, &ip_info); + if (ec != ESP_OK) + { + return ec; + } + + bool enableDHCP = (config->StartupAddressMode == AddressMode_DHCP); + + // Set static addresses + if (config->IPv4Address != 0) + { + ip_info.ip.addr = config->IPv4Address; + ip_info.netmask.addr = config->IPv4NetMask; + ip_info.gw.addr = config->IPv4GatewayAddress; + + ec = esp_netif_set_ip_info(netIf, &ip_info); + + // Make sure DHCP client is disabled + netIf->flags = (esp_netif_flags_t)(netIf->flags & ~ESP_NETIF_DHCP_CLIENT); + } + + return ec; +} + +esp_err_t NF_ESP32_ConfigureNetworkByIndex(int index, esp_netif_t *netIf) +{ + esp_err_t ec; + + HAL_Configuration_NetworkInterface *networkConfig = NF_ESP32_GetNetworkConfigBlock(index); + if (networkConfig == NULL) + { + return ESP_FAIL; + } + + ec = NF_ESP32_ConfigureNetwork(netIf, networkConfig); + + platform_free(networkConfig); + + return ec; +} diff --git a/targets/ESP32/_Network/NF_ESP32_Wireless.cpp b/targets/ESP32/_Network/NF_ESP32_Wireless.cpp index 6954849512..7d6d0851bd 100644 --- a/targets/ESP32/_Network/NF_ESP32_Wireless.cpp +++ b/targets/ESP32/_Network/NF_ESP32_Wireless.cpp @@ -112,6 +112,11 @@ wifi_mode_t NF_ESP32_GetCurrentWifiMode() return current_wifi_mode; } +esp_err_t NF_ESP32_ConfigureNetworkStation(esp_netif_t *netIf) +{ + return NF_ESP32_ConfigureNetworkByIndex(IDF_WIFI_STA_DEF, netIf); +} + void NF_ESP32_DeinitWifi() { // clear flags @@ -155,6 +160,14 @@ esp_err_t NF_ESP32_InitaliseWifi() // create Wi-Fi STA (ignoring return) wifiStaNetif = esp_netif_create_default_wifi_sta(); + // Set static address if configured + // ignore any errors + ec = NF_ESP32_ConfigureNetworkStation(wifiStaNetif); + if (ec != ESP_OK) + { + ESP_LOGE(TAG, "Unable to configure Wifi station - result %d", ec); + } + // We need to start the WIFI stack before the station can Connect // Also we can only get the NetIf number used by ESP IDF after it has been started. // Starting will also start the Soft- AP (if we have enabled it). @@ -514,47 +527,3 @@ bool NF_ESP32_WirelessAP_Close() } #endif - -// Wait for the network interface to become available -int NF_ESP32_Wait_NetNumber(int num) -{ - int number = 0; - - esp_netif_t *espNetif; - - while (true) - { - switch (num) - { - case IDF_WIFI_STA_DEF: - espNetif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); - break; - - case IDF_WIFI_AP_DEF: - espNetif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); - break; - - case IDF_ETH_DEF: - espNetif = esp_netif_get_handle_from_ifkey("ETH_DEF"); - break; - - case IDF_OT_DEF: - espNetif = esp_netif_get_handle_from_ifkey("OT_DEF"); - break; - - default: - // can't reach here - HAL_AssertEx(); - break; - } - - if (espNetif != NULL) - { - break; - } - - vTaskDelay(20 / portTICK_PERIOD_MS); - } - - return espNetif->lwip_netif->num; -} diff --git a/targets/ESP32/_include/NF_ESP32_Network.h b/targets/ESP32/_include/NF_ESP32_Network.h index 94e0edf837..0bcd91f766 100644 --- a/targets/ESP32/_include/NF_ESP32_Network.h +++ b/targets/ESP32/_include/NF_ESP32_Network.h @@ -60,5 +60,8 @@ void NF_ESP32_Start_wifi_smart_config(void); // Helpers int NF_ESP32_Wait_NetNumber(int num); +HAL_Configuration_NetworkInterface *NF_ESP32_GetNetworkConfigBlock(int index); +esp_err_t NF_ESP32_ConfigureNetwork(esp_netif_t *netIf, HAL_Configuration_NetworkInterface *config); +esp_err_t NF_ESP32_ConfigureNetworkByIndex(int index, esp_netif_t *netIf); #endif // NF_ESP32_NETWORK_H