2 * This is an implementation of Segment Routing for IS-IS as per RFC 8667
4 * Copyright (C) 2019 Orange http://www.orange.com
6 * Author: Olivier Dugeon <olivier.dugeon@orange.com>
7 * Contributor: Renato Westphal <renato@opensourcerouting.org> for NetDEF
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License as published by the Free
11 * Software Foundation; either version 2 of the License, or (at your option)
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
19 * You should have received a copy of the GNU General Public License along
20 * with this program; see the file COPYING; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 #ifndef _FRR_ISIS_SR_H
25 #define _FRR_ISIS_SR_H
27 #include "lib/linklist.h"
29 #include "lib/nexthop.h"
30 #include "lib/typesafe.h"
32 #include "isisd/isis_tlvs.h"
35 * Segment Routing information is transported through the following Sub-TLVs:
37 * Sub-TLV Name Value TLVs
38 * ---------------------------------------------------------------------
41 * Prefix Segment Identifier 3 135, 235, 236 and 237
43 * Adjacency Segment Identifier 31 22, 23, 141, 222 and 223
44 * LAN Adjacency Segment Identifier 32 22, 23, 141, 222 and 223
46 * Segment Routing Capability 2 242
47 * Segment Routing Algorithm 19 242
48 * Node Maximum Stack Depth (MSD) 23 242
50 * Sub-TLV definitions, serialization and de-serialization are defined
54 #define SRGB_LOWER_BOUND 16000
55 #define SRGB_UPPER_BOUND 23999
57 /* Segment Routing Data Base (SRDB) RB-Tree structure */
58 PREDECL_RBTREE_UNIQ(srdb_node
)
59 PREDECL_RBTREE_UNIQ(srdb_node_prefix
)
60 PREDECL_RBTREE_UNIQ(srdb_area_prefix
)
61 PREDECL_RBTREE_UNIQ(srdb_prefix_cfg
)
63 /* Segment Routing Adjacency-SID type. */
65 ISIS_SR_ADJ_NORMAL
= 0,
69 /* Segment Routing Adjacency. */
72 enum sr_adj_type type
;
74 /* Adjacency-SID nexthop information. */
81 /* (LAN-)Adjacency-SID Sub-TLV. */
83 struct isis_adj_sid
*adj_sid
;
84 struct isis_lan_adj_sid
*ladj_sid
;
87 /* Back pointer to IS-IS adjacency. */
88 struct isis_adjacency
*adj
;
91 /* Segment Routing Prefix-SID type. */
93 ISIS_SR_PREFIX_LOCAL
= 0,
94 ISIS_SR_PREFIX_REMOTE
,
97 /* Segment Routing Nexthop Information. */
98 struct sr_nexthop_info
{
103 /* State of Object (SR-Node and SR-Prefix) stored in SRDB */
105 SRDB_STATE_VALIDATED
= 0,
111 /* Segment Routing Prefix-SID. */
113 /* SRDB RB-tree entries. */
114 struct srdb_node_prefix_item node_entry
;
115 struct srdb_area_prefix_item area_entry
;
118 struct prefix prefix
;
120 /* SID value, algorithm and flags subTLVs. */
121 struct isis_prefix_sid sid
;
123 /* Input label value. */
124 mpls_label_t input_label
;
126 /* Prefix-SID type. */
127 enum sr_prefix_type type
;
130 /* Information about this local Prefix-SID. */
131 struct sr_nexthop_info info
;
134 /* Route associated to this remote Prefix-SID. */
135 struct isis_route_info
*rinfo
;
139 /* Backpointer to Segment Routing node. */
142 /* SR-Prefix State used while the LSPDB is being parsed. */
143 enum srdb_state state
;
146 /* Segment Routing node. */
148 /* SRDB RB-tree entry. */
149 struct srdb_node_item entry
;
151 /* IS-IS level: ISIS_LEVEL1 or ISIS_LEVEL2. */
154 /* IS-IS node identifier. */
155 uint8_t sysid
[ISIS_SYS_ID_LEN
];
157 /* Segment Routing node capabilities (SRGB, SR Algorithms) subTLVs. */
158 struct isis_router_cap cap
;
160 /* List of Prefix-SIDs advertised by this node. */
161 struct srdb_node_prefix_head prefix_sids
;
163 /* Backpointer to IS-IS area. */
164 struct isis_area
*area
;
166 /* SR-Node State used while the LSPDB is being parsed. */
167 enum srdb_state state
;
170 /* SID type. NOTE: these values must be in sync with the YANG module. */
171 enum sr_sid_value_type
{
172 SR_SID_VALUE_TYPE_INDEX
= 0,
173 SR_SID_VALUE_TYPE_ABSOLUTE
= 1,
176 #define IS_SID_VALUE(flag) CHECK_FLAG(flag, ISIS_PREFIX_SID_VALUE)
178 /* Last Hop Behavior. NOTE: these values must be in sync with the YANG module */
179 enum sr_last_hop_behavior
{
180 SR_LAST_HOP_BEHAVIOR_EXP_NULL
= 0,
181 SR_LAST_HOP_BEHAVIOR_NO_PHP
= 1,
182 SR_LAST_HOP_BEHAVIOR_PHP
= 2,
185 /* Segment Routing Prefix-SID configuration. */
186 struct sr_prefix_cfg
{
187 /* SRDB RB-tree entry. */
188 struct srdb_prefix_cfg_item entry
;
191 struct prefix prefix
;
196 /* SID value type. */
197 enum sr_sid_value_type sid_type
;
199 /* SID last hop behavior. */
200 enum sr_last_hop_behavior last_hop_behavior
;
202 /* Does this Prefix-SID refer to a loopback address (Node-SID)? */
205 /* Backpointer to IS-IS area. */
206 struct isis_area
*area
;
209 /* Per-area IS-IS Segment Routing Data Base (SRDB). */
211 /* Global Operational status of Segment Routing. */
214 /* List of local Adjacency-SIDs. */
215 struct list
*adj_sids
;
217 /* Segment Routing Node information per IS-IS level. */
218 struct srdb_node_head sr_nodes
[ISIS_LEVELS
];
220 /* Segment Routing Prefix-SIDs per IS-IS level. */
221 struct srdb_area_prefix_head prefix_sids
[ISIS_LEVELS
];
223 /* Area Segment Routing configuration. */
225 /* Administrative status of Segment Routing. */
228 /* Segment Routing Global Block lower & upper bound. */
229 uint32_t srgb_lower_bound
;
230 uint32_t srgb_upper_bound
;
232 /* Maximum SID Depth supported by the node. */
235 /* Prefix-SID mappings. */
236 struct srdb_prefix_cfg_head prefix_sids
;
241 extern int isis_sr_cfg_srgb_update(struct isis_area
*area
, uint32_t lower_bound
,
242 uint32_t upper_bound
);
243 extern struct sr_prefix_cfg
*
244 isis_sr_cfg_prefix_add(struct isis_area
*area
, const struct prefix
*prefix
);
245 extern void isis_sr_cfg_prefix_del(struct sr_prefix_cfg
*pcfg
);
246 extern struct sr_prefix_cfg
*
247 isis_sr_cfg_prefix_find(struct isis_area
*area
, union prefixconstptr prefix
);
248 extern void isis_sr_prefix_cfg2subtlv(const struct sr_prefix_cfg
*pcfg
,
250 struct isis_prefix_sid
*psid
);
251 extern void isis_sr_nexthop_update(struct sr_nexthop_info
*srnh
,
253 extern void isis_sr_nexthop_reset(struct sr_nexthop_info
*srnh
);
254 extern void isis_area_verify_sr(struct isis_area
*area
);
255 extern int isis_sr_start(struct isis_area
*area
);
256 extern void isis_sr_stop(struct isis_area
*area
);
257 extern void isis_sr_area_init(struct isis_area
*area
);
258 extern void isis_sr_area_term(struct isis_area
*area
);
259 extern void isis_sr_init(void);
260 extern void isis_sr_term(void);
262 #endif /* _FRR_ISIS_SR_H */