]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_zebra.c
Revert "pimd: Modifying members of pim_interface to accommodate IPv6 changes"
[mirror_frr.git] / pimd / pim_zebra.c
index aa041df85736ed99e19561837e7ac2f67e103876..3a08c6aee5b2e3945a442aead6c7d91172ceee53 100644 (file)
@@ -164,7 +164,7 @@ static int pim_zebra_if_address_add(ZAPI_CALLBACK_ARGS)
        }
 
        if (if_is_loopback(c->ifp)) {
-               struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
+               struct vrf *vrf = vrf_lookup_by_id(vrf_id);
                struct interface *ifp;
 
                FOR_ALL_INTERFACES (vrf, ifp) {
@@ -439,23 +439,29 @@ static void pim_zebra_capabilities(struct zclient_capabilities *cap)
        router->mlag_role = cap->role;
 }
 
+static zclient_handler *const pim_handlers[] = {
+       [ZEBRA_ROUTER_ID_UPDATE] = pim_router_id_update_zebra,
+       [ZEBRA_INTERFACE_ADDRESS_ADD] = pim_zebra_if_address_add,
+       [ZEBRA_INTERFACE_ADDRESS_DELETE] = pim_zebra_if_address_del,
+       [ZEBRA_INTERFACE_VRF_UPDATE] = pim_zebra_interface_vrf_update,
+       [ZEBRA_NEXTHOP_UPDATE] = pim_parse_nexthop_update,
+
+       [ZEBRA_VXLAN_SG_ADD] = pim_zebra_vxlan_sg_proc,
+       [ZEBRA_VXLAN_SG_DEL] = pim_zebra_vxlan_sg_proc,
+
+       [ZEBRA_MLAG_PROCESS_UP] = pim_zebra_mlag_process_up,
+       [ZEBRA_MLAG_PROCESS_DOWN] = pim_zebra_mlag_process_down,
+       [ZEBRA_MLAG_FORWARD_MSG] = pim_zebra_mlag_handle_msg,
+};
+
 void pim_zebra_init(void)
 {
        /* Socket for receiving updates from Zebra daemon */
-       zclient = zclient_new(router->master, &zclient_options_default);
+       zclient = zclient_new(router->master, &zclient_options_default,
+                             pim_handlers, array_size(pim_handlers));
 
        zclient->zebra_capabilities = pim_zebra_capabilities;
        zclient->zebra_connected = pim_zebra_connected;
-       zclient->router_id_update = pim_router_id_update_zebra;
-       zclient->interface_address_add = pim_zebra_if_address_add;
-       zclient->interface_address_delete = pim_zebra_if_address_del;
-       zclient->interface_vrf_update = pim_zebra_interface_vrf_update;
-       zclient->nexthop_update = pim_parse_nexthop_update;
-       zclient->vxlan_sg_add = pim_zebra_vxlan_sg_proc;
-       zclient->vxlan_sg_del = pim_zebra_vxlan_sg_proc;
-       zclient->mlag_process_up = pim_zebra_mlag_process_up;
-       zclient->mlag_process_down = pim_zebra_mlag_process_down;
-       zclient->mlag_handle_msg = pim_zebra_mlag_handle_msg;
 
        zclient_init(zclient, ZEBRA_ROUTE_PIM, 0, &pimd_privs);
        if (PIM_DEBUG_PIM_TRACE) {
@@ -542,6 +548,7 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
                struct pim_interface *pim_ifp = ifp->info;
                struct listnode *grpnode;
                struct igmp_group *grp;
+               struct pim_ifchannel *ch, *ch_temp;
 
                if (!pim_ifp)
                        continue;
@@ -556,9 +563,17 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim)
                        for (ALL_LIST_ELEMENTS_RO(grp->group_source_list,
                                                  srcnode, src)) {
                                igmp_source_forward_reevaluate_one(pim, src);
-                       }         /* scan group sources */
-               }                 /* scan igmp groups */
-       }                         /* scan interfaces */
+                       } /* scan group sources */
+               }        /* scan igmp groups */
+
+               RB_FOREACH_SAFE (ch, pim_ifchannel_rb, &pim_ifp->ifchannel_rb,
+                                ch_temp) {
+                       if (pim_is_grp_ssm(pim, ch->sg.grp)) {
+                               if (ch->sg.src.s_addr == INADDR_ANY)
+                                       pim_ifchannel_delete(ch);
+                       }
+               }
+       } /* scan interfaces */
 }
 
 void igmp_source_forward_start(struct pim_instance *pim,
@@ -830,14 +845,14 @@ void pim_forward_start(struct pim_ifchannel *ch)
                        mask, __func__);
 }
 
-void pim_forward_stop(struct pim_ifchannel *ch, bool install_it)
+void pim_forward_stop(struct pim_ifchannel *ch)
 {
        struct pim_upstream *up = ch->upstream;
 
        if (PIM_DEBUG_PIM_TRACE) {
-               zlog_debug("%s: (S,G)=%s oif=%s install_it: %d installed: %d",
+               zlog_debug("%s: (S,G)=%s oif=%s installed: %d",
                           __func__, ch->sg_str, ch->interface->name,
-                          install_it, up->channel_oil->installed);
+                          up->channel_oil->installed);
        }
 
        /*
@@ -850,9 +865,6 @@ void pim_forward_stop(struct pim_ifchannel *ch, bool install_it)
        else
                pim_channel_del_oif(up->channel_oil, ch->interface,
                                    PIM_OIF_FLAG_PROTO_PIM, __func__);
-
-       if (install_it && !up->channel_oil->installed)
-               pim_upstream_mroute_add(up->channel_oil, __func__);
 }
 
 void pim_zebra_zclient_update(struct vty *vty)