From 1a1a70655c869a1b66e363894e5aba19f4aa08f3 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Sat, 29 Oct 2016 14:37:11 -0200 Subject: lib: convert vrf code to use red-black trees as well Signed-off-by: Renato Westphal --- zebra/zebra_rib.c | 65 +++++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 33 deletions(-) (limited to 'zebra/zebra_rib.c') diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index 394469950d..ec7d1e7fde 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -2052,24 +2052,24 @@ process_subq (struct list * subq, u_char qindex) static void meta_queue_process_complete (struct work_queue *dummy) { - vrf_iter_t iter; + struct vrf *vrf; struct zebra_vrf *zvrf; /* Evaluate nexthops for those VRFs which underwent route processing. This * should limit the evaluation to the necessary VRFs in most common * situations. */ - for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) + RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) { - if (((zvrf = vrf_iter2info (iter)) != NULL) && - (zvrf->flags & ZEBRA_VRF_RIB_SCHEDULED)) - { - zvrf->flags &= ~ZEBRA_VRF_RIB_SCHEDULED; - zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_NEXTHOP_TYPE, NULL); - zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_IMPORT_CHECK_TYPE, NULL); - zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_NEXTHOP_TYPE, NULL); - zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_IMPORT_CHECK_TYPE, NULL); - } + zvrf = vrf->info; + if (zvrf == NULL || !(zvrf->flags & ZEBRA_VRF_RIB_SCHEDULED)) + continue; + + zvrf->flags &= ~ZEBRA_VRF_RIB_SCHEDULED; + zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_NEXTHOP_TYPE, NULL); + zebra_evaluate_rnh(zvrf->vrf_id, AF_INET, 0, RNH_IMPORT_CHECK_TYPE, NULL); + zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_NEXTHOP_TYPE, NULL); + zebra_evaluate_rnh(zvrf->vrf_id, AF_INET6, 0, RNH_IMPORT_CHECK_TYPE, NULL); } /* Schedule LSPs for processing, if needed. */ @@ -3037,11 +3037,11 @@ rib_weed_table (struct route_table *table) void rib_weed_tables (void) { - vrf_iter_t iter; + struct vrf *vrf; struct zebra_vrf *zvrf; - for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) - if ((zvrf = vrf_iter2info (iter)) != NULL) + RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) + if ((zvrf = vrf->info) != NULL) { rib_weed_table (zvrf->table[AFI_IP][SAFI_UNICAST]); rib_weed_table (zvrf->table[AFI_IP6][SAFI_UNICAST]); @@ -3078,11 +3078,11 @@ rib_sweep_table (struct route_table *table) void rib_sweep_route (void) { - vrf_iter_t iter; + struct vrf *vrf; struct zebra_vrf *zvrf; - for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) - if ((zvrf = vrf_iter2info (iter)) != NULL) + RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) + if ((zvrf = vrf->info) != NULL) { rib_sweep_table (zvrf->table[AFI_IP][SAFI_UNICAST]); rib_sweep_table (zvrf->table[AFI_IP6][SAFI_UNICAST]); @@ -3118,12 +3118,12 @@ rib_score_proto_table (u_char proto, u_short instance, struct route_table *table unsigned long rib_score_proto (u_char proto, u_short instance) { - vrf_iter_t iter; + struct vrf *vrf; struct zebra_vrf *zvrf; unsigned long cnt = 0; - for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) - if ((zvrf = vrf_iter2info (iter)) != NULL) + RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) + if ((zvrf = vrf->info) != NULL) cnt += rib_score_proto_table (proto, instance, zvrf->table[AFI_IP][SAFI_UNICAST]) +rib_score_proto_table (proto, instance, zvrf->table[AFI_IP6][SAFI_UNICAST]); @@ -3157,20 +3157,20 @@ rib_close_table (struct route_table *table) void rib_close (void) { - vrf_iter_t iter; + struct vrf *vrf; struct zebra_vrf *zvrf; struct listnode *node; struct interface *ifp; u_int32_t table_id; - for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter)) + RB_FOREACH (vrf, vrf_id_head, &vrfs_by_id) { - if ((zvrf = vrf_iter2info (iter)) != NULL) + if ((zvrf = vrf->info) != NULL) { rib_close_table (zvrf->table[AFI_IP][SAFI_UNICAST]); rib_close_table (zvrf->table[AFI_IP6][SAFI_UNICAST]); } - for (ALL_LIST_ELEMENTS_RO (vrf_iter2iflist (iter), node, ifp)) + for (ALL_LIST_ELEMENTS_RO (vrf->iflist, node, ifp)) if_nbr_ipv6ll_to_ipv4ll_neigh_del_all(ifp); } @@ -3207,17 +3207,16 @@ rib_init (void) static inline int vrf_id_get_next (vrf_id_t vrf_id, vrf_id_t *next_id_p) { - vrf_iter_t iter = vrf_iterator (vrf_id); - struct zebra_vrf *zvrf = vrf_iter2info (iter); + struct vrf *vrf; - /* The same one ? Then find out the next. */ - if (zvrf && (zvrf->vrf_id == vrf_id)) - zvrf = vrf_iter2info (vrf_next (iter)); - - if (zvrf) + vrf = vrf_lookup (vrf_id); + if (vrf) { - *next_id_p = zvrf->vrf_id; - return 1; + vrf = RB_NEXT (vrf_id_head, &vrfs_by_id, vrf); + if (vrf) { + *next_id_p = vrf->vrf_id; + return 1; + } } return 0; -- cgit v1.2.3