diff options
Diffstat (limited to 'pimd/pim_rp.c')
| -rw-r--r-- | pimd/pim_rp.c | 134 |
1 files changed, 45 insertions, 89 deletions
diff --git a/pimd/pim_rp.c b/pimd/pim_rp.c index e6de991a14..4fd19b5dbe 100644 --- a/pimd/pim_rp.c +++ b/pimd/pim_rp.c @@ -40,20 +40,6 @@ #include "pim_ssm.h" #include "termtable.h" -/* Cleanup pim->rpf_hash each node data */ -void pim_rp_list_hash_clean(void *data) -{ - struct pim_nexthop_cache *pnc = (struct pim_nexthop_cache *)data; - - list_delete(&pnc->rp_list); - - hash_clean_and_free(&pnc->upstream_hash, NULL); - if (pnc->nexthop) - nexthops_free(pnc->nexthop); - - XFREE(MTYPE_PIM_NEXTHOP_CACHE, pnc); -} - static void pim_rp_info_free(struct rp_info *rp_info) { XFREE(MTYPE_PIM_FILTER_NAME, rp_info->plist); @@ -97,14 +83,7 @@ void pim_rp_init(struct pim_instance *pim) rp_info = XCALLOC(MTYPE_PIM_RP, sizeof(*rp_info)); - if (!pim_get_all_mcast_group(&rp_info->group)) { - flog_err(EC_LIB_DEVELOPMENT, - "Unable to convert all-multicast prefix"); - list_delete(&pim->rp_list); - route_table_finish(pim->rp_table); - XFREE(MTYPE_PIM_RP, rp_info); - return; - } + pim_get_all_mcast_group(&rp_info->group); rp_info->rp.rpf_addr = PIMADDR_ANY; listnode_add(pim->rp_list, rp_info); @@ -343,7 +322,9 @@ struct rp_info *pim_rp_find_match_group(struct pim_instance *pim, */ void pim_rp_refresh_group_to_rp_mapping(struct pim_instance *pim) { +#if PIM_IPV == 4 pim_msdp_i_am_rp_changed(pim); +#endif /* PIM_IPV == 4 */ pim_upstream_reeval_use_rpt(pim); } @@ -437,7 +418,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_nht_delete_tracked(pim, old_upstream_addr, up, NULL); } /* Update the upstream address */ @@ -522,11 +503,7 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, rp_info->plist = XSTRDUP(MTYPE_PIM_FILTER_NAME, plist); } else { - - if (!pim_get_all_mcast_group(&group_all)) { - XFREE(MTYPE_PIM_RP, rp_info); - return PIM_GROUP_BAD_ADDRESS; - } + pim_get_all_mcast_group(&group_all); rp_all = pim_rp_find_match_group(pim, &group_all); /* @@ -592,12 +569,10 @@ int pim_rp_new(struct pim_instance *pim, pim_addr rp_addr, struct prefix group, zlog_debug("new RP %pPA for %pFX is ourselves", &rp_all->rp.rpf_addr, &rp_all->group); pim_rp_refresh_group_to_rp_mapping(pim); - pim_find_or_track_nexthop(pim, nht_p, NULL, rp_all, - NULL); + pim_nht_find_or_track(pim, nht_p, NULL, rp_all, NULL); - if (!pim_ecmp_nexthop_lookup(pim, - &rp_all->rp.source_nexthop, - nht_p, &rp_all->group, 1)) + if (!pim_nht_lookup_ecmp(pim, &rp_all->rp.source_nexthop, nht_p, + &rp_all->group, true)) return PIM_RP_NO_PATH; return PIM_SUCCESS; } @@ -692,9 +667,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, - &rp_info->group, 1)) + pim_nht_find_or_track(pim, nht_p, NULL, rp_info, NULL); + if (!pim_nht_lookup_ecmp(pim, &rp_info->rp.source_nexthop, nht_p, &rp_info->group, true)) return PIM_RP_NO_PATH; return PIM_SUCCESS; @@ -706,9 +680,10 @@ void pim_rp_del_config(struct pim_instance *pim, pim_addr rp_addr, struct prefix group; int result; - if (group_range == NULL) - result = pim_get_all_mcast_group(&group); - else + if (group_range == NULL) { + result = 0; + pim_get_all_mcast_group(&group); + } else result = str2prefix(group_range, &group); if (!result) { @@ -785,11 +760,9 @@ 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); - - if (!pim_get_all_mcast_group(&g_all)) - return PIM_RP_BAD_ADDRESS; + pim_nht_delete_tracked(pim, nht_p, NULL, rp_info); + pim_get_all_mcast_group(&g_all); rp_all = pim_rp_find_match_group(pim, &g_all); if (rp_all == rp_info) { @@ -919,10 +892,10 @@ 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_nht_delete_tracked(pim, nht_p, NULL, rp_info); } - pim_rp_nexthop_del(rp_info); + pim_nht_rp_del(rp_info); listnode_delete(pim->rp_list, rp_info); /* Update the new RP address*/ @@ -956,9 +929,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, - &rp_info->group, 1)) { + pim_nht_find_or_track(pim, nht_p, NULL, rp_info, NULL); + if (!pim_nht_lookup_ecmp(pim, &rp_info->rp.source_nexthop, nht_p, &rp_info->group, true)) { route_unlock_node(rn); return PIM_RP_NO_PATH; } @@ -984,13 +956,14 @@ 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); - if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, - nht_p, &rp_info->group, 1)) { + pim_nht_find_or_track(pim, nht_p, NULL, rp_info, NULL); + if (!pim_nht_lookup_ecmp(pim, &rp_info->rp.source_nexthop, nht_p, &rp_info->group, + true)) { if (PIM_DEBUG_PIM_NHT_RP) - zlog_debug( - "Unable to lookup nexthop for rp specified"); - pim_rp_nexthop_del(rp_info); + zlog_debug("%s: unable to lookup nexthop for rp %pPA", __func__, + &rp_info->rp.rpf_addr); + + pim_nht_rp_del(rp_info); } } } @@ -1030,7 +1003,9 @@ void pim_rp_check_on_if_add(struct pim_interface *pim_ifp) } if (i_am_rp_changed) { +#if PIM_IPV == 4 pim_msdp_i_am_rp_changed(pim); +#endif /* PIM_IPV == 4 */ pim_upstream_reeval_use_rpt(pim); } } @@ -1072,7 +1047,9 @@ void pim_i_am_rp_re_evaluate(struct pim_instance *pim) } if (i_am_rp_changed) { +#if PIM_IPV == 4 pim_msdp_i_am_rp_changed(pim); +#endif /* PIM_IPV == 4 */ pim_upstream_reeval_use_rpt(pim); } } @@ -1129,10 +1106,14 @@ 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_nht_find_or_track(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); + if (!pim_nht_lookup_ecmp(pim, &rp_info->rp.source_nexthop, nht_p, &rp_info->group, + true)) + if (PIM_DEBUG_PIM_NHT_RP) + zlog_debug("%s: unable to lookup nexthop for rp %pPA", __func__, + &rp_info->rp.rpf_addr); + return (&rp_info->rp); } @@ -1337,7 +1318,6 @@ 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; pim_addr nht_p; struct pim_nexthop_cache pnc; @@ -1347,35 +1327,11 @@ 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)) - continue; - for (nh_node = pnc.nexthop; nh_node; nh_node = nh_node->next) { -#if PIM_IPV == 4 - if (!pim_addr_is_any(nh_node->gate.ipv4)) - continue; -#else - if (!pim_addr_is_any(nh_node->gate.ipv6)) - continue; -#endif - - struct interface *ifp1 = if_lookup_by_index( - nh_node->ifindex, pim->vrf->vrf_id); - - if (nbr->interface != ifp1) - continue; + if (!pim_nht_find_or_track(pim, nht_p, NULL, rp_info, &pnc)) + continue; -#if PIM_IPV == 4 - nh_node->gate.ipv4 = nbr->source_addr; -#else - nh_node->gate.ipv6 = nbr->source_addr; -#endif - if (PIM_DEBUG_PIM_NHT_RP) - zlog_debug( - "%s: addr %pPA new nexthop addr %pPAs interface %s", - __func__, &nht_p, &nbr->source_addr, - ifp1->name); - } + pim_nht_set_gateway(pim, &pnc, nbr->source_addr, nbr->interface); } } @@ -1540,9 +1496,9 @@ void pim_embedded_rp_new(struct pim_instance *pim, const pim_addr *group, const zlog_debug("%s: NHT Register RP addr %pPA grp %pFX with Zebra", __func__, &rp_info->rp.rpf_addr, &rp_info->group); - pim_find_or_track_nexthop(pim, rp_info->rp.rpf_addr, NULL, rp_info, NULL); - if (!pim_ecmp_nexthop_lookup(pim, &rp_info->rp.source_nexthop, rp_info->rp.rpf_addr, - &rp_info->group, 1)) { + pim_nht_find_or_track(pim, rp_info->rp.rpf_addr, NULL, rp_info, NULL); + if (!pim_nht_lookup_ecmp(pim, &rp_info->rp.source_nexthop, rp_info->rp.rpf_addr, + &rp_info->group, 1)) { if (PIM_DEBUG_PIM_NHT_RP) zlog_debug("%s: Embedded RP %pPA learned but no next hop", __func__, &rp_info->rp.rpf_addr); @@ -1582,7 +1538,7 @@ void pim_embedded_rp_free(struct pim_instance *pim, struct rp_info *rp_info) if (PIM_DEBUG_TRACE) zlog_debug("delete embedded RP %pPA", &rp_info->rp.rpf_addr); - pim_delete_tracked_nexthop(pim, rp_info->rp.rpf_addr, NULL, rp_info); + pim_nht_delete_tracked(pim, rp_info->rp.rpf_addr, NULL, rp_info); listnode_delete(pim->rp_list, rp_info); XFREE(MTYPE_PIM_EMBEDDED_RP_ENTRY, rp_info); } |
