Merge branch 'fix/netif_igmp_cb' into 'master'

[esp_netif]: Fix calling IGMP callbacks after igmp_init()

Closes IDF-13554

See merge request espressif/esp-idf!42310
This commit is contained in:
David Čermák
2025-10-23 13:53:51 +08:00
+28 -2
View File
@@ -24,6 +24,10 @@
#include "lwip/dhcp.h"
#include "lwip/ip_addr.h"
#include "lwip/ip6_addr.h"
#include "lwip/ip4_addr.h"
#if LWIP_IPV4 && LWIP_IGMP
#include "lwip/igmp.h"
#endif
#include "lwip/mld6.h"
#include "lwip/prot/mld6.h"
#include "lwip/nd6.h"
@@ -626,7 +630,9 @@ static err_t netif_igmp_mac_filter_cb(struct netif *netif, const ip4_addr_t *gro
// internal pointer hasn't been configured yet (probably in the interface init_fn())
return ERR_VAL;
}
ESP_LOGD(TAG, "Multicast add filter IPv4: " IPSTR, IP2STR(group));
ESP_LOGD(TAG, "Multicast %s filter IPv4: " IPSTR,
(action == NETIF_ADD_MAC_FILTER) ? "add" : "remove",
IP2STR(group));
uint8_t mac[NETIF_MAX_HWADDR_LEN];
mac[0] = 0x01;
mac[1] = 0x00;
@@ -652,7 +658,9 @@ static err_t netif_mld_mac_filter_cb(struct netif *netif, const ip6_addr_t *grou
// internal pointer hasn't been configured yet (probably in the interface init_fn())
return ERR_VAL;
}
ESP_LOGD(TAG, "Multicast add filter IPv6: " IPV6STR, IPV62STR(*group));
ESP_LOGD(TAG, "Multicast %s filter IPv6: " IPV6STR,
(action == NETIF_ADD_MAC_FILTER) ? "add" : "remove",
IPV62STR(*group));
uint8_t mac[NETIF_MAX_HWADDR_LEN];
mac[0] = 0x33;
mac[1] = 0x33;
@@ -1004,9 +1012,27 @@ static esp_err_t esp_netif_lwip_add(esp_netif_t *esp_netif)
if (esp_netif->driver_set_mac_filter) {
#if LWIP_IPV4 && LWIP_IGMP
netif_set_igmp_mac_filter(esp_netif->lwip_netif, netif_igmp_mac_filter_cb);
/* Align L2 multicast filters with current IGMP groups, since igmp_start()
* was called before the callback was registered. */
if (esp_netif->lwip_netif && (esp_netif->lwip_netif->flags & NETIF_FLAG_IGMP)) {
struct igmp_group *group = netif_igmp_data(esp_netif->lwip_netif);
while (group) {
netif_igmp_mac_filter_cb(esp_netif->lwip_netif, &group->group_address, NETIF_ADD_MAC_FILTER);
group = group->next;
}
}
#endif
#if LWIP_IPV6 && LWIP_IPV6_MLD
netif_set_mld_mac_filter(esp_netif->lwip_netif, netif_mld_mac_filter_cb);
/* Align L2 multicast filters with current MLD groups, since mld6 processing
* may have started before the callback was registered. */
if (esp_netif->lwip_netif && (esp_netif->lwip_netif->flags & NETIF_FLAG_MLD6)) {
struct mld_group *group = netif_mld6_data(esp_netif->lwip_netif);
while (group) {
netif_mld_mac_filter_cb(esp_netif->lwip_netif, &group->group_address, NETIF_ADD_MAC_FILTER);
group = group->next;
}
}
#endif
}
lwip_set_esp_netif(esp_netif->lwip_netif, esp_netif);