@@ -601,76 +601,84 @@ static esp_err_t joinMulticastGroup(const ip_addr_t *addr, bool join, tcpip_adap
601601 return ESP_ERR_INVALID_ARG;
602602 }
603603 netif = (struct netif *)nif;
604+ UDP_MUTEX_LOCK ();
604605
605606#if CONFIG_LWIP_IPV6
606607 if (addr->type == IPADDR_TYPE_V4) {
607608 if (join) {
608609 if (igmp_joingroup_netif (netif, (const ip4_addr *)&(addr->u_addr .ip4 ))) {
609- return ESP_ERR_INVALID_STATE ;
610+ goto igmp_fail ;
610611 }
611612 } else {
612613 if (igmp_leavegroup_netif (netif, (const ip4_addr *)&(addr->u_addr .ip4 ))) {
613- return ESP_ERR_INVALID_STATE ;
614+ goto igmp_fail ;
614615 }
615616 }
616617 } else {
617618 if (join) {
618619 if (mld6_joingroup_netif (netif, &(addr->u_addr .ip6 ))) {
619- return ESP_ERR_INVALID_STATE ;
620+ goto igmp_fail ;
620621 }
621622 } else {
622623 if (mld6_leavegroup_netif (netif, &(addr->u_addr .ip6 ))) {
623- return ESP_ERR_INVALID_STATE ;
624+ goto igmp_fail ;
624625 }
625626 }
626627 }
627628#else
628629 if (join) {
629630 if (igmp_joingroup_netif (netif, (const ip4_addr *)(addr))) {
630- return ESP_ERR_INVALID_STATE ;
631+ goto igmp_fail ;
631632 }
632633 } else {
633634 if (igmp_leavegroup_netif (netif, (const ip4_addr *)(addr))) {
634- return ESP_ERR_INVALID_STATE ;
635+ goto igmp_fail ;
635636 }
636637 }
637638#endif
639+ UDP_MUTEX_UNLOCK ();
638640 } else {
641+ UDP_MUTEX_LOCK ();
639642#if CONFIG_LWIP_IPV6
640643 if (addr->type == IPADDR_TYPE_V4) {
641644 if (join) {
642645 if (igmp_joingroup ((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)&(addr->u_addr .ip4 ))) {
643- return ESP_ERR_INVALID_STATE ;
646+ goto igmp_fail ;
644647 }
645648 } else {
646649 if (igmp_leavegroup ((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)&(addr->u_addr .ip4 ))) {
647- return ESP_ERR_INVALID_STATE ;
650+ goto igmp_fail ;
648651 }
649652 }
650653 } else {
651654 if (join) {
652655 if (mld6_joingroup ((const ip6_addr *)IP6_ADDR_ANY, &(addr->u_addr .ip6 ))) {
653- return ESP_ERR_INVALID_STATE ;
656+ goto igmp_fail ;
654657 }
655658 } else {
656659 if (mld6_leavegroup ((const ip6_addr *)IP6_ADDR_ANY, &(addr->u_addr .ip6 ))) {
657- return ESP_ERR_INVALID_STATE ;
660+ goto igmp_fail ;
658661 }
659662 }
660663 }
661664#else
662665 if (join) {
663666 if (igmp_joingroup ((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)(addr))) {
664- return ESP_ERR_INVALID_STATE ;
667+ goto igmp_fail ;
665668 }
666669 } else {
667670 if (igmp_leavegroup ((const ip4_addr *)IP4_ADDR_ANY, (const ip4_addr *)(addr))) {
668- return ESP_ERR_INVALID_STATE ;
671+ goto igmp_fail ;
669672 }
670673 }
671674#endif
675+ UDP_MUTEX_UNLOCK ();
672676 }
673677 return ESP_OK;
678+
679+ igmp_fail:
680+ UDP_MUTEX_UNLOCK ();
681+ return ESP_ERR_INVALID_STATE;
674682}
675683
676684bool AsyncUDP::listenMulticast (const ip_addr_t *addr, uint16_t port, uint8_t ttl, tcpip_adapter_if_t tcpip_if) {
0 commit comments