diff --git a/pimd/pim6_mld.c b/pimd/pim6_mld.c index 20ef9216a9c9..ecfe2c85a060 100644 --- a/pimd/pim6_mld.c +++ b/pimd/pim6_mld.c @@ -2151,6 +2151,15 @@ static void gm_start(struct interface *ifp) } } +void pim_gm_if_reset(struct interface *ifp) +{ + struct pim_interface *pim_ifp = ifp->info; + struct gm_if *gm_ifp = pim_ifp->mld; + + if (gm_ifp) + gm_group_delete(gm_ifp); +} + void gm_group_delete(struct gm_if *gm_ifp) { struct gm_sg *sg; diff --git a/pimd/pim6_mld.h b/pimd/pim6_mld.h index 183ab2fc508d..f8d7dafece93 100644 --- a/pimd/pim6_mld.h +++ b/pimd/pim6_mld.h @@ -357,6 +357,7 @@ struct gm_if { #if PIM_IPV == 6 extern void gm_ifp_update(struct interface *ifp); extern void gm_ifp_teardown(struct interface *ifp); +extern void pim_gm_if_reset(struct interface *ifp); extern void gm_group_delete(struct gm_if *gm_ifp); #else static inline void gm_ifp_update(struct interface *ifp) diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index e00a3c0f9865..4d4c2b64c40a 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -201,7 +201,7 @@ void pim_if_delete(struct interface *ifp) pim_if_del_vif(ifp); - pim_igmp_if_fini(pim_ifp); + pim_igmp_if_fini(ifp); list_delete(&pim_ifp->pim_neighbor_list); list_delete(&pim_ifp->upstream_switch_list); @@ -1808,6 +1808,9 @@ void pim_pim_interface_delete(struct interface *ifp) pim_sock_delete(ifp, "pim unconfigured on interface"); pim_upstream_nh_if_update(pim_ifp->pim, ifp); + if (pim_ifp->gm_enable) + pim_gm_if_reset(ifp); + if (!pim_ifp->gm_enable) { pim_if_addr_del_all(ifp); pim_if_delete(ifp); diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index da5518994193..0d6625e5b03b 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -1232,8 +1232,6 @@ void pim_ifchannel_local_membership_del(struct interface *ifp, pim_sgaddr *sg) pim_ifp = ifp->info; if (!pim_ifp) return; - if (!pim_ifp->pim_enable) - return; orig = ch = pim_ifchannel_find(ifp, sg); if (!ch) diff --git a/pimd/pim_igmp.c b/pimd/pim_igmp.c index 063ba6edd275..cb46fc0eebc3 100644 --- a/pimd/pim_igmp.c +++ b/pimd/pim_igmp.c @@ -1074,10 +1074,12 @@ void igmp_sock_free(struct gm_sock *igmp) void igmp_sock_delete(struct gm_sock *igmp) { + struct interface *ifp; struct pim_interface *pim_ifp; sock_close(igmp); + ifp = igmp->interface; pim_ifp = igmp->interface->info; listnode_delete(pim_ifp->gm_socket_list, igmp); @@ -1085,7 +1087,7 @@ void igmp_sock_delete(struct gm_sock *igmp) igmp_sock_free(igmp); if (!listcount(pim_ifp->gm_socket_list)) - pim_igmp_if_reset(pim_ifp); + pim_gm_if_reset(ifp); } void igmp_sock_delete_all(struct interface *ifp) @@ -1135,8 +1137,9 @@ void pim_igmp_if_init(struct pim_interface *pim_ifp, struct interface *ifp) igmp_group_hash_equal, hash_name); } -void pim_igmp_if_reset(struct pim_interface *pim_ifp) +void pim_gm_if_reset(struct interface *ifp) { + struct pim_interface *pim_ifp = ifp->info; struct listnode *grp_node, *grp_nextnode; struct gm_group *grp; @@ -1146,9 +1149,11 @@ void pim_igmp_if_reset(struct pim_interface *pim_ifp) } } -void pim_igmp_if_fini(struct pim_interface *pim_ifp) +void pim_igmp_if_fini(struct interface *ifp) { - pim_igmp_if_reset(pim_ifp); + struct pim_interface *pim_ifp = ifp->info; + + pim_gm_if_reset(ifp); assert(pim_ifp->gm_group_list); assert(!listcount(pim_ifp->gm_group_list)); diff --git a/pimd/pim_igmp.h b/pimd/pim_igmp.h index a1f19b3c6e1c..2bf7f9cc7449 100644 --- a/pimd/pim_igmp.h +++ b/pimd/pim_igmp.h @@ -82,8 +82,8 @@ struct pim_interface; #if PIM_IPV == 4 void pim_igmp_if_init(struct pim_interface *pim_ifp, struct interface *ifp); -void pim_igmp_if_reset(struct pim_interface *pim_ifp); -void pim_igmp_if_fini(struct pim_interface *pim_ifp); +void pim_gm_if_reset(struct interface *ifp); +void pim_igmp_if_fini(struct interface *ifp); struct gm_sock *pim_igmp_sock_lookup_ifaddr(struct list *igmp_sock_list, struct in_addr ifaddr); @@ -108,7 +108,7 @@ static inline void pim_igmp_if_init(struct pim_interface *pim_ifp, { } -static inline void pim_igmp_if_fini(struct pim_interface *pim_ifp) +static inline void pim_igmp_if_fini(struct interface *ifp) { }