xref: /openbsd-src/usr.sbin/ospfd/ospf.h (revision 9171581de555a28e620bee01b500d7f654ebe727)
1*9171581dSmarkus /*	$OpenBSD: ospf.h,v 1.23 2013/01/17 09:14:15 markus Exp $ */
2204df0f8Sclaudio 
3204df0f8Sclaudio /*
4367f601bSnorby  * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
5204df0f8Sclaudio  *
6204df0f8Sclaudio  * Permission to use, copy, modify, and distribute this software for any
7204df0f8Sclaudio  * purpose with or without fee is hereby granted, provided that the above
8204df0f8Sclaudio  * copyright notice and this permission notice appear in all copies.
9204df0f8Sclaudio  *
10204df0f8Sclaudio  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11204df0f8Sclaudio  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12204df0f8Sclaudio  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13204df0f8Sclaudio  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14204df0f8Sclaudio  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15204df0f8Sclaudio  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16204df0f8Sclaudio  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17204df0f8Sclaudio  */
18204df0f8Sclaudio 
19204df0f8Sclaudio /* OSPF protocol definitions */
20204df0f8Sclaudio 
21204df0f8Sclaudio #ifndef _OSPF_H_
22204df0f8Sclaudio #define _OSPF_H_
23204df0f8Sclaudio 
24204df0f8Sclaudio #include <netinet/in.h>
25370c8b16Sguenther #include <stddef.h>
26204df0f8Sclaudio 
27204df0f8Sclaudio /* misc */
28204df0f8Sclaudio #define OSPF_VERSION		2
29204df0f8Sclaudio #define IPPROTO_OSPF		89
30204df0f8Sclaudio #define AllSPFRouters		"224.0.0.5"
31204df0f8Sclaudio #define AllDRouters		"224.0.0.6"
32204df0f8Sclaudio 
335909657cSnorby #define DEFAULT_METRIC		10
34f373ed5aSclaudio #define DEFAULT_REDIST_METRIC	100
35204df0f8Sclaudio #define MIN_METRIC		1
36ee89e4e9Sclaudio #define MAX_METRIC		65535	/* sum & as-ext lsa use 24bit metrics */
37204df0f8Sclaudio 
3844ca2d17Sclaudio #define DEFAULT_PRIORITY	1
39204df0f8Sclaudio #define MIN_PRIORITY		0
40204df0f8Sclaudio #define MAX_PRIORITY		255
41204df0f8Sclaudio 
42204df0f8Sclaudio #define DEFAULT_HELLO_INTERVAL	10
43204df0f8Sclaudio #define MIN_HELLO_INTERVAL	1
44204df0f8Sclaudio #define MAX_HELLO_INTERVAL	65535
45204df0f8Sclaudio 
467afdfd2dSdlg /* msec */
477afdfd2dSdlg #define DEFAULT_FAST_INTERVAL	333
487afdfd2dSdlg #define MIN_FAST_INTERVAL	50
497afdfd2dSdlg #define MAX_FAST_INTERVAL	333
507afdfd2dSdlg 
51204df0f8Sclaudio #define DEFAULT_RTR_DEAD_TIME	40
527afdfd2dSdlg #define FAST_RTR_DEAD_TIME	1
53204df0f8Sclaudio #define MIN_RTR_DEAD_TIME	2
54204df0f8Sclaudio #define MAX_RTR_DEAD_TIME	2147483647
55204df0f8Sclaudio 
56204df0f8Sclaudio #define DEFAULT_RXMT_INTERVAL	5
57204df0f8Sclaudio #define MIN_RXMT_INTERVAL	5
58204df0f8Sclaudio #define MAX_RXMT_INTERVAL	3600
59204df0f8Sclaudio 
601084cfe8Snorby #define DEFAULT_TRANSMIT_DELAY	1
611084cfe8Snorby #define MIN_TRANSMIT_DELAY	1
621084cfe8Snorby #define MAX_TRANSMIT_DELAY	3600
63204df0f8Sclaudio 
64*9171581dSmarkus #define DEFAULT_ADJ_TMOUT	120
65204df0f8Sclaudio 
6637cea71bSnorby #define DEFAULT_NBR_TMOUT	86400	/* 24 hours */
6737cea71bSnorby 
6837877ca4Sdlg /* msec */
6937877ca4Sdlg #define DEFAULT_SPF_DELAY	1000
7037877ca4Sdlg #define MIN_SPF_DELAY		10
7137877ca4Sdlg #define MAX_SPF_DELAY		10000
723ada9d8fSnorby 
7337877ca4Sdlg /* msec */
7437877ca4Sdlg #define DEFAULT_SPF_HOLDTIME	5000
7537877ca4Sdlg #define MIN_SPF_HOLDTIME	10
7637877ca4Sdlg #define MAX_SPF_HOLDTIME	5000
773ada9d8fSnorby 
78fddf39b9Ssthen /* msec */
79fddf39b9Ssthen #define KR_RELOAD_TIMER		250
80fddf39b9Ssthen #define KR_RELOAD_HOLD_TIMER	5000
81fddf39b9Ssthen 
8203431b74Snorby #define MIN_MD_ID		0
8303431b74Snorby #define MAX_MD_ID		255
8403431b74Snorby 
85eee4aafbSnorby #define MAX_SIMPLE_AUTH_LEN	8
86eee4aafbSnorby 
87204df0f8Sclaudio /* OSPF compatibility flags */
88097ed198Sclaudio #define OSPF_OPTION_MT		0x01
89204df0f8Sclaudio #define OSPF_OPTION_E		0x02
90204df0f8Sclaudio #define OSPF_OPTION_MC		0x04
91204df0f8Sclaudio #define OSPF_OPTION_NP		0x08
92204df0f8Sclaudio #define OSPF_OPTION_EA		0x10
93204df0f8Sclaudio #define OSPF_OPTION_DC		0x20
94097ed198Sclaudio #define OSPF_OPTION_O		0x40	/* only on DD options */
95097ed198Sclaudio #define OSPF_OPTION_DN		0x80	/* only on LSA options */
96204df0f8Sclaudio 
97204df0f8Sclaudio /* OSPF packet types */
98204df0f8Sclaudio #define PACKET_TYPE_HELLO	1
99204df0f8Sclaudio #define PACKET_TYPE_DD		2
100204df0f8Sclaudio #define PACKET_TYPE_LS_REQUEST	3
101204df0f8Sclaudio #define PACKET_TYPE_LS_UPDATE	4
102204df0f8Sclaudio #define PACKET_TYPE_LS_ACK	5
103204df0f8Sclaudio 
104204df0f8Sclaudio /* OSPF auth types */
105204df0f8Sclaudio #define	AUTH_TYPE_NONE		0
106204df0f8Sclaudio #define AUTH_TYPE_SIMPLE	1
107204df0f8Sclaudio #define	AUTH_TYPE_CRYPT		2
108204df0f8Sclaudio 
109204df0f8Sclaudio #define MIN_AUTHTYPE		0
110204df0f8Sclaudio #define MAX_AUTHTYPE		2
111204df0f8Sclaudio 
112204df0f8Sclaudio /* LSA */
113204df0f8Sclaudio #define LS_REFRESH_TIME		1800
114204df0f8Sclaudio #define MIN_LS_INTERVAL		5
115204df0f8Sclaudio #define MIN_LS_ARRIVAL		1
116204df0f8Sclaudio #define DEFAULT_AGE		0
117204df0f8Sclaudio #define MAX_AGE			3600
118204df0f8Sclaudio #define CHECK_AGE		300
119204df0f8Sclaudio #define MAX_AGE_DIFF		900
120204df0f8Sclaudio #define LS_INFINITY		0xffffff
121fd136cabSclaudio #define RESV_SEQ_NUM		0x80000000	/* reserved and "unused" */
122204df0f8Sclaudio #define INIT_SEQ_NUM		0x80000001
123204df0f8Sclaudio #define MAX_SEQ_NUM		0x7fffffff
124204df0f8Sclaudio 
125204df0f8Sclaudio /* OSPF header */
12603431b74Snorby struct crypt {
12703431b74Snorby 	u_int16_t		dummy;
12803431b74Snorby 	u_int8_t		keyid;
12903431b74Snorby 	u_int8_t		len;
13003431b74Snorby 	u_int32_t		seq_num;
13103431b74Snorby };
13203431b74Snorby 
133204df0f8Sclaudio struct ospf_hdr {
134204df0f8Sclaudio 	u_int8_t		version;
135204df0f8Sclaudio 	u_int8_t		type;
136204df0f8Sclaudio 	u_int16_t		len;
137204df0f8Sclaudio 	u_int32_t		rtr_id;
138204df0f8Sclaudio 	u_int32_t		area_id;
139204df0f8Sclaudio 	u_int16_t		chksum;
140204df0f8Sclaudio 	u_int16_t		auth_type;
141204df0f8Sclaudio 	union {
142eee4aafbSnorby 		char		simple[MAX_SIMPLE_AUTH_LEN];
14303431b74Snorby 		struct crypt	crypt;
144204df0f8Sclaudio 	} auth_key;
145204df0f8Sclaudio };
146204df0f8Sclaudio 
147204df0f8Sclaudio /* Hello header (type 1) */
148204df0f8Sclaudio struct hello_hdr {
149204df0f8Sclaudio 	u_int32_t		mask;
150204df0f8Sclaudio 	u_int16_t		hello_interval;
151204df0f8Sclaudio 	u_int8_t		opts;
152204df0f8Sclaudio 	u_int8_t		rtr_priority;
153204df0f8Sclaudio 	u_int32_t		rtr_dead_interval;
154204df0f8Sclaudio 	u_int32_t		d_rtr;
155204df0f8Sclaudio 	u_int32_t		bd_rtr;
156204df0f8Sclaudio };
157204df0f8Sclaudio 
158204df0f8Sclaudio /* Database Description header (type 2) */
159204df0f8Sclaudio struct db_dscrp_hdr {
160204df0f8Sclaudio 	u_int16_t		iface_mtu;
161204df0f8Sclaudio 	u_int8_t		opts;
162204df0f8Sclaudio 	u_int8_t		bits;
163204df0f8Sclaudio 	u_int32_t		dd_seq_num;
164204df0f8Sclaudio };
165204df0f8Sclaudio 
166204df0f8Sclaudio #define OSPF_DBD_MS		0x01
167204df0f8Sclaudio #define OSPF_DBD_M		0x02
168204df0f8Sclaudio #define OSPF_DBD_I		0x04
169204df0f8Sclaudio 
170204df0f8Sclaudio /*  Link State Request header (type 3) */
171204df0f8Sclaudio struct ls_req_hdr {
172204df0f8Sclaudio 	u_int32_t		type;
173204df0f8Sclaudio 	u_int32_t		ls_id;
174204df0f8Sclaudio 	u_int32_t		adv_rtr;
175204df0f8Sclaudio };
176204df0f8Sclaudio 
177204df0f8Sclaudio /* Link State Update header (type 4) */
178204df0f8Sclaudio struct ls_upd_hdr {
179204df0f8Sclaudio 	u_int32_t		num_lsa;
180204df0f8Sclaudio };
181204df0f8Sclaudio 
182204df0f8Sclaudio #define	LSA_TYPE_ROUTER		1
183204df0f8Sclaudio #define LSA_TYPE_NETWORK	2
184204df0f8Sclaudio #define LSA_TYPE_SUM_NETWORK	3
185204df0f8Sclaudio #define LSA_TYPE_SUM_ROUTER	4
186204df0f8Sclaudio #define	LSA_TYPE_EXTERNAL	5
187097ed198Sclaudio #define	LSA_TYPE_LINK_OPAQ	9
188097ed198Sclaudio #define	LSA_TYPE_AREA_OPAQ	10
189097ed198Sclaudio #define	LSA_TYPE_AS_OPAQ	11
190204df0f8Sclaudio 
191204df0f8Sclaudio #define LINK_TYPE_POINTTOPOINT	1
192204df0f8Sclaudio #define LINK_TYPE_TRANSIT_NET	2
193204df0f8Sclaudio #define LINK_TYPE_STUB_NET	3
194204df0f8Sclaudio #define LINK_TYPE_VIRTUAL	4
195204df0f8Sclaudio 
196204df0f8Sclaudio /* LSA headers */
197ee89e4e9Sclaudio #define LSA_METRIC_MASK		0x00ffffff	/* only for sum & as-ext */
198ee89e4e9Sclaudio #define LSA_ASEXT_E_FLAG	0x80000000
199ee89e4e9Sclaudio 
200097ed198Sclaudio /* for some reason they thought 24bit types are fun, make them less a hazard */
201097ed198Sclaudio #define LSA_24_MASK 0xffffff
202097ed198Sclaudio #define LSA_24_GETHI(x)		\
203097ed198Sclaudio 	((x) >> 24)
204097ed198Sclaudio #define LSA_24_GETLO(x)		\
205097ed198Sclaudio 	((x) & LSA_24_MASK)
206097ed198Sclaudio #define LSA_24_SETHI(x, y)	\
207097ed198Sclaudio 	((x) = ((x) & LSA_24_MASK) | (((y) & 0xff) << 24))
208097ed198Sclaudio #define LSA_24_SETLO(x, y)	\
209097ed198Sclaudio 	((x) = ((y) & LSA_24_MASK) | ((x) & ~LSA_24_MASK))
210097ed198Sclaudio 
211097ed198Sclaudio 
2123ada9d8fSnorby #define OSPF_RTR_B		0x01
2133ada9d8fSnorby #define OSPF_RTR_E		0x02
2143ada9d8fSnorby #define OSPF_RTR_V		0x04
2153ada9d8fSnorby 
216204df0f8Sclaudio struct lsa_rtr {
217204df0f8Sclaudio 	u_int8_t		flags;
218204df0f8Sclaudio 	u_int8_t		dummy;
219204df0f8Sclaudio 	u_int16_t		nlinks;
220204df0f8Sclaudio };
221204df0f8Sclaudio 
222204df0f8Sclaudio struct lsa_rtr_link {
223204df0f8Sclaudio 	u_int32_t		id;
224204df0f8Sclaudio 	u_int32_t		data;
225204df0f8Sclaudio 	u_int8_t		type;
226204df0f8Sclaudio 	u_int8_t		num_tos;
227204df0f8Sclaudio 	u_int16_t		metric;
228204df0f8Sclaudio };
229204df0f8Sclaudio 
230204df0f8Sclaudio struct lsa_net {
231204df0f8Sclaudio 	u_int32_t		mask;
232204df0f8Sclaudio 	u_int32_t		att_rtr[1];
233204df0f8Sclaudio };
234204df0f8Sclaudio 
2353ada9d8fSnorby struct lsa_net_link {
2363ada9d8fSnorby 	u_int32_t		att_rtr;
2373ada9d8fSnorby };
2383ada9d8fSnorby 
239204df0f8Sclaudio struct lsa_sum {
240204df0f8Sclaudio 	u_int32_t		mask;
241204df0f8Sclaudio 	u_int32_t		metric;		/* only lower 24 bit */
242204df0f8Sclaudio };
243204df0f8Sclaudio 
244ee89e4e9Sclaudio struct lsa_asext {
245ee89e4e9Sclaudio 	u_int32_t		mask;
246ee89e4e9Sclaudio 	u_int32_t		metric;		/* lower 24 bit plus E bit */
247ee89e4e9Sclaudio 	u_int32_t		fw_addr;
248ee89e4e9Sclaudio 	u_int32_t		ext_tag;
249ee89e4e9Sclaudio };
250ee89e4e9Sclaudio 
251204df0f8Sclaudio struct lsa_hdr {
252204df0f8Sclaudio 	u_int16_t		age;
253204df0f8Sclaudio 	u_int8_t		opts;
254204df0f8Sclaudio 	u_int8_t		type;
255204df0f8Sclaudio 	u_int32_t		ls_id;
256204df0f8Sclaudio 	u_int32_t		adv_rtr;
257fd136cabSclaudio 	u_int32_t		seq_num;
258204df0f8Sclaudio 	u_int16_t		ls_chksum;
259204df0f8Sclaudio 	u_int16_t		len;
260204df0f8Sclaudio };
261204df0f8Sclaudio 
262370c8b16Sguenther #define LS_CKSUM_OFFSET	offsetof(struct lsa_hdr, ls_chksum)
263204df0f8Sclaudio 
264204df0f8Sclaudio struct lsa {
265204df0f8Sclaudio 	struct lsa_hdr		hdr;
266204df0f8Sclaudio 	union {
267204df0f8Sclaudio 		struct lsa_rtr		rtr;
268204df0f8Sclaudio 		struct lsa_net		net;
269204df0f8Sclaudio 		struct lsa_sum		sum;
270ee89e4e9Sclaudio 		struct lsa_asext	asext;
271204df0f8Sclaudio 	}			data;
272204df0f8Sclaudio };
273204df0f8Sclaudio 
274204df0f8Sclaudio #endif /* !_OSPF_H_ */
275