Skip to content

Commit d955af4

Browse files
jukkaraescolar
authored andcommitted
net: dns: Join mDNS multicast group for resolving
If mDNS resolver is enabled but mDNS responder is not, then mDNS multicast address group is not joined. This would prevent the mDNS resolver to receive the responses. Fix this by joining the mDNS multicast group if mDNS responder is not enabled (because the responder will join the group itself). Fixes #86477 Signed-off-by: Jukka Rissanen <jukka.rissanen@nordicsemi.no>
1 parent 95fcf48 commit d955af4

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed

subsys/net/lib/dns/resolve.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ LOG_MODULE_REGISTER(net_dns_resolve, CONFIG_DNS_RESOLVER_LOG_LEVEL);
2525
#include <zephyr/net/net_ip.h>
2626
#include <zephyr/net/net_pkt.h>
2727
#include <zephyr/net/net_mgmt.h>
28+
#include <zephyr/net/igmp.h>
29+
#include <zephyr/net/mld.h>
2830
#include <zephyr/net/dns_resolve.h>
2931
#include <zephyr/net/socket_service.h>
3032
#include "../../ip/net_private.h"
@@ -148,6 +150,34 @@ static bool server_is_llmnr(sa_family_t family, struct sockaddr *addr)
148150
return false;
149151
}
150152

153+
static void join_ipv4_mcast_group(struct net_if *iface, void *user_data)
154+
{
155+
struct sockaddr *addr = user_data;
156+
int ret;
157+
158+
ret = net_ipv4_igmp_join(iface, &net_sin(addr)->sin_addr, NULL);
159+
if (ret < 0 && ret != -EALREADY) {
160+
NET_DBG("Cannot join %s mDNS group (%d)", "IPv4", ret);
161+
} else {
162+
NET_DBG("Joined %s mDNS group %s", "IPv4",
163+
net_sprint_ipv4_addr(&net_sin(addr)->sin_addr));
164+
}
165+
}
166+
167+
static void join_ipv6_mcast_group(struct net_if *iface, void *user_data)
168+
{
169+
struct sockaddr *addr = user_data;
170+
int ret;
171+
172+
ret = net_ipv6_mld_join(iface, &net_sin6(addr)->sin6_addr);
173+
if (ret < 0 && ret != -EALREADY) {
174+
NET_DBG("Cannot join %s mDNS group (%d)", "IPv6", ret);
175+
} else {
176+
NET_DBG("Joined %s mDNS group %s", "IPv6",
177+
net_sprint_ipv6_addr(&net_sin6(addr)->sin6_addr));
178+
}
179+
}
180+
151181
static void dns_postprocess_server(struct dns_resolve_context *ctx, int idx)
152182
{
153183
struct sockaddr *addr = &ctx->servers[idx].dns_server;
@@ -180,6 +210,26 @@ static void dns_postprocess_server(struct dns_resolve_context *ctx, int idx)
180210
net_sin(addr)->sin_port = htons(53);
181211
}
182212
}
213+
214+
/* Join the mDNS multicast group if responder is not enabled,
215+
* because it will join the group itself.
216+
*/
217+
if (!IS_ENABLED(CONFIG_MDNS_RESPONDER) && ctx->servers[idx].is_mdns) {
218+
struct in_addr mcast_addr = { { { 224, 0, 0, 251 } } };
219+
220+
if (net_sin(addr)->sin_addr.s_addr == mcast_addr.s_addr) {
221+
struct net_if *iface;
222+
223+
iface = net_if_get_by_index(ctx->servers[idx].if_index);
224+
if (iface == NULL) {
225+
/* Join all interfaces */
226+
net_if_foreach(join_ipv4_mcast_group, addr);
227+
} else {
228+
/* Join specific interface */
229+
join_ipv4_mcast_group(iface, addr);
230+
}
231+
}
232+
}
183233
} else {
184234
ctx->servers[idx].is_mdns = server_is_mdns(AF_INET6, addr);
185235
if (!ctx->servers[idx].is_mdns) {
@@ -198,6 +248,25 @@ static void dns_postprocess_server(struct dns_resolve_context *ctx, int idx)
198248
net_sin6(addr)->sin6_port = htons(53);
199249
}
200250
}
251+
252+
if (!IS_ENABLED(CONFIG_MDNS_RESPONDER) && ctx->servers[idx].is_mdns) {
253+
struct in6_addr mcast_addr = { { { 0xff, 0x02, 0, 0, 0, 0, 0, 0,
254+
0, 0, 0, 0, 0, 0, 0, 0xfb } } };
255+
256+
if (memcmp(&net_sin6(addr)->sin6_addr, &mcast_addr,
257+
sizeof(struct in6_addr)) == 0) {
258+
struct net_if *iface;
259+
260+
iface = net_if_get_by_index(ctx->servers[idx].if_index);
261+
if (iface == NULL) {
262+
/* Join all interfaces */
263+
net_if_foreach(join_ipv6_mcast_group, addr);
264+
} else {
265+
/* Join specific interface */
266+
join_ipv6_mcast_group(iface, addr);
267+
}
268+
}
269+
}
201270
}
202271
}
203272

0 commit comments

Comments
 (0)