/* * 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. */ #ifndef __MFIB_TABLE_H__ #define __MFIB_TABLE_H__ #include #include #include #include /** * Keep a lock per-source and a total */ #define MFIB_TABLE_N_LOCKS (MFIB_N_SOURCES+1) #define MFIB_TABLE_TOTAL_LOCKS MFIB_N_SOURCES /** * Flags for the source data */ typedef enum mfib_table_attribute_t_ { /** * Marker. Add new values after this one. */ MFIB_TABLE_ATTRIBUTE_FIRST, /** * the table is currently resync-ing */ MFIB_TABLE_ATTRIBUTE_RESYNC = MFIB_TABLE_ATTRIBUTE_FIRST, /** * Marker. add new entries before this one. */ MFIB_TABLE_ATTRIBUTE_LAST = MFIB_TABLE_ATTRIBUTE_RESYNC, } mfib_table_attribute_t; #define MFIB_TABLE_ATTRIBUTE_MAX (MFIB_TABLE_ATTRIBUTE_LAST+1) #define MFIB_TABLE_ATTRIBUTES { \ [MFIB_TABLE_ATTRIBUTE_RESYNC] = "resync", \ } #define FOR_EACH_MFIB_TABLE_ATTRIBUTE(_item) \ for (_item = MFIB_TABLE_ATTRIBUTE_FIRST; \ _item < MFIB_TABLE_ATTRIBUTE_MAX; \ _item++) typedef enum mfib_table_flags_t_ { MFIB_TABLE_FLAG_NONE = 0, MFIB_TABLE_FLAG_RESYNC = (1 << MFIB_TABLE_ATTRIBUTE_RESYNC), } __attribute__ ((packed)) mfib_table_flags_t; extern u8* format_mfib_table_flags(u8 *s, va_list *args); /** * @brief * A protocol Independent IP multicast FIB table */ typedef struct mfib_table_t_ { /** * Required for pool_get_aligned */ CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); /** * A union of the protocol specific FIBs that provide the * underlying LPM mechanism. * This element is first in the struct so that it is in the * first cache line. */ union { ip4_mfib_t v4; ip6_mfib_t v6; }; /** * Which protocol this table serves. Used to switch on the union above. */ fib_protocol_t mft_proto; /** * table falgs */ mfib_table_flags_t mft_flags; /** * number of locks on the table */ u16 mft_locks[MFIB_TABLE_N_LOCKS]; /** * Table ID (hash key) for this FIB. */ u32 mft_table_id; /** * resync epoch */ u32 mft_epoch; /** * Index into FIB vector. */ fib_node_index_t mft_index; /** * Total route counters */ u32 mft_total_route_counts; /** * Table description */ u8* mft_desc; } mfib_table_t; /** * @brief * Format the description/name of the table */ extern u8* format_mfib_table_name(u8* s, va_list *ap); /** * @brief * Perfom a longest prefix match in the non-forwarding table * * @param fib_index * The index of the FIB * * @param prefix * The prefix to lookup * * @return * The index of the fib_entry_t for the best match, which may be the default route */ extern fib_node_index_t mfib_table_lookup(u32 fib_index, const mfib_prefix_t *prefix); /** * @brief * Perfom an exact match in the non-forwarding table * * @param fib_index * The index of the FIB * * @param prefix * The prefix to lookup * * @return * The index of the fib_entry_t for the exact match, or INVALID * is there is no match. */ extern fib_node_index_t mfib_table_lookup_exact_match(u32 fib_index, const mfib_prefix_t *prefix); /** * @brief * Add a new (with no replication) or lock an existing entry * * @param prefix * The prefix for the entry to add * * @return * the index of the fib_entry_t that is created (or existed already). */ extern fib_node_index_t mfib_table_entry_update(u32 fib_index, const mfib_prefix_t *prefix, mfib_source_t source, fib_rpf_id_t rpf_id, mfib_entry_flags_t flags); /** * @brief * Add n paths to an entry (aka route) in the FIB. If the entry does not * exist, it will be created. * See the documentation for fib_route_path_t for more descirpt
#!/usr/bin/env python3

""" sanity check script """
import vpp_papi
need to delete, walk the whole * table and store elements in a vector, then delete the elements */ extern void mfib_table_walk(u32 fib_index, fib_protocol_t proto, mfib_table_walk_fn_t fn, void *ctx); /** * @brief format (display) the memory usage for mfibs */ extern u8 * format_mfib_table_memory(u8 * s, va_list * args); /** * To assit UT */ extern u32 mfib_table_get_n_routes(fib_node_index_t index, fib_protocol_t proto); #endif