diff --git a/src/system/zephyr/network.c b/src/system/zephyr/network.c index 6ce06f1..01c151f 100644 --- a/src/system/zephyr/network.c +++ b/src/system/zephyr/network.c @@ -396,6 +396,7 @@ void *_zn_listen_udp_multicast(void *arg, unsigned long tout, const z_str_t ifac { struct net_if_mcast_addr *mcast = NULL; mcast = net_if_ipv4_maddr_add(ifa, &((struct sockaddr_in *)raddr->ai_addr)->sin_addr); + // TODO: Do the same address lookup as in the IPV6 case below if (!mcast) goto _ZN_LISTEN_UDP_MULTICAST_ERROR_2; net_if_ipv4_maddr_join(mcast); @@ -403,9 +404,16 @@ void *_zn_listen_udp_multicast(void *arg, unsigned long tout, const z_str_t ifac else if (raddr->ai_family == AF_INET6) { struct net_if_mcast_addr *mcast = NULL; - mcast = net_if_ipv6_maddr_add(ifa, &((struct sockaddr_in6 *)raddr->ai_addr)->sin6_addr); + // We don't want to fail if the address already exists in the multicast group. + mcast = net_if_ipv6_maddr_lookup(&((struct sockaddr_in6 *)raddr->ai_addr)->sin6_addr, &ifa); if (!mcast) - goto _ZN_LISTEN_UDP_MULTICAST_ERROR_2; + { + mcast = net_if_ipv6_maddr_add(ifa, &((struct sockaddr_in6 *)raddr->ai_addr)->sin6_addr); + if (!mcast) + { + goto _ZN_LISTEN_UDP_MULTICAST_ERROR_2; + } + } net_if_ipv6_maddr_join(mcast); } else