blob: dfdb8b911aec613b2e43c9adf0b667f035802d26 [file] [log] [blame]
Neale Ranns5e575b12016-10-03 09:40:25 +01001/*
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 * @file
17 * @brief LISP-GPE definitions.
18 */
19
20#ifndef __LISP_GPE_FWD_ENTRY_H__
21#define __LISP_GPE_FWD_ENTRY_H__
22
23#include <vnet/lisp-gpe/lisp_gpe.h>
24
25/**
26 * @brief A path on which to forward lisp traffic
27 */
28typedef struct lisp_fwd_path_t_
29{
30 /**
31 * The adjacency constructed for the locator pair
32 */
33 index_t lisp_adj;
34
35 /**
36 * Priority. Only the paths with the best priority will be installed in FIB
37 */
38 u8 priority;
39
40 /**
41 * [UE]CMP weigt for the path
42 */
43 u8 weight;
44
45} lisp_fwd_path_t;
46
47/**
48 * @brief A Forwarding entry can be 'normal' or 'negative'
49 * Negative implies we deliberately want to add a FIB entry for an EID
50 * that results in 'special' behaviour determined by an 'action'.
51 * @normal means send it down some tunnels.
52 */
53typedef enum lisp_gpe_fwd_entry_type_t_
54{
55 LISP_GPE_FWD_ENTRY_TYPE_NORMAL,
56 LISP_GPE_FWD_ENTRY_TYPE_NEGATIVE,
57} lisp_gpe_fwd_entry_type_t;
58
59
60/**
61 * LISP-GPE fwd entry key
62 */
63typedef struct lisp_gpe_fwd_entry_key_t_
64{
65 dp_address_t rmt;
66 dp_address_t lcl;
67 u32 vni;
68} lisp_gpe_fwd_entry_key_t;
69
70/**
71 * @brief A LISP Forwarding Entry
72 *
73 * A forwarding entry is from a locai EID to a remote EID over a set of rloc pairs
74 */
75typedef struct lisp_gpe_fwd_entry_t_
76{
77 /**
Filip Tehlared6b52b2017-03-22 09:02:33 +010078 * Follows src/dst or dst only forwarding policy
79 */
80 u8 is_src_dst;
81
82 /**
Neale Ranns5e575b12016-10-03 09:40:25 +010083 * This object joins the FIB control plane graph to receive updates to
84 * for changes to the graph.
85 */
86 fib_node_t node;
87
88 /**
Florin Corasce1b4c72017-01-26 14:25:34 -080089 * The Entry's key: {lEID,rEID,vni}
Neale Ranns5e575b12016-10-03 09:40:25 +010090 */
91 lisp_gpe_fwd_entry_key_t *key;
92
93 /**
94 * The forwarding entry type
95 */
96 lisp_gpe_fwd_entry_type_t type;
97
98 /**
99 * The tenant the entry belongs to
100 */
101 u32 tenant;
102
103 /**
104 * The VRF (in the case of L3) or Bridge-Domain (for L2) index
105 */
106 union
107 {
108 /**
109 * Fields relevant to an L2 entry
110 */
111 struct
112 {
113 /**
114 * The VRF ID
115 */
116 u32 eid_table_id;
117
118 /**
119 * The FIB index for the overlay, i.e. the FIB in which the EIDs
120 * are present
121 */
122 u32 eid_fib_index;
123 /**
124 * The SRC-FIB index for created for anding source-route entries
125 */
126 u32 src_fib_index;
127 };
128 /**
129 * Fields relevant to an L2 entry
130 */
131 struct
132 {
133 /**
134 * The Bridge-Domain (for L2) index
135 */
136 u32 eid_bd_id;
137
138 /**
139 * The Bridge-domain index for the overlay EIDs
140 */
141 u32 eid_bd_index;
142
143 /**
144 * The path-list created for the forwarding
145 */
146 fib_node_index_t path_list_index;
147
148 /**
149 * Child index of this entry on the path-list
150 */
151 u32 child_index;
152
153 /**
154 * The DPO used to forward
155 */
156 dpo_id_t dpo;
157 } l2;
Florin Corasce1b4c72017-01-26 14:25:34 -0800158
159 /**
160 * Fields relevant to an NSH entry
161 */
162 struct
163 {
164 /**
165 * The path-list created for the forwarding
166 */
167 fib_node_index_t path_list_index;
168
169 /**
170 * Child index of this entry on the path-list
171 */
172 u32 child_index;
173
174 /**
175 * The DPO contributed by NSH
176 */
177 dpo_id_t dpo;
178
179 /**
180 * The DPO used for forwarding. Obtained after stacking tx node
181 * onto lb choice
182 */
183 dpo_id_t choice;
184 } nsh;
Neale Ranns5e575b12016-10-03 09:40:25 +0100185 };
186
187 union
188 {
189 /**
190 * @brief When the type is 'normal'
191 * The RLOC pair that form the route's paths. i.e. where to send
192 * packets for this route.
193 */
194 lisp_fwd_path_t *paths;
195
196 /**
197 * @brief When the type is negative. The action to take.
198 */
199 negative_fwd_actions_e action;
200 };
Filip Tehlar809bc742017-08-14 19:15:36 +0200201
202 /**
203 * used for getting load balance statistics
204 */
205 index_t dpoi_index;
206
Neale Ranns5e575b12016-10-03 09:40:25 +0100207} lisp_gpe_fwd_entry_t;
208
209extern int
210vnet_lisp_gpe_add_del_fwd_entry (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
211 u32 * hw_if_indexp);
212
213extern void vnet_lisp_gpe_fwd_entry_flush (void);
214
215extern u32 lisp_l2_fib_lookup (lisp_gpe_main_t * lgm,
216 u16 bd_index, u8 src_mac[8], u8 dst_mac[8]);
217
Florin Corasce1b4c72017-01-26 14:25:34 -0800218extern const dpo_id_t *lisp_nsh_fib_lookup (lisp_gpe_main_t * lgm,
219 u32 spi_si);
Filip Tehlar4868ff62017-03-09 16:48:39 +0100220extern void
Filip Tehlar21511912017-04-07 10:41:42 +0200221vnet_lisp_gpe_del_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
222 u32 fwd_entry_index);
223extern void
224vnet_lisp_gpe_add_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
225 u32 fwd_entry_index);
Filip Tehlar0eb874e2017-05-18 14:23:32 +0200226extern u32 *vnet_lisp_gpe_get_fwd_entry_vnis (void);
227
Filip Tehlar809bc742017-08-14 19:15:36 +0200228int
229vnet_lisp_gpe_get_fwd_stats (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
230 vlib_counter_t * c);
231
Neale Ranns5e575b12016-10-03 09:40:25 +0100232#endif
233
234/*
235 * fd.io coding-style-patch-verification: ON
236 *
237 * Local Variables:
238 * eval: (c-set-style "gnu")
239 * End:
240 */