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