xref: /openbsd/usr.sbin/ldpd/ldp.h (revision 38e65088)
1 /*	$OpenBSD: ldp.h,v 1.42 2017/03/04 00:21:48 renato Exp $ */
2 
3 /*
4  * Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
5  * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
6  * Copyright (c) 2004, 2005, 2008 Esben Norby <norby@openbsd.org>
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 /* LDP protocol definitions */
22 
23 #ifndef _LDP_H_
24 #define _LDP_H_
25 
26 #include <sys/types.h>
27 
28 /* misc */
29 #define LDP_VERSION		1
30 #define LDP_PORT		646
31 #define LDP_MAX_LEN		4096
32 
33 /* All Routers on this Subnet group multicast addresses */
34 #define AllRouters_v4		"224.0.0.2"
35 #define AllRouters_v6		"ff02::2"
36 
37 #define LINK_DFLT_HOLDTIME	15
38 #define TARGETED_DFLT_HOLDTIME	45
39 #define MIN_HOLDTIME		3
40 #define MAX_HOLDTIME		0xffff
41 #define	INFINITE_HOLDTIME	0xffff
42 
43 #define DEFAULT_KEEPALIVE	180
44 #define MIN_KEEPALIVE		3
45 #define MAX_KEEPALIVE		0xffff
46 #define KEEPALIVE_PER_PERIOD	3
47 #define INIT_FSM_TIMEOUT	15
48 
49 #define	DEFAULT_HELLO_INTERVAL	5
50 #define	MIN_HELLO_INTERVAL	1
51 #define	MAX_HELLO_INTERVAL	0xffff
52 
53 #define	INIT_DELAY_TMR		15
54 #define	MAX_DELAY_TMR		120
55 
56 #define	MIN_PWID_ID		1
57 #define	MAX_PWID_ID		0xffffffff
58 
59 #define	DEFAULT_L2VPN_MTU	1500
60 #define	MIN_L2VPN_MTU		512
61 #define	MAX_L2VPN_MTU		0xffff
62 
63 /* LDP message types */
64 #define MSG_TYPE_NOTIFICATION	0x0001
65 #define MSG_TYPE_HELLO		0x0100
66 #define MSG_TYPE_INIT		0x0200
67 #define MSG_TYPE_KEEPALIVE	0x0201
68 #define MSG_TYPE_CAPABILITY	0x0202 /* RFC 5561 */
69 #define MSG_TYPE_ADDR		0x0300
70 #define MSG_TYPE_ADDRWITHDRAW	0x0301
71 #define MSG_TYPE_LABELMAPPING	0x0400
72 #define MSG_TYPE_LABELREQUEST	0x0401
73 #define MSG_TYPE_LABELWITHDRAW	0x0402
74 #define MSG_TYPE_LABELRELEASE	0x0403
75 #define MSG_TYPE_LABELABORTREQ	0x0404
76 
77 /* LDP TLV types */
78 #define TLV_TYPE_FEC		0x0100
79 #define TLV_TYPE_ADDRLIST	0x0101
80 #define TLV_TYPE_HOPCOUNT	0x0103
81 #define TLV_TYPE_PATHVECTOR	0x0104
82 #define TLV_TYPE_GENERICLABEL	0x0200
83 #define TLV_TYPE_ATMLABEL	0x0201
84 #define TLV_TYPE_FRLABEL	0x0202
85 #define TLV_TYPE_STATUS		0x0300
86 #define TLV_TYPE_EXTSTATUS	0x0301
87 #define TLV_TYPE_RETURNEDPDU	0x0302
88 #define TLV_TYPE_RETURNEDMSG	0x0303
89 #define TLV_TYPE_COMMONHELLO	0x0400
90 #define TLV_TYPE_IPV4TRANSADDR	0x0401
91 #define TLV_TYPE_CONFIG		0x0402
92 #define TLV_TYPE_IPV6TRANSADDR	0x0403
93 #define TLV_TYPE_COMMONSESSION	0x0500
94 #define TLV_TYPE_ATMSESSIONPAR	0x0501
95 #define TLV_TYPE_FRSESSION	0x0502
96 #define TLV_TYPE_LABELREQUEST	0x0600
97 /* RFC 4447 */
98 #define TLV_TYPE_MAC_LIST	0x8404
99 #define TLV_TYPE_PW_STATUS	0x896A
100 #define TLV_TYPE_PW_IF_PARAM	0x096B
101 #define TLV_TYPE_PW_GROUP_ID	0x096C
102 /* RFC 5561 */
103 #define TLV_TYPE_RETURNED_TLVS	0x8304
104 #define TLV_TYPE_DYNAMIC_CAP	0x8506
105 /* RFC 5918 */
106 #define TLV_TYPE_TWCARD_CAP	0x850B
107 /* RFC 5919 */
108 #define TLV_TYPE_UNOTIF_CAP	0x8603
109 /* RFC 7552 */
110 #define TLV_TYPE_DUALSTACK	0x8701
111 
112 /* LDP header */
113 struct ldp_hdr {
114 	uint16_t	version;
115 	uint16_t	length;
116 	uint32_t	lsr_id;
117 	uint16_t	lspace_id;
118 } __packed;
119 
120 #define	LDP_HDR_SIZE		10	/* actual size of the LDP header */
121 #define	LDP_HDR_PDU_LEN		6	/* minimum "PDU Length" */
122 #define LDP_HDR_DEAD_LEN	4
123 
124 /* TLV record */
125 struct tlv {
126 	uint16_t	type;
127 	uint16_t	length;
128 };
129 #define	TLV_HDR_SIZE		4
130 
131 struct ldp_msg {
132 	uint16_t	type;
133 	uint16_t	length;
134 	uint32_t	id;
135 	/* Mandatory Parameters */
136 	/* Optional Parameters */
137 } __packed;
138 
139 #define LDP_MSG_SIZE		8	/* minimum size of LDP message */
140 #define LDP_MSG_LEN		4	/* minimum "Message Length" */
141 #define LDP_MSG_DEAD_LEN	4
142 
143 #define	UNKNOWN_FLAG		0x8000
144 #define	FORWARD_FLAG		0xc000
145 
146 struct hello_prms_tlv {
147 	uint16_t	type;
148 	uint16_t	length;
149 	uint16_t	holdtime;
150 	uint16_t	flags;
151 };
152 #define F_HELLO_TARGETED	0x8000
153 #define F_HELLO_REQ_TARG	0x4000
154 #define F_HELLO_GTSM		0x2000
155 
156 struct hello_prms_opt4_tlv {
157 	uint16_t	type;
158 	uint16_t	length;
159 	uint32_t	value;
160 };
161 
162 struct hello_prms_opt16_tlv {
163 	uint16_t	type;
164 	uint16_t	length;
165 	uint8_t		value[16];
166 };
167 
168 #define DUAL_STACK_LDPOV4	4
169 #define DUAL_STACK_LDPOV6	6
170 
171 #define F_HELLO_TLV_RCVD_ADDR	0x01
172 #define F_HELLO_TLV_RCVD_CONF	0x02
173 #define F_HELLO_TLV_RCVD_DS	0x04
174 
175 #define	S_SUCCESS	0x00000000
176 #define	S_BAD_LDP_ID	0x80000001
177 #define	S_BAD_PROTO_VER	0x80000002
178 #define	S_BAD_PDU_LEN	0x80000003
179 #define	S_UNKNOWN_MSG	0x00000004
180 #define	S_BAD_MSG_LEN	0x80000005
181 #define	S_UNKNOWN_TLV	0x00000006
182 #define	S_BAD_TLV_LEN	0x80000007
183 #define	S_BAD_TLV_VAL	0x80000008
184 #define	S_HOLDTIME_EXP	0x80000009
185 #define	S_SHUTDOWN	0x8000000A
186 #define	S_LOOP_DETECTED	0x0000000B
187 #define	S_UNKNOWN_FEC	0x0000000C
188 #define	S_NO_ROUTE	0x0000000D
189 #define	S_NO_LABEL_RES	0x0000000E
190 #define	S_AVAILABLE	0x0000000F
191 #define	S_NO_HELLO	0x80000010
192 #define	S_PARM_ADV_MODE	0x80000011
193 #define	S_MAX_PDU_LEN	0x80000012
194 #define	S_PARM_L_RANGE	0x80000013
195 #define	S_KEEPALIVE_TMR	0x80000014
196 #define	S_LAB_REQ_ABRT	0x00000015
197 #define	S_MISS_MSG	0x00000016
198 #define	S_UNSUP_ADDR	0x00000017
199 #define	S_KEEPALIVE_BAD	0x80000018
200 #define	S_INTERN_ERR	0x80000019
201 /* RFC 4447 */
202 #define S_ILLEGAL_CBIT	0x00000024
203 #define S_WRONG_CBIT	0x00000025
204 #define S_INCPT_BITRATE	0x00000026
205 #define S_CEP_MISCONF	0x00000027
206 #define S_PW_STATUS	0x00000028
207 #define S_UNASSIGN_TAI	0x00000029
208 #define S_MISCONF_ERR	0x0000002A
209 #define S_WITHDRAW_MTHD	0x0000002B
210 /* RFC 5561 */
211 #define	S_UNSSUPORTDCAP	0x0000002E
212 /* RFC 5919 */
213 #define	S_ENDOFLIB	0x0000002F
214 /* RFC 7552 */
215 #define	S_TRANS_MISMTCH	0x80000032
216 #define	S_DS_NONCMPLNCE	0x80000033
217 
218 struct sess_prms_tlv {
219 	uint16_t	type;
220 	uint16_t	length;
221 	uint16_t	proto_version;
222 	uint16_t	keepalive_time;
223 	uint8_t		reserved;
224 	uint8_t		pvlim;
225 	uint16_t	max_pdu_len;
226 	uint32_t	lsr_id;
227 	uint16_t	lspace_id;
228 } __packed;
229 
230 #define SESS_PRMS_SIZE		18
231 #define SESS_PRMS_LEN		14
232 
233 struct status_tlv {
234 	uint16_t	type;
235 	uint16_t	length;
236 	uint32_t	status_code;
237 	uint32_t	msg_id;
238 	uint16_t	msg_type;
239 } __packed;
240 
241 #define STATUS_SIZE		14
242 #define STATUS_TLV_LEN		10
243 #define	STATUS_FATAL		0x80000000
244 
245 struct capability_tlv {
246 	uint16_t	type;
247 	uint16_t	length;
248 	uint8_t		reserved;
249 };
250 #define STATE_BIT		0x80
251 
252 #define F_CAP_TLV_RCVD_DYNAMIC	0x01
253 #define F_CAP_TLV_RCVD_TWCARD	0x02
254 #define F_CAP_TLV_RCVD_UNOTIF	0x04
255 
256 #define CAP_TLV_DYNAMIC_SIZE	5
257 #define CAP_TLV_DYNAMIC_LEN	1
258 
259 #define CAP_TLV_TWCARD_SIZE	5
260 #define CAP_TLV_TWCARD_LEN	1
261 
262 #define CAP_TLV_UNOTIF_SIZE	5
263 #define CAP_TLV_UNOTIF_LEN	1
264 
265 #define	AF_IPV4			0x1
266 #define	AF_IPV6			0x2
267 
268 struct address_list_tlv {
269 	uint16_t	type;
270 	uint16_t	length;
271 	uint16_t	family;
272 	/* address entries */
273 } __packed;
274 
275 #define ADDR_LIST_SIZE		6
276 
277 #define FEC_ELM_WCARD_LEN	1
278 #define FEC_ELM_PREFIX_MIN_LEN	4
279 #define FEC_PWID_ELM_MIN_LEN	8
280 #define FEC_PWID_SIZE		4
281 #define FEC_ELM_TWCARD_MIN_LEN	3
282 
283 #define	MAP_TYPE_WILDCARD	0x01
284 #define	MAP_TYPE_PREFIX		0x02
285 #define	MAP_TYPE_TYPED_WCARD	0x05
286 #define	MAP_TYPE_PWID		0x80
287 #define	MAP_TYPE_GENPWID	0x81
288 
289 #define CONTROL_WORD_FLAG	0x8000
290 #define PW_TYPE_ETHERNET_TAGGED	0x0004
291 #define PW_TYPE_ETHERNET	0x0005
292 #define PW_TYPE_WILDCARD	0x7FFF
293 #define DEFAULT_PW_TYPE		PW_TYPE_ETHERNET
294 
295 #define PW_TWCARD_RESERVED_BIT	0x8000
296 
297 /* RFC 4447 Sub-TLV record */
298 struct subtlv {
299 	uint8_t		type;
300 	uint8_t		length;
301 };
302 #define	SUBTLV_HDR_SIZE		2
303 
304 #define SUBTLV_IFMTU		0x01
305 #define SUBTLV_VLANID		0x06
306 
307 #define FEC_SUBTLV_IFMTU_SIZE	4
308 #define FEC_SUBTLV_VLANID_SIZE	4
309 
310 struct label_tlv {
311 	uint16_t	type;
312 	uint16_t	length;
313 	uint32_t	label;
314 };
315 #define LABEL_TLV_SIZE		8
316 #define LABEL_TLV_LEN		4
317 
318 struct reqid_tlv {
319 	uint16_t	type;
320 	uint16_t	length;
321 	uint32_t	reqid;
322 };
323 #define REQID_TLV_SIZE		8
324 #define REQID_TLV_LEN		4
325 
326 struct pw_status_tlv {
327 	uint16_t	type;
328 	uint16_t	length;
329 	uint32_t	value;
330 };
331 #define PW_STATUS_TLV_SIZE	8
332 #define PW_STATUS_TLV_LEN	4
333 
334 #define PW_FORWARDING		0
335 #define PW_NOT_FORWARDING	(1 << 0)
336 #define PW_LOCAL_RX_FAULT	(1 << 1)
337 #define PW_LOCAL_TX_FAULT	(1 << 2)
338 #define PW_PSN_RX_FAULT		(1 << 3)
339 #define PW_PSN_TX_FAULT		(1 << 4)
340 
341 #define	NO_LABEL		UINT32_MAX
342 
343 #endif /* !_LDP_H_ */
344