summaryrefslogtreecommitdiff
path: root/pimd/pim_zebra.c
diff options
context:
space:
mode:
Diffstat (limited to 'pimd/pim_zebra.c')
-rw-r--r--pimd/pim_zebra.c78
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)