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