LCOV - code coverage report
Current view: top level - vnet/bier - bier_table.h (source / functions) Hit Total Coverage
Test: coverage-filtered.info Lines: 6 6 100.0 %
Date: 2023-10-26 01:39:38 Functions: 3 3 100.0 %

          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_TABLE_H__
      17             : #define __BIER_TABLE_H__
      18             : 
      19             : #include <vlib/vlib.h>
      20             : #include <vnet/fib/fib_types.h>
      21             : #include <vnet/bier/bier_types.h>
      22             : #include <vnet/bier/bier_entry.h>
      23             : 
      24             : #include <vnet/dpo/dpo.h>
      25             : 
      26             : /**
      27             :  * Forward declarations
      28             :  */
      29             : struct bier_route_update_t_;
      30             : 
      31             : /**
      32             :  * A BIER Table is the bit-indexed forwarding table.
      33             :  * Each entry (bit-position) represents one destination, and its reachability
      34             :  *
      35             :  * The number of entries in a table is thus the maximum supported
      36             :  * bit-position. Since this is small <4096, the table is a flat array
      37             :  */
      38             : typedef struct bier_table_t_ {
      39             :     /**
      40             :      * required for pool_get_aligned.
      41             :      *  memebers used in the switch path come first!
      42             :      */
      43             :     CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
      44             : 
      45             :     /**
      46             :      * Save the MPLS local label associated with the table
      47             :      */
      48             :     mpls_label_t bt_ll;
      49             : 
      50             :     /**
      51             :      * The path-list used for the ECMP-tables
      52             :      */
      53             :     fib_node_index_t bt_pl;
      54             : 
      55             :     /**
      56             :      * The index of the lfib entry created for this table.
      57             :      * Only the EOS is required.
      58             :      */
      59             :     fib_node_index_t bt_lfei;
      60             : 
      61             :     /**
      62             :      * Number of locks on the table
      63             :      */
      64             :     u16 bt_locks;
      65             : 
      66             :     /**
      67             :      * Entries in the table
      68             :      * This is a vector sized to the appropriate number of entries
      69             :      * given the table's supported Bit-string length
      70             :      */
      71             :     index_t *bt_entries;
      72             : 
      73             :     /**
      74             :      * The identity/key or the table. we need the hdr_len in the data-path
      75             :      */
      76             :     bier_table_id_t bt_id;
      77             : 
      78             :     /**
      79             :      * f-masks in the ECMP table
      80             :      * This is a vector sized to the appropriate number of entries
      81             :      * given the table's supported Bit-string length.
      82             :      * In the ECMP table the LB choice has been pre-resolved, so each entry
      83             :      * links to just one f-mask, i.e. there is a 1:1 mapping of bit-position to
      84             :      * fmask. For efficient forwarding we collapse the fmasks up to the table.
      85             :      */
      86             :     index_t *bt_fmasks;
      87             : } bier_table_t;
      88             : 
      89             : STATIC_ASSERT((sizeof(bier_table_t) <= 2*CLIB_CACHE_LINE_BYTES),
      90             :               "BIER table fits on 2 cache lines");
      91             : 
      92             : extern index_t bier_table_add_or_lock(const bier_table_id_t *id,
      93             :                                       mpls_label_t ll);
      94             : extern index_t bier_table_lock(const bier_table_id_t *id);
      95             : extern void bier_table_unlock(const bier_table_id_t *id);
      96             : 
      97             : extern void bier_table_route_path_add(const bier_table_id_t *bti,
      98             :                                       bier_bp_t bp,
      99             :                                       fib_route_path_t *brp);
     100             : extern void bier_table_route_path_remove(const bier_table_id_t *bti,
     101             :                                          bier_bp_t bp,
     102             :                                          fib_route_path_t *brp);
     103             : extern void bier_table_route_path_update(const bier_table_id_t *bti,
     104             :                                          bier_bp_t bp,
     105             :                                          fib_route_path_t *brp);
     106             : extern void bier_table_route_delete(const bier_table_id_t *bti,
     107             :                                     bier_bp_t b);
     108             : 
     109             : extern void bier_table_show_all(vlib_main_t * vm,
     110             :                                 bier_show_flags_t flags);
     111             : 
     112             : extern const bier_table_id_t *bier_table_get_id(index_t bti);
     113             : 
     114             : extern u8 *format_bier_table (u8 *s, va_list *args);
     115             : extern u8 *format_bier_table_entry (u8 *s, va_list *args);
     116             : 
     117             : extern index_t bier_table_ecmp_create_and_lock(const bier_table_id_t *id);
     118             : extern void bier_table_ecmp_unlock(index_t bti);
     119             : extern void bier_table_ecmp_set_fmask(index_t bti,
     120             :                                       bier_bp_t bp,
     121             :                                       index_t bfmi);
     122             : 
     123             : extern void bier_table_contribute_forwarding(index_t bti,
     124             :                                              dpo_id_t *dpo);
     125             : 
     126             : /**
     127             :  * Types and functions to walk the ECMP tables of a main table
     128             :  */
     129             : typedef void (*bier_table_ecmp_walk_fn_t)(index_t btei,
     130             :                                           void *ctx);
     131             : extern void bier_table_ecmp_walk(index_t bti,
     132             :                                  bier_table_ecmp_walk_fn_t fn,
     133             :                                  void *ctx);
     134             : extern int bier_table_is_main (const bier_table_t *bt);
     135             : 
     136             : /**
     137             :  * Types and functions to walk all the BIER Tables
     138             :  */
     139             : typedef void (*bier_tables_walk_fn_t)(const bier_table_t *bt,
     140             :                                       void *ctx);
     141             : extern void bier_tables_walk(bier_tables_walk_fn_t fn,
     142             :                              void *ctx);
     143             : 
     144             : /**
     145             :  * Types and functions to walk all the entries in one BIER Table
     146             :  */
     147             : typedef void (*bier_table_walk_fn_t)(const bier_table_t *bt,
     148             :                                      const bier_entry_t *be,
     149             :                                      void *ctx);
     150             : extern void bier_table_walk(const bier_table_id_t *id,
     151             :                             bier_table_walk_fn_t fn,
     152             :                             void *ctx);
     153             : 
     154             : /*
     155             :  * provided for fast data plane access.
     156             :  */
     157             : extern bier_table_t *bier_table_pool;
     158             : 
     159             : static inline bier_table_t *
     160       12929 : bier_table_get (index_t bti)
     161             : {
     162       12929 :     return (pool_elt_at_index(bier_table_pool, bti));
     163             : }
     164             : 
     165             : static inline const index_t
     166         161 : bier_table_lookup (const bier_table_t *bt,
     167             :                    bier_bp_t bp)
     168             : {
     169         161 :     return (bt->bt_entries[BIER_BP_TO_INDEX(bp)]);
     170             : }
     171             : 
     172             : static inline const index_t
     173       67924 : bier_table_fwd_lookup (const bier_table_t *bt,
     174             :                        bier_bp_t bp)
     175             : {
     176       67924 :     return (bt->bt_fmasks[BIER_BP_TO_INDEX(bp)]);
     177             : }
     178             : 
     179             : #endif

Generated by: LCOV version 1.14