ospf6.h revision 56893
156893Sfenner/*
256893Sfenner * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
356893Sfenner *	The Regents of the University of California.  All rights reserved.
456893Sfenner *
556893Sfenner * Redistribution and use in source and binary forms, with or without
656893Sfenner * modification, are permitted provided that: (1) source code distributions
756893Sfenner * retain the above copyright notice and this paragraph in its entirety, (2)
856893Sfenner * distributions including binary code include the above copyright notice and
956893Sfenner * this paragraph in its entirety in the documentation or other materials
1056893Sfenner * provided with the distribution, and (3) all advertising materials mentioning
1156893Sfenner * features or use of this software display the following acknowledgement:
1256893Sfenner * ``This product includes software developed by the University of California,
1356893Sfenner * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
1456893Sfenner * the University nor the names of its contributors may be used to endorse
1556893Sfenner * or promote products derived from this software without specific prior
1656893Sfenner * written permission.
1756893Sfenner * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
1856893Sfenner * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
1956893Sfenner * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
2056893Sfenner *
2156893Sfenner * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu)
2256893Sfenner */
2356893Sfenner#define	OSPF_TYPE_UMD	0	/* UMd's special monitoring packets */
2456893Sfenner#define	OSPF_TYPE_HELLO	1	/* Hello */
2556893Sfenner#define	OSPF_TYPE_DB	2	/* Database Description */
2656893Sfenner#define	OSPF_TYPE_LSR	3	/* Link State Request */
2756893Sfenner#define	OSPF_TYPE_LSU	4	/* Link State Update */
2856893Sfenner#define	OSPF_TYPE_LSA	5	/* Link State Ack */
2956893Sfenner#define	OSPF_TYPE_MAX	6
3056893Sfenner
3156893Sfenner/* Options *_options	*/
3256893Sfenner#define OSPF6_OPTION_V6	0x01	/* V6 bit: A bit for peeping tom */
3356893Sfenner#define OSPF6_OPTION_E	0x02	/* E bit: External routes advertised	*/
3456893Sfenner#define OSPF6_OPTION_MC	0x04	/* MC bit: Multicast capable */
3556893Sfenner#define OSPF6_OPTION_N	0x08	/* N bit: For type-7 LSA */
3656893Sfenner#define OSPF6_OPTION_R	0x10	/* R bit: Router bit */
3756893Sfenner#define OSPF6_OPTION_DC	0x20	/* DC bit: Demand circuits */
3856893Sfenner
3956893Sfenner
4056893Sfenner/* db_flags	*/
4156893Sfenner#define	OSPF6_DB_INIT		0x04	    /*	*/
4256893Sfenner#define	OSPF6_DB_MORE		0x02
4356893Sfenner#define	OSPF6_DB_MASTER		0x01
4456893Sfenner
4556893Sfenner/* ls_type	*/
4656893Sfenner#define	LS_TYPE_ROUTER		1   /* router link */
4756893Sfenner#define	LS_TYPE_NETWORK		2   /* network link */
4856893Sfenner#define	LS_TYPE_INTER_AP	3   /* Inter-Area-Prefix */
4956893Sfenner#define	LS_TYPE_INTER_AR	4   /* Inter-Area-Router */
5056893Sfenner#define	LS_TYPE_ASE		5   /* ASE */
5156893Sfenner#define	LS_TYPE_GROUP		6   /* Group membership */
5256893Sfenner#define	LS_TYPE_TYPE7		7   /* Type 7 LSA */
5356893Sfenner#define	LS_TYPE_LINK		8   /* Link LSA */
5456893Sfenner#define	LS_TYPE_INTRA_AP	9   /* Intra-Area-Prefix */
5556893Sfenner#define	LS_TYPE_MAX		10
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
6256893Sfenner
6356893Sfenner/*************************************************
6456893Sfenner *
6556893Sfenner * is the above a bug in the documentation?
6656893Sfenner *
6756893Sfenner *************************************************/
6856893Sfenner
6956893Sfenner
7056893Sfenner/* rla_link.link_type	*/
7156893Sfenner#define	RLA_TYPE_ROUTER		1   /* point-to-point to another router	*/
7256893Sfenner#define	RLA_TYPE_TRANSIT	2   /* connection to transit network	*/
7356893Sfenner#define RLA_TYPE_VIRTUAL	4   /* virtual link			*/
7456893Sfenner
7556893Sfenner/* rla_flags	*/
7656893Sfenner#define	RLA_FLAG_B	0x01
7756893Sfenner#define	RLA_FLAG_E	0x02
7856893Sfenner#define	RLA_FLAG_V	0x04
7956893Sfenner#define	RLA_FLAG_W	0x08
8056893Sfenner
8156893Sfenner/* sla_tosmetric breakdown	*/
8256893Sfenner#define	SLA_MASK_TOS		0x7f000000
8356893Sfenner#define	SLA_MASK_METRIC		0x00ffffff
8456893Sfenner#define SLA_SHIFT_TOS		24
8556893Sfenner
8656893Sfenner/* asla_tosmetric breakdown	*/
8756893Sfenner#define	ASLA_FLAG_EXTERNAL	0x80000000
8856893Sfenner#define	ASLA_MASK_TOS		0x7f000000
8956893Sfenner#define	ASLA_SHIFT_TOS		24
9056893Sfenner#define	ASLA_MASK_METRIC	0x00ffffff
9156893Sfenner
9256893Sfenner/* multicast vertex type */
9356893Sfenner#define	MCLA_VERTEX_ROUTER	1
9456893Sfenner#define	MCLA_VERTEX_NETWORK	2
9556893Sfenner
9656893Sfennertypedef u_int32_t rtrid_t;
9756893Sfenner
9856893Sfenner/* link state advertisement header */
9956893Sfennerstruct lsa_hdr {
10056893Sfenner    u_int16_t ls_age;
10156893Sfenner    u_int16_t ls_type;
10256893Sfenner    rtrid_t ls_stateid;
10356893Sfenner    rtrid_t ls_router;
10456893Sfenner    u_int32_t ls_seq;
10556893Sfenner    u_int16_t ls_chksum;
10656893Sfenner    u_int16_t ls_length;
10756893Sfenner} ;
10856893Sfenner
10956893Sfennerstruct lsa_prefix {
11056893Sfenner    u_int8_t lsa_p_len;
11156893Sfenner    u_int8_t lsa_p_opt;
11256893Sfenner    u_int16_t lsa_p_mbz;
11356893Sfenner    u_int8_t lsa_p_prefix[4];
11456893Sfenner};
11556893Sfenner
11656893Sfenner/* link state advertisement */
11756893Sfennerstruct lsa {
11856893Sfenner    struct lsa_hdr ls_hdr;
11956893Sfenner
12056893Sfenner    /* Link state types */
12156893Sfenner    union {
12256893Sfenner	/* Router links advertisements */
12356893Sfenner	struct {
12456893Sfenner	    union {
12556893Sfenner		u_int8_t flg;
12656893Sfenner		u_int32_t opt;
12756893Sfenner	    } rla_flgandopt;
12856893Sfenner#define rla_flags	rla_flgandopt.flg
12956893Sfenner#define rla_options	rla_flgandopt.opt
13056893Sfenner	    struct rlalink {
13156893Sfenner		u_int8_t link_type;
13256893Sfenner		u_int8_t link_zero[1];
13356893Sfenner		u_int16_t link_metric;
13456893Sfenner		u_int32_t link_ifid;
13556893Sfenner		u_int32_t link_nifid;
13656893Sfenner		rtrid_t link_nrtid;
13756893Sfenner	    } rla_link[1];		/* may repeat	*/
13856893Sfenner	} un_rla;
13956893Sfenner
14056893Sfenner	/* Network links advertisements */
14156893Sfenner	struct {
14256893Sfenner	    u_int32_t nla_options;
14356893Sfenner	    rtrid_t nla_router[1];	/* may repeat	*/
14456893Sfenner	} un_nla;
14556893Sfenner
14656893Sfenner	/* Inter Area Prefix LSA */
14756893Sfenner	struct {
14856893Sfenner	    u_int32_t inter_ap_metric;
14956893Sfenner	    struct lsa_prefix inter_ap_prefix[1];
15056893Sfenner	} un_inter_ap;
15156893Sfenner
15256893Sfenner#if 0
15356893Sfenner	/* Summary links advertisements */
15456893Sfenner	struct {
15556893Sfenner	    struct in_addr sla_mask;
15656893Sfenner	    u_int32_t sla_tosmetric[1];	/* may repeat	*/
15756893Sfenner	} un_sla;
15856893Sfenner
15956893Sfenner	/* AS external links advertisements */
16056893Sfenner	struct {
16156893Sfenner	    struct in_addr asla_mask;
16256893Sfenner	    struct aslametric {
16356893Sfenner		u_int32_t asla_tosmetric;
16456893Sfenner		struct in_addr asla_forward;
16556893Sfenner		struct in_addr asla_tag;
16656893Sfenner	    } asla_metric[1];		/* may repeat	*/
16756893Sfenner	} un_asla;
16856893Sfenner
16956893Sfenner	/* Multicast group membership */
17056893Sfenner	struct mcla {
17156893Sfenner	    u_int32_t mcla_vtype;
17256893Sfenner	    struct in_addr mcla_vid;
17356893Sfenner	} un_mcla[1];
17456893Sfenner#endif
17556893Sfenner
17656893Sfenner	/* Type 7 LSA */
17756893Sfenner
17856893Sfenner	/* Link LSA */
17956893Sfenner	struct llsa {
18056893Sfenner	    union {
18156893Sfenner		u_int8_t pri;
18256893Sfenner		u_int32_t opt;
18356893Sfenner	    } llsa_priandopt;
18456893Sfenner#define llsa_priority	llsa_priandopt.pri
18556893Sfenner#define llsa_options	llsa_priandopt.opt
18656893Sfenner	    struct in6_addr llsa_lladdr;
18756893Sfenner	    u_int32_t llsa_nprefix;
18856893Sfenner	    struct lsa_prefix llsa_prefix[1];
18956893Sfenner	} un_llsa;
19056893Sfenner
19156893Sfenner	/* Intra-Area-Prefix */
19256893Sfenner	struct {
19356893Sfenner	    u_int16_t intra_ap_nprefix;
19456893Sfenner	    u_int16_t intra_ap_lstype;
19556893Sfenner	    rtrid_t intra_ap_lsid;
19656893Sfenner	    rtrid_t intra_ap_rtid;
19756893Sfenner	    struct lsa_prefix intra_ap_prefix[1];
19856893Sfenner	} un_intra_ap;
19956893Sfenner    } lsa_un;
20056893Sfenner} ;
20156893Sfenner
20256893Sfenner
20356893Sfenner/*
20456893Sfenner * TOS metric struct (will be 0 or more in router links update)
20556893Sfenner */
20656893Sfennerstruct tos_metric {
20756893Sfenner    u_int8_t tos_type;
20856893Sfenner    u_int8_t tos_zero;
20956893Sfenner    u_int16_t tos_metric;
21056893Sfenner} ;
21156893Sfenner
21256893Sfenner#define	OSPF_AUTH_SIZE	8
21356893Sfenner
21456893Sfenner/*
21556893Sfenner * the main header
21656893Sfenner */
21756893Sfennerstruct ospf6hdr {
21856893Sfenner    u_int8_t ospf6_version;
21956893Sfenner    u_int8_t ospf6_type;
22056893Sfenner    u_int16_t ospf6_len;
22156893Sfenner    rtrid_t ospf6_routerid;
22256893Sfenner    rtrid_t ospf6_areaid;
22356893Sfenner    u_int16_t ospf6_chksum;
22456893Sfenner    u_int8_t ospf6_instanceid;
22556893Sfenner    u_int8_t ospf6_rsvd;
22656893Sfenner    union {
22756893Sfenner
22856893Sfenner	/* Hello packet */
22956893Sfenner	struct {
23056893Sfenner	    u_int32_t hello_ifid;
23156893Sfenner	    union {
23256893Sfenner		u_int8_t pri;
23356893Sfenner		u_int32_t opt;
23456893Sfenner	    } hello_priandopt;
23556893Sfenner#define hello_priority	hello_priandopt.pri
23656893Sfenner#define hello_options	hello_priandopt.opt
23756893Sfenner	    u_int16_t hello_helloint;
23856893Sfenner	    u_int16_t hello_deadint;
23956893Sfenner	    rtrid_t hello_dr;
24056893Sfenner	    rtrid_t hello_bdr;
24156893Sfenner	    rtrid_t hello_neighbor[1]; /* may repeat	*/
24256893Sfenner	} un_hello;
24356893Sfenner
24456893Sfenner	/* Database Description packet */
24556893Sfenner	struct {
24656893Sfenner	    u_int32_t db_options;
24756893Sfenner	    u_int16_t db_mtu;
24856893Sfenner	    u_int8_t db_mbz;
24956893Sfenner	    u_int8_t db_flags;
25056893Sfenner	    u_int32_t db_seq;
25156893Sfenner	    struct lsa_hdr db_lshdr[1]; /* may repeat	*/
25256893Sfenner	} un_db;
25356893Sfenner
25456893Sfenner	/* Link State Request */
25556893Sfenner	struct lsr {
25656893Sfenner	    u_int16_t ls_mbz;
25756893Sfenner	    u_int16_t ls_type;
25856893Sfenner	    rtrid_t ls_stateid;
25956893Sfenner	    rtrid_t ls_router;
26056893Sfenner	} un_lsr[1];		/* may repeat	*/
26156893Sfenner
26256893Sfenner	/* Link State Update */
26356893Sfenner	struct {
26456893Sfenner	    u_int32_t lsu_count;
26556893Sfenner	    struct lsa lsu_lsa[1]; /* may repeat	*/
26656893Sfenner	} un_lsu;
26756893Sfenner
26856893Sfenner	/* Link State Acknowledgement */
26956893Sfenner	struct {
27056893Sfenner	    struct lsa_hdr lsa_lshdr[1]; /* may repeat	*/
27156893Sfenner	} un_lsa ;
27256893Sfenner    } ospf6_un ;
27356893Sfenner} ;
27456893Sfenner
27556893Sfenner#define	ospf6_hello	ospf6_un.un_hello
27656893Sfenner#define	ospf6_db	ospf6_un.un_db
27756893Sfenner#define	ospf6_lsr	ospf6_un.un_lsr
27856893Sfenner#define	ospf6_lsu	ospf6_un.un_lsu
27956893Sfenner#define	ospf6_lsa	ospf6_un.un_lsa
28056893Sfenner
281