diff options
author | Neale Ranns <neale@graphiant.com> | 2021-08-10 07:39:18 +0000 |
---|---|---|
committer | Ole Tr�an <otroan@employees.org> | 2021-08-11 08:48:42 +0000 |
commit | d6953332db225d5355f50348ef3b09f0525d5282 (patch) | |
tree | 3f4870c12c97f458119d6460e4082de767181c2b /src/vnet/fib/ip4_fib_8.c | |
parent | 7244a706430746facf20a5f047666b74d440cef8 (diff) |
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 <neale@graphiant.com>
Change-Id: I5a54d4e6e6cc639f18a3fb65ef2925507a7ef1de
Diffstat (limited to 'src/vnet/fib/ip4_fib_8.c')
-rw-r--r-- | src/vnet/fib/ip4_fib_8.c | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/vnet/fib/ip4_fib_8.c b/src/vnet/fib/ip4_fib_8.c new file mode 100644 index 00000000000..587e28a8c9c --- /dev/null +++ b/src/vnet/fib/ip4_fib_8.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 <vnet/fib/fib_table.h> +#include <vnet/fib/fib_entry.h> +#include <vnet/fib/ip4_fib.h> + +ip4_fib_8_t *ip4_fib_8s; + +void +ip4_fib_8_table_init (ip4_fib_8_t *fib) +{ + ip4_mtrie_8_init(&fib->mtrie); +} + +void +ip4_fib_8_table_free (ip4_fib_8_t *fib) +{ + ip4_mtrie_8_free(&fib->mtrie); +} + +/* + * ip4_fib_8_table_lookup_exact_match + * + * Exact match prefix lookup + */ +fib_node_index_t +ip4_fib_8_table_lookup_exact_match (const ip4_fib_8_t *fib, + const ip4_address_t *addr, + u32 len) +{ + return (ip4_fib_hash_table_lookup_exact_match(&fib->hash, addr, len)); +} + +/* + * ip4_fib_8_table_lookup_adj + * + * Longest prefix match + */ +index_t +ip4_fib_8_table_lookup_lb (ip4_fib_8_t *fib, + const ip4_address_t *addr) +{ + return (ip4_fib_hash_table_lookup_lb(&fib->hash, addr)); +} + +/* + * ip4_fib_8_table_lookup + * + * Longest prefix match + */ +fib_node_index_t +ip4_fib_8_table_lookup (const ip4_fib_8_t *fib, + const ip4_address_t *addr, + u32 len) +{ + return (ip4_fib_hash_table_lookup(&fib->hash, addr, len)); +} + +void +ip4_fib_8_table_entry_insert (ip4_fib_8_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_8_table_entry_remove (ip4_fib_8_t *fib, + const ip4_address_t *addr, + u32 len) +{ + return (ip4_fib_hash_table_entry_remove(&fib->hash, addr, len)); +} + +void +ip4_fib_8_table_fwding_dpo_update (ip4_fib_8_t *fib, + const ip4_address_t *addr, + u32 len, + const dpo_id_t *dpo) +{ + ip4_mtrie_8_route_add(&fib->mtrie, addr, len, dpo->dpoi_index); +} + +void +ip4_fib_8_table_fwding_dpo_remove (ip4_fib_8_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_8_route_del(&fib->mtrie, + addr, len, dpo->dpoi_index, + cover_prefix->fp_len, + cover_dpo->dpoi_index); +} + +void +ip4_fib_8_table_walk (ip4_fib_8_t *fib, + fib_table_walk_fn_t fn, + void *ctx) +{ + ip4_fib_hash_table_walk(&fib->hash, fn, ctx); +} + +void +ip4_fib_8_table_sub_tree_walk (ip4_fib_8_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); +} |