diff options
Diffstat (limited to 'pimd/pim_zebra.c')
| -rw-r--r-- | pimd/pim_zebra.c | 78 |
1 files changed, 45 insertions, 33 deletions
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index aa041df857..5708c35751 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -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) { @@ -466,9 +472,9 @@ void pim_zebra_init(void) } void igmp_anysource_forward_start(struct pim_instance *pim, - struct igmp_group *group) + struct gm_group *group) { - struct igmp_source *source; + struct gm_source *source; struct in_addr src_addr = {.s_addr = 0}; /* Any source (*,G) is forwarded only if mode is EXCLUDE {empty} */ assert(group->group_filtermode_isexcl); @@ -483,9 +489,9 @@ void igmp_anysource_forward_start(struct pim_instance *pim, igmp_source_forward_start(pim, source); } -void igmp_anysource_forward_stop(struct igmp_group *group) +void igmp_anysource_forward_stop(struct gm_group *group) { - struct igmp_source *source; + struct gm_source *source; struct in_addr star = {.s_addr = 0}; source = igmp_find_source_by_addr(group, star); @@ -494,10 +500,10 @@ void igmp_anysource_forward_stop(struct igmp_group *group) } static void igmp_source_forward_reevaluate_one(struct pim_instance *pim, - struct igmp_source *source) + struct gm_source *source) { struct prefix_sg sg; - struct igmp_group *group = source->source_group; + struct gm_group *group = source->source_group; struct pim_ifchannel *ch; if ((source->source_addr.s_addr != INADDR_ANY) @@ -541,7 +547,8 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim) FOR_ALL_INTERFACES (pim->vrf, ifp) { struct pim_interface *pim_ifp = ifp->info; struct listnode *grpnode; - struct igmp_group *grp; + struct gm_group *grp; + struct pim_ifchannel *ch, *ch_temp; if (!pim_ifp) continue; @@ -550,22 +557,30 @@ void igmp_source_forward_reevaluate_all(struct pim_instance *pim) for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_group_list, grpnode, grp)) { struct listnode *srcnode; - struct igmp_source *src; + struct gm_source *src; /* scan group sources */ 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, - struct igmp_source *source) + struct gm_source *source) { struct pim_interface *pim_oif; - struct igmp_group *group; + struct gm_group *group; struct prefix_sg sg; int result; int input_iface_vif_index = 0; @@ -743,9 +758,9 @@ void igmp_source_forward_start(struct pim_instance *pim, igmp_source_forward_stop: stop fowarding, but keep the source igmp_source_delete: stop fowarding, and delete the source */ -void igmp_source_forward_stop(struct igmp_source *source) +void igmp_source_forward_stop(struct gm_source *source) { - struct igmp_group *group; + struct gm_group *group; struct prefix_sg sg; int result; @@ -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) |
