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