blob: 2850a58860859bbaecace8995963e6df3bae85bf [file] [log] [blame]
Neale Ranns0bfe5d82016-08-25 15:29:12 +01001/*
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>
Neale Ranns0f26c5a2017-03-01 15:12:11 -080021#include <vnet/dpo/load_balance.h>
Neale Ranns0bfe5d82016-08-25 15:29:12 +010022
23/**
Neale Ranns81424992017-05-18 03:03:22 -070024 * A description of the type of path extension
25 */
26typedef 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 */
42typedef enum fib_path_ext_adj_attr_t_
43{
44 FIB_PATH_EXT_ADJ_ATTR_REFINES_COVER,
45} fib_path_ext_adj_attr_t;
46
47typedef 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/**
Neale Ranns31ed7442018-02-23 05:29:09 -080063 * Flags present on an MPLS label sourced path-extension
64 */
65typedef 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
73typedef 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/**
Eyal Baric5b13602016-11-24 19:42:43 +020089 * A path extension is a per-entry addition to the forwarding information
Neale Ranns0bfe5d82016-08-25 15:29:12 +010090 * when packets are sent for that entry over that path.
91 *
92 * For example:
Neale Rannsad422ed2016-11-02 14:20:04 +000093 * ip route add 1.1.1.1/32 via 10.10.10.10 out-label 100
Neale Ranns0bfe5d82016-08-25 15:29:12 +010094 *
95 * The out-going MPLS label value 100 is a path-extension. It is a value sepcific
Neale Rannsad422ed2016-11-02 14:20:04 +000096 * to the entry 1.1.1.1/32 and valid only when packets are sent via 10.10.10.10.
Neale Ranns0bfe5d82016-08-25 15:29:12 +010097 */
98typedef 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;
Neale Rannsad422ed2016-11-02 14:20:04 +0000106#define fpe_label_stack fpe_path.frp_label_stack
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100107
Neale Ranns81424992017-05-18 03:03:22 -0700108 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;
Neale Ranns31ed7442018-02-23 05:29:09 -0800115 /**
116 * For an MPLS type extension
117 *
118 * Flags describing the mpls state
119 */
120 fib_path_ext_mpls_flags_t fpe_mpls_flags;
Neale Ranns81424992017-05-18 03:03:22 -0700121 };
122
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100123 /**
Neale Rannsdcd6d622017-05-26 02:59:16 -0700124 * The type of path extension
125 */
126 fib_path_ext_type_t fpe_type;
127
128 /**
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100129 * 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;
Neale Ranns31ed7442018-02-23 05:29:09 -0800133} __attribute__ ((packed)) fib_path_ext_t;
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100134
135extern u8 * format_fib_path_ext(u8 * s, va_list * args);
136
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100137extern int fib_path_ext_cmp(fib_path_ext_t *path_ext,
138 const fib_route_path_t *rpath);
139
140extern void fib_path_ext_resolve(fib_path_ext_t *path_ext,
141 fib_node_index_t path_list_index);
142
143extern load_balance_path_t *fib_path_ext_stack(fib_path_ext_t *path_ext,
Neale Ranns53962fb2021-12-20 18:18:42 +0000144 dpo_proto_t payload_proto,
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100145 fib_forward_chain_type_t fct,
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100146 load_balance_path_t *nhs);
147
Neale Ranns81424992017-05-18 03:03:22 -0700148extern 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
153extern 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
158extern u8* format_fib_path_ext_list (u8 * s, va_list * args);
159
160extern 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
164extern 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);
167extern 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);
169extern void fib_path_ext_list_resolve(fib_path_ext_list_t *list,
170 fib_node_index_t path_list_index);
171
172extern int fib_path_ext_list_length(const fib_path_ext_list_t *list);
173extern void fib_path_ext_list_flush(fib_path_ext_list_t *list);
174
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100175#endif
176