diff --git a/modules/openthread/platform/mdns_socket.c b/modules/openthread/platform/mdns_socket.c index 59e0c204315fd..71abb3150c3ba 100644 --- a/modules/openthread/platform/mdns_socket.c +++ b/modules/openthread/platform/mdns_socket.c @@ -35,6 +35,7 @@ static int mdns_sock_v4 = -1; #endif /* CONFIG_NET_IPV4 */ static struct otInstance *ot_instance_ptr; static uint32_t ail_iface_index; +static bool mdns_socket_is_enabled; static otError mdns_socket_init_v6(uint32_t ail_iface_idx); #if defined(CONFIG_NET_IPV4) @@ -87,10 +88,13 @@ static otError set_listening_enable(otInstance *instance, bool enable, uint32_t #if defined(CONFIG_NET_IPV4) SuccessOrExit(error = mdns_socket_init_v4(ail_iface_idx)); #endif /* CONFIG_NET_IPV4 */ + mdns_socket_is_enabled = true; + mdns_plat_monitor_interface(net_if_get_by_index(ail_iface_idx)); ExitNow(); } SuccessOrExit(error = mdns_socket_deinit()); + mdns_socket_is_enabled = false; exit: return error; @@ -389,6 +393,10 @@ void mdns_plat_monitor_interface(struct net_if *ail_iface) otIp6Address ip6_addr = {0}; struct net_if_addr *unicast = NULL; + VerifyOrExit(mdns_socket_is_enabled); + + net_if_lock(ail_iface); + otPlatMdnsHandleHostAddressRemoveAll(ot_instance_ptr, ail_iface_index); ipv6 = ail_iface->config.ip.ipv6; @@ -422,4 +430,8 @@ void mdns_plat_monitor_interface(struct net_if *ail_iface) ail_iface_index); } #endif /* CONFIG_NET_IPV4 && CONFIG_NET_IPV4_MAPPING_TO_IPV6 */ + + net_if_unlock(ail_iface); +exit: + return; } diff --git a/subsys/net/l2/openthread/openthread_border_router.c b/subsys/net/l2/openthread/openthread_border_router.c index dde38376ac5cd..8a21f0d35ca64 100644 --- a/subsys/net/l2/openthread/openthread_border_router.c +++ b/subsys/net/l2/openthread/openthread_border_router.c @@ -33,9 +33,9 @@ #include static struct net_mgmt_event_callback ail_net_event_connection_cb; -static struct net_mgmt_event_callback ail_net_event_address_cb; +static struct net_mgmt_event_callback ail_net_event_ipv6_addr_cb; #if defined(CONFIG_NET_IPV4) -static struct net_mgmt_event_callback ail_net_event_ipv4_addr_add_cb; +static struct net_mgmt_event_callback ail_net_event_ipv4_addr_cb; #endif /* CONFIG_NET_IPV4 */ static uint32_t ail_iface_index; static struct net_if *ail_iface_ptr; @@ -234,15 +234,14 @@ static void ail_connection_handler(struct net_mgmt_event_callback *cb, uint64_t mdns_plat_monitor_interface(iface); } -static void ail_address_event_handler(struct net_mgmt_event_callback *cb, uint64_t mgmt_event, +static void ail_ipv6_address_event_handler(struct net_mgmt_event_callback *cb, uint64_t mgmt_event, struct net_if *iface) { if (net_if_l2(iface) != &NET_L2_GET_NAME(ETHERNET)) { return; } - if ((mgmt_event & (NET_EVENT_IPV6_ADDR_ADD | NET_EVENT_IPV6_ADDR_DEL | - NET_EVENT_IPV4_ADDR_ADD | NET_EVENT_IPV4_ADDR_DEL)) != mgmt_event) { + if ((mgmt_event & (NET_EVENT_IPV6_ADDR_ADD | NET_EVENT_IPV6_ADDR_DEL)) != mgmt_event) { return; } @@ -257,13 +256,15 @@ static void ail_ipv4_address_event_handler(struct net_mgmt_event_callback *cb, u return; } - if (mgmt_event != NET_EVENT_IPV4_ADDR_ADD) { + if ((mgmt_event & (NET_EVENT_IPV4_ADDR_ADD | NET_EVENT_IPV4_ADDR_DEL)) != mgmt_event) { return; } - struct openthread_context *ot_context = openthread_get_default_context(); + if (mgmt_event == NET_EVENT_IPV4_ADDR_ADD) { + struct openthread_context *ot_context = openthread_get_default_context(); - openthread_start_border_router_services(ot_context->iface, iface); + openthread_start_border_router_services(ot_context->iface, iface); + } mdns_plat_monitor_interface(iface); } @@ -318,15 +319,14 @@ void openthread_border_router_init(struct openthread_context *ot_ctx) net_mgmt_init_event_callback(&ail_net_event_connection_cb, ail_connection_handler, NET_EVENT_IF_UP | NET_EVENT_IF_DOWN); net_mgmt_add_event_callback(&ail_net_event_connection_cb); - net_mgmt_init_event_callback(&ail_net_event_address_cb, ail_address_event_handler, - NET_EVENT_IPV6_ADDR_ADD | NET_EVENT_IPV6_ADDR_DEL | - NET_EVENT_IPV4_ADDR_ADD | NET_EVENT_IPV4_ADDR_DEL); - net_mgmt_add_event_callback(&ail_net_event_address_cb); + net_mgmt_init_event_callback(&ail_net_event_ipv6_addr_cb, ail_ipv6_address_event_handler, + NET_EVENT_IPV6_ADDR_ADD | NET_EVENT_IPV6_ADDR_DEL); + net_mgmt_add_event_callback(&ail_net_event_ipv6_addr_cb); #if defined(CONFIG_NET_IPV4) - net_mgmt_init_event_callback(&ail_net_event_ipv4_addr_add_cb, + net_mgmt_init_event_callback(&ail_net_event_ipv4_addr_cb, ail_ipv4_address_event_handler, NET_EVENT_IPV4_ADDR_ADD); - net_mgmt_add_event_callback(&ail_net_event_ipv4_addr_add_cb); + net_mgmt_add_event_callback(&ail_net_event_ipv4_addr_cb); #endif /* CONFIG_NET_IPV4 */ openthread_set_bbr_multicast_listener_cb(ot_bbr_multicast_listener_handler, (void *)ot_ctx); (void)infra_if_start_icmp6_listener();