xref: /openbsd/usr.sbin/tcpdump/ospf6.h (revision edd7aa8f)
1 /*	$OpenBSD: ospf6.h,v 1.1 2000/04/26 21:35:39 jakob Exp $	*/
2 
3 /*
4  * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that: (1) source code distributions
9  * retain the above copyright notice and this paragraph in its entirety, (2)
10  * distributions including binary code include the above copyright notice and
11  * this paragraph in its entirety in the documentation or other materials
12  * provided with the distribution, and (3) all advertising materials mentioning
13  * features or use of this software display the following acknowledgement:
14  * ``This product includes software developed by the University of California,
15  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16  * the University nor the names of its contributors may be used to endorse
17  * or promote products derived from this software without specific prior
18  * written permission.
19  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22  *
23  * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu)
24  */
25 #define	OSPF_TYPE_UMD	0	/* UMd's special monitoring packets */
26 #define	OSPF_TYPE_HELLO	1	/* Hello */
27 #define	OSPF_TYPE_DB	2	/* Database Description */
28 #define	OSPF_TYPE_LSR	3	/* Link State Request */
29 #define	OSPF_TYPE_LSU	4	/* Link State Update */
30 #define	OSPF_TYPE_LSA	5	/* Link State Ack */
31 #define	OSPF_TYPE_MAX	6
32 
33 /* Options *_options	*/
34 #define OSPF6_OPTION_V6	0x01	/* V6 bit: A bit for peeping tom */
35 #define OSPF6_OPTION_E	0x02	/* E bit: External routes advertised	*/
36 #define OSPF6_OPTION_MC	0x04	/* MC bit: Multicast capable */
37 #define OSPF6_OPTION_N	0x08	/* N bit: For type-7 LSA */
38 #define OSPF6_OPTION_R	0x10	/* R bit: Router bit */
39 #define OSPF6_OPTION_DC	0x20	/* DC bit: Demand circuits */
40 
41 
42 /* db_flags	*/
43 #define	OSPF6_DB_INIT		0x04	    /*	*/
44 #define	OSPF6_DB_MORE		0x02
45 #define	OSPF6_DB_MASTER		0x01
46 
47 /* ls_type	*/
48 #define	LS_TYPE_ROUTER		1   /* router link */
49 #define	LS_TYPE_NETWORK		2   /* network link */
50 #define	LS_TYPE_INTER_AP	3   /* Inter-Area-Prefix */
51 #define	LS_TYPE_INTER_AR	4   /* Inter-Area-Router */
52 #define	LS_TYPE_ASE		5   /* ASE */
53 #define	LS_TYPE_GROUP		6   /* Group membership */
54 #define	LS_TYPE_TYPE7		7   /* Type 7 LSA */
55 #define	LS_TYPE_LINK		8   /* Link LSA */
56 #define	LS_TYPE_INTRA_AP	9   /* Intra-Area-Prefix */
57 #define	LS_TYPE_MAX		10
58 #define LS_TYPE_MASK		0x1fff
59 
60 #define LS_SCOPE_LINKLOCAL	0x0000
61 #define LS_SCOPE_AREA		0x2000
62 #define LS_SCOPE_AS		0x4000
63 #define LS_SCOPE_MASK		0x6000
64 
65 /*************************************************
66  *
67  * is the above a bug in the documentation?
68  *
69  *************************************************/
70 
71 
72 /* rla_link.link_type	*/
73 #define	RLA_TYPE_ROUTER		1   /* point-to-point to another router	*/
74 #define	RLA_TYPE_TRANSIT	2   /* connection to transit network	*/
75 #define RLA_TYPE_VIRTUAL	4   /* virtual link			*/
76 
77 /* rla_flags	*/
78 #define	RLA_FLAG_B	0x01
79 #define	RLA_FLAG_E	0x02
80 #define	RLA_FLAG_V	0x04
81 #define	RLA_FLAG_W	0x08
82 
83 /* sla_tosmetric breakdown	*/
84 #define	SLA_MASK_TOS		0x7f000000
85 #define	SLA_MASK_METRIC		0x00ffffff
86 #define SLA_SHIFT_TOS		24
87 
88 /* asla_tosmetric breakdown	*/
89 #define	ASLA_FLAG_EXTERNAL	0x80000000
90 #define	ASLA_MASK_TOS		0x7f000000
91 #define	ASLA_SHIFT_TOS		24
92 #define	ASLA_MASK_METRIC	0x00ffffff
93 
94 /* multicast vertex type */
95 #define	MCLA_VERTEX_ROUTER	1
96 #define	MCLA_VERTEX_NETWORK	2
97 
98 typedef u_int32_t rtrid_t;
99 
100 /* link state advertisement header */
101 struct lsa_hdr {
102     u_int16_t ls_age;
103     u_int16_t ls_type;
104     rtrid_t ls_stateid;
105     rtrid_t ls_router;
106     u_int32_t ls_seq;
107     u_int16_t ls_chksum;
108     u_int16_t ls_length;
109 } ;
110 
111 struct lsa_prefix {
112     u_int8_t lsa_p_len;
113     u_int8_t lsa_p_opt;
114     u_int16_t lsa_p_mbz;
115     u_int8_t lsa_p_prefix[4];
116 };
117 
118 /* link state advertisement */
119 struct lsa {
120     struct lsa_hdr ls_hdr;
121 
122     /* Link state types */
123     union {
124 	/* Router links advertisements */
125 	struct {
126 	    union {
127 		u_int8_t flg;
128 		u_int32_t opt;
129 	    } rla_flgandopt;
130 #define rla_flags	rla_flgandopt.flg
131 #define rla_options	rla_flgandopt.opt
132 	    struct rlalink {
133 		u_int8_t link_type;
134 		u_int8_t link_zero[1];
135 		u_int16_t link_metric;
136 		u_int32_t link_ifid;
137 		u_int32_t link_nifid;
138 		rtrid_t link_nrtid;
139 	    } rla_link[1];		/* may repeat	*/
140 	} un_rla;
141 
142 	/* Network links advertisements */
143 	struct {
144 	    u_int32_t nla_options;
145 	    rtrid_t nla_router[1];	/* may repeat	*/
146 	} un_nla;
147 
148 	/* Inter Area Prefix LSA */
149 	struct {
150 	    u_int32_t inter_ap_metric;
151 	    struct lsa_prefix inter_ap_prefix[1];
152 	} un_inter_ap;
153 
154 #if 0
155 	/* Summary links advertisements */
156 	struct {
157 	    struct in_addr sla_mask;
158 	    u_int32_t sla_tosmetric[1];	/* may repeat	*/
159 	} un_sla;
160 
161 	/* AS external links advertisements */
162 	struct {
163 	    struct in_addr asla_mask;
164 	    struct aslametric {
165 		u_int32_t asla_tosmetric;
166 		struct in_addr asla_forward;
167 		struct in_addr asla_tag;
168 	    } asla_metric[1];		/* may repeat	*/
169 	} un_asla;
170 
171 	/* Multicast group membership */
172 	struct mcla {
173 	    u_int32_t mcla_vtype;
174 	    struct in_addr mcla_vid;
175 	} un_mcla[1];
176 #endif
177 
178 	/* Type 7 LSA */
179 
180 	/* Link LSA */
181 	struct llsa {
182 	    union {
183 		u_int8_t pri;
184 		u_int32_t opt;
185 	    } llsa_priandopt;
186 #define llsa_priority	llsa_priandopt.pri
187 #define llsa_options	llsa_priandopt.opt
188 	    struct in6_addr llsa_lladdr;
189 	    u_int32_t llsa_nprefix;
190 	    struct lsa_prefix llsa_prefix[1];
191 	} un_llsa;
192 
193 	/* Intra-Area-Prefix */
194 	struct {
195 	    u_int16_t intra_ap_nprefix;
196 	    u_int16_t intra_ap_lstype;
197 	    rtrid_t intra_ap_lsid;
198 	    rtrid_t intra_ap_rtid;
199 	    struct lsa_prefix intra_ap_prefix[1];
200 	} un_intra_ap;
201     } lsa_un;
202 } ;
203 
204 
205 /*
206  * TOS metric struct (will be 0 or more in router links update)
207  */
208 struct tos_metric {
209     u_int8_t tos_type;
210     u_int8_t tos_zero;
211     u_int16_t tos_metric;
212 } ;
213 
214 #define	OSPF_AUTH_SIZE	8
215 
216 /*
217  * the main header
218  */
219 struct ospf6hdr {
220     u_int8_t ospf6_version;
221     u_int8_t ospf6_type;
222     u_int16_t ospf6_len;
223     rtrid_t ospf6_routerid;
224     rtrid_t ospf6_areaid;
225     u_int16_t ospf6_chksum;
226     u_int8_t ospf6_instanceid;
227     u_int8_t ospf6_rsvd;
228     union {
229 
230 	/* Hello packet */
231 	struct {
232 	    u_int32_t hello_ifid;
233 	    union {
234 		u_int8_t pri;
235 		u_int32_t opt;
236 	    } hello_priandopt;
237 #define hello_priority	hello_priandopt.pri
238 #define hello_options	hello_priandopt.opt
239 	    u_int16_t hello_helloint;
240 	    u_int16_t hello_deadint;
241 	    rtrid_t hello_dr;
242 	    rtrid_t hello_bdr;
243 	    rtrid_t hello_neighbor[1]; /* may repeat	*/
244 	} un_hello;
245 
246 	/* Database Description packet */
247 	struct {
248 	    u_int32_t db_options;
249 	    u_int16_t db_mtu;
250 	    u_int8_t db_mbz;
251 	    u_int8_t db_flags;
252 	    u_int32_t db_seq;
253 	    struct lsa_hdr db_lshdr[1]; /* may repeat	*/
254 	} un_db;
255 
256 	/* Link State Request */
257 	struct lsr {
258 	    u_int16_t ls_mbz;
259 	    u_int16_t ls_type;
260 	    rtrid_t ls_stateid;
261 	    rtrid_t ls_router;
262 	} un_lsr[1];		/* may repeat	*/
263 
264 	/* Link State Update */
265 	struct {
266 	    u_int32_t lsu_count;
267 	    struct lsa lsu_lsa[1]; /* may repeat	*/
268 	} un_lsu;
269 
270 	/* Link State Acknowledgement */
271 	struct {
272 	    struct lsa_hdr lsa_lshdr[1]; /* may repeat	*/
273 	} un_lsa ;
274     } ospf6_un ;
275 } ;
276 
277 #define	ospf6_hello	ospf6_un.un_hello
278 #define	ospf6_db	ospf6_un.un_db
279 #define	ospf6_lsr	ospf6_un.un_lsr
280 #define	ospf6_lsu	ospf6_un.un_lsu
281 #define	ospf6_lsa	ospf6_un.un_lsa
282 
283