MPLS Unifom mode
[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  * Flags present on an MPLS label sourced path-extension
64  */
65 typedef enum fib_path_ext_mpls_attr_t_
66 {
67     /**
68      * Do not decrement the TTL of IP packet during imposition
69      */
70     FIB_PATH_EXT_MPLS_ATTR_NO_IP_TTL_DECR,
71 } fib_path_ext_mpls_attr_t;
72
73 typedef enum fib_path_ext_mpls_flags_t_
74 {
75     FIB_PATH_EXT_MPLS_FLAG_NONE = 0,
76     FIB_PATH_EXT_MPLS_FLAG_NO_IP_TTL_DECR = (1 << FIB_PATH_EXT_MPLS_ATTR_NO_IP_TTL_DECR),
77 } fib_path_ext_mpls_flags_t;
78
79 #define FIB_PATH_EXT_MPLS_ATTR_NAMES {                               \
80     [FIB_PATH_EXT_MPLS_ATTR_NO_IP_TTL_DECR] = "no-ip-tll-decr",      \
81 }
82
83 #define FOR_EACH_PATH_EXT_MPLS_ATTR(_item)                \
84     for (_item = FIB_PATH_EXT_MPLS_ATTR_NO_IP_TTL_DECR;   \
85          _item <= FIB_PATH_EXT_MPLS_ATTR_NO_IP_TTL_DECR;  \
86          _item++)
87
88 /**
89  * A path extension is a per-entry addition to the forwarding information
90  * when packets are sent for that entry over that path.
91  *
92  * For example:
93  *    ip route add 1.1.1.1/32 via 10.10.10.10 out-label 100
94  *
95  * The out-going MPLS label value 100 is a path-extension. It is a value sepcific
96  * to the entry 1.1.1.1/32 and valid only when packets are sent via 10.10.10.10.
97  */
98 typedef struct fib_path_ext_t_
99 {
100     /**
101      * A description of the path that is being extended.
102      * This description is used to match this extension with the [changing]
103      * instance of a fib_path_t that is extended
104      */
105     fib_route_path_t fpe_path;
106 #define fpe_label_stack fpe_path.frp_label_stack
107
108     union {
109         /**
110          * For an ADJ type extension
111          *
112          * Flags describing the adj state
113          */
114         fib_path_ext_adj_flags_t fpe_adj_flags;
115         /**
116          * For an MPLS type extension
117          *
118          * Flags describing the mpls state
119          */
120         fib_path_ext_mpls_flags_t fpe_mpls_flags;
121     };
122
123     /**
124      * The type of path extension
125      */
126     fib_path_ext_type_t fpe_type;
127
128     /**
129      * The index of the path. This is the global index, not the path's
130      * position in the path-list.
131      */
132     fib_node_index_t fpe_path_index;
133 } __attribute__ ((packed)) fib_path_ext_t;
134
135 extern u8 * format_fib_path_ext(u8 * s, va_list * args);
136
137 extern int fib_path_ext_cmp(fib_path_ext_t *path_ext,
138                             const fib_route_path_t *rpath);
139
140 extern void fib_path_ext_resolve(fib_path_ext_t *path_ext,
141                                  fib_node_index_t path_list_index);
142
143 extern load_balance_path_t *fib_path_ext_stack(fib_path_ext_t *path_ext,
144                                                fib_forward_chain_type_t fct,
145                                                fib_forward_chain_type_t imp_null_fct,
146                                                load_balance_path_t *nhs);
147
148 extern fib_path_ext_t * fib_path_ext_list_push_back (fib_path_ext_list_t *list,
149                                                      fib_node_index_t path_list_index,
150                                                      fib_path_ext_type_t ext_type,
151                                                      const fib_route_path_t *rpath);
152
153 extern fib_path_ext_t * fib_path_ext_list_insert (fib_path_ext_list_t *list,
154                                                   fib_node_index_t path_list_index,
155                                                   fib_path_ext_type_t ext_type,
156                                                   const fib_route_path_t *rpath);
157
158 extern u8* format_fib_path_ext_list (u8 * s, va_list * args);
159
160 extern void fib_path_ext_list_remove (fib_path_ext_list_t *list,
161                                       fib_path_ext_type_t ext_type,
162                                       const fib_route_path_t *rpath);
163
164 extern fib_path_ext_t * fib_path_ext_list_find (const fib_path_ext_list_t *list,
165                                                 fib_path_ext_type_t ext_type,
166                                                 const fib_route_path_t *rpath);
167 extern fib_path_ext_t * fib_path_ext_list_find_by_path_index (const fib_path_ext_list_t *list,
168                                                               fib_node_index_t path_index);
169 extern void fib_path_ext_list_resolve(fib_path_ext_list_t *list,
170                                       fib_node_index_t path_list_index);
171
172 extern int fib_path_ext_list_length(const fib_path_ext_list_t *list);
173 extern void fib_path_ext_list_flush(fib_path_ext_list_t *list);
174
175 #endif
176