d07941c108b08db0236315812dc262b90768e48f
[vpp.git] / src / vnet / fib / fib_path_ext.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 #ifndef __FIB_PATH_EXT_H__
17 #define __FIB_PATH_EXT_H__
18
19 #include <vnet/mpls/mpls.h>
20 #include <vnet/fib/fib_types.h>
21 #include <vnet/dpo/load_balance.h>
22
23 /**
24  * A description of the type of path extension
25  */
26 typedef enum fib_path_ext_type_t_
27 {
28     /**
29      * An MPLS extension that maintains the path's outgoing labels,
30      */
31     FIB_PATH_EXT_MPLS,
32     /**
33      * A adj-source extension indicating the path's refinement criteria
34      * result
35      */
36     FIB_PATH_EXT_ADJ,
37 } fib_path_ext_type_t;
38
39 /**
40  * Flags present on an ADJ sourced path-extension
41  */
42 typedef enum fib_path_ext_adj_attr_t_
43 {
44     FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER,
45 } fib_path_ext_adj_attr_t;
46
47 typedef enum fib_path_ext_adj_flags_t_
48 {
49     FIB_PATH_EXT_ADJ_FLAG_NONE = 0,
50     FIB_PATH_EXT_ADJ_FLAG_REFINES_COVER = (1 << FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER),
51 } fib_path_ext_adj_flags_t;
52
53 #define FIB_PATH_EXT_ADJ_ATTR_NAMES {                               \
54     [FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER] = "refines-cover",        \
55 }
56
57 #define FOR_EACH_PATH_EXT_ADJ_ATTR(_item)               \
58     for (_item = FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER;   \
59          _item <= FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER;  \
60          _item++)
61
62 /**
63  * A path extension is a per-entry addition to the forwarding information
64  * when packets are sent for that entry over that path.
65  *
66  * For example:
67  *    ip route add 1.1.1.1/32 via 10.10.10.10 out-label 100
68  *
69  * The out-going MPLS label value 100 is a path-extension. It is a value sepcific
70  * to the entry 1.1.1.1/32 and valid only when packets are sent via 10.10.10.10.
71  */
72 typedef struct fib_path_ext_t_
73 {
74     /**
75      * A description of the path that is being extended.
76      * This description is used to match this extension with the [changing]
77      * instance of a fib_path_t that is extended
78      */
79     fib_route_path_t fpe_path;
80 #define fpe_label_stack fpe_path.frp_label_stack
81
82     union {
83         /**
84          * For an ADJ type extension
85          *
86          * Flags describing the adj state
87          */
88         fib_path_ext_adj_flags_t fpe_adj_flags;
89     };
90
91     /**
92      * The type of path extension
93      */
94     fib_path_ext_type_t fpe_type;
95
96     /**
97      * The index of the path. This is the global index, not the path's
98      * position in the path-list.
99      */
100     fib_node_index_t fpe_path_index;
101 } __attribute__ ((packed))  fib_path_ext_t;
102
103 extern u8 * format_fib_path_ext(u8 * s, va_list * args);
104
105 extern int fib_path_ext_cmp(fib_path_ext_t *path_ext,
106                             const fib_route_path_t *rpath);
107
108 extern void fib_path_ext_resolve(fib_path_ext_t *path_ext,
109                                  fib_node_index_t path_list_index);
110
111 extern load_balance_path_t *fib_path_ext_stack(fib_path_ext_t *path_ext,
112                                                fib_forward_chain_type_t fct,
113                                                fib_forward_chain_type_t imp_null_fct,
114                                                load_balance_path_t *nhs);
115
116 extern fib_path_ext_t * fib_path_ext_list_push_back (fib_path_ext_list_t *list,
117                                                      fib_node_index_t path_list_index,
118                                                      fib_path_ext_type_t ext_type,
119                                                      const fib_route_path_t *rpath);
120
121 extern fib_path_ext_t * fib_path_ext_list_insert (fib_path_ext_list_t *list,
122                                                   fib_node_index_t path_list_index,
123                                                   fib_path_ext_type_t ext_type,
124                                                   const fib_route_path_t *rpath);
125
126 extern u8* format_fib_path_ext_list (u8 * s, va_list * args);
127
128 extern void fib_path_ext_list_remove (fib_path_ext_list_t *list,
129                                       fib_path_ext_type_t ext_type,
130                                       const fib_route_path_t *rpath);
131
132 extern fib_path_ext_t * fib_path_ext_list_find (const fib_path_ext_list_t *list,
133                                                 fib_path_ext_type_t ext_type,
134                                                 const fib_route_path_t *rpath);
135 extern fib_path_ext_t * fib_path_ext_list_find_by_path_index (const fib_path_ext_list_t *list,
136                                                               fib_node_index_t path_index);
137 extern void fib_path_ext_list_resolve(fib_path_ext_list_t *list,
138                                       fib_node_index_t path_list_index);
139
140 extern int fib_path_ext_list_length(const fib_path_ext_list_t *list);
141 extern void fib_path_ext_list_flush(fib_path_ext_list_t *list);
142
143 #endif
144