Line data Source code
1 : /* 2 : * Copyright (c) 2016 Cisco and/or its affiliates. 3 : * Licensed under the Apache License, Version 2.0 (the "License"); 4 : * you may not use this file except in compliance with the License. 5 : * You may obtain a copy of the License at: 6 : * 7 : * http://www.apache.org/licenses/LICENSE-2.0 8 : * 9 : * Unless required by applicable law or agreed to in writing, software 10 : * distributed under the License is distributed on an "AS IS" BASIS, 11 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 : * See the License for the specific language governing permissions and 13 : * limitations under the License. 14 : */ 15 : 16 : #ifndef __BIER_DISP_TABLE_H__ 17 : #define __BIER_DISP_TABLE_H__ 18 : 19 : #include <vnet/ip/ip.h> 20 : #include <vnet/adj/adj.h> 21 : #include <vnet/dpo/replicate_dpo.h> 22 : 23 : #include <vnet/bier/bier_types.h> 24 : #include <vnet/bier/bier_disp_entry.h> 25 : 26 : /** 27 : * @brief 28 : * A protocol Independent IP multicast FIB table 29 : */ 30 : typedef struct bier_disp_table_t_ 31 : { 32 : /** 33 : * Required for pool_get_aligned 34 : */ 35 : CLIB_CACHE_LINE_ALIGN_MARK(cacheline0); 36 : 37 : /** 38 : * number of locks on the table 39 : */ 40 : u16 bdt_locks; 41 : 42 : /** 43 : * Table ID (hash key) for this FIB. 44 : */ 45 : u32 bdt_table_id; 46 : 47 : /** 48 : * The lookup DB based on sender BP. Value is the index of the 49 : * BIER disp object. 50 : */ 51 : index_t bdt_db[BIER_BP_MAX]; 52 : } bier_disp_table_t; 53 : 54 : /** 55 : * @brief 56 : * Format the description/name of the table 57 : */ 58 : extern u8* format_bier_disp_table(u8* s, va_list *ap); 59 : 60 : extern void bier_disp_table_entry_path_add(u32 table_id, 61 : bier_bp_t src, 62 : bier_hdr_proto_id_t payload_proto, 63 : const fib_route_path_t *rpath); 64 : 65 : extern void bier_disp_table_entry_path_remove(u32 table_id, 66 : bier_bp_t src, 67 : bier_hdr_proto_id_t payload_proto, 68 : const fib_route_path_t *paths); 69 : 70 : extern index_t bier_disp_table_find(u32 table_id); 71 : 72 : 73 : extern index_t bier_disp_table_add_or_lock(u32 table_id); 74 : extern void bier_disp_table_unlock_w_table_id(u32 table_id); 75 : 76 : extern void bier_disp_table_unlock(index_t bdti); 77 : extern void bier_disp_table_lock(index_t bdti); 78 : extern void bier_disp_table_contribute_forwarding(index_t bdti, 79 : dpo_id_t *dpo); 80 : 81 : /** 82 : * Types and functions to walk all the entries in one BIER Table 83 : */ 84 : typedef void (*bier_disp_table_walk_fn_t)(const bier_disp_table_t *bdt, 85 : const bier_disp_entry_t *bde, 86 : u16 bp, 87 : void *ctx); 88 : extern void bier_disp_table_walk(u32 table_id, 89 : bier_disp_table_walk_fn_t fn, 90 : void *ctx); 91 : 92 : /** 93 : * @brief 94 : * Get a pointer to a FIB table 95 : */ 96 : extern bier_disp_table_t *bier_disp_table_pool; 97 : 98 : static inline bier_disp_table_t * 99 241 : bier_disp_table_get (index_t bdti) 100 : { 101 241 : return (pool_elt_at_index(bier_disp_table_pool, bdti)); 102 : } 103 : 104 : static inline index_t 105 157 : bier_disp_table_lookup (index_t bdti, 106 : bier_hdr_src_id_t src) 107 : { 108 : bier_disp_table_t *bdt; 109 : 110 157 : bdt = bier_disp_table_get(bdti); 111 : 112 157 : return (bdt->bdt_db[src]); 113 : } 114 : 115 : #endif