@@ -25,6 +25,8 @@ LOG_MODULE_REGISTER(net_dns_resolve, CONFIG_DNS_RESOLVER_LOG_LEVEL);
25
25
#include <zephyr/net/net_ip.h>
26
26
#include <zephyr/net/net_pkt.h>
27
27
#include <zephyr/net/net_mgmt.h>
28
+ #include <zephyr/net/igmp.h>
29
+ #include <zephyr/net/mld.h>
28
30
#include <zephyr/net/dns_resolve.h>
29
31
#include <zephyr/net/socket_service.h>
30
32
#include "../../ip/net_private.h"
@@ -148,6 +150,34 @@ static bool server_is_llmnr(sa_family_t family, struct sockaddr *addr)
148
150
return false;
149
151
}
150
152
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
+
151
181
static void dns_postprocess_server (struct dns_resolve_context * ctx , int idx )
152
182
{
153
183
struct sockaddr * addr = & ctx -> servers [idx ].dns_server ;
@@ -180,6 +210,26 @@ static void dns_postprocess_server(struct dns_resolve_context *ctx, int idx)
180
210
net_sin (addr )-> sin_port = htons (53 );
181
211
}
182
212
}
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
+ }
183
233
} else {
184
234
ctx -> servers [idx ].is_mdns = server_is_mdns (AF_INET6 , addr );
185
235
if (!ctx -> servers [idx ].is_mdns ) {
@@ -198,6 +248,25 @@ static void dns_postprocess_server(struct dns_resolve_context *ctx, int idx)
198
248
net_sin6 (addr )-> sin6_port = htons (53 );
199
249
}
200
250
}
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
+ }
201
270
}
202
271
}
203
272
0 commit comments