2020#include <zephyr/net/socket_service.h>
2121#include <openthread/nat64.h>
2222#include "sockets_internal.h"
23+ #include <errno.h>
2324
2425#define MULTICAST_PORT 5353
2526#if defined(CONFIG_NET_IPV4 ) && defined(CONFIG_NET_IPV6 )
@@ -108,13 +109,14 @@ static otError mdns_socket_init_v6(uint32_t ail_iface_idx)
108109 struct net_ipv6_mreq mreq_v6 = {0 };
109110 int mcast_hops = 255 ;
110111 int on = 1 ;
112+ int mcast_join_ret = 0 ;
111113
112114 struct net_sockaddr_in6 addr = {.sin6_family = NET_AF_INET6 ,
113- .sin6_port = net_htons (MULTICAST_PORT ),
114- .sin6_addr = {{{0 }}},
115- .sin6_scope_id = 0 };
115+ .sin6_port = net_htons (MULTICAST_PORT ),
116+ .sin6_addr = {{{0 }}},
117+ .sin6_scope_id = 0 };
116118
117- mdns_sock_v6 = zsock_socket (NET_AF_INET6 , SOCK_DGRAM , IPPROTO_UDP );
119+ mdns_sock_v6 = zsock_socket (NET_AF_INET6 , NET_SOCK_DGRAM , NET_IPPROTO_UDP );
118120 VerifyOrExit (mdns_sock_v6 >= 0 , error = OT_ERROR_FAILED );
119121 VerifyOrExit (net_if_get_name (net_if_get_by_index (ail_iface_idx ), name ,
120122 CONFIG_NET_INTERFACE_NAME_LEN ) > 0 ,
@@ -134,8 +136,9 @@ static otError mdns_socket_init_v6(uint32_t ail_iface_idx)
134136 error = OT_ERROR_FAILED );
135137 mreq_v6 .ipv6mr_ifindex = ail_iface_idx ;
136138 net_ipv6_addr_create (& mreq_v6 .ipv6mr_multiaddr , 0xff02 , 0 , 0 , 0 , 0 , 0 , 0 , 0x00fb );
137- VerifyOrExit (zsock_setsockopt (mdns_sock_v6 , NET_IPPROTO_IPV6 , ZSOCK_IPV6_ADD_MEMBERSHIP ,
138- & mreq_v6 , sizeof (mreq_v6 )) == 0 ,
139+ mcast_join_ret = zsock_setsockopt (mdns_sock_v6 , NET_IPPROTO_IPV6 , ZSOCK_IPV6_ADD_MEMBERSHIP ,
140+ & mreq_v6 , sizeof (mreq_v6 ));
141+ VerifyOrExit (mcast_join_ret == 0 || (mcast_join_ret == -1 && errno == EALREADY ),
139142 error = OT_ERROR_FAILED );
140143 VerifyOrExit (zsock_setsockopt (mdns_sock_v6 , NET_IPPROTO_IPV6 , ZSOCK_IPV6_MULTICAST_LOOP ,
141144 & on , sizeof (on )) == 0 ,
@@ -172,10 +175,11 @@ static otError mdns_socket_init_v4(uint32_t ail_iface_idx)
172175 struct net_ip_mreqn mreq_v4 = {0 };
173176 int mcast_hops = 255 ;
174177 int on = 1 ;
178+ int mcast_join_ret = 0 ;
175179
176180 struct net_sockaddr_in addr = {.sin_family = NET_AF_INET ,
177- .sin_port = net_htons (MULTICAST_PORT ),
178- .sin_addr = {{{0 }}}};
181+ .sin_port = net_htons (MULTICAST_PORT ),
182+ .sin_addr = {{{0 }}}};
179183
180184 mdns_sock_v4 = zsock_socket (NET_AF_INET , NET_SOCK_DGRAM , NET_IPPROTO_UDP );
181185 VerifyOrExit (mdns_sock_v4 >= 0 , error = OT_ERROR_FAILED );
@@ -194,8 +198,9 @@ static otError mdns_socket_init_v4(uint32_t ail_iface_idx)
194198 error = OT_ERROR_FAILED );
195199 mreq_v4 .imr_ifindex = ail_iface_idx ;
196200 mreq_v4 .imr_multiaddr .s_addr = net_htonl (0xE00000FB );
197- VerifyOrExit (zsock_setsockopt (mdns_sock_v4 , NET_IPPROTO_IP , ZSOCK_IP_ADD_MEMBERSHIP ,
198- & mreq_v4 , sizeof (mreq_v4 )) == 0 ,
201+ mcast_join_ret = zsock_setsockopt (mdns_sock_v4 , NET_IPPROTO_IP , ZSOCK_IP_ADD_MEMBERSHIP ,
202+ & mreq_v4 , sizeof (mreq_v4 ));
203+ VerifyOrExit (mcast_join_ret == 0 || (mcast_join_ret == -1 && errno == EALREADY ),
199204 error = OT_ERROR_FAILED );
200205 VerifyOrExit (zsock_setsockopt (mdns_sock_v4 , NET_IPPROTO_IP , ZSOCK_IP_MULTICAST_LOOP ,
201206 & on , sizeof (on )) == 0 ,
@@ -241,6 +246,10 @@ static otError mdns_socket_deinit(void)
241246 sockfd_udp [1 ].fd = -1 ;
242247 mdns_sock_v4 = -1 ;
243248#endif /* CONFIG_NET_IPV4 */
249+
250+ VerifyOrExit (net_socket_service_register (& mdns_udp_service , sockfd_udp ,
251+ ARRAY_SIZE (sockfd_udp ), NULL ) == 0 ,
252+ error = OT_ERROR_FAILED );
244253exit :
245254 return error ;
246255}
@@ -250,13 +259,13 @@ static void mdns_send_multicast(otMessage *message, uint32_t ail_iface_idx)
250259 uint16_t length = otMessageGetLength (message );
251260 struct otbr_msg_ctx * req = NULL ;
252261 struct net_sockaddr_in6 addr_v6 = {.sin6_family = NET_AF_INET6 ,
253- .sin6_port = net_htons (MULTICAST_PORT ),
254- .sin6_addr = NET_IN6ADDR_ANY_INIT ,
255- .sin6_scope_id = 0 };
262+ .sin6_port = net_htons (MULTICAST_PORT ),
263+ .sin6_addr = NET_IN6ADDR_ANY_INIT ,
264+ .sin6_scope_id = 0 };
256265#if defined(CONFIG_NET_IPV4 )
257266 struct net_sockaddr_in addr_v4 = {.sin_family = NET_AF_INET ,
258- .sin_port = net_htons (MULTICAST_PORT ),
259- .sin_addr = NET_INADDR_ANY_INIT };
267+ .sin_port = net_htons (MULTICAST_PORT ),
268+ .sin_addr = NET_INADDR_ANY_INIT };
260269#endif /* CONFIG_NET_IPV4*/
261270
262271 VerifyOrExit (length <= OTBR_MESSAGE_SIZE );
@@ -271,11 +280,11 @@ static void mdns_send_multicast(otMessage *message, uint32_t ail_iface_idx)
271280
272281 VerifyOrExit (zsock_sendto (mdns_sock_v6 , req -> buffer , length , 0 ,
273282 (struct net_sockaddr * )& addr_v6 ,
274- sizeof (addr_v6 )) > 0 );
283+ sizeof (addr_v6 )) > 0 );
275284#if defined(CONFIG_NET_IPV4 )
276285 VerifyOrExit (zsock_sendto (mdns_sock_v4 , req -> buffer , length , 0 ,
277286 (struct net_sockaddr * )& addr_v4 ,
278- sizeof (addr_v4 )) > 0 );
287+ sizeof (addr_v4 )) > 0 );
279288#endif /* CONFIG_NET_IPV4 */
280289exit :
281290 otMessageFree (message );
@@ -294,9 +303,9 @@ static void mdns_send_unicast(otMessage *message, const otPlatMdnsAddressInfo *a
294303 struct net_sockaddr_in addr_v4 = {0 };
295304#endif /* CONFIG_NET_IPV4*/
296305 struct net_sockaddr_in6 addr_v6 = {.sin6_family = NET_AF_INET6 ,
297- .sin6_port = net_htons (aAddress -> mPort ),
298- .sin6_addr = NET_IN6ADDR_ANY_INIT ,
299- .sin6_scope_id = 0 };
306+ .sin6_port = net_htons (aAddress -> mPort ),
307+ .sin6_addr = NET_IN6ADDR_ANY_INIT ,
308+ .sin6_scope_id = 0 };
300309
301310 VerifyOrExit (length <= OTBR_MESSAGE_SIZE );
302311 VerifyOrExit (openthread_border_router_allocate_message ((void * * )& req ) == OT_ERROR_NONE );
@@ -314,7 +323,7 @@ static void mdns_send_unicast(otMessage *message, const otPlatMdnsAddressInfo *a
314323
315324 VerifyOrExit (zsock_sendto (mdns_sock_v6 , req -> buffer , length , 0 ,
316325 (struct net_sockaddr * )& addr_v6 ,
317- sizeof (addr_v6 )) > 0 );
326+ sizeof (addr_v6 )) > 0 );
318327#if defined(CONFIG_NET_IPV4 )
319328 if (send_ipv4 ) {
320329 VerifyOrExit (zsock_sendto (mdns_sock_v4 , req -> buffer , length , 0 ,
@@ -349,7 +358,7 @@ static void mdns_receive_handler(struct net_socket_service_event *evt)
349358 if (family == NET_AF_INET ) {
350359 addrlen = sizeof (addr_v4 );
351360 len = zsock_recvfrom (mdns_sock_v4 , req -> buffer , sizeof (req -> buffer ), 0 ,
352- (struct net_sockaddr * )& addr_v4 , & addrlen );
361+ (struct net_sockaddr * )& addr_v4 , & addrlen );
353362 VerifyOrExit (len > 0 );
354363 otIp4ToIp4MappedIp6Address ((otIp4Address * )& addr_v4 .sin_addr .s_addr ,
355364 & req -> addr_info .mAddress );
@@ -358,7 +367,7 @@ static void mdns_receive_handler(struct net_socket_service_event *evt)
358367#endif /* CONFIG_NET_IPV4 */
359368 addrlen = sizeof (addr_v6 );
360369 len = zsock_recvfrom (mdns_sock_v6 , req -> buffer , sizeof (req -> buffer ), 0 ,
361- (struct net_sockaddr * )& addr_v6 , & addrlen );
370+ (struct net_sockaddr * )& addr_v6 , & addrlen );
362371 VerifyOrExit (len > 0 );
363372 memcpy (& req -> addr_info .mAddress , & addr_v6 .sin6_addr ,
364373 sizeof (req -> addr_info .mAddress ));
0 commit comments