f79236711eab8737ee0ff1f31c3a97c289ec30e8
[vpp.git] / vnet / 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    * This object joins the FIB control plane graph to receive updates to
79    * for changes to the graph.
80    */
81   fib_node_t node;
82
83   /**
84    * The Entry's key: {lEID,r-EID,vni}
85    */
86   lisp_gpe_fwd_entry_key_t *key;
87
88   /**
89    * The forwarding entry type
90    */
91   lisp_gpe_fwd_entry_type_t type;
92
93   /**
94    * The tenant the entry belongs to
95    */
96   u32 tenant;
97
98   /**
99    * The VRF (in the case of L3) or Bridge-Domain (for L2) index
100    */
101   union
102   {
103     /**
104      * Fields relevant to an L2 entry
105      */
106     struct
107     {
108       /**
109        * The VRF ID
110        */
111       u32 eid_table_id;
112
113       /**
114        * The FIB index for the overlay, i.e. the FIB in which the EIDs
115        * are present
116        */
117       u32 eid_fib_index;
118       /**
119        * The SRC-FIB index for created for anding source-route entries
120        */
121       u32 src_fib_index;
122     };
123     /**
124      * Fields relevant to an L2 entry
125      */
126     struct
127     {
128       /**
129        * The Bridge-Domain (for L2) index
130        */
131       u32 eid_bd_id;
132
133       /**
134        * The Bridge-domain index for the overlay EIDs
135        */
136       u32 eid_bd_index;
137
138       /**
139        * The path-list created for the forwarding
140        */
141       fib_node_index_t path_list_index;
142
143       /**
144        * Child index of this entry on the path-list
145        */
146       u32 child_index;
147
148       /**
149        * The DPO used to forward
150        */
151       dpo_id_t dpo;
152     } l2;
153   };
154
155   union
156   {
157     /**
158      * @brief When the type is 'normal'
159      *        The RLOC pair that form the route's paths. i.e. where to send
160      *        packets for this route.
161      */
162     lisp_fwd_path_t *paths;
163
164     /**
165      * @brief When the type is negative. The action to take.
166      */
167     negative_fwd_actions_e action;
168   };
169 } lisp_gpe_fwd_entry_t;
170
171 extern int
172 vnet_lisp_gpe_add_del_fwd_entry (vnet_lisp_gpe_add_del_fwd_entry_args_t * a,
173                                  u32 * hw_if_indexp);
174
175 extern void vnet_lisp_gpe_fwd_entry_flush (void);
176
177 extern u32 lisp_l2_fib_lookup (lisp_gpe_main_t * lgm,
178                                u16 bd_index, u8 src_mac[8], u8 dst_mac[8]);
179
180 #endif
181
182 /*
183  * fd.io coding-style-patch-verification: ON
184  *
185  * Local Variables:
186  * eval: (c-set-style "gnu")
187  * End:
188  */