Page 1 of 1
How to set a static global IPV6 address using esp-idf 5.2.1
Posted: Mon May 20, 2024 8:06 pm
by kiwironnie
Hi All
The latest ESP FAQ Handbook says: "If it is a global static IP, both IPv6 and IPv4 support manual configuration"
However I've not been able to discover how to successfully achieve this, particularly to establish a WiFi connection with an ESP32 board.
Rather than static the preference is actually to retrieve a global IPv6 address via dhcp6 (via an Ubuntu 22.04 dnsmasq server, served up according to the client's MAC address using the normal dhcp-host method) but it doesn't look like this is possible right now.
Help would be very much appreciated, either a suitable manual reference(s) or example code. Cheers Ron.
Re: How to set a static global IPV6 address using esp-idf 5.2.1
Posted: Wed May 22, 2024 3:27 am
by kiwironnie
Partly answering myself. To enable SLAAC global addresses it is necessary to set a kconfig setting using menuconfig as described here:
https://github.com/espressif/arduino-esp32/issues/6626
"On current ESP-IDF version, I can configure sample projects to receive IPv6 either via SLAAC or DCHP6 via idf.py menuconfig -> Component config ---> LWIP ---> Enable IPV6 stateless address autoconfiguration (SLAAC)"
Re: How to set a static global IPV6 address using esp-idf 5.2.1
Posted: Mon Jun 24, 2024 7:04 am
by kiwironnie
Responding again in case it helps other.
Eventually I did manage to find an obscure reference (not in the latest esp-idf manual) that enables a static IPV6 address to be configured. The code for the relevant wifi setup function in my code is provided here:
// Static IPv6 configuration
#define STATIC_IPV6_ADDR "2001:470:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX"
void wifi_init_sta() {
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_netif_init());
// Initialize the event loop
ESP_ERROR_CHECK(esp_event_loop_create_default());
sta_netif = esp_netif_create_default_wifi_sta();
esp_netif_set_hostname(sta_netif, hostname);
esp_netif_dhcpc_stop(sta_netif); // Disable DHCP client for IPv4
if (!sta_netif) {
ESP_LOGE(TAG, "Failed to create default WiFi station interface");
return;
}
ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &wifi_event_handler, NULL));
// Register handler for IPv6 events
ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_GOT_IP6, &wifi_event_handler, NULL));
wifi_config_t wifi_config = {
.sta = {
.ssid = SSID,
.password = PASSWORD,
},
};
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_start());
// Configure static IPV6 address
esp_netif_ip6_info_t ip6_addr = { 0 };
ip6addr_aton(STATIC_IPV6_ADDR, (ip6_addr_t *)&ip6_addr.ip);
struct netif *lwip_netif = esp_netif_get_netif_impl(sta_netif);
ESP_ERROR_CHECK(netif_add_ip6_address(lwip_netif, (ip6_addr_t *)&ip6_addr.ip, 0));
// ESP_ERROR_CHECK(esp_netif_set_dns_info(sta_netif), ESP_NETIF_DNS_MAIN, &dns_info));
}
Cheers
Ron
Re: How to set a static global IPV6 address using esp-idf 5.2.1
Posted: Sat Jul 27, 2024 8:08 am
by eriksl
The way HOW you set a static ipv6 address is properly documented. What's not documented is how you should set netmask and gateway.
DHCPv6 is not supported, this also documented. Best use SLAAC then.