diff options
Diffstat (limited to 'zebra/zebra_rib.c')
| -rw-r--r-- | zebra/zebra_rib.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 2df24f75c5..b523d54012 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -36,6 +36,7 @@ #include "thread.h" #include "vrf.h" #include "workqueue.h" +#include "nexthop_group_private.h" #include "zebra/zebra_router.h" #include "zebra/connected.h" @@ -192,7 +193,7 @@ int zebra_check_addr(const struct prefix *p) /* Add nexthop to the end of a rib node's nexthop list */ void route_entry_nexthop_add(struct route_entry *re, struct nexthop *nexthop) { - nexthop_add(&re->ng.nexthop, nexthop); + _nexthop_group_add_sorted(&re->ng, nexthop); re->nexthop_num++; } @@ -697,7 +698,7 @@ static void rib_uninstall(struct route_node *rn, struct route_entry *re) /* * rib_can_delete_dest * - * Returns TRUE if the given dest can be deleted from the table. + * Returns true if the given dest can be deleted from the table. */ static int rib_can_delete_dest(rib_dest_t *dest) { @@ -815,7 +816,7 @@ void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq) * Garbage collect the rib dest corresponding to the given route node * if appropriate. * - * Returns TRUE if the dest was deleted, FALSE otherwise. + * Returns true if the dest was deleted, false otherwise. */ int rib_gc_dest(struct route_node *rn) { @@ -1363,6 +1364,7 @@ static void zebra_rib_fixup_system(struct route_node *rn) continue; SET_FLAG(re->status, ROUTE_ENTRY_INSTALLED); + UNSET_FLAG(re->status, ROUTE_ENTRY_QUEUED); for (ALL_NEXTHOPS(re->ng, nhop)) { if (CHECK_FLAG(nhop->flags, NEXTHOP_FLAG_RECURSIVE)) @@ -1589,7 +1591,7 @@ static bool rib_update_re_from_ctx(struct route_entry *re, */ nexthop = nexthop_new(); nexthop->type = NEXTHOP_TYPE_IPV4; - nexthop_add(&(re->fib_ng.nexthop), nexthop); + _nexthop_add(&(re->fib_ng.nexthop), nexthop); } done: @@ -2346,9 +2348,11 @@ static void rib_link(struct route_node *rn, struct route_entry *re, int process) afi = (rn->p.family == AF_INET) ? AFI_IP : (rn->p.family == AF_INET6) ? AFI_IP6 : AFI_MAX; - if (is_zebra_import_table_enabled(afi, re->table)) { + if (is_zebra_import_table_enabled(afi, re->vrf_id, re->table)) { + struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id); + rmap_name = zebra_get_import_table_route_map(afi, re->table); - zebra_add_import_table_entry(rn, re, rmap_name); + zebra_add_import_table_entry(zvrf, rn, re, rmap_name); } else if (process) rib_queue_add(rn); } @@ -2414,8 +2418,10 @@ void rib_delnode(struct route_node *rn, struct route_entry *re) afi = (rn->p.family == AF_INET) ? AFI_IP : (rn->p.family == AF_INET6) ? AFI_IP6 : AFI_MAX; - if (is_zebra_import_table_enabled(afi, re->table)) { - zebra_del_import_table_entry(rn, re); + if (is_zebra_import_table_enabled(afi, re->vrf_id, re->table)) { + struct zebra_vrf *zvrf = zebra_vrf_lookup_by_id(re->vrf_id); + + zebra_del_import_table_entry(zvrf, rn, re); /* Just clean up if non main table */ if (IS_ZEBRA_DEBUG_RIB) { char buf[SRCDEST2STR_BUFFER]; @@ -2741,11 +2747,14 @@ void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type, else src_buf[0] = '\0'; - if (IS_ZEBRA_DEBUG_RIB) - zlog_debug("%u:%s%s%s doesn't exist in rib", vrf_id, - dst_buf, + if (IS_ZEBRA_DEBUG_RIB) { + struct vrf *vrf = vrf_lookup_by_id(vrf_id); + + zlog_debug("%s[%d]:%s%s%s doesn't exist in rib", + vrf->name, table_id, dst_buf, (src_buf[0] != '\0') ? " from " : "", src_buf); + } return; } @@ -3383,7 +3392,7 @@ void rib_init(void) * * Get the first vrf id that is greater than the given vrf id if any. * - * Returns TRUE if a vrf id was found, FALSE otherwise. + * Returns true if a vrf id was found, false otherwise. */ static inline int vrf_id_get_next(vrf_id_t vrf_id, vrf_id_t *next_id_p) { |
