/* * Copyright (c) 2018 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_ENTRY_SRC_H__ #define __MFIB_ENTRY_SRC_H__ #include /** * MFIB extensions to each path */ typedef struct mfib_path_ext_t_ { mfib_itf_flags_t mfpe_flags; fib_node_index_t mfpe_path; } mfib_path_ext_t; /** * Flags for the source data */ typedef enum mfib_entry_src_attribute_t_ { /** * Marker. Add new values after this one. */ MFIB_ENTRY_SRC_ATTRIBUTE_FIRST, /** * the source has been added to the entry */ MFIB_ENTRY_SRC_ATTRIBUTE_STALE = MFIB_ENTRY_SRC_ATTRIBUTE_FIRST, /** * Marker. add new entries before this one. */ MFIB_ENTRY_SRC_ATTRIBUTE_LAST = MFIB_ENTRY_SRC_ATTRIBUTE_STALE, } mfib_entry_src_attribute_t; #define MFIB_ENTRY_SRC_ATTRIBUTES { \ [MFIB_ENTRY_SRC_ATTRIBUTE_STALE] = "stale", \ } #define FOR_EACH_MFIB_SRC_ATTRIBUTE(_item) \ for (_item = MFIB_ENTRY_SRC_ATTRIBUTE_FIRST; \ _item <= MFIB_ENTRY_SRC_ATTRIBUTE_LAST; \ _item++) typedef enum mfib_entry_src_flag_t_ { MFIB_ENTRY_SRC_FLAG_NONE = 0, MFIB_ENTRY_SRC_FLAG_STALE = (1 << MFIB_ENTRY_SRC_ATTRIBUTE_STALE), } __attribute__ ((packed)) mfib_entry_src_flags_t; extern u8 * format_mfib_entry_src_flags(u8 *s, va_list *args); /* * Keep the size of the flags field to 2 bytes, so it * can be placed next to the 2 bytes reference count */ STATIC_ASSERT (sizeof(mfib_entry_src_flags_t) <= 2, "FIB entry flags field size too big"); /** * The source of an MFIB entry */ typedef struct mfib_entry_src_t_ { /** * Which source this is */ mfib_source_t mfes_src; /** * Route flags */ mfib_entry_flags_t mfes_route_flags; /** * Source flags */ mfib_entry_src_flags_t mfes_flags; /** * The reference count on the entry. this is a u32 * since there is no path-list sharing in mfib, so the number * os children could be high. */ u32 mfes_ref_count; /** * The path-list of forwarding interfaces */ fib_node_index_t mfes_pl; /** * RPF-ID */ fib_rpf_id_t mfes_rpf_id; /** * Hash table of path extensions */ uword *mfes_exts; /** * Covering entry (if needed) */ struct { fib_node_index_t mfes_cover; u32 mfes_sibling; }; /** * The hash table of all interfaces. * This is forwarding time information derived from the paths * and their extensions. */ mfib_itf_t *mfes_itfs; } mfib_entry_src_t; /** * signals from the sources to the caller */ typedef enum mfib_src_res_t_ { MFIB_SRC_OK, MFIB_SRC_REEVALUATE, } mfib_src_res_t; /** * A function provided by each source to be invoked when it is activated */ typedef void (*mfib_entry_src_activiate_t) (mfib_entry_t*, mfib_entry_src_t*); /** * A function provided by each source to be invoked when it is deactivated */ typedef void (*mfib_entry_src_deactiviate_t) (mfib_entry_t*, mfib_entry_src_t*); /** * A function provided by each source to be invoked when the cover changes */ typedef mfib_src_res_t (*mfib_entry_src_cover_change_t) (mfib_entry_t*, mfib_entry_src_t*); /** * A function provided by each source to be invoked when the cover is updated */ typedef mfib_src_res_t (*mfib_entry_src_cover_update_t) (mfib_entry_t*, mfib_entry_src_t*); /** * Virtual function table provided by each_source */ typedef struct mfib_entry_src_vft_t_ { mfib_entry_src_activiate_t mev_activate; mfib_entry_src_deactiviate_t mev_deactivate; mfib_entry_src_cover_change_t mev_cover_change; mfib_entry_src_cover_update_t mev_cover_update; } mfib_entry_src_vft; extern void mfib_entry_src_register(mfib_source_t, const mfib_entry_src_vft*); extern void mfib_entry_src_deactivate(mfib_entry_t *mfib_entry, mfib_entry_src_t *bsrc); extern void mfib_entry_src_activate(mfib_entry_t *mfib_entry, mfib_entry_src_t *bsrc); extern mfib_src_res_t mfib_entry_src_cover_change(mfib_entry_t *mfib_entry, mfib_entry_src_t *bsrc); extern mfib_src_res_t mfib_entry_src_cover_update(mfib_entry_t *mfib_entry, mfib_entry_src_t *bsrc); extern mfib_entry_src_t* mfib_entry_get_best_src(const mfib_entry_t *mfib_entry); extern void mfib_entry_src_module_init(void); extern void mfib_entry_src_rr_module_init(void); #endif