mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-09-11 17:14:27 +00:00
[ESP-IDF5.1] Add initial support for IPv6
This commit is contained in:
@@ -50,7 +50,6 @@ extra_scripts = post:tools/pio/post_esp32.py
|
||||
; -mtext-section-literals may be required when building large builds
|
||||
; However LTO cannot optimize builds with text section literals and thus will result in quite a lot larger builds (80k - 140k larger)
|
||||
build_unflags = -Wall
|
||||
-DLWIP_IPV6
|
||||
-fno-lto
|
||||
build_flags = ${core_esp32_IDF5_1__3_0_0.build_flags}
|
||||
; ${mqtt_flags.build_flags}
|
||||
@@ -60,7 +59,8 @@ build_flags = ${core_esp32_IDF5_1__3_0_0.build_flags}
|
||||
-fno-strict-aliasing
|
||||
-flto=auto
|
||||
-Wswitch
|
||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_ERROR
|
||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||
-DLWIP_IPV6
|
||||
monitor_filters = esp32_exception_decoder
|
||||
lib_ignore =
|
||||
${core_esp32_IDF5_1__3_0_0.lib_ignore}
|
||||
|
||||
@@ -25,6 +25,9 @@ enum class TimingStatsElements {
|
||||
|
||||
// Controller queue
|
||||
MQTT_DELAY_QUEUE,
|
||||
|
||||
// Do not interrupt this sequence of Cxxx_DELAY_QUEUE
|
||||
// as its order is used to generate MiscStatsName
|
||||
C001_DELAY_QUEUE,
|
||||
C002_DELAY_QUEUE,
|
||||
C003_DELAY_QUEUE,
|
||||
@@ -43,7 +46,6 @@ enum class TimingStatsElements {
|
||||
C016_DELAY_QUEUE,
|
||||
C017_DELAY_QUEUE,
|
||||
C018_DELAY_QUEUE,
|
||||
C018_AIR_TIME,
|
||||
C019_DELAY_QUEUE,
|
||||
C020_DELAY_QUEUE,
|
||||
C021_DELAY_QUEUE,
|
||||
@@ -52,6 +54,9 @@ enum class TimingStatsElements {
|
||||
C024_DELAY_QUEUE,
|
||||
C025_DELAY_QUEUE,
|
||||
|
||||
// Controller specific timing stats
|
||||
C018_AIR_TIME,
|
||||
|
||||
|
||||
// Related to Task runs & sending data + rules
|
||||
PLUGIN_CALL_50PS,
|
||||
|
||||
@@ -18,6 +18,18 @@
|
||||
#include <ETH.h>
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef LWIP_IPV6
|
||||
#include <esp_netif.h>
|
||||
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
// ---------------------------------------------------- Private functions ------------------------------------------------
|
||||
// -----------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
esp_netif_t* get_esp_interface_netif(esp_interface_t interface);
|
||||
#endif
|
||||
|
||||
|
||||
void setNetworkMedium(NetworkMedium_t new_medium) {
|
||||
#if !(FEATURE_ETHERNET)
|
||||
if (new_medium == NetworkMedium_t::Ethernet) {
|
||||
@@ -139,6 +151,61 @@ IPAddress NetworkDnsIP(uint8_t dns_no) {
|
||||
return WiFi.dnsIP(dns_no);
|
||||
}
|
||||
|
||||
#ifdef LWIP_IPV6
|
||||
|
||||
|
||||
IPAddress NetworkLocalIP6() {
|
||||
esp_interface_t iface = ESP_IF_MAX;
|
||||
#if FEATURE_ETHERNET
|
||||
if(active_network_medium == NetworkMedium_t::Ethernet) {
|
||||
if(EthEventData.ethInitSuccess) {
|
||||
iface = ESP_IF_ETH;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
if (WifiIsSTA(WiFi.getMode())) {
|
||||
iface = ESP_IF_WIFI_STA;
|
||||
}
|
||||
}
|
||||
esp_ip6_addr_t addr;
|
||||
if(ESP_IF_MAX == iface ||
|
||||
esp_netif_get_ip6_linklocal(get_esp_interface_netif(iface), &addr))
|
||||
{
|
||||
return IN6ADDR_ANY;
|
||||
}
|
||||
|
||||
IPAddress res(IPv6, (const uint8_t*)addr.addr, addr.zone);
|
||||
return res;
|
||||
}
|
||||
|
||||
IPAddress NetworkGlobalIP6() {
|
||||
esp_interface_t iface = ESP_IF_MAX;
|
||||
#if FEATURE_ETHERNET
|
||||
if(active_network_medium == NetworkMedium_t::Ethernet) {
|
||||
if(EthEventData.ethInitSuccess) {
|
||||
iface = ESP_IF_ETH;
|
||||
}
|
||||
} else
|
||||
#endif
|
||||
{
|
||||
if (WifiIsSTA(WiFi.getMode())) {
|
||||
iface = ESP_IF_WIFI_STA;
|
||||
}
|
||||
}
|
||||
esp_ip6_addr_t addr;
|
||||
if(ESP_IF_MAX == iface ||
|
||||
esp_netif_get_ip6_global(get_esp_interface_netif(iface), &addr))
|
||||
{
|
||||
return IN6ADDR_ANY;
|
||||
}
|
||||
|
||||
IPAddress res(IPv6, (const uint8_t*)addr.addr, addr.zone);
|
||||
return res;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
MAC_address NetworkMacAddress() {
|
||||
#if FEATURE_ETHERNET
|
||||
if(active_network_medium == NetworkMedium_t::Ethernet) {
|
||||
|
||||
@@ -15,6 +15,10 @@ IPAddress NetworkLocalIP();
|
||||
IPAddress NetworkSubnetMask();
|
||||
IPAddress NetworkGatewayIP();
|
||||
IPAddress NetworkDnsIP (uint8_t dns_no);
|
||||
#ifdef LWIP_IPV6
|
||||
IPAddress NetworkLocalIP6();
|
||||
IPAddress NetworkGlobalIP6();
|
||||
#endif
|
||||
MAC_address NetworkMacAddress();
|
||||
String NetworkGetHostNameFromSettings(bool force_add_unitnr = false);
|
||||
String NetworkGetHostname();
|
||||
|
||||
@@ -160,6 +160,18 @@ void WiFiEvent(WiFiEvent_t event, arduino_event_info_t info) {
|
||||
ignoreDisconnectEvent = false;
|
||||
WiFiEventData.markGotIP();
|
||||
break;
|
||||
#if ESP_IDF_VERSION_MAJOR >= 5
|
||||
case ARDUINO_EVENT_WIFI_STA_GOT_IP6:
|
||||
{
|
||||
ip_event_got_ip6_t * event = static_cast<ip_event_got_ip6_t*>(&info.got_ip6);
|
||||
IPAddress ip(IPv6, (const uint8_t*)event->ip6_info.ip.addr, event->ip6_info.ip.zone);
|
||||
addLog(LOG_LEVEL_INFO, String(F("WIFI : STA got IP6 ")) + ip.toString());
|
||||
break;
|
||||
}
|
||||
case ARDUINO_EVENT_WIFI_AP_GOT_IP6:
|
||||
addLog(LOG_LEVEL_INFO, F("WIFI : AP got IP6"));
|
||||
break;
|
||||
#endif
|
||||
case ARDUINO_EVENT_WIFI_AP_STACONNECTED:
|
||||
#if ESP_IDF_VERSION_MAJOR > 3
|
||||
WiFiEventData.markConnectedAPmode(info.wifi_ap_staconnected.mac);
|
||||
|
||||
@@ -469,6 +469,10 @@ void AttemptWiFiConnect() {
|
||||
WiFiEventData.wifiConnectInProgress = true;
|
||||
const String key = WiFi_AP_CandidatesList::get_key(candidate.index);
|
||||
|
||||
#if ESP_IDF_VERSION_MAJOR>=5 && defined(LWIP_IPV6)
|
||||
WiFi.IPv6(true);
|
||||
#endif
|
||||
|
||||
if ((Settings.HiddenSSID_SlowConnectPerBSSID() || !candidate.isHidden)
|
||||
&& candidate.allowQuickConnect()) {
|
||||
WiFi.begin(candidate.ssid.c_str(), key.c_str(), candidate.channel, candidate.bssid.mac);
|
||||
|
||||
@@ -151,6 +151,10 @@ const __FlashStringHelper * getLabel(LabelType::Enum label) {
|
||||
case LabelType::WIFI_CONNECTION: return F("WiFi Connection");
|
||||
case LabelType::WIFI_RSSI: return F("RSSI");
|
||||
case LabelType::IP_CONFIG: return F("IP Config");
|
||||
#ifdef LWIP_IPV6
|
||||
case LabelType::IP6_LOCAL: return F("IPv6 link local");
|
||||
case LabelType::IP6_GLOBAL: return F("IPv6 global");
|
||||
#endif
|
||||
case LabelType::IP_CONFIG_STATIC: return F("Static");
|
||||
case LabelType::IP_CONFIG_DYNAMIC: return F("DHCP");
|
||||
case LabelType::IP_ADDRESS: return F("IP Address");
|
||||
@@ -427,6 +431,10 @@ String getValue(LabelType::Enum label) {
|
||||
case LabelType::IP_SUBNET: return formatIP(NetworkSubnetMask());
|
||||
case LabelType::IP_ADDRESS_SUBNET: return strformat(F("%s / %s"), getValue(LabelType::IP_ADDRESS).c_str(), getValue(LabelType::IP_SUBNET).c_str());
|
||||
case LabelType::GATEWAY: return formatIP(NetworkGatewayIP());
|
||||
#ifdef LWIP_IPV6
|
||||
case LabelType::IP6_LOCAL: return formatIP(NetworkLocalIP6());
|
||||
case LabelType::IP6_GLOBAL: return formatIP(NetworkGlobalIP6());
|
||||
#endif
|
||||
case LabelType::CLIENT_IP: return formatIP(web_server.client().remoteIP());
|
||||
#if FEATURE_INTERNAL_TEMPERATURE
|
||||
case LabelType::INTERNAL_TEMPERATURE: return toString(getInternalTemperature());
|
||||
|
||||
@@ -104,6 +104,12 @@ struct LabelType {
|
||||
IP_SUBNET, // 255.255.255.0
|
||||
IP_ADDRESS_SUBNET, // 192.168.1.123 / 255.255.255.0
|
||||
GATEWAY, // 192.168.1.1
|
||||
#ifdef LWIP_IPV6
|
||||
IP6_LOCAL,
|
||||
IP6_GLOBAL,
|
||||
// IP6_ADDRESS_CDIR,
|
||||
// IP6_GATEWAY,
|
||||
#endif
|
||||
CLIENT_IP, // 192.168.1.67
|
||||
#if FEATURE_MDNS
|
||||
M_DNS, // breadboard.local
|
||||
|
||||
@@ -235,6 +235,10 @@ void handle_json()
|
||||
#endif // if FEATURE_MDNS
|
||||
LabelType::IP_CONFIG,
|
||||
LabelType::IP_ADDRESS,
|
||||
#ifdef LWIP_IPV6
|
||||
LabelType::IP6_LOCAL,
|
||||
LabelType::IP6_GLOBAL,
|
||||
#endif
|
||||
LabelType::IP_SUBNET,
|
||||
LabelType::GATEWAY,
|
||||
LabelType::STA_MAC,
|
||||
|
||||
@@ -196,6 +196,10 @@ void handle_root() {
|
||||
if (!WiFiEventData.WiFiDisconnected())
|
||||
{
|
||||
addRowLabelValue(LabelType::IP_ADDRESS);
|
||||
#ifdef LWIP_IPV6
|
||||
addRowLabelValue(LabelType::IP6_LOCAL);
|
||||
addRowLabelValue(LabelType::IP6_GLOBAL);
|
||||
#endif
|
||||
addRowLabel(LabelType::WIFI_RSSI);
|
||||
addHtml(strformat(
|
||||
F("%d dBm (%s)"),
|
||||
@@ -208,6 +212,10 @@ void handle_root() {
|
||||
if (active_network_medium == NetworkMedium_t::Ethernet) {
|
||||
addRowLabelValue(LabelType::ETH_SPEED_STATE);
|
||||
addRowLabelValue(LabelType::ETH_IP_ADDRESS);
|
||||
#ifdef LWIP_IPV6
|
||||
addRowLabelValue(LabelType::IP6_LOCAL);
|
||||
addRowLabelValue(LabelType::IP6_GLOBAL);
|
||||
#endif
|
||||
}
|
||||
# endif // if FEATURE_ETHERNET
|
||||
|
||||
|
||||
@@ -120,6 +120,11 @@ void handle_sysinfo_json() {
|
||||
json_number(F("rssi"), String(WiFi.RSSI()));
|
||||
json_prop(F("dhcp"), useStaticIP() ? getLabel(LabelType::IP_CONFIG_STATIC) : getLabel(LabelType::IP_CONFIG_DYNAMIC));
|
||||
json_prop(F("ip"), getValue(LabelType::IP_ADDRESS));
|
||||
#ifdef LWIP_IPV6
|
||||
json_prop(F("ip6_local"), getValue(LabelType::IP6_LOCAL));
|
||||
json_prop(F("ip6_global"), getValue(LabelType::IP6_GLOBAL));
|
||||
#endif
|
||||
|
||||
json_prop(F("subnet"), getValue(LabelType::IP_SUBNET));
|
||||
json_prop(F("gw"), getValue(LabelType::GATEWAY));
|
||||
json_prop(F("dns1"), getValue(LabelType::DNS_1));
|
||||
@@ -428,6 +433,10 @@ void handle_sysinfo_Network() {
|
||||
# endif
|
||||
LabelType::IP_CONFIG,
|
||||
LabelType::IP_ADDRESS_SUBNET,
|
||||
#ifdef LWIP_IPV6
|
||||
LabelType::IP6_LOCAL,
|
||||
LabelType::IP6_GLOBAL,
|
||||
#endif
|
||||
LabelType::GATEWAY,
|
||||
LabelType::CLIENT_IP,
|
||||
LabelType::DNS,
|
||||
|
||||
Reference in New Issue
Block a user