blob: 2fd3ea3a57d180808861aba0760fe0c5bccf7d12 [file] [log] [blame]
Neale Rannsd792d9c2017-10-21 10:53:20 -07001/*
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 */
29struct 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
Paul Vinciguerrae6eefb62019-05-13 15:56:41 -040036 * bit-position. Since this is small <4096, the table is a flat array
Neale Rannsd792d9c2017-10-21 10:53:20 -070037 */
38typedef struct bier_table_t_ {
39 /**
Dave Baracheb987d32018-05-03 08:26:39 -040040 * required for pool_get_aligned.
41 * memebers used in the switch path come first!
42 */
43 CLIB_CACHE_LINE_ALIGN_MARK(cacheline0);
44
45 /**
Neale Rannsd792d9c2017-10-21 10:53:20 -070046 * 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 /**
Neale Rannsd792d9c2017-10-21 10:53:20 -070074 * 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
89STATIC_ASSERT((sizeof(bier_table_t) <= 2*CLIB_CACHE_LINE_BYTES),
90 "BIER table fits on 2 cache lines");
91
92extern index_t bier_table_add_or_lock(const bier_table_id_t *id,
93 mpls_label_t ll);
Neale Rannsfe4e48f2018-09-24 23:38:37 -070094extern index_t bier_table_lock(const bier_table_id_t *id);
Neale Rannsd792d9c2017-10-21 10:53:20 -070095extern void bier_table_unlock(const bier_table_id_t *id);
96
Neale Rannsef90ed02018-09-13 08:45:12 -070097extern void bier_table_route_path_add(const bier_table_id_t *bti,
98 bier_bp_t bp,
99 fib_route_path_t *brp);
100extern void bier_table_route_path_remove(const bier_table_id_t *bti,
101 bier_bp_t bp,
102 fib_route_path_t *brp);
103extern void bier_table_route_path_update(const bier_table_id_t *bti,
104 bier_bp_t bp,
105 fib_route_path_t *brp);
106extern void bier_table_route_delete(const bier_table_id_t *bti,
107 bier_bp_t b);
Neale Rannsd792d9c2017-10-21 10:53:20 -0700108
109extern void bier_table_show_all(vlib_main_t * vm,
110 bier_show_flags_t flags);
111
112extern const bier_table_id_t *bier_table_get_id(index_t bti);
113
114extern u8 *format_bier_table (u8 *s, va_list *args);
115extern u8 *format_bier_table_entry (u8 *s, va_list *args);
116
117extern index_t bier_table_ecmp_create_and_lock(const bier_table_id_t *id);
118extern void bier_table_ecmp_unlock(index_t bti);
119extern void bier_table_ecmp_set_fmask(index_t bti,
120 bier_bp_t bp,
121 index_t bfmi);
122
123extern 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 */
129typedef void (*bier_table_ecmp_walk_fn_t)(index_t btei,
130 void *ctx);
131extern void bier_table_ecmp_walk(index_t bti,
132 bier_table_ecmp_walk_fn_t fn,
133 void *ctx);
134extern int bier_table_is_main (const bier_table_t *bt);
135
136/**
137 * Types and functions to walk all the BIER Tables
138 */
139typedef void (*bier_tables_walk_fn_t)(const bier_table_t *bt,
140 void *ctx);
141extern 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 */
147typedef void (*bier_table_walk_fn_t)(const bier_table_t *bt,
148 const bier_entry_t *be,
149 void *ctx);
150extern 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 */
157extern bier_table_t *bier_table_pool;
158
159static inline bier_table_t *
160bier_table_get (index_t bti)
161{
162 return (pool_elt_at_index(bier_table_pool, bti));
163}
164
165static inline const index_t
166bier_table_lookup (const bier_table_t *bt,
167 bier_bp_t bp)
168{
169 return (bt->bt_entries[BIER_BP_TO_INDEX(bp)]);
170}
171
172static inline const index_t
173bier_table_fwd_lookup (const bier_table_t *bt,
174 bier_bp_t bp)
175{
176 return (bt->bt_fmasks[BIER_BP_TO_INDEX(bp)]);
177}
178
179#endif