ldp.h revision 1.42
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 */
113struct 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 */
125struct tlv {
126	uint16_t	type;
127	uint16_t	length;
128};
129#define	TLV_HDR_SIZE		4
130
131struct 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
146struct 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
156struct hello_prms_opt4_tlv {
157	uint16_t	type;
158	uint16_t	length;
159	uint32_t	value;
160};
161
162struct 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
218struct 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
233struct 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
245struct 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
268struct 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 */
298struct 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
310struct 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
318struct 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
326struct 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