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