xref: /freebsd/contrib/tcpdump/ospf.h (revision 4644f044b29b71b385396356b7cbf92b09e67628)
14edb46e9SPaul Traina /*
24644f044SBill Fenner  * Copyright (c) 1991, 1993, 1994, 1995, 1996, 1997
34edb46e9SPaul Traina  *	The Regents of the University of California.  All rights reserved.
44edb46e9SPaul Traina  *
54edb46e9SPaul Traina  * Redistribution and use in source and binary forms, with or without
64edb46e9SPaul Traina  * modification, are permitted provided that: (1) source code distributions
74edb46e9SPaul Traina  * retain the above copyright notice and this paragraph in its entirety, (2)
84edb46e9SPaul Traina  * distributions including binary code include the above copyright notice and
94edb46e9SPaul Traina  * this paragraph in its entirety in the documentation or other materials
104edb46e9SPaul Traina  * provided with the distribution, and (3) all advertising materials mentioning
114edb46e9SPaul Traina  * features or use of this software display the following acknowledgement:
124edb46e9SPaul Traina  * ``This product includes software developed by the University of California,
134edb46e9SPaul Traina  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
144edb46e9SPaul Traina  * the University nor the names of its contributors may be used to endorse
154edb46e9SPaul Traina  * or promote products derived from this software without specific prior
164edb46e9SPaul Traina  * written permission.
174edb46e9SPaul Traina  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
184edb46e9SPaul Traina  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
194edb46e9SPaul Traina  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
204edb46e9SPaul Traina  *
214edb46e9SPaul Traina  * OSPF support contributed by Jeffrey Honig (jch@mitchell.cit.cornell.edu)
224edb46e9SPaul Traina  */
234edb46e9SPaul Traina #define	OSPF_TYPE_UMD	0	/* UMd's special monitoring packets */
244edb46e9SPaul Traina #define	OSPF_TYPE_HELLO	1	/* Hello */
254edb46e9SPaul Traina #define	OSPF_TYPE_DB	2	/* Database Description */
264edb46e9SPaul Traina #define	OSPF_TYPE_LSR	3	/* Link State Request */
274edb46e9SPaul Traina #define	OSPF_TYPE_LSU	4	/* Link State Update */
284edb46e9SPaul Traina #define	OSPF_TYPE_LSA	5	/* Link State Ack */
294edb46e9SPaul Traina #define	OSPF_TYPE_MAX	6
304edb46e9SPaul Traina 
314edb46e9SPaul Traina /* Options *_options	*/
324edb46e9SPaul Traina #define OSPF_OPTION_T	0x01	/* T bit: TOS support	*/
334edb46e9SPaul Traina #define OSPF_OPTION_E	0x02	/* E bit: External routes advertised	*/
344edb46e9SPaul Traina #define	OSPF_OPTION_MC	0x04	/* MC bit: Multicast capable */
354edb46e9SPaul Traina 
364edb46e9SPaul Traina /* ospf_authtype	*/
374edb46e9SPaul Traina #define	OSPF_AUTH_NONE		0	/* No auth-data */
384edb46e9SPaul Traina #define	OSPF_AUTH_SIMPLE	1	/* Simple password */
394644f044SBill Fenner #define OSPF_AUTH_MD5		2	/* MD5 authentication */
404644f044SBill Fenner #define     OSPF_AUTH_MD5_LEN	16	/* length of MD5 authentication */
414644f044SBill Fenner 
424edb46e9SPaul Traina 
434edb46e9SPaul Traina /* db_flags	*/
444edb46e9SPaul Traina #define	OSPF_DB_INIT		0x04	    /*	*/
454edb46e9SPaul Traina #define	OSPF_DB_MORE		0x02
464edb46e9SPaul Traina #define	OSPF_DB_MASTER		0x01
474edb46e9SPaul Traina 
484edb46e9SPaul Traina /* ls_type	*/
494edb46e9SPaul Traina #define	LS_TYPE_ROUTER		1   /* router link */
504edb46e9SPaul Traina #define	LS_TYPE_NETWORK		2   /* network link */
514edb46e9SPaul Traina #define	LS_TYPE_SUM_IP		3   /* summary link */
524edb46e9SPaul Traina #define	LS_TYPE_SUM_ABR		4   /* summary area link */
534edb46e9SPaul Traina #define	LS_TYPE_ASE		5   /* ASE  */
544edb46e9SPaul Traina #define	LS_TYPE_GROUP		6   /* Group membership (multicast */
554edb46e9SPaul Traina 				    /* extensions 23 July 1991) */
564edb46e9SPaul Traina #define	LS_TYPE_MAX		7
574edb46e9SPaul Traina 
584edb46e9SPaul Traina /*************************************************
594edb46e9SPaul Traina  *
604edb46e9SPaul Traina  * is the above a bug in the documentation?
614edb46e9SPaul Traina  *
624edb46e9SPaul Traina  *************************************************/
634edb46e9SPaul Traina 
644edb46e9SPaul Traina 
654edb46e9SPaul Traina /* rla_link.link_type	*/
664edb46e9SPaul Traina #define	RLA_TYPE_ROUTER		1   /* point-to-point to another router	*/
674edb46e9SPaul Traina #define	RLA_TYPE_TRANSIT	2   /* connection to transit network	*/
684edb46e9SPaul Traina #define	RLA_TYPE_STUB		3   /* connection to stub network	*/
694edb46e9SPaul Traina #define RLA_TYPE_VIRTUAL	4   /* virtual link			*/
704edb46e9SPaul Traina 
714edb46e9SPaul Traina /* rla_flags	*/
724edb46e9SPaul Traina #define	RLA_FLAG_B	0x01
734edb46e9SPaul Traina #define	RLA_FLAG_E	0x02
744edb46e9SPaul Traina #define	RLA_FLAG_W1	0x04
754edb46e9SPaul Traina #define	RLA_FLAG_W2	0x08
764edb46e9SPaul Traina 
774edb46e9SPaul Traina /* sla_tosmetric breakdown	*/
784edb46e9SPaul Traina #define	SLA_MASK_TOS		0x7f000000
794edb46e9SPaul Traina #define	SLA_MASK_METRIC		0x00ffffff
804edb46e9SPaul Traina #define SLA_SHIFT_TOS		24
814edb46e9SPaul Traina 
824edb46e9SPaul Traina /* asla_tosmetric breakdown	*/
834edb46e9SPaul Traina #define	ASLA_FLAG_EXTERNAL	0x80000000
844edb46e9SPaul Traina #define	ASLA_MASK_TOS		0x7f000000
854edb46e9SPaul Traina #define	ASLA_SHIFT_TOS		24
864edb46e9SPaul Traina #define	ASLA_MASK_METRIC	0x00ffffff
874edb46e9SPaul Traina 
884edb46e9SPaul Traina /* multicast vertex type */
894edb46e9SPaul Traina #define	MCLA_VERTEX_ROUTER	1
904edb46e9SPaul Traina #define	MCLA_VERTEX_NETWORK	2
914edb46e9SPaul Traina 
924edb46e9SPaul Traina /* link state advertisement header */
934edb46e9SPaul Traina struct lsa_hdr {
944edb46e9SPaul Traina     u_short ls_age;
954edb46e9SPaul Traina     u_char ls_options;
964edb46e9SPaul Traina     u_char ls_type;
974edb46e9SPaul Traina     struct in_addr ls_stateid;
984edb46e9SPaul Traina     struct in_addr ls_router;
994edb46e9SPaul Traina     u_int32_t ls_seq;
1004edb46e9SPaul Traina     u_short ls_chksum;
1014edb46e9SPaul Traina     u_short ls_length;
1024edb46e9SPaul Traina } ;
1034edb46e9SPaul Traina 
1044edb46e9SPaul Traina /* link state advertisement */
1054edb46e9SPaul Traina struct lsa {
1064edb46e9SPaul Traina     struct lsa_hdr ls_hdr;
1074edb46e9SPaul Traina 
1084edb46e9SPaul Traina     /* Link state types */
1094edb46e9SPaul Traina     union {
1104edb46e9SPaul Traina 	/* Router links advertisements */
1114edb46e9SPaul Traina 	struct {
1124edb46e9SPaul Traina 	    u_char rla_flags;
1134edb46e9SPaul Traina 	    u_char rla_zero[1];
1144edb46e9SPaul Traina 	    u_short rla_count;
1154edb46e9SPaul Traina 	    struct rlalink {
1164edb46e9SPaul Traina 		struct in_addr link_id;
1174edb46e9SPaul Traina 		struct in_addr link_data;
1184edb46e9SPaul Traina 		u_char link_type;
1194edb46e9SPaul Traina 		u_char link_toscount;
1204edb46e9SPaul Traina 		u_short link_tos0metric;
1214edb46e9SPaul Traina 	    } rla_link[1];		/* may repeat	*/
1224edb46e9SPaul Traina 	} un_rla;
1234edb46e9SPaul Traina 
1244edb46e9SPaul Traina 	/* Network links advertisements */
1254edb46e9SPaul Traina 	struct {
1264edb46e9SPaul Traina 	    struct in_addr nla_mask;
1274edb46e9SPaul Traina 	    struct in_addr nla_router[1];	/* may repeat	*/
1284edb46e9SPaul Traina 	} un_nla;
1294edb46e9SPaul Traina 
1304edb46e9SPaul Traina 	/* Summary links advertisements */
1314edb46e9SPaul Traina 	struct {
1324edb46e9SPaul Traina 	    struct in_addr sla_mask;
1334edb46e9SPaul Traina 	    u_int32_t sla_tosmetric[1];	/* may repeat	*/
1344edb46e9SPaul Traina 	} un_sla;
1354edb46e9SPaul Traina 
1364edb46e9SPaul Traina 	/* AS external links advertisements */
1374edb46e9SPaul Traina 	struct {
1384edb46e9SPaul Traina 	    struct in_addr asla_mask;
1394edb46e9SPaul Traina 	    struct aslametric {
1404edb46e9SPaul Traina 		u_int32_t asla_tosmetric;
1414edb46e9SPaul Traina 		struct in_addr asla_forward;
1424edb46e9SPaul Traina 		struct in_addr asla_tag;
1434edb46e9SPaul Traina 	    } asla_metric[1];		/* may repeat	*/
1444edb46e9SPaul Traina 	} un_asla;
1454edb46e9SPaul Traina 
1464edb46e9SPaul Traina 	/* Multicast group membership */
1474edb46e9SPaul Traina 	struct mcla {
1484edb46e9SPaul Traina 	    u_int32_t mcla_vtype;
1494edb46e9SPaul Traina 	    struct in_addr mcla_vid;
1504edb46e9SPaul Traina 	} un_mcla[1];
1514edb46e9SPaul Traina     } lsa_un;
1524edb46e9SPaul Traina } ;
1534edb46e9SPaul Traina 
1544edb46e9SPaul Traina 
1554edb46e9SPaul Traina /*
1564edb46e9SPaul Traina  * TOS metric struct (will be 0 or more in router links update)
1574edb46e9SPaul Traina  */
1584edb46e9SPaul Traina struct tos_metric {
1594edb46e9SPaul Traina     u_char tos_type;
1604edb46e9SPaul Traina     u_char tos_zero;
1614edb46e9SPaul Traina     u_short tos_metric;
1624edb46e9SPaul Traina } ;
1634edb46e9SPaul Traina 
1644edb46e9SPaul Traina #define	OSPF_AUTH_SIZE	8
1654edb46e9SPaul Traina 
1664edb46e9SPaul Traina /*
1674edb46e9SPaul Traina  * the main header
1684edb46e9SPaul Traina  */
1694edb46e9SPaul Traina struct ospfhdr {
1704edb46e9SPaul Traina     u_char ospf_version;
1714edb46e9SPaul Traina     u_char ospf_type;
1724edb46e9SPaul Traina     u_short ospf_len;
1734edb46e9SPaul Traina     struct in_addr ospf_routerid;
1744edb46e9SPaul Traina     struct in_addr ospf_areaid;
1754edb46e9SPaul Traina     u_short ospf_chksum;
1764edb46e9SPaul Traina     u_short ospf_authtype;
1774edb46e9SPaul Traina     u_char ospf_authdata[OSPF_AUTH_SIZE];
1784edb46e9SPaul Traina     union {
1794edb46e9SPaul Traina 
1804edb46e9SPaul Traina 	/* Hello packet */
1814edb46e9SPaul Traina 	struct {
1824edb46e9SPaul Traina 	    struct in_addr hello_mask;
1834edb46e9SPaul Traina 	    u_short hello_helloint;
1844edb46e9SPaul Traina 	    u_char hello_options;
1854edb46e9SPaul Traina 	    u_char hello_priority;
1864edb46e9SPaul Traina 	    u_int32_t hello_deadint;
1874edb46e9SPaul Traina 	    struct in_addr hello_dr;
1884edb46e9SPaul Traina 	    struct in_addr hello_bdr;
1894edb46e9SPaul Traina 	    struct in_addr hello_neighbor[1]; /* may repeat	*/
1904edb46e9SPaul Traina 	} un_hello;
1914edb46e9SPaul Traina 
1924edb46e9SPaul Traina 	/* Database Description packet */
1934edb46e9SPaul Traina 	struct {
1944edb46e9SPaul Traina 	    u_char db_zero[2];
1954edb46e9SPaul Traina 	    u_char db_options;
1964edb46e9SPaul Traina 	    u_char db_flags;
1974edb46e9SPaul Traina 	    u_int32_t db_seq;
1984edb46e9SPaul Traina 	    struct lsa_hdr db_lshdr[1]; /* may repeat	*/
1994edb46e9SPaul Traina 	} un_db;
2004edb46e9SPaul Traina 
2014edb46e9SPaul Traina 	/* Link State Request */
2024edb46e9SPaul Traina 	struct lsr {
2034edb46e9SPaul Traina 	    u_int32_t ls_type;
2044edb46e9SPaul Traina 	    struct in_addr ls_stateid;
2054edb46e9SPaul Traina 	    struct in_addr ls_router;
2064edb46e9SPaul Traina 	} un_lsr[1];		/* may repeat	*/
2074edb46e9SPaul Traina 
2084edb46e9SPaul Traina 	/* Link State Update */
2094edb46e9SPaul Traina 	struct {
2104edb46e9SPaul Traina 	    u_int32_t lsu_count;
2114edb46e9SPaul Traina 	    struct lsa lsu_lsa[1]; /* may repeat	*/
2124edb46e9SPaul Traina 	} un_lsu;
2134edb46e9SPaul Traina 
2144edb46e9SPaul Traina 	/* Link State Acknowledgement */
2154edb46e9SPaul Traina 	struct {
2164edb46e9SPaul Traina 	    struct lsa_hdr lsa_lshdr[1]; /* may repeat	*/
2174edb46e9SPaul Traina 	} un_lsa ;
2184edb46e9SPaul Traina     } ospf_un ;
2194edb46e9SPaul Traina } ;
2204edb46e9SPaul Traina 
2214edb46e9SPaul Traina #define	ospf_hello	ospf_un.un_hello
2224edb46e9SPaul Traina #define	ospf_db		ospf_un.un_db
2234edb46e9SPaul Traina #define	ospf_lsr	ospf_un.un_lsr
2244edb46e9SPaul Traina #define	ospf_lsu	ospf_un.un_lsu
2254edb46e9SPaul Traina #define	ospf_lsa	ospf_un.un_lsa
2264edb46e9SPaul Traina 
227