From d6953332db225d5355f50348ef3b09f0525d5282 Mon Sep 17 00:00:00 2001 From: Neale Ranns Date: Tue, 10 Aug 2021 07:39:18 +0000 Subject: fib: A 16-8-8 and a 8-8-8-8 versions of an ip4_fib_t Type: feature The difference being the MTRIE type they contain. THE FIB continues to use the 16-8-8 version. Signed-off-by: Neale Ranns Change-Id: I5a54d4e6e6cc639f18a3fb65ef2925507a7ef1de --- src/vnet/fib/ip4_fib_16.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 src/vnet/fib/ip4_fib_16.c (limited to 'src/vnet/fib/ip4_fib_16.c') diff --git a/src/vnet/fib/ip4_fib_16.c b/src/vnet/fib/ip4_fib_16.c new file mode 100644 index 00000000000..7699e8926f1 --- /dev/null +++ b/src/vnet/fib/ip4_fib_16.c @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2016 Cisco and/or its affiliates. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +ip4_fib_16_t *ip4_fib_16s; + +void +ip4_fib_16_table_init (ip4_fib_16_t *fib) +{ + ip4_mtrie_16_init(&fib->mtrie); +} + +void +ip4_fib_16_table_free (ip4_fib_16_t *fib) +{ + ip4_mtrie_16_free(&fib->mtrie); +} + +/* + * ip4_fib_16_table_lookup_exact_match + * + * Exact match prefix lookup + */ +fib_node_index_t +ip4_fib_16_table_lookup_exact_match (const ip4_fib_16_t *fib, + const ip4_address_t *addr, + u32 len) +{ + return (ip4_fib_hash_table_lookup_exact_match(&fib->hash, addr, len)); +} + +/* + * ip4_fib_16_table_lookup_adj + * + * Longest prefix match + */ +index_t +ip4_fib_16_table_lookup_lb (ip4_fib_16_t *fib, + const ip4_address_t *addr) +{ + return (ip4_fib_hash_table_lookup_lb(&fib->hash, addr)); +} + +/* + * ip4_fib_16_table_lookup + * + * Longest prefix match + */ +fib_node_index_t +ip4_fib_16_table_lookup (const ip4_fib_16_t *fib, + const ip4_address_t *addr, + u32 len) +{ + return (ip4_fib_hash_table_lookup(&fib->hash, addr, len)); +} + +void +ip4_fib_16_table_entry_insert (ip4_fib_16_t *fib, + const ip4_address_t *addr, + u32 len, + fib_node_index_t fib_entry_index) +{ + return (ip4_fib_hash_table_entry_insert(&fib->hash, addr, len, fib_entry_index)); +} + +void +ip4_fib_16_table_entry_remove (ip4_fib_16_t *fib, + const ip4_address_t *addr, + u32 len) +{ + return (ip4_fib_hash_table_entry_remove(&fib->hash, addr, len)); +} + +void +ip4_fib_16_table_fwding_dpo_update (ip4_fib_16_t *fib, + const ip4_address_t *addr, + u32 len, + const dpo_id_t *dpo) +{ + ip4_mtrie_16_route_add(&fib->mtrie, addr, len, dpo->dpoi_index); +} + +void +ip4_fib_16_table_fwding_dpo_remove (ip4_fib_16_t *fib, + const ip4_address_t *addr, + u32 len, + const dpo_id_t *dpo, + u32 cover_index) +{ + const fib_prefix_t *cover_prefix; + const dpo_id_t *cover_dpo; + + /* + * We need to pass the MTRIE the LB index and address length of the + * covering prefix, so it can fill the plys with the correct replacement + * for the entry being removed + */ + cover_prefix = fib_entry_get_prefix(cover_index); + cover_dpo = fib_entry_contribute_ip_forwarding(cover_index); + + ip4_mtrie_16_route_del(&fib->mtrie, + addr, len, dpo->dpoi_index, + cover_prefix->fp_len, + cover_dpo->dpoi_index); +} + +void +ip4_fib_16_table_walk (ip4_fib_16_t *fib, + fib_table_walk_fn_t fn, + void *ctx) +{ + ip4_fib_hash_table_walk(&fib->hash, fn, ctx); +} + +void +ip4_fib_16_table_sub_tree_walk (ip4_fib_16_t *fib, + const fib_prefix_t *root, + fib_table_walk_fn_t fn, + void *ctx) +{ + ip4_fib_hash_table_sub_tree_walk(&fib->hash, root, fn, ctx); +} -- cgit 1.2.3-korg