From 490e5b181c1fb63d9968497f9749ade5416d7960 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:19:18 -0700 Subject: [PATCH 01/16] pimd: modify rpf_addr from prefix to pim_addr Currently rpf_addr is of type struct prefix, but it's always a /32 host prefix. So changing it to pim_addr in order to support both IPV4 and IPV6. Signed-off-by: sarita patra --- pimd/pim_rpf.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pimd/pim_rpf.h b/pimd/pim_rpf.h index a2289b4cc5..2ddb9832f6 100644 --- a/pimd/pim_rpf.h +++ b/pimd/pim_rpf.h @@ -49,7 +49,7 @@ struct pim_nexthop { struct pim_rpf { struct pim_nexthop source_nexthop; - struct prefix rpf_addr; /* RPF'(S,G) */ + pim_addr rpf_addr; /* RPF'(S,G) */ }; enum pim_rpf_result { PIM_RPF_OK = 0, PIM_RPF_CHANGED, PIM_RPF_FAILURE }; From 66344d3d5287d8b304f3e4604d86063a2752d1d4 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:19:33 -0700 Subject: [PATCH 02/16] pim6d: Adjust rpf_addr rpf code In this PR, we are handling the pim_rpf code after rpf_addr modified from prefix to pim_addr. Signed-off-by: sarita patra --- pimd/pim_rpf.c | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-) diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c index bd4dd31a2c..13a7c12dd3 100644 --- a/pimd/pim_rpf.c +++ b/pimd/pim_rpf.c @@ -203,11 +203,10 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, { struct pim_rpf *rpf = &up->rpf; struct pim_rpf saved; - struct prefix nht_p; - struct prefix src, grp; + pim_addr src; + struct prefix grp; bool neigh_needed = true; uint32_t saved_mrib_route_metric; - pim_addr rpf_addr; if (PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(up->flags)) return PIM_RPF_OK; @@ -226,15 +225,13 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, old->rpf_addr = saved.rpf_addr; } - pim_addr_to_prefix(&nht_p, up->upstream_addr); - - pim_addr_to_prefix(&src, up->upstream_addr); // RP or Src address + src = up->upstream_addr; // RP or Src address pim_addr_to_prefix(&grp, up->sg.grp); if ((pim_addr_is_any(up->sg.src) && I_am_RP(pim, up->sg.grp)) || PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)) neigh_needed = false; - pim_find_or_track_nexthop(pim, &nht_p, up, NULL, NULL); + pim_find_or_track_nexthop(pim, &up->upstream_addr, up, NULL, NULL); if (!pim_ecmp_nexthop_lookup(pim, &rpf->source_nexthop, &src, &grp, neigh_needed)) { /* Route is Deleted in Zebra, reset the stored NH data */ @@ -243,8 +240,7 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, return PIM_RPF_FAILURE; } - rpf_addr = pim_rpf_find_rpf_addr(up); - pim_addr_to_prefix(&rpf->rpf_addr, rpf_addr); + rpf->rpf_addr = pim_rpf_find_rpf_addr(up); if (pim_rpf_addr_is_inaddr_any(rpf) && PIM_DEBUG_ZEBRA) { /* RPF'(S,G) not found */ @@ -287,7 +283,7 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, } /* detect change in RPF'(S,G) */ - if (!prefix_same(&saved.rpf_addr, &rpf->rpf_addr) || + if (pim_addr_cmp(saved.rpf_addr, rpf->rpf_addr) || saved.source_nexthop.interface != rpf->source_nexthop.interface) { pim_rpf_cost_change(pim, up, saved_mrib_route_metric); return PIM_RPF_CHANGED; @@ -321,7 +317,7 @@ void pim_upstream_rpf_clear(struct pim_instance *pim, router->infinite_assert_metric.metric_preference; up->rpf.source_nexthop.mrib_route_metric = router->infinite_assert_metric.route_metric; - pim_addr_to_prefix(&up->rpf.rpf_addr, PIMADDR_ANY); + up->rpf.rpf_addr = PIMADDR_ANY; pim_upstream_mroute_iif_update(up->channel_oil, __func__); } } @@ -375,15 +371,7 @@ static pim_addr pim_rpf_find_rpf_addr(struct pim_upstream *up) int pim_rpf_addr_is_inaddr_any(struct pim_rpf *rpf) { - pim_addr rpf_addr = pim_addr_from_prefix(&rpf->rpf_addr); - - switch (rpf->rpf_addr.family) { - case AF_INET: - case AF_INET6: - return pim_addr_is_any(rpf_addr); - default: - return 0; - } + return pim_addr_is_any(rpf->rpf_addr); } int pim_rpf_is_same(struct pim_rpf *rpf1, struct pim_rpf *rpf2) @@ -399,10 +387,10 @@ unsigned int pim_rpf_hash_key(const void *arg) const struct pim_nexthop_cache *r = arg; #if PIM_IPV == 4 - return jhash_1word(r->rpf.rpf_addr.u.prefix4.s_addr, 0); + return jhash_1word(r->rpf.rpf_addr.s_addr, 0); #else - return jhash2(r->rpf.rpf_addr.u.prefix6.s6_addr32, - array_size(r->rpf.rpf_addr.u.prefix6.s6_addr32), 0); + return jhash2(r->rpf.rpf_addr.s6_addr32, + array_size(r->rpf.rpf_addr.s6_addr32), 0); #endif } @@ -413,5 +401,5 @@ bool pim_rpf_equal(const void *arg1, const void *arg2) const struct pim_nexthop_cache *r2 = (const struct pim_nexthop_cache *)arg2; - return prefix_same(&r1->rpf.rpf_addr, &r2->rpf.rpf_addr); + return (!pim_addr_cmp(r1->rpf.rpf_addr, r2->rpf.rpf_addr)); } From b63192cfc2f5944ee29684b53b083bb7350822f5 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:20:38 -0700 Subject: [PATCH 03/16] pim6d: Adjust rpf_addr in rp_info In this PR, we are handling the rp_info after rpf_addr modified from prefix to pim_addr. Signed-off-by: sarita patra --- pimd/pim_bsm.c | 10 ++-- pimd/pim_rp.c | 121 ++++++++++++++++++++++--------------------------- 2 files changed, 57 insertions(+), 74 deletions(-) diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index 8ef3c43a99..bd5b1a2cdf 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -571,7 +571,7 @@ void pim_bsm_clear(struct pim_instance *pim) struct route_node *rn; struct route_node *rpnode; struct bsgrp_node *bsgrp; - struct prefix nht_p; + pim_addr nht_p; struct prefix g_all; struct rp_info *rp_all; struct pim_upstream *up; @@ -617,12 +617,10 @@ void pim_bsm_clear(struct pim_instance *pim) } /* Deregister addr with Zebra NHT */ - nht_p.family = AF_INET; - nht_p.prefixlen = IPV4_MAX_BITLEN; - nht_p.u.prefix4 = rp_info->rp.rpf_addr.u.prefix4; + nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) { - zlog_debug("%s: Deregister RP addr %pFX with Zebra ", + zlog_debug("%s: Deregister RP addr %pPA with Zebra ", __func__, &nht_p); } @@ -634,7 +632,7 @@ void pim_bsm_clear(struct pim_instance *pim) rp_all = pim_rp_find_match_group(pim, &g_all); if (rp_all == rp_info) { - pim_addr_to_prefix(&rp_all->rp.rpf_addr, PIMADDR_ANY); + rp_all->rp.rpf_addr = PIMADDR_ANY; rp_all->i_am_rp = 0; } else { /* Delete the rp_info from rp-list */ diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 2b798b14b2..657e776c7f 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -84,7 +84,7 @@ int pim_rp_list_cmp(void *v1, void *v2) /* * Sort by RP IP address */ - ret = prefix_cmp(&rp1->rp.rpf_addr, &rp2->rp.rpf_addr); + ret = pim_addr_cmp(rp1->rp.rpf_addr, rp2->rp.rpf_addr); if (ret) return ret; @@ -119,7 +119,7 @@ void pim_rp_init(struct pim_instance *pim) XFREE(MTYPE_PIM_RP, rp_info); return; } - pim_addr_to_prefix(&rp_info->rp.rpf_addr, PIMADDR_ANY); + rp_info->rp.rpf_addr = PIMADDR_ANY; listnode_add(pim->rp_list, rp_info); @@ -149,12 +149,9 @@ static struct rp_info *pim_rp_find_prefix_list(struct pim_instance *pim, { struct listnode *node; struct rp_info *rp_info; - struct prefix rp_prefix; - - pim_addr_to_prefix(&rp_prefix, rp); for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { - if (prefix_same(&rp_prefix, &rp_info->rp.rpf_addr) && + if ((!pim_addr_cmp(rp, rp_info->rp.rpf_addr)) && rp_info->plist && strcmp(rp_info->plist, plist) == 0) { return rp_info; } @@ -189,11 +186,9 @@ static struct rp_info *pim_rp_find_exact(struct pim_instance *pim, pim_addr rp, { struct listnode *node; struct rp_info *rp_info; - struct prefix rp_prefix; - pim_addr_to_prefix(&rp_prefix, rp); for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { - if (prefix_same(&rp_prefix, &rp_info->rp.rpf_addr) && + if ((!pim_addr_cmp(rp, rp_info->rp.rpf_addr)) && prefix_same(&rp_info->group, group)) return rp_info; } @@ -344,11 +339,11 @@ static int pim_rp_check_interface_addrs(struct rp_info *rp_info, { struct listnode *node; struct pim_secondary_addr *sec_addr; - pim_addr rpf_addr; + struct prefix rpf_addr; - rpf_addr = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + pim_addr_to_prefix(&rpf_addr, rp_info->rp.rpf_addr); - if (!pim_addr_cmp(pim_ifp->primary_address, rpf_addr)) + if (!pim_addr_cmp(pim_ifp->primary_address, rp_info->rp.rpf_addr)) return 1; if (!pim_ifp->sec_addr_list) { @@ -356,7 +351,7 @@ static int pim_rp_check_interface_addrs(struct rp_info *rp_info, } for (ALL_LIST_ELEMENTS_RO(pim_ifp->sec_addr_list, node, sec_addr)) { - if (prefix_same(&sec_addr->addr, &rp_info->rp.rpf_addr)) { + if (prefix_same(&sec_addr->addr, &rpf_addr)) { return 1; } } @@ -388,7 +383,6 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up) enum pim_rpf_result rpf_result; pim_addr old_upstream_addr; pim_addr new_upstream_addr; - struct prefix nht_p; old_upstream_addr = up->upstream_addr; pim_rp_set_upstream_addr(pim, &new_upstream_addr, up->sg.src, @@ -408,12 +402,11 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up) */ if (!pim_addr_is_any(old_upstream_addr)) { /* Deregister addr with Zebra NHT */ - pim_addr_to_prefix(&nht_p, old_upstream_addr); if (PIM_DEBUG_PIM_TRACE) zlog_debug( - "%s: Deregister upstream %s addr %pFX with Zebra NHT", - __func__, up->sg_str, &nht_p); - pim_delete_tracked_nexthop(pim, &nht_p, up, NULL); + "%s: Deregister upstream %s addr %pPA with Zebra NHT", + __func__, up->sg_str, &old_upstream_addr); + pim_delete_tracked_nexthop(pim, &old_upstream_addr, up, NULL); } /* Update the upstream address */ @@ -446,7 +439,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, struct listnode *node, *nnode; struct rp_info *tmp_rp_info; char buffer[BUFSIZ]; - struct prefix nht_p; + pim_addr nht_p; struct route_node *rn = NULL; struct pim_upstream *up; bool upstream_updated = false; @@ -456,7 +449,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info)); - pim_addr_to_prefix(&rp_info->rp.rpf_addr, rp_addr); + rp_info->rp.rpf_addr = rp_addr; prefix_copy(&rp_info->group, &group); rp_info->rp_src = rp_src_flag; @@ -482,8 +475,8 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, */ for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode, tmp_rp_info)) { - if (prefix_same(&rp_info->rp.rpf_addr, - &tmp_rp_info->rp.rpf_addr)) { + if (!pim_addr_cmp(rp_info->rp.rpf_addr, + tmp_rp_info->rp.rpf_addr)) { if (tmp_rp_info->plist) pim_rp_del_config(pim, rp_addr, NULL, tmp_rp_info->plist); @@ -519,8 +512,8 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, for (ALL_LIST_ELEMENTS(pim->rp_list, node, nnode, tmp_rp_info)) { if (tmp_rp_info->plist && - prefix_same(&rp_info->rp.rpf_addr, - &tmp_rp_info->rp.rpf_addr)) { + (!pim_addr_cmp(rp_info->rp.rpf_addr, + tmp_rp_info->rp.rpf_addr))) { pim_rp_del_config(pim, rp_addr, NULL, tmp_rp_info->plist); } @@ -539,7 +532,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, nht_p = rp_all->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug( - "%s: NHT Register rp_all addr %pFX grp %pFX ", + "%s: NHT Register rp_all addr %pPA grp %pFX ", __func__, &nht_p, &rp_all->group); frr_each (rb_pim_upstream, &pim->upstream_head, up) { @@ -660,7 +653,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, /* Register addr with Zebra NHT */ nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) - zlog_debug("%s: NHT Register RP addr %pFX grp %pFX with Zebra ", + zlog_debug("%s: NHT Register RP addr %pPA grp %pFX with Zebra ", __func__, &nht_p, &rp_info->group); pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL); if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, &nht_p, @@ -698,7 +691,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, struct prefix g_all; struct rp_info *rp_info; struct rp_info *rp_all; - struct prefix nht_p; + pim_addr nht_p; struct route_node *rn; bool was_plist = false; struct rp_info *trp_info; @@ -753,7 +746,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, /* Deregister addr with Zebra NHT */ nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) - zlog_debug("%s: Deregister RP addr %pFX with Zebra ", __func__, + zlog_debug("%s: Deregister RP addr %pPA with Zebra ", __func__, &nht_p); pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); @@ -769,7 +762,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, */ pim_addr rpf_addr; - rpf_addr = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + rpf_addr = rp_info->rp.rpf_addr; if (!pim_addr_cmp(up->upstream_addr, rpf_addr) && pim_addr_is_any(up->sg.src)) { struct prefix grp; @@ -782,7 +775,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, } } } - pim_addr_to_prefix(&rp_all->rp.rpf_addr, PIMADDR_ANY); + rp_all->rp.rpf_addr = PIMADDR_ANY; rp_all->i_am_rp = 0; return PIM_SUCCESS; } @@ -817,7 +810,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, */ pim_addr rpf_addr; - rpf_addr = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + rpf_addr = rp_info->rp.rpf_addr; if (!pim_addr_cmp(up->upstream_addr, rpf_addr) && pim_addr_is_any(up->sg.src)) { struct prefix grp; @@ -851,7 +844,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, struct prefix group, enum rp_source rp_src_flag) { - struct prefix nht_p; + pim_addr nht_p; struct route_node *rn; int result = 0; struct rp_info *rp_info = NULL; @@ -873,7 +866,7 @@ int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, return result; } - old_rp_addr = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + old_rp_addr = rp_info->rp.rpf_addr; if (!pim_addr_cmp(new_rp_addr, old_rp_addr)) { if (rp_info->rp_src != rp_src_flag) { rp_info->rp_src = rp_src_flag; @@ -882,15 +875,12 @@ int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, } } - nht_p.family = PIM_AF; - nht_p.prefixlen = PIM_MAX_BITLEN; - /* Deregister old RP addr with Zebra NHT */ if (!pim_addr_is_any(old_rp_addr)) { nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) - zlog_debug("%s: Deregister RP addr %pFX with Zebra ", + zlog_debug("%s: Deregister RP addr %pPA with Zebra ", __func__, &nht_p); pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); } @@ -899,7 +889,7 @@ int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, listnode_delete(pim->rp_list, rp_info); /* Update the new RP address*/ - pim_addr_to_prefix(&rp_info->rp.rpf_addr, new_rp_addr); + rp_info->rp.rpf_addr = new_rp_addr; rp_info->rp_src = rp_src_flag; rp_info->i_am_rp = 0; @@ -926,7 +916,7 @@ int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, /* Register new RP addr with Zebra NHT */ nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) - zlog_debug("%s: NHT Register RP addr %pFX grp %pFX with Zebra ", + zlog_debug("%s: NHT Register RP addr %pPA grp %pFX with Zebra ", __func__, &nht_p, &rp_info->group); pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL); @@ -949,7 +939,7 @@ void pim_rp_setup(struct pim_instance *pim) { struct listnode *node; struct rp_info *rp_info; - struct prefix nht_p; + pim_addr nht_p; for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { if (pim_rpf_addr_is_inaddr_any(&rp_info->rp)) @@ -994,12 +984,9 @@ void pim_rp_check_on_if_add(struct pim_interface *pim_ifp) if (pim_rp_check_interface_addrs(rp_info, pim_ifp)) { i_am_rp_changed = true; rp_info->i_am_rp = 1; - if (PIM_DEBUG_PIM_NHT_RP) { - char rp[PREFIX_STRLEN]; - pim_addr_dump("", &rp_info->rp.rpf_addr, - rp, sizeof(rp)); - zlog_debug("%s: %s: i am rp", __func__, rp); - } + if (PIM_DEBUG_PIM_NHT_RP) + zlog_debug("%s: %pPA: i am rp", __func__, + &rp_info->rp.rpf_addr); } } @@ -1032,16 +1019,14 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim) if (old_i_am_rp != rp_info->i_am_rp) { i_am_rp_changed = true; if (PIM_DEBUG_PIM_NHT_RP) { - char rp[PREFIX_STRLEN]; - pim_addr_dump("", &rp_info->rp.rpf_addr, - rp, sizeof(rp)); - if (rp_info->i_am_rp) { - zlog_debug("%s: %s: i am rp", __func__, - rp); - } else { - zlog_debug("%s: %s: i am no longer rp", - __func__, rp); - } + if (rp_info->i_am_rp) + zlog_debug("%s: %pPA: i am rp", + __func__, + &rp_info->rp.rpf_addr); + else + zlog_debug("%s: %pPA: i am no longer rp", + __func__, + &rp_info->rp.rpf_addr); } } } @@ -1088,13 +1073,13 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) rp_info = pim_rp_find_match_group(pim, &g); if (rp_info) { - struct prefix nht_p; + pim_addr nht_p; /* Register addr with Zebra NHT */ nht_p = rp_info->rp.rpf_addr; if (PIM_DEBUG_PIM_NHT_RP) zlog_debug( - "%s: NHT Register RP addr %pFX grp %pFX with Zebra", + "%s: NHT Register RP addr %pPA grp %pFX with Zebra", __func__, &nht_p, &rp_info->group); pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL); pim_rpf_set_refresh_time(pim); @@ -1137,7 +1122,7 @@ int pim_rp_set_upstream_addr(struct pim_instance *pim, pim_addr *up, } if (pim_addr_is_any(source)) - *up = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + *up = rp_info->rp.rpf_addr; else *up = source; @@ -1159,7 +1144,7 @@ int pim_rp_config_write(struct pim_instance *pim, struct vty *vty, if (rp_info->rp_src == RP_SRC_BSR) continue; - rp_addr = pim_addr_from_prefix(&rp_info->rp.rpf_addr); + rp_addr = rp_info->rp.rpf_addr; if (rp_info->plist) vty_out(vty, "%s" PIM_AF_NAME @@ -1215,10 +1200,10 @@ void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, * entry for the previous RP */ if (prev_rp_info && - prefix_cmp(&prev_rp_info->rp.rpf_addr, - &rp_info->rp.rpf_addr)) { + (pim_addr_cmp(prev_rp_info->rp.rpf_addr, + rp_info->rp.rpf_addr))) { json_object_object_addf( - json, json_rp_rows, "%pFXh", + json, json_rp_rows, "%pPA", &prev_rp_info->rp.rpf_addr); json_rp_rows = NULL; } @@ -1227,7 +1212,7 @@ void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, json_rp_rows = json_object_new_array(); json_row = json_object_new_object(); - json_object_string_addf(json_row, "rpAddress", "%pFXh", + json_object_string_addf(json_row, "rpAddress", "%pPA", &rp_info->rp.rpf_addr); if (rp_info->rp.source_nexthop.interface) json_object_string_add( @@ -1257,7 +1242,7 @@ void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, json_object_array_add(json_rp_rows, json_row); } else { - vty_out(vty, "%-15pFXh ", &rp_info->rp.rpf_addr); + vty_out(vty, "%-15pPA ", &rp_info->rp.rpf_addr); if (rp_info->plist) vty_out(vty, "%-18s ", rp_info->plist); @@ -1284,7 +1269,7 @@ void pim_rp_show_information(struct pim_instance *pim, struct prefix *range, if (json) { if (prev_rp_info && json_rp_rows) - json_object_object_addf(json, json_rp_rows, "%pFXh", + json_object_object_addf(json, json_rp_rows, "%pPA", &prev_rp_info->rp.rpf_addr); } } @@ -1294,7 +1279,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr) struct listnode *node = NULL; struct rp_info *rp_info = NULL; struct nexthop *nh_node = NULL; - struct prefix nht_p; + pim_addr nht_p; struct pim_nexthop_cache pnc; for (ALL_LIST_ELEMENTS_RO(pim->rp_list, node, rp_info)) { @@ -1329,7 +1314,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr) #endif if (PIM_DEBUG_PIM_NHT_RP) zlog_debug( - "%s: addr %pFXh new nexthop addr %pPAs interface %s", + "%s: addr %pPA new nexthop addr %pPAs interface %s", __func__, &nht_p, &nbr->source_addr, ifp1->name); } From 028583e9e096cac6c6ae16afa14c72f016cb8c0c Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:21:23 -0700 Subject: [PATCH 04/16] pim6d: Adjust rpf_addr in pim_upstream In this PR, we are handling the pim_upstream after rpf_addr modified from prefix to pim_addr. Signed-off-by: sarita patra --- pimd/pim_upstream.c | 69 +++++++++++++++++---------------------------- pimd/pim_upstream.h | 2 +- 2 files changed, 27 insertions(+), 44 deletions(-) diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 54a7f59ca4..8190162a2a 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -192,7 +192,6 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim, struct listnode *node, *nnode; struct pim_ifchannel *ch; bool notify_msdp = false; - struct prefix nht_p; if (PIM_DEBUG_PIM_TRACE) zlog_debug( @@ -267,12 +266,11 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim, */ if (!pim_addr_is_any(up->upstream_addr)) { /* Deregister addr with Zebra NHT */ - pim_addr_to_prefix(&nht_p, up->upstream_addr); if (PIM_DEBUG_PIM_TRACE) zlog_debug( - "%s: Deregister upstream %s addr %pFX with Zebra NHT", - __func__, up->sg_str, &nht_p); - pim_delete_tracked_nexthop(pim, &nht_p, up, NULL); + "%s: Deregister upstream %s addr %pPA with Zebra NHT", + __func__, up->sg_str, &up->upstream_addr); + pim_delete_tracked_nexthop(pim, &up->upstream_addr, up, NULL); } XFREE(MTYPE_PIM_UPSTREAM, up); @@ -290,16 +288,13 @@ void pim_upstream_send_join(struct pim_upstream *up) } if (PIM_DEBUG_PIM_TRACE) { - char rpf_str[PREFIX_STRLEN]; - pim_addr_dump("", &up->rpf.rpf_addr, rpf_str, - sizeof(rpf_str)); - zlog_debug("%s: RPF'%s=%s(%s) for Interface %s", __func__, - up->sg_str, rpf_str, + zlog_debug("%s: RPF'%s=%pPA(%s) for Interface %s", __func__, + up->sg_str, &up->rpf.rpf_addr, pim_upstream_state2str(up->join_state), up->rpf.source_nexthop.interface->name); if (pim_rpf_addr_is_inaddr_any(&up->rpf)) { - zlog_debug("%s: can't send join upstream: RPF'%s=%s", - __func__, up->sg_str, rpf_str); + zlog_debug("%s: can't send join upstream: RPF'%s=%pPA", + __func__, up->sg_str, &up->rpf.rpf_addr); /* warning only */ } } @@ -345,8 +340,8 @@ static void join_timer_stop(struct pim_upstream *up) THREAD_OFF(up->t_join_timer); if (up->rpf.source_nexthop.interface) - nbr = pim_neighbor_find_prefix(up->rpf.source_nexthop.interface, - &up->rpf.rpf_addr); + nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, + up->rpf.rpf_addr); if (nbr) pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr); @@ -359,8 +354,8 @@ void join_timer_start(struct pim_upstream *up) struct pim_neighbor *nbr = NULL; if (up->rpf.source_nexthop.interface) { - nbr = pim_neighbor_find_prefix(up->rpf.source_nexthop.interface, - &up->rpf.rpf_addr); + nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, + up->rpf.rpf_addr); if (PIM_DEBUG_PIM_EVENTS) { zlog_debug( @@ -428,7 +423,7 @@ void pim_update_suppress_timers(uint32_t suppress_time) } } -void pim_upstream_join_suppress(struct pim_upstream *up, struct prefix rpf, +void pim_upstream_join_suppress(struct pim_upstream *up, pim_addr rpf, int holdtime) { long t_joinsuppress_msec; @@ -451,23 +446,19 @@ void pim_upstream_join_suppress(struct pim_upstream *up, struct prefix rpf, pim_time_timer_remain_msec(up->t_join_timer); else { /* Remove it from jp agg from the nbr for suppression */ - nbr = pim_neighbor_find_prefix(up->rpf.source_nexthop.interface, - &up->rpf.rpf_addr); + nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, + up->rpf.rpf_addr); if (nbr) { join_timer_remain_msec = pim_time_timer_remain_msec(nbr->jp_timer); } } - if (PIM_DEBUG_PIM_TRACE) { - char rpf_str[INET_ADDRSTRLEN]; - - pim_addr_dump("", &rpf, rpf_str, sizeof(rpf_str)); + if (PIM_DEBUG_PIM_TRACE) zlog_debug( - "%s %s: detected Join%s to RPF'(S,G)=%s: join_timer=%ld msec t_joinsuppress=%ld msec", - __FILE__, __func__, up->sg_str, rpf_str, + "%s %s: detected Join%s to RPF'(S,G)=%pPA: join_timer=%ld msec t_joinsuppress=%ld msec", + __FILE__, __func__, up->sg_str, &rpf, join_timer_remain_msec, t_joinsuppress_msec); - } if (join_timer_remain_msec < t_joinsuppress_msec) { if (PIM_DEBUG_PIM_TRACE) { @@ -507,8 +498,8 @@ void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label, /* upstream join tracked with neighbor jp timer */ struct pim_neighbor *nbr; - nbr = pim_neighbor_find_prefix(up->rpf.source_nexthop.interface, - &up->rpf.rpf_addr); + nbr = pim_neighbor_find(up->rpf.source_nexthop.interface, + up->rpf.rpf_addr); if (nbr) join_timer_remain_msec = pim_time_timer_remain_msec(nbr->jp_timer); @@ -517,17 +508,11 @@ void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label, join_timer_remain_msec = t_override_msec + 1; } - if (PIM_DEBUG_PIM_TRACE) { - char rpf_str[INET_ADDRSTRLEN]; - - pim_addr_dump("", &up->rpf.rpf_addr, rpf_str, - sizeof(rpf_str)); - + if (PIM_DEBUG_PIM_TRACE) zlog_debug( - "%s: to RPF'%s=%s: join_timer=%ld msec t_override=%d msec", - debug_label, up->sg_str, rpf_str, + "%s: to RPF'%s=%pPA: join_timer=%ld msec t_override=%d msec", + debug_label, up->sg_str, &up->rpf.rpf_addr, join_timer_remain_msec, t_override_msec); - } if (join_timer_remain_msec > t_override_msec) { if (PIM_DEBUG_PIM_TRACE) { @@ -842,9 +827,7 @@ void pim_upstream_fill_static_iif(struct pim_upstream *up, up->rpf.source_nexthop.mrib_metric_preference = ZEBRA_CONNECT_DISTANCE_DEFAULT; up->rpf.source_nexthop.mrib_route_metric = 0; - up->rpf.rpf_addr.family = AF_INET; - up->rpf.rpf_addr.u.prefix4.s_addr = PIM_NET_INADDR_ANY; - + up->rpf.rpf_addr = PIMADDR_ANY; } static struct pim_upstream *pim_upstream_new(struct pim_instance *pim, @@ -903,7 +886,7 @@ static struct pim_upstream *pim_upstream_new(struct pim_instance *pim, router->infinite_assert_metric.metric_preference; up->rpf.source_nexthop.mrib_route_metric = router->infinite_assert_metric.route_metric; - pim_addr_to_prefix(&up->rpf.rpf_addr, PIMADDR_ANY); + up->rpf.rpf_addr = PIMADDR_ANY; up->ifchannels = list_new(); up->ifchannels->cmp = (int (*)(void *, void *))pim_ifchannel_compare; @@ -1070,7 +1053,7 @@ struct pim_upstream *pim_upstream_add(struct pim_instance *pim, pim_sgaddr *sg, if (PIM_DEBUG_PIM_TRACE) { if (up) - zlog_debug("%s(%s): %s, iif %pFX (%s) found: %d: ref_count: %d", + zlog_debug("%s(%s): %s, iif %pPA (%s) found: %d: ref_count: %d", __func__, name, up->sg_str, &up->rpf.rpf_addr, up->rpf.source_nexthop.interface ? up->rpf.source_nexthop.interface->name : "Unknown" , @@ -1274,7 +1257,7 @@ void pim_upstream_rpf_genid_changed(struct pim_instance *pim, frr_each (rb_pim_upstream, &pim->upstream_head, up) { pim_addr rpf_addr; - rpf_addr = pim_addr_from_prefix(&up->rpf.rpf_addr); + rpf_addr = up->rpf.rpf_addr; if (PIM_DEBUG_PIM_TRACE) zlog_debug( diff --git a/pimd/pim_upstream.h b/pimd/pim_upstream.h index 8feffb8fdb..3841d1af7b 100644 --- a/pimd/pim_upstream.h +++ b/pimd/pim_upstream.h @@ -317,7 +317,7 @@ void pim_upstream_update_join_desired(struct pim_instance *pim, struct pim_upstream *up); void pim_update_suppress_timers(uint32_t suppress_time); -void pim_upstream_join_suppress(struct pim_upstream *up, struct prefix rpf, +void pim_upstream_join_suppress(struct pim_upstream *up, pim_addr rpf, int holdtime); void pim_upstream_join_timer_decrease_to_t_override(const char *debug_label, From 144035b741733d450a992700c95785492c41e1df Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:22:21 -0700 Subject: [PATCH 05/16] pim6d: Adjust rpf_addr in pim_zebra In this PR, we are handling the pim_zebra code after rpf_addr modified from prefix to pim_addr. Signed-off-by: sarita patra --- pimd/pim_zebra.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index 7f217d9c2e..2c76fd6868 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -255,7 +255,7 @@ void pim_zebra_update_all_interfaces(struct pim_instance *pim) struct pim_rpf rpf; rpf.source_nexthop.interface = ifp; - pim_addr_to_prefix(&rpf.rpf_addr, us->address); + rpf.rpf_addr = us->address; pim_joinprune_send(&rpf, us->us); pim_jp_agg_clear_group(us->us); } @@ -269,8 +269,8 @@ void pim_zebra_upstream_rpf_changed(struct pim_instance *pim, if (old->source_nexthop.interface) { struct pim_neighbor *nbr; - nbr = pim_neighbor_find_prefix(old->source_nexthop.interface, - &old->rpf_addr); + nbr = pim_neighbor_find(old->source_nexthop.interface, + old->rpf_addr); if (nbr) pim_jp_agg_remove_group(nbr->upstream_jp_agg, up, nbr); From 122c31403efb53087da4ad7a807b21c86f3a09a9 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:23:31 -0700 Subject: [PATCH 06/16] pim6d: Adjust rpf_addr in pim_vxlan_orig_mr_up_add In this PR, we are handling the pim_vxlan_orig_mr_up_add() after rpf_addr modified from prefix to pim_addr. Signed-off-by: sarita patra --- pimd/pim_vxlan.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pimd/pim_vxlan.c b/pimd/pim_vxlan.c index 3565be35bd..d6bfc0a256 100644 --- a/pimd/pim_vxlan.c +++ b/pimd/pim_vxlan.c @@ -303,7 +303,6 @@ static void pim_vxlan_orig_mr_up_add(struct pim_vxlan_sg *vxlan_sg) struct pim_upstream *up; struct pim_interface *term_ifp; int flags = 0; - struct prefix nht_p; struct pim_instance *pim = vxlan_sg->pim; if (vxlan_sg->up) { @@ -353,9 +352,8 @@ static void pim_vxlan_orig_mr_up_add(struct pim_vxlan_sg *vxlan_sg) * iif */ if (!PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(up->flags)) { - pim_addr_to_prefix(&nht_p, up->upstream_addr); - pim_delete_tracked_nexthop(vxlan_sg->pim, &nht_p, up, - NULL); + pim_delete_tracked_nexthop( + vxlan_sg->pim, &up->upstream_addr, up, NULL); } /* We are acting FHR; clear out use_rpt setting if any */ pim_upstream_update_use_rpt(up, false /*update_mroute*/); From 6b362f9fb15df308e17fc232bdc5a4e93b028b2a Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:24:42 -0700 Subject: [PATCH 07/16] pim6d: Adjust rpf_addr in pim_tib code In this PR, we are handling the pim_tib code after rpf_addr modified from prefix to pim_addr. Signed-off-by: sarita patra --- pimd/pim_tib.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pimd/pim_tib.c b/pimd/pim_tib.c index a69177a6e5..81dcfc9269 100644 --- a/pimd/pim_tib.c +++ b/pimd/pim_tib.c @@ -34,7 +34,7 @@ tib_sg_oil_setup(struct pim_instance *pim, pim_sgaddr sg, struct interface *oif) struct pim_interface *pim_oif = oif->info; int input_iface_vif_index = 0; pim_addr vif_source; - struct prefix src, grp; + struct prefix grp; struct pim_nexthop nexthop; struct pim_upstream *up = NULL; @@ -43,20 +43,19 @@ tib_sg_oil_setup(struct pim_instance *pim, pim_sgaddr sg, struct interface *oif) return pim_channel_oil_add(pim, &sg, __func__); } - pim_addr_to_prefix(&src, vif_source); // RP or Src addr pim_addr_to_prefix(&grp, sg.grp); up = pim_upstream_find(pim, &sg); if (up) { memcpy(&nexthop, &up->rpf.source_nexthop, sizeof(struct pim_nexthop)); - pim_ecmp_nexthop_lookup(pim, &nexthop, &src, &grp, 0); + pim_ecmp_nexthop_lookup(pim, &nexthop, &vif_source, &grp, 0); if (nexthop.interface) input_iface_vif_index = pim_if_find_vifindex_by_ifindex( pim, nexthop.interface->ifindex); } else - input_iface_vif_index = - pim_ecmp_fib_lookup_if_vif_index(pim, &src, &grp); + input_iface_vif_index = pim_ecmp_fib_lookup_if_vif_index( + pim, &vif_source, &grp); if (PIM_DEBUG_ZEBRA) zlog_debug("%s: NHT %pSG vif_source %pPAs vif_index:%d", From 4a8336cfa8434aeca22325f5c45ea755b0378aee Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:26:54 -0700 Subject: [PATCH 08/16] pim6d: Handle rpf_addr in pim_if_addr_add() Signed-off-by: sarita patra --- pimd/pim_iface.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pimd/pim_iface.c b/pimd/pim_iface.c index ebe33f6c16..73b6ca951a 100644 --- a/pimd/pim_iface.c +++ b/pimd/pim_iface.c @@ -635,9 +635,7 @@ void pim_if_addr_add(struct connected *ifc) with RNH address to receive update and add the interface as nexthop. */ memset(&rpf, 0, sizeof(struct pim_rpf)); - rpf.rpf_addr.family = AF_INET; - rpf.rpf_addr.prefixlen = IPV4_MAX_BITLEN; - rpf.rpf_addr.u.prefix4 = ifc->address->u.prefix4; + rpf.rpf_addr = pim_addr_from_prefix(ifc->address); pnc = pim_nexthop_cache_find(pim_ifp->pim, &rpf); if (pnc) pim_sendmsg_zebra_rnh(pim_ifp->pim, zclient, From bad81cbc7b0c61a0f13cc1d2e40970d053d11a7e Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:28:33 -0700 Subject: [PATCH 09/16] pim6d: Handle rpf_addr in on_neighbor_jp_timer() Signed-off-by: sarita patra --- pimd/pim_neighbor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pimd/pim_neighbor.c b/pimd/pim_neighbor.c index 0bbed1f99f..6d6dbb6465 100644 --- a/pimd/pim_neighbor.c +++ b/pimd/pim_neighbor.c @@ -263,7 +263,7 @@ static void on_neighbor_jp_timer(struct thread *t) neigh->upstream_jp_agg->count); rpf.source_nexthop.interface = neigh->interface; - pim_addr_to_prefix(&rpf.rpf_addr, neigh->source_addr); + rpf.rpf_addr = neigh->source_addr; pim_joinprune_send(&rpf, neigh->upstream_jp_agg); thread_add_timer(router->master, on_neighbor_jp_timer, neigh, From 5262018dbf0222137209829b0088e36ea92bfde9 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:29:11 -0700 Subject: [PATCH 10/16] pim6d: Handle rpf_addr in pim_msg_build_jp_groups() Signed-off-by: sarita patra --- pimd/pim_msg.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pimd/pim_msg.c b/pimd/pim_msg.c index b67849fd8f..7e57b405f2 100644 --- a/pimd/pim_msg.c +++ b/pimd/pim_msg.c @@ -279,7 +279,7 @@ size_t pim_msg_build_jp_groups(struct pim_jp_groups *grp, struct pim_rpf *rpf = pim_rp_g(pim, source->up->sg.grp); bits = PIM_ENCODE_SPARSE_BIT | PIM_ENCODE_WC_BIT | PIM_ENCODE_RPT_BIT; - stosend = pim_addr_from_prefix(&rpf->rpf_addr); + stosend = rpf->rpf_addr; /* Only Send SGRpt in case of *,G Join */ if (source->is_join) up = source->up; From fc9f6f88e5f6b243ee6d1e560e5575574a846661 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:29:34 -0700 Subject: [PATCH 11/16] pimd: Handle rpf_addr in join/prune processing Signed-off-by: sarita patra --- pimd/pim_join.c | 16 +++++++--------- pimd/pim_jp_agg.c | 7 ++----- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/pimd/pim_join.c b/pimd/pim_join.c index 1b722382b9..8c7ae80d2b 100644 --- a/pimd/pim_join.c +++ b/pimd/pim_join.c @@ -86,7 +86,7 @@ static void recv_join(struct interface *ifp, struct pim_neighbor *neigh, * If the RP sent in the message is not * our RP for the group, drop the message */ - rpf_addr = pim_addr_from_prefix(&rp->rpf_addr); + rpf_addr = rp->rpf_addr; if (pim_addr_cmp(sg->src, rpf_addr)) { zlog_warn( "%s: Specified RP(%pPAs) in join is different than our configured RP(%pPAs)", @@ -427,7 +427,6 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups) size_t packet_left = 0; size_t packet_size = 0; size_t group_size = 0; - pim_addr rpf_addr; if (rpf->source_nexthop.interface) pim_ifp = rpf->source_nexthop.interface->info; @@ -436,9 +435,8 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups) return -1; } - rpf_addr = pim_addr_from_prefix(&rpf->rpf_addr); - on_trace(__func__, rpf->source_nexthop.interface, rpf_addr); + on_trace(__func__, rpf->source_nexthop.interface, rpf->rpf_addr); if (!pim_ifp) { zlog_warn("%s: multicast not enabled on interface %s", __func__, @@ -446,11 +444,11 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups) return -1; } - if (pim_addr_is_any(rpf_addr)) { + if (pim_addr_is_any(rpf->rpf_addr)) { if (PIM_DEBUG_PIM_J_P) zlog_debug( "%s: upstream=%pPA is myself on interface %s", - __func__, &rpf_addr, + __func__, &rpf->rpf_addr, rpf->source_nexthop.interface->name); return 0; } @@ -473,7 +471,7 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups) memset(msg, 0, sizeof(*msg)); pim_msg_addr_encode_ucast((uint8_t *)&msg->addr, - rpf_addr); + rpf->rpf_addr); msg->reserved = 0; msg->holdtime = htons(PIM_JP_HOLDTIME); @@ -492,7 +490,7 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups) if (PIM_DEBUG_PIM_J_P) zlog_debug( "%s: sending (G)=%pPAs to upstream=%pPA on interface %s", - __func__, &group->group, &rpf_addr, + __func__, &group->group, &rpf->rpf_addr, rpf->source_nexthop.interface->name); group_size = pim_msg_get_jp_group_size(group->sources); @@ -516,7 +514,7 @@ int pim_joinprune_send(struct pim_rpf *rpf, struct list *groups) memset(msg, 0, sizeof(*msg)); pim_msg_addr_encode_ucast((uint8_t *)&msg->addr, - rpf_addr); + rpf->rpf_addr); msg->reserved = 0; msg->holdtime = htons(PIM_JP_HOLDTIME); diff --git a/pimd/pim_jp_agg.c b/pimd/pim_jp_agg.c index 16774a03f5..44ebbb4dea 100644 --- a/pimd/pim_jp_agg.c +++ b/pimd/pim_jp_agg.c @@ -110,7 +110,6 @@ pim_jp_agg_get_interface_upstream_switch_list(struct pim_rpf *rpf) struct pim_interface *pim_ifp; struct pim_iface_upstream_switch *pius; struct listnode *node, *nnode; - pim_addr rpf_addr; if (!ifp) return NULL; @@ -121,18 +120,16 @@ pim_jp_agg_get_interface_upstream_switch_list(struct pim_rpf *rpf) if (!pim_ifp) return NULL; - rpf_addr = pim_addr_from_prefix(&rpf->rpf_addr); - for (ALL_LIST_ELEMENTS(pim_ifp->upstream_switch_list, node, nnode, pius)) { - if (!pim_addr_cmp(pius->address, rpf_addr)) + if (!pim_addr_cmp(pius->address, rpf->rpf_addr)) break; } if (!pius) { pius = XCALLOC(MTYPE_PIM_JP_AGG_GROUP, sizeof(struct pim_iface_upstream_switch)); - pius->address = rpf_addr; + pius->address = rpf->rpf_addr; pius->us = list_new(); listnode_add_sort(pim_ifp->upstream_switch_list, pius); } From 5d58abc161dd84840dc347fadc16a1213282aace Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:30:16 -0700 Subject: [PATCH 12/16] pimd: Handle rpf_addr in register send/recv Signed-off-by: sarita patra --- pimd/pim_register.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/pimd/pim_register.c b/pimd/pim_register.c index 8403340d86..0eb49a7f91 100644 --- a/pimd/pim_register.c +++ b/pimd/pim_register.c @@ -139,7 +139,6 @@ int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size) struct pim_instance *pim = pim_ifp->pim; struct pim_upstream *up = NULL; struct pim_rpf *rp; - pim_addr rpf_addr; pim_sgaddr sg; struct listnode *up_node; struct pim_upstream *child; @@ -174,12 +173,11 @@ int pim_register_stop_recv(struct interface *ifp, uint8_t *buf, int buf_size) rp = RP(pim_ifp->pim, sg.grp); if (rp) { - rpf_addr = pim_addr_from_prefix(&rp->rpf_addr); /* As per RFC 7761, Section 4.9.4: * A special wildcard value consisting of an address field of * all zeros can be used to indicate any source. */ - if ((pim_addr_cmp(sg.src, rpf_addr) == 0) || + if ((pim_addr_cmp(sg.src, rp->rpf_addr) == 0) || pim_addr_is_any(sg.src)) { handling_star = true; sg.src = PIMADDR_ANY; @@ -284,11 +282,10 @@ void pim_register_send(const uint8_t *buf, int buf_size, pim_addr src, unsigned char *b1; struct pim_interface *pinfo; struct interface *ifp; - pim_addr dst = pim_addr_from_prefix(&rpg->rpf_addr); if (PIM_DEBUG_PIM_REG) { zlog_debug("Sending %s %sRegister Packet to %pPA", up->sg_str, - null_register ? "NULL " : "", &dst); + null_register ? "NULL " : "", &rpg->rpf_addr); } ifp = rpg->source_nexthop.interface; @@ -310,7 +307,7 @@ void pim_register_send(const uint8_t *buf, int buf_size, pim_addr src, if (PIM_DEBUG_PIM_REG) { zlog_debug("%s: Sending %s %sRegister Packet to %pPA on %s", __func__, up->sg_str, null_register ? "NULL " : "", - &dst, ifp->name); + &rpg->rpf_addr, ifp->name); } memset(buffer, 0, 10000); @@ -327,13 +324,14 @@ void pim_register_send(const uint8_t *buf, int buf_size, pim_addr src, */ src = pim_register_get_unicast_v6_addr(pinfo); #endif - pim_msg_build_header(src, dst, buffer, buf_size + PIM_MSG_REGISTER_LEN, + pim_msg_build_header(src, rpg->rpf_addr, buffer, + buf_size + PIM_MSG_REGISTER_LEN, PIM_MSG_TYPE_REGISTER, false); if (!pinfo->pim_passive_enable) ++pinfo->pim_ifstat_reg_send; - if (pim_msg_send(pinfo->pim_sock_fd, src, dst, buffer, + if (pim_msg_send(pinfo->pim_sock_fd, src, rpg->rpf_addr, buffer, buf_size + PIM_MSG_REGISTER_LEN, ifp)) { if (PIM_DEBUG_PIM_TRACE) { zlog_debug( @@ -618,7 +616,7 @@ int pim_register_recv(struct interface *ifp, pim_addr dest_addr, } } - rp_addr = pim_addr_from_prefix(&(RP(pim, sg.grp))->rpf_addr); + rp_addr = (RP(pim, sg.grp))->rpf_addr; if (i_am_rp && (!pim_addr_cmp(dest_addr, rp_addr))) { sentRegisterStop = 0; From 6288ebcf22af232a74dcca95eb377042c26381bc Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:31:06 -0700 Subject: [PATCH 13/16] pimd: Handle rpf_addr in pim nht Signed-off-by: sarita patra --- pimd/pim_nht.c | 127 ++++++++++++++++++++++--------------------------- pimd/pim_nht.h | 10 ++-- 2 files changed, 61 insertions(+), 76 deletions(-) diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 564d16a60b..95ed09d227 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -52,11 +52,11 @@ void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient, struct pim_nexthop_cache *pnc, int command) { - struct prefix *p; + struct prefix p; int ret; - p = &(pnc->rpf.rpf_addr); - ret = zclient_send_rnh(zclient, command, p, SAFI_UNICAST, false, false, + pim_addr_to_prefix(&p, pnc->rpf.rpf_addr); + ret = zclient_send_rnh(zclient, command, &p, SAFI_UNICAST, false, false, pim->vrf->vrf_id); if (ret == ZCLIENT_SEND_FAILURE) zlog_warn("sendmsg_nexthop: zclient_send_message() failed"); @@ -65,7 +65,7 @@ void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient, zlog_debug( "%s: NHT %sregistered addr %pFX(%s) with Zebra ret:%d ", __func__, - (command == ZEBRA_NEXTHOP_REGISTER) ? " " : "de", p, + (command == ZEBRA_NEXTHOP_REGISTER) ? " " : "de", &p, pim->vrf->name, ret); return; @@ -98,7 +98,7 @@ static struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim, pnc->rp_list = list_new(); pnc->rp_list->cmp = pim_rp_list_cmp; - snprintfrr(hash_name, sizeof(hash_name), "PNC %pFX(%s) Upstream Hash", + snprintfrr(hash_name, sizeof(hash_name), "PNC %pPA(%s) Upstream Hash", &pnc->rpf.rpf_addr, pim->vrf->name); pnc->upstream_hash = hash_create_size(8192, pim_upstream_hash_key, pim_upstream_equal, hash_name); @@ -107,7 +107,7 @@ static struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim, } static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim, - struct prefix *addr) + pim_addr *addr) { struct pim_nexthop_cache *pnc = NULL; struct pim_rpf rpf; @@ -124,7 +124,7 @@ static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim, ZEBRA_NEXTHOP_REGISTER); if (PIM_DEBUG_PIM_NHT_DETAIL) zlog_debug( - "%s: NHT cache and zebra notification added for %pFX(%s)", + "%s: NHT cache and zebra notification added for %pPA(%s)", __func__, addr, pim->vrf->name); } @@ -134,7 +134,7 @@ static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim, /* TBD: this does several distinct things and should probably be split up. * (checking state vs. returning pnc vs. adding upstream vs. adding rp) */ -int pim_find_or_track_nexthop(struct pim_instance *pim, struct prefix *addr, +int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr *addr, struct pim_upstream *up, struct rp_info *rp, struct pim_nexthop_cache *out_pnc) { @@ -143,7 +143,7 @@ int pim_find_or_track_nexthop(struct pim_instance *pim, struct prefix *addr, pnc = pim_nht_get(pim, addr); - assertf(up || rp, "addr=%pFX", addr); + assertf(up || rp, "addr=%pPA", addr); if (rp != NULL) { ch_node = listnode_lookup(pnc->rp_list, rp); @@ -167,13 +167,11 @@ int pim_find_or_track_nexthop(struct pim_instance *pim, struct prefix *addr, void pim_nht_bsr_add(struct pim_instance *pim, struct in_addr addr) { struct pim_nexthop_cache *pnc; - struct prefix pfx; + pim_addr rpf_addr; - pfx.family = AF_INET; - pfx.prefixlen = IPV4_MAX_BITLEN; - pfx.u.prefix4 = addr; + rpf_addr = addr; - pnc = pim_nht_get(pim, &pfx); + pnc = pim_nht_get(pim, &rpf_addr); pnc->bsr_count++; } @@ -184,7 +182,7 @@ static void pim_nht_drop_maybe(struct pim_instance *pim, { if (PIM_DEBUG_PIM_NHT) zlog_debug( - "%s: NHT %pFX(%s) rp_list count:%d upstream count:%ld BSR count:%u", + "%s: NHT %pPA(%s) rp_list count:%d upstream count:%ld BSR count:%u", __func__, &pnc->rpf.rpf_addr, pim->vrf->name, pnc->rp_list->count, pnc->upstream_hash->count, pnc->bsr_count); @@ -206,7 +204,7 @@ static void pim_nht_drop_maybe(struct pim_instance *pim, } } -void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr, +void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr *addr, struct pim_upstream *up, struct rp_info *rp) { struct pim_nexthop_cache *pnc = NULL; @@ -217,7 +215,7 @@ void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr, lookup.rpf.rpf_addr = *addr; pnc = hash_lookup(pim->rpf_hash, &lookup); if (!pnc) { - zlog_warn("attempting to delete nonexistent NHT entry %pFX", + zlog_warn("attempting to delete nonexistent NHT entry %pPA", addr); return; } @@ -261,9 +259,7 @@ void pim_nht_bsr_del(struct pim_instance *pim, struct in_addr addr) if (addr.s_addr == INADDR_ANY) return; - lookup.rpf.rpf_addr.family = AF_INET; - lookup.rpf.rpf_addr.prefixlen = IPV4_MAX_BITLEN; - lookup.rpf.rpf_addr.u.prefix4 = addr; + lookup.rpf.rpf_addr = addr; pnc = hash_lookup(pim->rpf_hash, &lookup); @@ -288,9 +284,7 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, struct in_addr bsr_addr, struct nexthop *nh; struct interface *ifp; - lookup.rpf.rpf_addr.family = AF_INET; - lookup.rpf.rpf_addr.prefixlen = IPV4_MAX_BITLEN; - lookup.rpf.rpf_addr.u.prefix4 = bsr_addr; + lookup.rpf.rpf_addr = bsr_addr; pnc = hash_lookup(pim->rpf_hash, &lookup); if (!pnc || !CHECK_FLAG(pnc->flags, PIM_NEXTHOP_ANSWER_RECEIVED)) { @@ -497,9 +491,8 @@ uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp) static int pim_ecmp_nexthop_search(struct pim_instance *pim, struct pim_nexthop_cache *pnc, - struct pim_nexthop *nexthop, - struct prefix *src, struct prefix *grp, - int neighbor_needed) + struct pim_nexthop *nexthop, pim_addr *src, + struct prefix *grp, int neighbor_needed) { struct pim_neighbor *nbrs[router->multipath], *nbr = NULL; struct interface *ifps[router->multipath]; @@ -510,7 +503,6 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, uint8_t nh_iter = 0, found = 0; uint32_t i, num_nbrs = 0; pim_addr nh_addr = nexthop->mrib_nexthop_addr; - pim_addr src_addr = pim_addr_from_prefix(src); pim_addr grp_addr = pim_addr_from_prefix(grp); if (!pnc || !pnc->nexthop_num || !nexthop) @@ -544,7 +536,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, if (curr_route_valid && !pim_if_connected_to_source(nexthop->interface, - src_addr)) { + *src)) { nbr = pim_neighbor_find( nexthop->interface, nexthop->mrib_nexthop_addr); @@ -565,7 +557,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s: (%pPA,%pPA)(%s) current nexthop %s is valid, skipping new path selection", - __func__, &src_addr, + __func__, src, &grp_addr, pim->vrf->name, nexthop->interface->name); @@ -591,11 +583,12 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, #endif nbrs[i] = pim_neighbor_find(ifps[i], nhaddr); if (nbrs[i] || - pim_if_connected_to_source(ifps[i], src_addr)) + pim_if_connected_to_source(ifps[i], *src)) num_nbrs++; } } if (pim->ecmp_enable) { + struct prefix src_pfx; uint32_t consider = pnc->nexthop_num; if (neighbor_needed && num_nbrs < consider) @@ -605,7 +598,8 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, return 0; // PIM ECMP flag is enable then choose ECMP path. - hash_val = pim_compute_ecmp_hash(src, grp); + pim_addr_to_prefix(&src_pfx, *src); + hash_val = pim_compute_ecmp_hash(&src_pfx, grp); mod_val = hash_val % consider; } @@ -617,8 +611,8 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s %s: could not find interface for ifindex %d (address %pPA(%s))", - __FILE__, __func__, first_ifindex, - &src_addr, pim->vrf->name); + __FILE__, __func__, first_ifindex, src, + pim->vrf->name); if (nh_iter == mod_val) mod_val++; // Select nexthpath nh_iter++; @@ -629,15 +623,14 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, zlog_debug( "%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)", __func__, ifp->name, pim->vrf->name, - first_ifindex, &src_addr); + first_ifindex, src); if (nh_iter == mod_val) mod_val++; // Select nexthpath nh_iter++; continue; } - if (neighbor_needed && - !pim_if_connected_to_source(ifp, src_addr)) { + if (neighbor_needed && !pim_if_connected_to_source(ifp, *src)) { nbr = nbrs[nh_iter]; if (!nbr && !if_is_loopback(ifp)) { if (PIM_DEBUG_PIM_NHT) @@ -661,14 +654,14 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, #endif nexthop->mrib_metric_preference = pnc->distance; nexthop->mrib_route_metric = pnc->metric; - nexthop->last_lookup = src_addr; + nexthop->last_lookup = *src; nexthop->last_lookup_time = pim_time_monotonic_usec(); nexthop->nbr = nbr; found = 1; if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s: (%pPA,%pPA)(%s) selected nhop interface %s addr %pPAs mod_val %u iter %d ecmp %d", - __func__, &src_addr, &grp_addr, + __func__, src, &grp_addr, pim->vrf->name, ifp->name, &nh_addr, mod_val, nh_iter, pim->ecmp_enable); } @@ -708,12 +701,12 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) } if (cmd == ZEBRA_NEXTHOP_UPDATE) { - prefix_copy(&rpf.rpf_addr, &match); + rpf.rpf_addr = pim_addr_from_prefix(&match); pnc = pim_nexthop_cache_find(pim, &rpf); if (!pnc) { if (PIM_DEBUG_PIM_NHT) zlog_debug( - "%s: Skipping NHT update, addr %pFX is not in local cached DB.", + "%s: Skipping NHT update, addr %pPA is not in local cached DB.", __func__, &rpf.rpf_addr); return 0; } @@ -740,12 +733,10 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) */ #if PIM_IPV == 4 nexthop->type = NEXTHOP_TYPE_IPV4_IFINDEX; - nexthop->gate.ipv4 = - pnc->rpf.rpf_addr.u.prefix4; + nexthop->gate.ipv4 = pnc->rpf.rpf_addr; #else nexthop->type = NEXTHOP_TYPE_IPV6_IFINDEX; - nexthop->gate.ipv6 = - pnc->rpf.rpf_addr.u.prefix6; + nexthop->gate.ipv6 = pnc->rpf.rpf_addr; #endif break; #if PIM_IPV == 4 @@ -884,7 +875,7 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) } int pim_ecmp_nexthop_lookup(struct pim_instance *pim, - struct pim_nexthop *nexthop, struct prefix *src, + struct pim_nexthop *nexthop, pim_addr *src, struct prefix *grp, int neighbor_needed) { struct pim_nexthop_cache *pnc; @@ -898,11 +889,10 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, uint8_t i = 0; uint32_t hash_val = 0, mod_val = 0; uint32_t num_nbrs = 0; - pim_addr src_addr = pim_addr_from_prefix(src); if (PIM_DEBUG_PIM_NHT_DETAIL) zlog_debug("%s: Looking up: %pPA(%s), last lookup time: %lld", - __func__, &src_addr, pim->vrf->name, + __func__, src, pim->vrf->name, nexthop->last_lookup_time); rpf.rpf_addr = *src; @@ -917,13 +907,13 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, memset(nexthop_tab, 0, sizeof(struct pim_zlookup_nexthop) * router->multipath); num_ifindex = - zclient_lookup_nexthop(pim, nexthop_tab, router->multipath, - src_addr, PIM_NEXTHOP_LOOKUP_MAX); + zclient_lookup_nexthop(pim, nexthop_tab, router->multipath, src, + PIM_NEXTHOP_LOOKUP_MAX); if (num_ifindex < 1) { if (PIM_DEBUG_PIM_NHT) zlog_warn( "%s: could not find nexthop ifindex for address %pPA(%s)", - __func__, &src_addr, pim->vrf->name); + __func__, src, pim->vrf->name); return 0; } @@ -941,13 +931,14 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, nbrs[i] = pim_neighbor_find( ifps[i], nexthop_tab[i].nexthop_addr); if (nbrs[i] || - pim_if_connected_to_source(ifps[i], src_addr)) + pim_if_connected_to_source(ifps[i], *src)) num_nbrs++; } } // If PIM ECMP enable then choose ECMP path. if (pim->ecmp_enable) { + struct prefix src_pfx; uint32_t consider = num_ifindex; if (neighbor_needed && num_nbrs < consider) @@ -956,7 +947,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, if (consider == 0) return 0; - hash_val = pim_compute_ecmp_hash(src, grp); + pim_addr_to_prefix(&src_pfx, *src); + hash_val = pim_compute_ecmp_hash(&src_pfx, grp); mod_val = hash_val % consider; if (PIM_DEBUG_PIM_NHT_DETAIL) zlog_debug("%s: hash_val %u mod_val %u", __func__, @@ -972,8 +964,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s %s: could not find interface for ifindex %d (address %pPA(%s))", - __FILE__, __func__, first_ifindex, - &src_addr, pim->vrf->name); + __FILE__, __func__, first_ifindex, src, + pim->vrf->name); if (i == mod_val) mod_val++; i++; @@ -985,14 +977,13 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, zlog_debug( "%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)", __func__, ifp->name, pim->vrf->name, - first_ifindex, &src_addr); + first_ifindex, src); if (i == mod_val) mod_val++; i++; continue; } - if (neighbor_needed && - !pim_if_connected_to_source(ifp, src_addr)) { + if (neighbor_needed && !pim_if_connected_to_source(ifp, *src)) { nbr = nbrs[i]; if (PIM_DEBUG_PIM_NHT_DETAIL) zlog_debug("ifp name: %s(%s), pim nbr: %p", @@ -1005,8 +996,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, "%s: NBR (%pPA) not found on input interface %s(%s) (RPF for source %pPA)", __func__, &nexthop_tab[i].nexthop_addr, - ifp->name, pim->vrf->name, - &src_addr); + ifp->name, pim->vrf->name, src); i++; continue; } @@ -1017,7 +1007,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, zlog_debug( "%s: found nhop %pPA for addr %pPA interface %s(%s) metric %d dist %d", __func__, &nexthop_tab[i].nexthop_addr, - &src_addr, ifp->name, pim->vrf->name, + src, ifp->name, pim->vrf->name, nexthop_tab[i].route_metric, nexthop_tab[i].protocol_distance); /* update nexthop data */ @@ -1028,7 +1018,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, nexthop_tab[i].protocol_distance; nexthop->mrib_route_metric = nexthop_tab[i].route_metric; - nexthop->last_lookup = src_addr; + nexthop->last_lookup = *src; nexthop->last_lookup_time = pim_time_monotonic_usec(); nexthop->nbr = nbr; found = 1; @@ -1042,24 +1032,19 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, return 0; } -int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, - struct prefix *src, struct prefix *grp) +int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src, + struct prefix *grp) { struct pim_nexthop nhop; int vif_index; ifindex_t ifindex; - pim_addr src_addr; - - if (PIM_DEBUG_PIM_NHT_DETAIL) { - src_addr = pim_addr_from_prefix(src); - } memset(&nhop, 0, sizeof(nhop)); if (!pim_ecmp_nexthop_lookup(pim, &nhop, src, grp, 1)) { if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s: could not find nexthop ifindex for address %pPA(%s)", - __func__, &src_addr, pim->vrf->name); + __func__, src, pim->vrf->name); return -1; } @@ -1069,7 +1054,7 @@ int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, "%s: found nexthop ifindex=%d (interface %s(%s)) for address %pPA", __func__, ifindex, ifindex2ifname(ifindex, pim->vrf->vrf_id), - pim->vrf->name, &src_addr); + pim->vrf->name, src); vif_index = pim_if_find_vifindex_by_ifindex(pim, ifindex); @@ -1077,7 +1062,7 @@ int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) { zlog_debug( "%s: low vif_index=%d(%s) < 1 nexthop for address %pPA", - __func__, vif_index, pim->vrf->name, &src_addr); + __func__, vif_index, pim->vrf->name, src); } return -2; } diff --git a/pimd/pim_nht.h b/pimd/pim_nht.h index d51f622ece..65cffdb595 100644 --- a/pimd/pim_nht.h +++ b/pimd/pim_nht.h @@ -54,21 +54,21 @@ struct pim_nexthop_cache { }; int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS); -int pim_find_or_track_nexthop(struct pim_instance *pim, struct prefix *addr, +int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr *addr, struct pim_upstream *up, struct rp_info *rp, struct pim_nexthop_cache *out_pnc); -void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr, +void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr *addr, struct pim_upstream *up, struct rp_info *rp); struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim, struct pim_rpf *rpf); uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp); int pim_ecmp_nexthop_lookup(struct pim_instance *pim, - struct pim_nexthop *nexthop, struct prefix *src, + struct pim_nexthop *nexthop, pim_addr *src, struct prefix *grp, int neighbor_needed); void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient, struct pim_nexthop_cache *pnc, int command); -int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, - struct prefix *src, struct prefix *grp); +int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src, + struct prefix *grp); void pim_rp_nexthop_del(struct rp_info *rp_info); /* for RPF check on BSM message receipt */ From 8d61ad0f174a2c6cdc815da31fe21a86098c60cd Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:31:31 -0700 Subject: [PATCH 14/16] pimd: Handle rpf_addr in pim_ifchannel code Signed-off-by: sarita patra --- pimd/pim_ifchannel.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index e2d2ab97c9..ac2eee0a30 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -685,8 +685,7 @@ static void on_ifjoin_prune_pending_timer(struct thread *t) struct pim_rpf rpf; rpf.source_nexthop.interface = ifp; - pim_addr_to_prefix(&rpf.rpf_addr, - pim_ifp->primary_address); + rpf.rpf_addr = pim_ifp->primary_address; pim_jp_agg_single_upstream_send( &rpf, ch->upstream, 0); } @@ -751,7 +750,7 @@ static void check_recv_upstream(int is_join, struct interface *recv_ifp, return; } - rpf_addr = pim_addr_from_prefix(&up->rpf.rpf_addr); + rpf_addr = up->rpf.rpf_addr; /* upstream directed to RPF'(S,G) ? */ if (pim_addr_cmp(upstream, rpf_addr)) { From b502add84f0c6191c9e7d27e844284b1fb19a03f Mon Sep 17 00:00:00 2001 From: sarita patra Date: Wed, 27 Apr 2022 01:55:57 -0700 Subject: [PATCH 15/16] pimd: Adjust rpf_addr in show commands Signed-off-by: sarita patra --- pimd/pim_cmd_common.c | 53 +++++++++++++++++-------------------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/pimd/pim_cmd_common.c b/pimd/pim_cmd_common.c index ebd7aca519..76a7c4b122 100644 --- a/pimd/pim_cmd_common.c +++ b/pimd/pim_cmd_common.c @@ -898,13 +898,9 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json) } frr_each (rb_pim_upstream, &pim->upstream_head, up) { - char rpf_addr_str[PREFIX_STRLEN]; const char *rpf_ifname; struct pim_rpf *rpf = &up->rpf; - pim_addr_dump("", &rpf->rpf_addr, rpf_addr_str, - sizeof(rpf_addr_str)); - rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop .interface->name @@ -932,8 +928,8 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json) json_object_string_add(json_row, "group", grp_str); json_object_string_add(json_row, "rpfInterface", rpf_ifname); - json_object_string_add(json_row, "rpfAddress", - rpf_addr_str); + json_object_string_addf(json_row, "rpfAddress", "%pPA", + &rpf->rpf_addr); json_object_string_addf( json_row, "ribNexthop", "%pPAs", &rpf->source_nexthop.mrib_nexthop_addr); @@ -947,9 +943,9 @@ void pim_show_rpf(struct pim_instance *pim, struct vty *vty, json_object *json) } else { vty_out(vty, - "%-15pPAs %-15pPAs %-16s %-15s %-15pPAs %6d %4d\n", + "%-15pPAs %-15pPAs %-16s %-15pPA %-15pPAs %6d %4d\n", &up->sg.src, &up->sg.grp, rpf_ifname, - rpf_addr_str, + &rpf->rpf_addr, &rpf->source_nexthop.mrib_nexthop_addr, rpf->source_nexthop.mrib_route_metric, rpf->source_nexthop.mrib_metric_preference); @@ -1352,9 +1348,9 @@ void pim_show_upstream(struct pim_instance *pim, struct vty *vty, if (!up->t_join_timer && up->rpf.source_nexthop.interface) { struct pim_neighbor *nbr; - nbr = pim_neighbor_find_prefix( + nbr = pim_neighbor_find( up->rpf.source_nexthop.interface, - &up->rpf.rpf_addr); + up->rpf.rpf_addr); if (nbr) pim_time_timer_to_hhmmss(join_timer, sizeof(join_timer), @@ -1418,7 +1414,7 @@ void pim_show_upstream(struct pim_instance *pim, struct vty *vty, rpg = RP(pim, up->sg.grp); json_object_string_addf(json_row, "rpfAddress", - "%pFX", &rpg->rpf_addr); + "%pPA", &rpg->rpf_addr); } else { json_object_string_add(json_row, "rpfAddress", src_str); @@ -1534,15 +1530,11 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj) "Source Group RpfIface RibNextHop RpfAddress \n"); frr_each (rb_pim_upstream, &pim->upstream_head, up) { - char rpf_addr_str[PREFIX_STRLEN]; struct pim_rpf *rpf; const char *rpf_ifname; rpf = &up->rpf; - pim_addr_dump("", &rpf->rpf_addr, rpf_addr_str, - sizeof(rpf_addr_str)); - rpf_ifname = rpf->source_nexthop.interface ? rpf->source_nexthop .interface->name @@ -1573,14 +1565,15 @@ void pim_show_upstream_rpf(struct pim_instance *pim, struct vty *vty, bool uj) json_object_string_addf( json_row, "ribNexthop", "%pPAs", &rpf->source_nexthop.mrib_nexthop_addr); - json_object_string_add(json_row, "rpfAddress", - rpf_addr_str); + json_object_string_addf(json_row, "rpfAddress", "%pPA", + &rpf->rpf_addr); json_object_object_add(json_group, src_str, json_row); } else { - vty_out(vty, "%-15pPAs %-15pPAs %-16s %-15pPA %-15s\n", + vty_out(vty, + "%-15pPAs %-15pPAs %-16s %-15pPA %-15pPA\n", &up->sg.src, &up->sg.grp, rpf_ifname, &rpf->source_nexthop.mrib_nexthop_addr, - rpf_addr_str); + &rpf->rpf_addr); } } @@ -2657,11 +2650,10 @@ static int pim_print_vty_pnc_cache_walkcb(struct hash_bucket *bucket, void *arg) for (nh_node = pnc->nexthop; nh_node; nh_node = nh_node->next) { first_ifindex = nh_node->ifindex; - pim_addr rpf_addr = pim_addr_from_prefix(&pnc->rpf.rpf_addr); ifp = if_lookup_by_index(first_ifindex, pim->vrf->vrf_id); - vty_out(vty, "%-15pPAs ", &rpf_addr); + vty_out(vty, "%-15pPA ", &pnc->rpf.rpf_addr); vty_out(vty, "%-16s ", ifp ? ifp->name : "NULL"); #if PIM_IPV == 4 vty_out(vty, "%pI4 ", &nh_node->gate.ipv4); @@ -2688,19 +2680,17 @@ static int pim_print_json_pnc_cache_walkcb(struct hash_bucket *backet, json_object *json_arr = NULL; for (nh_node = pnc->nexthop; nh_node; nh_node = nh_node->next) { - pim_addr rpf_addr; - first_ifindex = nh_node->ifindex; - rpf_addr = pim_addr_from_prefix(&pnc->rpf.rpf_addr); ifp = if_lookup_by_index(first_ifindex, pim->vrf->vrf_id); - snprintfrr(addr_str, sizeof(addr_str), "%pPAs", &rpf_addr); + snprintfrr(addr_str, sizeof(addr_str), "%pPA", + &pnc->rpf.rpf_addr); json_object_object_get_ex(cwd->json_obj, addr_str, &json_row); if (!json_row) { json_row = json_object_new_object(); - json_object_string_addf(json_row, "address", "%pPAs", - &rpf_addr); - json_object_object_addf(cwd->json_obj, json_row, - "%pPAs", &rpf_addr); + json_object_string_addf(json_row, "address", "%pPA", + &pnc->rpf.rpf_addr); + json_object_object_addf(cwd->json_obj, json_row, "%pPA", + &pnc->rpf.rpf_addr); json_arr = json_object_new_array(); json_object_object_add(json_row, "nexthops", json_arr); } @@ -2722,7 +2712,6 @@ static int pim_print_json_pnc_cache_walkcb(struct hash_bucket *backet, int pim_show_nexthop_lookup_cmd_helper(const char *vrf, struct vty *vty, pim_addr source, pim_addr group) { - struct prefix nht_p; int result = 0; pim_addr vif_source; struct prefix grp; @@ -2752,11 +2741,11 @@ int pim_show_nexthop_lookup_cmd_helper(const char *vrf, struct vty *vty, if (!pim_rp_set_upstream_addr(v->info, &vif_source, source, group)) return CMD_SUCCESS; - pim_addr_to_prefix(&nht_p, vif_source); pim_addr_to_prefix(&grp, group); memset(&nexthop, 0, sizeof(nexthop)); - result = pim_ecmp_nexthop_lookup(v->info, &nexthop, &nht_p, &grp, 0); + result = + pim_ecmp_nexthop_lookup(v->info, &nexthop, vif_source, &grp, 0); if (!result) { vty_out(vty, From e6e530063649d1197d054c8b87580f5a64407916 Mon Sep 17 00:00:00 2001 From: sarita patra Date: Mon, 23 May 2022 05:18:28 -0700 Subject: [PATCH 16/16] pim6d: Pass pim_addr for pim_nht callbacks. For pim callbacks, we pass pim_addr as value, not pointer. So making it consistent for pim_nht callbacks. Signed-off-by: sarita patra --- pimd/pim_bsm.c | 2 +- pimd/pim_nht.c | 82 +++++++++++++++++++++------------------------ pimd/pim_nht.h | 8 ++--- pimd/pim_rp.c | 36 ++++++++++---------- pimd/pim_rpf.c | 6 ++-- pimd/pim_tib.c | 6 ++-- pimd/pim_upstream.c | 2 +- pimd/pim_vxlan.c | 4 +-- 8 files changed, 71 insertions(+), 75 deletions(-) diff --git a/pimd/pim_bsm.c b/pimd/pim_bsm.c index bd5b1a2cdf..e5e621de0d 100644 --- a/pimd/pim_bsm.c +++ b/pimd/pim_bsm.c @@ -624,7 +624,7 @@ void pim_bsm_clear(struct pim_instance *pim) __func__, &nht_p); } - pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); + pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info); if (!pim_get_all_mcast_group(&g_all)) return; diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 95ed09d227..94906d3426 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -107,7 +107,7 @@ static struct pim_nexthop_cache *pim_nexthop_cache_add(struct pim_instance *pim, } static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim, - pim_addr *addr) + pim_addr addr) { struct pim_nexthop_cache *pnc = NULL; struct pim_rpf rpf; @@ -115,7 +115,7 @@ static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim, zclient = pim_zebra_zclient_get(); memset(&rpf, 0, sizeof(rpf)); - rpf.rpf_addr = *addr; + rpf.rpf_addr = addr; pnc = pim_nexthop_cache_find(pim, &rpf); if (!pnc) { @@ -125,7 +125,7 @@ static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT_DETAIL) zlog_debug( "%s: NHT cache and zebra notification added for %pPA(%s)", - __func__, addr, pim->vrf->name); + __func__, &addr, pim->vrf->name); } return pnc; @@ -134,7 +134,7 @@ static struct pim_nexthop_cache *pim_nht_get(struct pim_instance *pim, /* TBD: this does several distinct things and should probably be split up. * (checking state vs. returning pnc vs. adding upstream vs. adding rp) */ -int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr *addr, +int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr addr, struct pim_upstream *up, struct rp_info *rp, struct pim_nexthop_cache *out_pnc) { @@ -143,7 +143,7 @@ int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr *addr, pnc = pim_nht_get(pim, addr); - assertf(up || rp, "addr=%pPA", addr); + assertf(up || rp, "addr=%pPA", &addr); if (rp != NULL) { ch_node = listnode_lookup(pnc->rp_list, rp); @@ -167,11 +167,8 @@ int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr *addr, void pim_nht_bsr_add(struct pim_instance *pim, struct in_addr addr) { struct pim_nexthop_cache *pnc; - pim_addr rpf_addr; - rpf_addr = addr; - - pnc = pim_nht_get(pim, &rpf_addr); + pnc = pim_nht_get(pim, addr); pnc->bsr_count++; } @@ -204,7 +201,7 @@ static void pim_nht_drop_maybe(struct pim_instance *pim, } } -void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr *addr, +void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr addr, struct pim_upstream *up, struct rp_info *rp) { struct pim_nexthop_cache *pnc = NULL; @@ -212,11 +209,11 @@ void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr *addr, struct pim_upstream *upstream = NULL; /* Remove from RPF hash if it is the last entry */ - lookup.rpf.rpf_addr = *addr; + lookup.rpf.rpf_addr = addr; pnc = hash_lookup(pim->rpf_hash, &lookup); if (!pnc) { zlog_warn("attempting to delete nonexistent NHT entry %pPA", - addr); + &addr); return; } @@ -390,8 +387,8 @@ bool pim_nht_bsr_rpf_check(struct pim_instance *pim, struct in_addr bsr_addr, if (!nbr) continue; - return nh->ifindex == src_ifp->ifindex - && nhaddr.s_addr == src_ip.s_addr; + return nh->ifindex == src_ifp->ifindex && + (!pim_addr_cmp(nhaddr, src_ip)); } return false; } @@ -421,7 +418,7 @@ static void pim_update_rp_nh(struct pim_instance *pim, // Compute PIM RPF using cached nexthop if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, - &rp_info->rp.rpf_addr, + rp_info->rp.rpf_addr, &rp_info->group, 1)) pim_rp_nexthop_del(rp_info); } @@ -491,7 +488,7 @@ uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp) static int pim_ecmp_nexthop_search(struct pim_instance *pim, struct pim_nexthop_cache *pnc, - struct pim_nexthop *nexthop, pim_addr *src, + struct pim_nexthop *nexthop, pim_addr src, struct prefix *grp, int neighbor_needed) { struct pim_neighbor *nbrs[router->multipath], *nbr = NULL; @@ -536,7 +533,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, if (curr_route_valid && !pim_if_connected_to_source(nexthop->interface, - *src)) { + src)) { nbr = pim_neighbor_find( nexthop->interface, nexthop->mrib_nexthop_addr); @@ -557,7 +554,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s: (%pPA,%pPA)(%s) current nexthop %s is valid, skipping new path selection", - __func__, src, + __func__, &src, &grp_addr, pim->vrf->name, nexthop->interface->name); @@ -582,8 +579,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, pim_addr nhaddr = nh_node->gate.ipv6; #endif nbrs[i] = pim_neighbor_find(ifps[i], nhaddr); - if (nbrs[i] || - pim_if_connected_to_source(ifps[i], *src)) + if (nbrs[i] || pim_if_connected_to_source(ifps[i], src)) num_nbrs++; } } @@ -598,7 +594,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, return 0; // PIM ECMP flag is enable then choose ECMP path. - pim_addr_to_prefix(&src_pfx, *src); + pim_addr_to_prefix(&src_pfx, src); hash_val = pim_compute_ecmp_hash(&src_pfx, grp); mod_val = hash_val % consider; } @@ -611,7 +607,7 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s %s: could not find interface for ifindex %d (address %pPA(%s))", - __FILE__, __func__, first_ifindex, src, + __FILE__, __func__, first_ifindex, &src, pim->vrf->name); if (nh_iter == mod_val) mod_val++; // Select nexthpath @@ -623,14 +619,14 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, zlog_debug( "%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)", __func__, ifp->name, pim->vrf->name, - first_ifindex, src); + first_ifindex, &src); if (nh_iter == mod_val) mod_val++; // Select nexthpath nh_iter++; continue; } - if (neighbor_needed && !pim_if_connected_to_source(ifp, *src)) { + if (neighbor_needed && !pim_if_connected_to_source(ifp, src)) { nbr = nbrs[nh_iter]; if (!nbr && !if_is_loopback(ifp)) { if (PIM_DEBUG_PIM_NHT) @@ -654,14 +650,14 @@ static int pim_ecmp_nexthop_search(struct pim_instance *pim, #endif nexthop->mrib_metric_preference = pnc->distance; nexthop->mrib_route_metric = pnc->metric; - nexthop->last_lookup = *src; + nexthop->last_lookup = src; nexthop->last_lookup_time = pim_time_monotonic_usec(); nexthop->nbr = nbr; found = 1; if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s: (%pPA,%pPA)(%s) selected nhop interface %s addr %pPAs mod_val %u iter %d ecmp %d", - __func__, src, &grp_addr, + __func__, &src, &grp_addr, pim->vrf->name, ifp->name, &nh_addr, mod_val, nh_iter, pim->ecmp_enable); } @@ -875,7 +871,7 @@ int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS) } int pim_ecmp_nexthop_lookup(struct pim_instance *pim, - struct pim_nexthop *nexthop, pim_addr *src, + struct pim_nexthop *nexthop, pim_addr src, struct prefix *grp, int neighbor_needed) { struct pim_nexthop_cache *pnc; @@ -892,10 +888,10 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT_DETAIL) zlog_debug("%s: Looking up: %pPA(%s), last lookup time: %lld", - __func__, src, pim->vrf->name, + __func__, &src, pim->vrf->name, nexthop->last_lookup_time); - rpf.rpf_addr = *src; + rpf.rpf_addr = src; pnc = pim_nexthop_cache_find(pim, &rpf); if (pnc) { @@ -913,7 +909,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) zlog_warn( "%s: could not find nexthop ifindex for address %pPA(%s)", - __func__, src, pim->vrf->name); + __func__, &src, pim->vrf->name); return 0; } @@ -930,8 +926,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, if (ifps[i]) { nbrs[i] = pim_neighbor_find( ifps[i], nexthop_tab[i].nexthop_addr); - if (nbrs[i] || - pim_if_connected_to_source(ifps[i], *src)) + if (nbrs[i] || pim_if_connected_to_source(ifps[i], src)) num_nbrs++; } } @@ -947,7 +942,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, if (consider == 0) return 0; - pim_addr_to_prefix(&src_pfx, *src); + pim_addr_to_prefix(&src_pfx, src); hash_val = pim_compute_ecmp_hash(&src_pfx, grp); mod_val = hash_val % consider; if (PIM_DEBUG_PIM_NHT_DETAIL) @@ -964,7 +959,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s %s: could not find interface for ifindex %d (address %pPA(%s))", - __FILE__, __func__, first_ifindex, src, + __FILE__, __func__, first_ifindex, &src, pim->vrf->name); if (i == mod_val) mod_val++; @@ -977,13 +972,13 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, zlog_debug( "%s: multicast not enabled on input interface %s(%s) (ifindex=%d, RPF for source %pPA)", __func__, ifp->name, pim->vrf->name, - first_ifindex, src); + first_ifindex, &src); if (i == mod_val) mod_val++; i++; continue; } - if (neighbor_needed && !pim_if_connected_to_source(ifp, *src)) { + if (neighbor_needed && !pim_if_connected_to_source(ifp, src)) { nbr = nbrs[i]; if (PIM_DEBUG_PIM_NHT_DETAIL) zlog_debug("ifp name: %s(%s), pim nbr: %p", @@ -996,7 +991,8 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, "%s: NBR (%pPA) not found on input interface %s(%s) (RPF for source %pPA)", __func__, &nexthop_tab[i].nexthop_addr, - ifp->name, pim->vrf->name, src); + ifp->name, pim->vrf->name, + &src); i++; continue; } @@ -1007,7 +1003,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, zlog_debug( "%s: found nhop %pPA for addr %pPA interface %s(%s) metric %d dist %d", __func__, &nexthop_tab[i].nexthop_addr, - src, ifp->name, pim->vrf->name, + &src, ifp->name, pim->vrf->name, nexthop_tab[i].route_metric, nexthop_tab[i].protocol_distance); /* update nexthop data */ @@ -1018,7 +1014,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, nexthop_tab[i].protocol_distance; nexthop->mrib_route_metric = nexthop_tab[i].route_metric; - nexthop->last_lookup = *src; + nexthop->last_lookup = src; nexthop->last_lookup_time = pim_time_monotonic_usec(); nexthop->nbr = nbr; found = 1; @@ -1032,7 +1028,7 @@ int pim_ecmp_nexthop_lookup(struct pim_instance *pim, return 0; } -int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src, +int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr src, struct prefix *grp) { struct pim_nexthop nhop; @@ -1044,7 +1040,7 @@ int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src, if (PIM_DEBUG_PIM_NHT) zlog_debug( "%s: could not find nexthop ifindex for address %pPA(%s)", - __func__, src, pim->vrf->name); + __func__, &src, pim->vrf->name); return -1; } @@ -1054,7 +1050,7 @@ int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src, "%s: found nexthop ifindex=%d (interface %s(%s)) for address %pPA", __func__, ifindex, ifindex2ifname(ifindex, pim->vrf->vrf_id), - pim->vrf->name, src); + pim->vrf->name, &src); vif_index = pim_if_find_vifindex_by_ifindex(pim, ifindex); @@ -1062,7 +1058,7 @@ int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src, if (PIM_DEBUG_PIM_NHT) { zlog_debug( "%s: low vif_index=%d(%s) < 1 nexthop for address %pPA", - __func__, vif_index, pim->vrf->name, src); + __func__, vif_index, pim->vrf->name, &src); } return -2; } diff --git a/pimd/pim_nht.h b/pimd/pim_nht.h index 65cffdb595..c5c607e5ab 100644 --- a/pimd/pim_nht.h +++ b/pimd/pim_nht.h @@ -54,20 +54,20 @@ struct pim_nexthop_cache { }; int pim_parse_nexthop_update(ZAPI_CALLBACK_ARGS); -int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr *addr, +int pim_find_or_track_nexthop(struct pim_instance *pim, pim_addr addr, struct pim_upstream *up, struct rp_info *rp, struct pim_nexthop_cache *out_pnc); -void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr *addr, +void pim_delete_tracked_nexthop(struct pim_instance *pim, pim_addr addr, struct pim_upstream *up, struct rp_info *rp); struct pim_nexthop_cache *pim_nexthop_cache_find(struct pim_instance *pim, struct pim_rpf *rpf); uint32_t pim_compute_ecmp_hash(struct prefix *src, struct prefix *grp); int pim_ecmp_nexthop_lookup(struct pim_instance *pim, - struct pim_nexthop *nexthop, pim_addr *src, + struct pim_nexthop *nexthop, pim_addr src, struct prefix *grp, int neighbor_needed); void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient, struct pim_nexthop_cache *pnc, int command); -int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr *src, +int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, pim_addr src, struct prefix *grp); void pim_rp_nexthop_del(struct rp_info *rp_info); diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index 657e776c7f..aa31a67036 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -406,7 +406,7 @@ void pim_upstream_update(struct pim_instance *pim, struct pim_upstream *up) zlog_debug( "%s: Deregister upstream %s addr %pPA with Zebra NHT", __func__, up->sg_str, &old_upstream_addr); - pim_delete_tracked_nexthop(pim, &old_upstream_addr, up, NULL); + pim_delete_tracked_nexthop(pim, old_upstream_addr, up, NULL); } /* Update the upstream address */ @@ -558,12 +558,12 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, pim_rp_check_interfaces(pim, rp_all); pim_rp_refresh_group_to_rp_mapping(pim); - pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_all, + pim_find_or_track_nexthop(pim, nht_p, NULL, rp_all, NULL); if (!pim_ecmp_nexthop_lookup(pim, &rp_all->rp.source_nexthop, - &nht_p, &rp_all->group, 1)) + nht_p, &rp_all->group, 1)) return PIM_RP_NO_PATH; return PIM_SUCCESS; } @@ -655,8 +655,8 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: NHT Register RP addr %pPA grp %pFX with Zebra ", __func__, &nht_p, &rp_info->group); - pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL); - if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, &nht_p, + pim_find_or_track_nexthop(pim, nht_p, NULL, rp_info, NULL); + if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, nht_p, &rp_info->group, 1)) return PIM_RP_NO_PATH; @@ -748,7 +748,7 @@ int pim_rp_del(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: Deregister RP addr %pPA with Zebra ", __func__, &nht_p); - pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); + pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info); if (!pim_get_all_mcast_group(&g_all)) return PIM_RP_BAD_ADDRESS; @@ -882,7 +882,7 @@ int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: Deregister RP addr %pPA with Zebra ", __func__, &nht_p); - pim_delete_tracked_nexthop(pim, &nht_p, NULL, rp_info); + pim_delete_tracked_nexthop(pim, nht_p, NULL, rp_info); } pim_rp_nexthop_del(rp_info); @@ -919,8 +919,8 @@ int pim_rp_change(struct pim_instance *pim, pim_addr new_rp_addr, zlog_debug("%s: NHT Register RP addr %pPA grp %pFX with Zebra ", __func__, &nht_p, &rp_info->group); - pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL); - if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, &nht_p, + pim_find_or_track_nexthop(pim, nht_p, NULL, rp_info, NULL); + if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, nht_p, &rp_info->group, 1)) { route_unlock_node(rn); return PIM_RP_NO_PATH; @@ -947,9 +947,9 @@ void pim_rp_setup(struct pim_instance *pim) nht_p = rp_info->rp.rpf_addr; - pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL); + pim_find_or_track_nexthop(pim, nht_p, NULL, rp_info, NULL); if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, - &nht_p, &rp_info->group, 1)) + nht_p, &rp_info->group, 1)) if (PIM_DEBUG_PIM_NHT_RP) zlog_debug( "Unable to lookup nexthop for rp specified"); @@ -1024,9 +1024,10 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim) __func__, &rp_info->rp.rpf_addr); else - zlog_debug("%s: %pPA: i am no longer rp", - __func__, - &rp_info->rp.rpf_addr); + zlog_debug( + "%s: %pPA: i am no longer rp", + __func__, + &rp_info->rp.rpf_addr); } } } @@ -1081,10 +1082,10 @@ struct pim_rpf *pim_rp_g(struct pim_instance *pim, pim_addr group) zlog_debug( "%s: NHT Register RP addr %pPA grp %pFX with Zebra", __func__, &nht_p, &rp_info->group); - pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, NULL); + pim_find_or_track_nexthop(pim, nht_p, NULL, rp_info, NULL); pim_rpf_set_refresh_time(pim); (void)pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, - &nht_p, &rp_info->group, 1); + nht_p, &rp_info->group, 1); return (&rp_info->rp); } @@ -1288,8 +1289,7 @@ void pim_resolve_rp_nh(struct pim_instance *pim, struct pim_neighbor *nbr) nht_p = rp_info->rp.rpf_addr; memset(&pnc, 0, sizeof(struct pim_nexthop_cache)); - if (!pim_find_or_track_nexthop(pim, &nht_p, NULL, rp_info, - &pnc)) + if (!pim_find_or_track_nexthop(pim, nht_p, NULL, rp_info, &pnc)) continue; for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) { diff --git a/pimd/pim_rpf.c b/pimd/pim_rpf.c index 13a7c12dd3..a28278c581 100644 --- a/pimd/pim_rpf.c +++ b/pimd/pim_rpf.c @@ -231,9 +231,9 @@ enum pim_rpf_result pim_rpf_update(struct pim_instance *pim, if ((pim_addr_is_any(up->sg.src) && I_am_RP(pim, up->sg.grp)) || PIM_UPSTREAM_FLAG_TEST_FHR(up->flags)) neigh_needed = false; - pim_find_or_track_nexthop(pim, &up->upstream_addr, up, NULL, NULL); - if (!pim_ecmp_nexthop_lookup(pim, &rpf->source_nexthop, &src, &grp, - neigh_needed)) { + pim_find_or_track_nexthop(pim, up->upstream_addr, up, NULL, NULL); + if (!pim_ecmp_nexthop_lookup(pim, &rpf->source_nexthop, src, &grp, + neigh_needed)) { /* Route is Deleted in Zebra, reset the stored NH data */ pim_upstream_rpf_clear(pim, up); pim_rpf_cost_change(pim, up, saved_mrib_route_metric); diff --git a/pimd/pim_tib.c b/pimd/pim_tib.c index 81dcfc9269..3b73c430b0 100644 --- a/pimd/pim_tib.c +++ b/pimd/pim_tib.c @@ -49,13 +49,13 @@ tib_sg_oil_setup(struct pim_instance *pim, pim_sgaddr sg, struct interface *oif) if (up) { memcpy(&nexthop, &up->rpf.source_nexthop, sizeof(struct pim_nexthop)); - pim_ecmp_nexthop_lookup(pim, &nexthop, &vif_source, &grp, 0); + pim_ecmp_nexthop_lookup(pim, &nexthop, vif_source, &grp, 0); if (nexthop.interface) input_iface_vif_index = pim_if_find_vifindex_by_ifindex( pim, nexthop.interface->ifindex); } else - input_iface_vif_index = pim_ecmp_fib_lookup_if_vif_index( - pim, &vif_source, &grp); + input_iface_vif_index = + pim_ecmp_fib_lookup_if_vif_index(pim, vif_source, &grp); if (PIM_DEBUG_ZEBRA) zlog_debug("%s: NHT %pSG vif_source %pPAs vif_index:%d", diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 8190162a2a..4dcdee34f0 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -270,7 +270,7 @@ struct pim_upstream *pim_upstream_del(struct pim_instance *pim, zlog_debug( "%s: Deregister upstream %s addr %pPA with Zebra NHT", __func__, up->sg_str, &up->upstream_addr); - pim_delete_tracked_nexthop(pim, &up->upstream_addr, up, NULL); + pim_delete_tracked_nexthop(pim, up->upstream_addr, up, NULL); } XFREE(MTYPE_PIM_UPSTREAM, up); diff --git a/pimd/pim_vxlan.c b/pimd/pim_vxlan.c index d6bfc0a256..5b63d04936 100644 --- a/pimd/pim_vxlan.c +++ b/pimd/pim_vxlan.c @@ -352,8 +352,8 @@ static void pim_vxlan_orig_mr_up_add(struct pim_vxlan_sg *vxlan_sg) * iif */ if (!PIM_UPSTREAM_FLAG_TEST_STATIC_IIF(up->flags)) { - pim_delete_tracked_nexthop( - vxlan_sg->pim, &up->upstream_addr, up, NULL); + pim_delete_tracked_nexthop(vxlan_sg->pim, + up->upstream_addr, up, NULL); } /* We are acting FHR; clear out use_rpt setting if any */ pim_upstream_update_use_rpt(up, false /*update_mroute*/);