1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#ifndef _OSPF_H
28#define	_OSPF_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32/*
33 * Definitions for parsing OSPF packets (RFC 2328 and RFC 2740)
34 */
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40#define	OSPF_TYPE_UMD	0	/* UMD's special monitoring packets */
41#define	OSPF_TYPE_HELLO	1	/* Hello */
42#define	OSPF_TYPE_DB	2	/* Database Description */
43#define	OSPF_TYPE_LSR	3	/* Link State Request */
44#define	OSPF_TYPE_LSU	4	/* Link State Update */
45#define	OSPF_TYPE_LSA	5	/* Link State Ack */
46#define	OSPF_TYPE_MAX	6
47
48extern char *ospf_types[];
49struct bits {
50	uint32_t bit;
51	const char *str;
52};
53char *ospf_print_bits(const struct bits *, uchar_t);
54char *ospf_print_lsa_age(long);
55
56/* Options *_options	*/
57#define	OSPF_OPTION_T	0x01	/* RFC 2328 T bit: TOS support	*/
58#define	OSPF_OPTION_E	0x02	/* E bit: External routes advertised	*/
59#define	OSPF_OPTION_MC	0x04	/* MC bit: Multicast capable */
60#define	OSPF_OPTION_N	0x08	/* N bit: For type-7 LSA */
61#define	OSPF_OPTION_R	0x10	/* R bit: Router bit */
62#define	OSPF_OPTION_DC	0x20	/* DC bit: Demand circuits */
63
64#define	OSPF_OPTION_V6	0x01	/* RFC 2740 V6 bit */
65
66/* ospf_authtype	*/
67#define	OSPF_AUTH_NONE		0	/* No auth-data */
68#define	OSPF_AUTH_SIMPLE	1	/* Simple password */
69#define	OSPF_AUTH_MD5		2	/* MD5 authentication */
70#define	OSPF_AUTH_MD5_LEN	16	/* length of MD5 authentication */
71
72#define	OSPF_AUTH_TYPE_MAX	3
73
74/* db_flags	*/
75#define	OSPF_DB_INIT		0x04	/* "I"  */
76#define	OSPF_DB_MORE		0x02 	/* "M"  */
77#define	OSPF_DB_MASTER		0x01	/* "MS" */
78
79
80/* ls_type	*/
81#define	LS_TYPE_ROUTER		1   /* router link */
82#define	LS_TYPE_NETWORK		2   /* network link */
83#define	LS_TYPE_SUM_IP		3   /* summary link */
84#define	LS_TYPE_SUM_ABR		4   /* summary area link */
85#define	LS_TYPE_ASE		5   /* ASE  */
86#define	LS_TYPE_GROUP		6   /* Group membership (multicast */
87				    /* extensions 23 July 1991) */
88#define	LS_TYPE_TYPE7		7   /* Type 7 LSA */
89#define	LS_TYPE_LINK		8   /* Link LSA */
90#define	LS_TYPE_INTRA_AP	9   /* Intra-Area-Prefix */
91#define	LS_TYPE_MAX		10
92#define	LS_TYPE_MASK		0x1fff
93
94#define	LS_TYPE_INTER_AP	3   /* RFC 2740 Inter-Area-Prefix */
95#define	LS_TYPE_INTER_AR	4   /* RFC 2740 Inter-Area-Router */
96
97#define	LS6_SCOPE_LINKLOCAL	0x0000
98#define	LS6_SCOPE_AREA		0x2000
99#define	LS6_SCOPE_AS		0x4000
100#define	LS6_SCOPE_MASK		0x6000
101
102/* rla_link.link_type	*/
103#define	RLA_TYPE_ROUTER		1   /* point-to-point to another router	*/
104#define	RLA_TYPE_TRANSIT	2   /* connection to transit network	*/
105#define	RLA_TYPE_STUB		3   /* connection to stub network	*/
106#define	RLA_TYPE_VIRTUAL	4   /* virtual link			*/
107
108/* rla_flags	*/
109#define	RLA_FLAG_B	0x01
110#define	RLA_FLAG_E	0x02
111#define	RLA_FLAG_V	0x04
112#define	RLA_FLAG_W	0x08
113
114
115/* sla_tosmetric breakdown	*/
116#define	SLA_MASK_TOS		0x7f000000
117#define	SLA_MASK_METRIC		0x00ffffff
118#define	SLA_SHIFT_TOS		24
119
120/* asla_tosmetric breakdown	*/
121#define	ASLA_FLAG_EXTERNAL	0x80000000
122#define	ASLA_MASK_TOS		0x7f000000
123#define	ASLA_SHIFT_TOS		24
124#define	ASLA_MASK_METRIC	0x00ffffff
125
126/* multicast vertex type 	*/
127#define	MCLA_VERTEX_ROUTER	1
128#define	MCLA_VERTEX_NETWORK	2
129
130/* link state advertisement header */
131struct lsa_hdr {
132	ushort_t ls_age;
133	uchar_t ls_options;
134	uchar_t ls_type;
135	struct in_addr ls_stateid;
136	struct in_addr ls_router;
137	uint32_t ls_seq;
138	ushort_t ls_chksum;
139	ushort_t ls_length;
140};
141
142/* link state advertisement */
143struct lsa {
144	struct lsa_hdr ls_hdr;
145
146	/* Link state types */
147	union {
148		/* Router links advertisements */
149		struct {
150			uchar_t rla_flags;
151			uchar_t rla_zero[1];
152			ushort_t rla_count;
153			struct rlalink {
154				struct in_addr link_id;
155				struct in_addr link_data;
156				uchar_t link_type;
157				uchar_t link_toscount;
158				ushort_t link_tos0metric;
159			} rla_link[1];		/* may repeat	*/
160		} un_rla;
161
162		/* Network links advertisements */
163		struct {
164			struct in_addr nla_mask;
165			struct in_addr nla_router[1];	/* may repeat	*/
166		} un_nla;
167
168		/* Summary links advertisements */
169		struct {
170			struct in_addr sla_mask;
171			uint32_t sla_tosmetric[1];	/* may repeat	*/
172		} un_sla;
173
174		/* AS external links advertisements */
175		struct {
176			struct in_addr asla_mask;
177			struct aslametric {
178				uint32_t asla_tosmetric;
179				struct in_addr asla_forward;
180				struct in_addr asla_tag;
181			} asla_metric[1];		/* may repeat	*/
182		} un_asla;
183
184		/* Multicast group membership */
185		struct mcla {
186			uint32_t mcla_vtype;
187			struct in_addr mcla_vid;
188		} un_mcla[1];
189	} lsa_un;
190};
191
192/*
193 * TOS metric struct (will be 0 or more in router links update)
194 */
195struct tos_metric {
196	uchar_t tos_type;
197	uchar_t tos_zero;
198	ushort_t tos_metric;
199};
200
201/*
202 * OSPF minimum header sizes
203 */
204#define	OSPF_AUTH_SIZE			8
205#define	OSPF_MIN_HEADER_SIZE		24
206#define	OSPF6_MIN_HEADER_SIZE		16
207#define	OSPF_MIN_HELLO_HEADER_SIZE	20
208#define	OSPF_MIN_DB_HEADER_SIZE		8
209#define	OSPF6_MIN_DB_HEADER_SIZE	12
210#define	OSPF_MIN_LSR_HEADER_SIZE	12
211#define	OSPF_MIN_LSU_HEADER_SIZE	4
212
213/*
214 * ospf packet header
215 */
216struct ospfhdr {
217	uchar_t ospf_version;
218	uchar_t ospf_type;
219	ushort_t ospf_len;
220	struct in_addr ospf_routerid;
221	struct in_addr ospf_areaid;
222	ushort_t ospf_chksum;
223	ushort_t ospf_authtype;
224	uchar_t ospf_authdata[OSPF_AUTH_SIZE];
225	union {
226
227		/* Hello packet */
228		struct {
229			struct in_addr hello_mask;
230			ushort_t hello_helloint;
231			uchar_t hello_options;
232			uchar_t hello_priority;
233			uint32_t hello_deadint;
234			struct in_addr hello_dr;
235			struct in_addr hello_bdr;
236			struct in_addr hello_neighbor[1]; /* may repeat	*/
237		} un_hello;
238
239		/* Database Description packet */
240		struct {
241			uchar_t db_zero[2];
242			uchar_t db_options;
243			uchar_t db_flags;
244			uint32_t db_seq;
245			struct lsa_hdr db_lshdr[1];	/* may repeat */
246		} un_db;
247
248		/* Link State Request */
249		struct lsr {
250			uint32_t ls_type;
251			struct in_addr ls_stateid;
252			struct in_addr ls_router;
253		} un_lsr[1];				/* may repeat */
254
255		/* Link State Update */
256		struct {
257			uint32_t lsu_count;
258			struct lsa lsu_lsa[1]; 		/* may repeat */
259		} un_lsu;
260
261		/* Link State Acknowledgement */
262		struct {
263			struct lsa_hdr lsa_lshdr[1]; 	/* may repeat */
264		} un_lsa;
265	} ospf_un;
266};
267
268#define	ospf_hello	ospf_un.un_hello
269#define	ospf_db		ospf_un.un_db
270#define	ospf_lsr	ospf_un.un_lsr
271#define	ospf_lsu	ospf_un.un_lsu
272#define	ospf_lsa	ospf_un.un_lsa
273
274
275
276#ifdef __cplusplus
277}
278#endif
279
280#endif /* _OSPF_H */
281