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:
7 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 #ifndef __FIB_PATH_EXT_H__
17 #define __FIB_PATH_EXT_H__
19 #include <vnet/mpls/mpls.h>
20 #include <vnet/fib/fib_types.h>
21 #include <vnet/dpo/load_balance.h>
24 * A description of the type of path extension
26 typedef enum fib_path_ext_type_t_
29 * An MPLS extension that maintains the path's outgoing labels,
33 * A adj-source extension indicating the path's refinement criteria
37 } fib_path_ext_type_t;
40 * Flags present on an ADJ sourced path-extension
42 typedef enum fib_path_ext_adj_attr_t_
44 FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER,
45 } fib_path_ext_adj_attr_t;
47 typedef enum fib_path_ext_adj_flags_t_
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;
53 #define FIB_PATH_EXT_ADJ_ATTR_NAMES { \
54 [FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER] = "refines-cover", \
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; \
63 * A path extension is a per-entry addition to the forwarding information
64 * when packets are sent for that entry over that path.
67 * ip route add 1.1.1.1/32 via 10.10.10.10 out-label 100
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.
72 typedef struct fib_path_ext_t_
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
79 fib_route_path_t fpe_path;
80 #define fpe_label_stack fpe_path.frp_label_stack
84 * For an ADJ type extension
86 * Flags describing the adj state
88 fib_path_ext_adj_flags_t fpe_adj_flags;
92 * The type of path extension
94 fib_path_ext_type_t fpe_type;
97 * The index of the path. This is the global index, not the path's
98 * position in the path-list.
100 fib_node_index_t fpe_path_index;
101 } __attribute__ ((packed)) fib_path_ext_t;
103 extern u8 * format_fib_path_ext(u8 * s, va_list * args);
105 extern int fib_path_ext_cmp(fib_path_ext_t *path_ext,
106 const fib_route_path_t *rpath);
108 extern void fib_path_ext_resolve(fib_path_ext_t *path_ext,
109 fib_node_index_t path_list_index);
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);
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);
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);
126 extern u8* format_fib_path_ext_list (u8 * s, va_list * args);
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);
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);
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);