blob: d07941c108b08db0236315812dc262b90768e48f [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/**
Eyal Baric5b13602016-11-24 19:42:43 +020063 * A path extension is a per-entry addition to the forwarding information
Neale Ranns0bfe5d82016-08-25 15:29:12 +010064 * when packets are sent for that entry over that path.
65 *
66 * For example:
Neale Rannsad422ed2016-11-02 14:20:04 +000067 * ip route add 1.1.1.1/32 via 10.10.10.10 out-label 100
Neale Ranns0bfe5d82016-08-25 15:29:12 +010068 *
69 * The out-going MPLS label value 100 is a path-extension. It is a value sepcific
Neale Rannsad422ed2016-11-02 14:20:04 +000070 * 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 +010071 */
72typedef 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;
Neale Rannsad422ed2016-11-02 14:20:04 +000080#define fpe_label_stack fpe_path.frp_label_stack
Neale Ranns0bfe5d82016-08-25 15:29:12 +010081
Neale Ranns81424992017-05-18 03:03:22 -070082 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
Neale Ranns0bfe5d82016-08-25 15:29:12 +010091 /**
Neale Rannsdcd6d622017-05-26 02:59:16 -070092 * The type of path extension
93 */
94 fib_path_ext_type_t fpe_type;
95
96 /**
Neale Ranns0bfe5d82016-08-25 15:29:12 +010097 * 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;
Neale Ranns81424992017-05-18 03:03:22 -0700101} __attribute__ ((packed)) fib_path_ext_t;
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100102
103extern u8 * format_fib_path_ext(u8 * s, va_list * args);
104
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100105extern int fib_path_ext_cmp(fib_path_ext_t *path_ext,
106 const fib_route_path_t *rpath);
107
108extern void fib_path_ext_resolve(fib_path_ext_t *path_ext,
109 fib_node_index_t path_list_index);
110
111extern load_balance_path_t *fib_path_ext_stack(fib_path_ext_t *path_ext,
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100112 fib_forward_chain_type_t fct,
Neale Ranns0f26c5a2017-03-01 15:12:11 -0800113 fib_forward_chain_type_t imp_null_fct,
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100114 load_balance_path_t *nhs);
115
Neale Ranns81424992017-05-18 03:03:22 -0700116extern 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
121extern 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
126extern u8* format_fib_path_ext_list (u8 * s, va_list * args);
127
128extern 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
132extern 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);
135extern 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);
137extern void fib_path_ext_list_resolve(fib_path_ext_list_t *list,
138 fib_node_index_t path_list_index);
139
140extern int fib_path_ext_list_length(const fib_path_ext_list_t *list);
141extern void fib_path_ext_list_flush(fib_path_ext_list_t *list);
142
Neale Ranns0bfe5d82016-08-25 15:29:12 +0100143#endif
144