vxlan-gbp: Mark APIs as in-progress
[vpp.git] / src / vnet / lisp-gpe / lisp_gpe_fwd_entry.h
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  * @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  */
28 typedef 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  */
53 typedef 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  */
63 typedef 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  */
75 typedef struct lisp_gpe_fwd_entry_t_
76 {
77   /**
78    * Follows src/dst or dst only forwarding policy
79    */
80   u8 is_src_dst;
81
82   /**
83    * 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   /**
89    * The Entry's key: {lEID,rEID,vni}
90    */
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;
158
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;
185   };
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   };
201
202   /**
203    * used for getting load balance statistics
204    */
205   index_t dpoi_index;
206
207 } lisp_gpe_fwd_entry_t;
208
209 extern int
210 vnet_lisp_gpe_add_del_fwd_entry (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
211                                  u32 * hw_if_indexp);
212
213 extern void vnet_lisp_gpe_fwd_entry_flush (void);
214
215 extern u32 lisp_l2_fib_lookup (lisp_gpe_main_t * lgm,
216                                u16 bd_index, u8 src_mac[8], u8 dst_mac[8]);
217
218 extern const dpo_id_t *lisp_nsh_fib_lookup (lisp_gpe_main_t * lgm,
219                                             u32 spi_si);
220 extern void
221 vnet_lisp_gpe_del_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
222                                 u32 fwd_entry_index);
223 extern void
224 vnet_lisp_gpe_add_fwd_counters (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
225                                 u32 fwd_entry_index);
226 extern u32 *vnet_lisp_gpe_get_fwd_entry_vnis (void);
227
228 int
229 vnet_lisp_gpe_get_fwd_stats (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
230                              vlib_counter_t * c);
231
232 #endif
233
234 /*
235  * fd.io coding-style-patch-verification: ON
236  *
237  * Local Variables:
238  * eval: (c-set-style "gnu")
239  * End:
240  */