1190207Srpaulo/* @(#) $Header: /tcpdump/master/tcpdump/ospf6.h,v 1.7 2006-09-05 15:50:26 hannes Exp $ (LBL) */
256893Sfenner/*
356893Sfenner * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
456893Sfenner *	The Regents of the University of California.  All rights reserved.
556893Sfenner *
656893Sfenner * Redistribution and use in source and binary forms, with or without
756893Sfenner * modification, are permitted provided that: (1) source code distributions
856893Sfenner * retain the above copyright notice and this paragraph in its entirety, (2)
956893Sfenner * distributions including binary code include the above copyright notice and
1056893Sfenner * this paragraph in its entirety in the documentation or other materials
1156893Sfenner * provided with the distribution, and (3) all advertising materials mentioning
1256893Sfenner * features or use of this software display the following acknowledgement:
1356893Sfenner * ``This product includes software developed by the University of California,
1456893Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1556893Sfenner * the University nor the names of its contributors may be used to endorse
1656893Sfenner * or promote products derived from this software without specific prior
1756893Sfenner * written permission.
1856893Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1956893Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
2056893Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2156893Sfenner *
2256893Sfenner * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu)
2356893Sfenner */
24190207Srpaulo#define	OSPF_TYPE_HELLO         1	/* Hello */
25190207Srpaulo#define	OSPF_TYPE_DD            2	/* Database Description */
26190207Srpaulo#define	OSPF_TYPE_LS_REQ        3	/* Link State Request */
27190207Srpaulo#define	OSPF_TYPE_LS_UPDATE     4	/* Link State Update */
28190207Srpaulo#define	OSPF_TYPE_LS_ACK        5	/* Link State Ack */
2956893Sfenner
3056893Sfenner/* Options *_options	*/
3156893Sfenner#define OSPF6_OPTION_V6	0x01	/* V6 bit: A bit for peeping tom */
3256893Sfenner#define OSPF6_OPTION_E	0x02	/* E bit: External routes advertised	*/
3356893Sfenner#define OSPF6_OPTION_MC	0x04	/* MC bit: Multicast capable */
3456893Sfenner#define OSPF6_OPTION_N	0x08	/* N bit: For type-7 LSA */
3556893Sfenner#define OSPF6_OPTION_R	0x10	/* R bit: Router bit */
3656893Sfenner#define OSPF6_OPTION_DC	0x20	/* DC bit: Demand circuits */
3756893Sfenner
3856893Sfenner
3956893Sfenner/* db_flags	*/
4056893Sfenner#define	OSPF6_DB_INIT		0x04	    /*	*/
4156893Sfenner#define	OSPF6_DB_MORE		0x02
4256893Sfenner#define	OSPF6_DB_MASTER		0x01
4356893Sfenner
4456893Sfenner/* ls_type	*/
4556893Sfenner#define	LS_TYPE_ROUTER		1   /* router link */
4656893Sfenner#define	LS_TYPE_NETWORK		2   /* network link */
4756893Sfenner#define	LS_TYPE_INTER_AP	3   /* Inter-Area-Prefix */
4856893Sfenner#define	LS_TYPE_INTER_AR	4   /* Inter-Area-Router */
4956893Sfenner#define	LS_TYPE_ASE		5   /* ASE */
5056893Sfenner#define	LS_TYPE_GROUP		6   /* Group membership */
51190207Srpaulo#define	LS_TYPE_NSSA		7   /* NSSA */
5256893Sfenner#define	LS_TYPE_LINK		8   /* Link LSA */
5356893Sfenner#define	LS_TYPE_INTRA_AP	9   /* Intra-Area-Prefix */
54190207Srpaulo#define LS_TYPE_INTRA_ATE       10  /* Intra-Area-TE */
55190207Srpaulo#define LS_TYPE_GRACE           11  /* Grace LSA */
5656893Sfenner#define LS_TYPE_MASK		0x1fff
5756893Sfenner
5856893Sfenner#define LS_SCOPE_LINKLOCAL	0x0000
5956893Sfenner#define LS_SCOPE_AREA		0x2000
6056893Sfenner#define LS_SCOPE_AS		0x4000
6156893Sfenner#define LS_SCOPE_MASK		0x6000
62190207Srpaulo#define LS_SCOPE_U              0x8000
6356893Sfenner
6456893Sfenner/* rla_link.link_type	*/
6556893Sfenner#define	RLA_TYPE_ROUTER		1   /* point-to-point to another router	*/
6656893Sfenner#define	RLA_TYPE_TRANSIT	2   /* connection to transit network	*/
6756893Sfenner#define RLA_TYPE_VIRTUAL	4   /* virtual link			*/
6856893Sfenner
6956893Sfenner/* rla_flags	*/
7056893Sfenner#define	RLA_FLAG_B	0x01
7156893Sfenner#define	RLA_FLAG_E	0x02
7256893Sfenner#define	RLA_FLAG_V	0x04
7356893Sfenner#define	RLA_FLAG_W	0x08
74190207Srpaulo#define RLA_FLAG_N      0x10
7556893Sfenner
76190207Srpaulo/* lsa_prefix options */
77190207Srpaulo#define LSA_PREFIX_OPT_NU 0x01
78190207Srpaulo#define LSA_PREFIX_OPT_LA 0x02
79190207Srpaulo#define LSA_PREFIX_OPT_MC 0x04
80190207Srpaulo#define LSA_PREFIX_OPT_P  0x08
81190207Srpaulo#define LSA_PREFIX_OPT_DN 0x10
82190207Srpaulo
8356893Sfenner/* sla_tosmetric breakdown	*/
8456893Sfenner#define	SLA_MASK_TOS		0x7f000000
8556893Sfenner#define	SLA_MASK_METRIC		0x00ffffff
8656893Sfenner#define SLA_SHIFT_TOS		24
8756893Sfenner
8875115Sfenner/* asla_metric */
8975115Sfenner#define ASLA_FLAG_FWDADDR	0x02000000
9075115Sfenner#define ASLA_FLAG_ROUTETAG	0x01000000
9156893Sfenner#define	ASLA_MASK_METRIC	0x00ffffff
9256893Sfenner
9356893Sfennertypedef u_int32_t rtrid_t;
9456893Sfenner
9556893Sfenner/* link state advertisement header */
96190207Srpaulostruct lsa6_hdr {
9756893Sfenner    u_int16_t ls_age;
9856893Sfenner    u_int16_t ls_type;
9956893Sfenner    rtrid_t ls_stateid;
10056893Sfenner    rtrid_t ls_router;
10156893Sfenner    u_int32_t ls_seq;
10256893Sfenner    u_int16_t ls_chksum;
10356893Sfenner    u_int16_t ls_length;
104127668Sbms};
10556893Sfenner
106190207Srpaulostruct lsa6_prefix {
10756893Sfenner    u_int8_t lsa_p_len;
10856893Sfenner    u_int8_t lsa_p_opt;
109190207Srpaulo    u_int16_t lsa_p_metric;
11056893Sfenner    u_int8_t lsa_p_prefix[4];
11156893Sfenner};
11256893Sfenner
11356893Sfenner/* link state advertisement */
114190207Srpaulostruct lsa6 {
115190207Srpaulo    struct lsa6_hdr ls_hdr;
11656893Sfenner
11756893Sfenner    /* Link state types */
11856893Sfenner    union {
11956893Sfenner	/* Router links advertisements */
12056893Sfenner	struct {
12156893Sfenner	    union {
12256893Sfenner		u_int8_t flg;
12356893Sfenner		u_int32_t opt;
12456893Sfenner	    } rla_flgandopt;
12556893Sfenner#define rla_flags	rla_flgandopt.flg
12656893Sfenner#define rla_options	rla_flgandopt.opt
127190207Srpaulo	    struct rlalink6 {
12856893Sfenner		u_int8_t link_type;
12956893Sfenner		u_int8_t link_zero[1];
13056893Sfenner		u_int16_t link_metric;
13156893Sfenner		u_int32_t link_ifid;
13256893Sfenner		u_int32_t link_nifid;
13356893Sfenner		rtrid_t link_nrtid;
13456893Sfenner	    } rla_link[1];		/* may repeat	*/
13556893Sfenner	} un_rla;
13656893Sfenner
13756893Sfenner	/* Network links advertisements */
13856893Sfenner	struct {
13956893Sfenner	    u_int32_t nla_options;
14056893Sfenner	    rtrid_t nla_router[1];	/* may repeat	*/
14156893Sfenner	} un_nla;
14256893Sfenner
14356893Sfenner	/* Inter Area Prefix LSA */
14456893Sfenner	struct {
14556893Sfenner	    u_int32_t inter_ap_metric;
146190207Srpaulo	    struct lsa6_prefix inter_ap_prefix[1];
14756893Sfenner	} un_inter_ap;
14856893Sfenner
14975115Sfenner	/* AS external links advertisements */
15075115Sfenner	struct {
15175115Sfenner	    u_int32_t asla_metric;
152190207Srpaulo	    struct lsa6_prefix asla_prefix[1];
15375115Sfenner	    /* some optional fields follow */
15475115Sfenner	} un_asla;
15575115Sfenner
15656893Sfenner#if 0
15756893Sfenner	/* Summary links advertisements */
15856893Sfenner	struct {
15956893Sfenner	    struct in_addr sla_mask;
16056893Sfenner	    u_int32_t sla_tosmetric[1];	/* may repeat	*/
16156893Sfenner	} un_sla;
16256893Sfenner
16356893Sfenner	/* Multicast group membership */
16456893Sfenner	struct mcla {
16556893Sfenner	    u_int32_t mcla_vtype;
16656893Sfenner	    struct in_addr mcla_vid;
16756893Sfenner	} un_mcla[1];
16856893Sfenner#endif
16956893Sfenner
17056893Sfenner	/* Type 7 LSA */
17156893Sfenner
17256893Sfenner	/* Link LSA */
17356893Sfenner	struct llsa {
17456893Sfenner	    union {
17556893Sfenner		u_int8_t pri;
17656893Sfenner		u_int32_t opt;
17756893Sfenner	    } llsa_priandopt;
17856893Sfenner#define llsa_priority	llsa_priandopt.pri
17956893Sfenner#define llsa_options	llsa_priandopt.opt
18056893Sfenner	    struct in6_addr llsa_lladdr;
18156893Sfenner	    u_int32_t llsa_nprefix;
182190207Srpaulo	    struct lsa6_prefix llsa_prefix[1];
18356893Sfenner	} un_llsa;
18456893Sfenner
18556893Sfenner	/* Intra-Area-Prefix */
18656893Sfenner	struct {
18756893Sfenner	    u_int16_t intra_ap_nprefix;
18856893Sfenner	    u_int16_t intra_ap_lstype;
18956893Sfenner	    rtrid_t intra_ap_lsid;
19056893Sfenner	    rtrid_t intra_ap_rtid;
191190207Srpaulo	    struct lsa6_prefix intra_ap_prefix[1];
19256893Sfenner	} un_intra_ap;
19356893Sfenner    } lsa_un;
194127668Sbms};
19556893Sfenner
19656893Sfenner
19756893Sfenner#define	OSPF_AUTH_SIZE	8
19856893Sfenner
19956893Sfenner/*
20056893Sfenner * the main header
20156893Sfenner */
20256893Sfennerstruct ospf6hdr {
20356893Sfenner    u_int8_t ospf6_version;
20456893Sfenner    u_int8_t ospf6_type;
20556893Sfenner    u_int16_t ospf6_len;
20656893Sfenner    rtrid_t ospf6_routerid;
20756893Sfenner    rtrid_t ospf6_areaid;
20856893Sfenner    u_int16_t ospf6_chksum;
20956893Sfenner    u_int8_t ospf6_instanceid;
21056893Sfenner    u_int8_t ospf6_rsvd;
21156893Sfenner    union {
21256893Sfenner
21356893Sfenner	/* Hello packet */
21456893Sfenner	struct {
21556893Sfenner	    u_int32_t hello_ifid;
21656893Sfenner	    union {
21756893Sfenner		u_int8_t pri;
21856893Sfenner		u_int32_t opt;
21956893Sfenner	    } hello_priandopt;
22056893Sfenner#define hello_priority	hello_priandopt.pri
22156893Sfenner#define hello_options	hello_priandopt.opt
22256893Sfenner	    u_int16_t hello_helloint;
22356893Sfenner	    u_int16_t hello_deadint;
22456893Sfenner	    rtrid_t hello_dr;
22556893Sfenner	    rtrid_t hello_bdr;
22656893Sfenner	    rtrid_t hello_neighbor[1]; /* may repeat	*/
22756893Sfenner	} un_hello;
22856893Sfenner
22956893Sfenner	/* Database Description packet */
23056893Sfenner	struct {
23156893Sfenner	    u_int32_t db_options;
23256893Sfenner	    u_int16_t db_mtu;
23356893Sfenner	    u_int8_t db_mbz;
23456893Sfenner	    u_int8_t db_flags;
23556893Sfenner	    u_int32_t db_seq;
236190207Srpaulo	    struct lsa6_hdr db_lshdr[1]; /* may repeat	*/
23756893Sfenner	} un_db;
23856893Sfenner
23956893Sfenner	/* Link State Request */
240190207Srpaulo	struct lsr6 {
24156893Sfenner	    u_int16_t ls_mbz;
24256893Sfenner	    u_int16_t ls_type;
24356893Sfenner	    rtrid_t ls_stateid;
24456893Sfenner	    rtrid_t ls_router;
24556893Sfenner	} un_lsr[1];		/* may repeat	*/
24656893Sfenner
24756893Sfenner	/* Link State Update */
24856893Sfenner	struct {
24956893Sfenner	    u_int32_t lsu_count;
250190207Srpaulo	    struct lsa6 lsu_lsa[1]; /* may repeat	*/
25156893Sfenner	} un_lsu;
25256893Sfenner
25356893Sfenner	/* Link State Acknowledgement */
25456893Sfenner	struct {
255190207Srpaulo	    struct lsa6_hdr lsa_lshdr[1]; /* may repeat	*/
25656893Sfenner	} un_lsa ;
25756893Sfenner    } ospf6_un ;
258127668Sbms};
25956893Sfenner
26056893Sfenner#define	ospf6_hello	ospf6_un.un_hello
26156893Sfenner#define	ospf6_db	ospf6_un.un_db
26256893Sfenner#define	ospf6_lsr	ospf6_un.un_lsr
26356893Sfenner#define	ospf6_lsu	ospf6_un.un_lsu
26456893Sfenner#define	ospf6_lsa	ospf6_un.un_lsa
26556893Sfenner
266