From 44c3a5f0c2b275e10e4ec53e6b7e6d0a03367e13 Mon Sep 17 00:00:00 2001 From: zwx Date: Fri, 4 Sep 2026 17:12:57 +0800 Subject: [PATCH 1/3] fix(esp_netif): add all-nodes multicast filter --- components/esp_netif/lwip/esp_netif_lwip.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index eef0d47d919..d382e71b7c3 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -655,6 +655,13 @@ static err_t netif_mld_mac_filter_cb(struct netif *netif, const ip6_addr_t *grou } return ERR_OK; } + +static void netif_mld_mac_filter_all_nodes(struct netif *netif, enum netif_mac_filter_action action) +{ + ip6_addr_t all_nodes; + ip6_addr_set_allnodes_linklocal(&all_nodes); + netif_mld_mac_filter_cb(netif, &all_nodes, action); +} #endif /* LWIP_IPV6 && LWIP_IPV6_MLD */ static esp_err_t esp_netif_init_configuration(esp_netif_t *esp_netif, const esp_netif_config_t *cfg) @@ -917,6 +924,11 @@ static void esp_netif_lwip_remove(esp_netif_t *esp_netif) if (netif_is_up(esp_netif->lwip_netif)) { netif_set_down(esp_netif->lwip_netif); } +#if LWIP_IPV6 && LWIP_IPV6_MLD + if (esp_netif->driver_set_mac_filter) { + netif_mld_mac_filter_all_nodes(esp_netif->lwip_netif, NETIF_DEL_MAC_FILTER); + } +#endif netif_remove(esp_netif->lwip_netif); #if ESP_GRATUITOUS_ARP if (esp_netif->flags & ESP_NETIF_FLAG_GARP) { @@ -995,6 +1007,8 @@ static esp_err_t esp_netif_lwip_add(esp_netif_t *esp_netif) #endif #if LWIP_IPV6 && LWIP_IPV6_MLD netif_set_mld_mac_filter(esp_netif->lwip_netif, netif_mld_mac_filter_cb); + /* ff02::1 is implicitly joined and therefore absent from the MLD group list. */ + netif_mld_mac_filter_all_nodes(esp_netif->lwip_netif, NETIF_ADD_MAC_FILTER); #endif } lwip_set_esp_netif(esp_netif->lwip_netif, esp_netif); From a9dc945ec0076c4f1e988f37645f8b300376ced0 Mon Sep 17 00:00:00 2001 From: Ondrej Kosta Date: Mon, 7 Sep 2026 15:58:31 +0200 Subject: [PATCH 2/3] fix(esp_netif): fixed order of deinit in L2TAP test --- .../test_apps/test_app_vfs_l2tap/main/test_vfs_l2tap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/esp_netif/test_apps/test_app_vfs_l2tap/main/test_vfs_l2tap.c b/components/esp_netif/test_apps/test_app_vfs_l2tap/main/test_vfs_l2tap.c index 10217cf813d..69783927002 100644 --- a/components/esp_netif/test_apps/test_app_vfs_l2tap/main/test_vfs_l2tap.c +++ b/components/esp_netif/test_apps/test_app_vfs_l2tap/main/test_vfs_l2tap.c @@ -228,12 +228,12 @@ static void ethernet_deinit(test_vfs_eth_network_t *network_hndls) { TEST_ESP_OK(esp_eth_stop(network_hndls->eth_handle)); TEST_ESP_OK(esp_eth_del_netif_glue(network_hndls->glue)); + TEST_ESP_OK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler)); + esp_netif_destroy(network_hndls->eth_netif); esp_eth_driver_uninstall(network_hndls->eth_handle); TEST_ESP_OK(network_hndls->phy->del(network_hndls->phy)); TEST_ESP_OK(network_hndls->mac->del(network_hndls->mac)); - TEST_ESP_OK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_ETH_GOT_IP, got_ip_event_handler)); TEST_ESP_OK(esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, eth_event_handler)); - esp_netif_destroy(network_hndls->eth_netif); TEST_ESP_OK(esp_event_loop_delete_default()); } From 9bfaa285b67d86997c5ad6080d872f96c381ba63 Mon Sep 17 00:00:00 2001 From: zwx Date: Tue, 8 Sep 2026 17:06:16 +0800 Subject: [PATCH 3/3] fix(esp_netif): avoid duplicate all-nodes multicast filter removal --- components/esp_netif/lwip/esp_netif_lwip.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/esp_netif/lwip/esp_netif_lwip.c b/components/esp_netif/lwip/esp_netif_lwip.c index d382e71b7c3..11956d9b3fb 100644 --- a/components/esp_netif/lwip/esp_netif_lwip.c +++ b/components/esp_netif/lwip/esp_netif_lwip.c @@ -925,11 +925,14 @@ static void esp_netif_lwip_remove(esp_netif_t *esp_netif) netif_set_down(esp_netif->lwip_netif); } #if LWIP_IPV6 && LWIP_IPV6_MLD - if (esp_netif->driver_set_mac_filter) { + if (esp_netif->driver_set_mac_filter && esp_netif->lwip_netif->mld_mac_filter) { netif_mld_mac_filter_all_nodes(esp_netif->lwip_netif, NETIF_DEL_MAC_FILTER); } #endif netif_remove(esp_netif->lwip_netif); +#if LWIP_IPV6 && LWIP_IPV6_MLD + netif_set_mld_mac_filter(esp_netif->lwip_netif, NULL); +#endif #if ESP_GRATUITOUS_ARP if (esp_netif->flags & ESP_NETIF_FLAG_GARP) { netif_unset_garp_flag(esp_netif->lwip_netif);