1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _OSPF_H 28 #define _OSPF_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 /* 33 * Definitions for parsing OSPF packets (RFC 2328 and RFC 2740) 34 */ 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #define OSPF_TYPE_UMD 0 /* UMD's special monitoring packets */ 41 #define OSPF_TYPE_HELLO 1 /* Hello */ 42 #define OSPF_TYPE_DB 2 /* Database Description */ 43 #define OSPF_TYPE_LSR 3 /* Link State Request */ 44 #define OSPF_TYPE_LSU 4 /* Link State Update */ 45 #define OSPF_TYPE_LSA 5 /* Link State Ack */ 46 #define OSPF_TYPE_MAX 6 47 48 extern char *ospf_types[]; 49 struct bits { 50 uint32_t bit; 51 const char *str; 52 }; 53 char *ospf_print_bits(const struct bits *, uchar_t); 54 char *ospf_print_lsa_age(long); 55 56 /* Options *_options */ 57 #define OSPF_OPTION_T 0x01 /* RFC 2328 T bit: TOS support */ 58 #define OSPF_OPTION_E 0x02 /* E bit: External routes advertised */ 59 #define OSPF_OPTION_MC 0x04 /* MC bit: Multicast capable */ 60 #define OSPF_OPTION_N 0x08 /* N bit: For type-7 LSA */ 61 #define OSPF_OPTION_R 0x10 /* R bit: Router bit */ 62 #define OSPF_OPTION_DC 0x20 /* DC bit: Demand circuits */ 63 64 #define OSPF_OPTION_V6 0x01 /* RFC 2740 V6 bit */ 65 66 /* ospf_authtype */ 67 #define OSPF_AUTH_NONE 0 /* No auth-data */ 68 #define OSPF_AUTH_SIMPLE 1 /* Simple password */ 69 #define OSPF_AUTH_MD5 2 /* MD5 authentication */ 70 #define OSPF_AUTH_MD5_LEN 16 /* length of MD5 authentication */ 71 72 #define OSPF_AUTH_TYPE_MAX 3 73 74 /* db_flags */ 75 #define OSPF_DB_INIT 0x04 /* "I" */ 76 #define OSPF_DB_MORE 0x02 /* "M" */ 77 #define OSPF_DB_MASTER 0x01 /* "MS" */ 78 79 80 /* ls_type */ 81 #define LS_TYPE_ROUTER 1 /* router link */ 82 #define LS_TYPE_NETWORK 2 /* network link */ 83 #define LS_TYPE_SUM_IP 3 /* summary link */ 84 #define LS_TYPE_SUM_ABR 4 /* summary area link */ 85 #define LS_TYPE_ASE 5 /* ASE */ 86 #define LS_TYPE_GROUP 6 /* Group membership (multicast */ 87 /* extensions 23 July 1991) */ 88 #define LS_TYPE_TYPE7 7 /* Type 7 LSA */ 89 #define LS_TYPE_LINK 8 /* Link LSA */ 90 #define LS_TYPE_INTRA_AP 9 /* Intra-Area-Prefix */ 91 #define LS_TYPE_MAX 10 92 #define LS_TYPE_MASK 0x1fff 93 94 #define LS_TYPE_INTER_AP 3 /* RFC 2740 Inter-Area-Prefix */ 95 #define LS_TYPE_INTER_AR 4 /* RFC 2740 Inter-Area-Router */ 96 97 #define LS6_SCOPE_LINKLOCAL 0x0000 98 #define LS6_SCOPE_AREA 0x2000 99 #define LS6_SCOPE_AS 0x4000 100 #define LS6_SCOPE_MASK 0x6000 101 102 /* rla_link.link_type */ 103 #define RLA_TYPE_ROUTER 1 /* point-to-point to another router */ 104 #define RLA_TYPE_TRANSIT 2 /* connection to transit network */ 105 #define RLA_TYPE_STUB 3 /* connection to stub network */ 106 #define RLA_TYPE_VIRTUAL 4 /* virtual link */ 107 108 /* rla_flags */ 109 #define RLA_FLAG_B 0x01 110 #define RLA_FLAG_E 0x02 111 #define RLA_FLAG_V 0x04 112 #define RLA_FLAG_W 0x08 113 114 115 /* sla_tosmetric breakdown */ 116 #define SLA_MASK_TOS 0x7f000000 117 #define SLA_MASK_METRIC 0x00ffffff 118 #define SLA_SHIFT_TOS 24 119 120 /* asla_tosmetric breakdown */ 121 #define ASLA_FLAG_EXTERNAL 0x80000000 122 #define ASLA_MASK_TOS 0x7f000000 123 #define ASLA_SHIFT_TOS 24 124 #define ASLA_MASK_METRIC 0x00ffffff 125 126 /* multicast vertex type */ 127 #define MCLA_VERTEX_ROUTER 1 128 #define MCLA_VERTEX_NETWORK 2 129 130 /* link state advertisement header */ 131 struct lsa_hdr { 132 ushort_t ls_age; 133 uchar_t ls_options; 134 uchar_t ls_type; 135 struct in_addr ls_stateid; 136 struct in_addr ls_router; 137 uint32_t ls_seq; 138 ushort_t ls_chksum; 139 ushort_t ls_length; 140 }; 141 142 /* link state advertisement */ 143 struct lsa { 144 struct lsa_hdr ls_hdr; 145 146 /* Link state types */ 147 union { 148 /* Router links advertisements */ 149 struct { 150 uchar_t rla_flags; 151 uchar_t rla_zero[1]; 152 ushort_t rla_count; 153 struct rlalink { 154 struct in_addr link_id; 155 struct in_addr link_data; 156 uchar_t link_type; 157 uchar_t link_toscount; 158 ushort_t link_tos0metric; 159 } rla_link[1]; /* may repeat */ 160 } un_rla; 161 162 /* Network links advertisements */ 163 struct { 164 struct in_addr nla_mask; 165 struct in_addr nla_router[1]; /* may repeat */ 166 } un_nla; 167 168 /* Summary links advertisements */ 169 struct { 170 struct in_addr sla_mask; 171 uint32_t sla_tosmetric[1]; /* may repeat */ 172 } un_sla; 173 174 /* AS external links advertisements */ 175 struct { 176 struct in_addr asla_mask; 177 struct aslametric { 178 uint32_t asla_tosmetric; 179 struct in_addr asla_forward; 180 struct in_addr asla_tag; 181 } asla_metric[1]; /* may repeat */ 182 } un_asla; 183 184 /* Multicast group membership */ 185 struct mcla { 186 uint32_t mcla_vtype; 187 struct in_addr mcla_vid; 188 } un_mcla[1]; 189 } lsa_un; 190 }; 191 192 /* 193 * TOS metric struct (will be 0 or more in router links update) 194 */ 195 struct tos_metric { 196 uchar_t tos_type; 197 uchar_t tos_zero; 198 ushort_t tos_metric; 199 }; 200 201 /* 202 * OSPF minimum header sizes 203 */ 204 #define OSPF_AUTH_SIZE 8 205 #define OSPF_MIN_HEADER_SIZE 24 206 #define OSPF6_MIN_HEADER_SIZE 16 207 #define OSPF_MIN_HELLO_HEADER_SIZE 20 208 #define OSPF_MIN_DB_HEADER_SIZE 8 209 #define OSPF6_MIN_DB_HEADER_SIZE 12 210 #define OSPF_MIN_LSR_HEADER_SIZE 12 211 #define OSPF_MIN_LSU_HEADER_SIZE 4 212 213 /* 214 * ospf packet header 215 */ 216 struct ospfhdr { 217 uchar_t ospf_version; 218 uchar_t ospf_type; 219 ushort_t ospf_len; 220 struct in_addr ospf_routerid; 221 struct in_addr ospf_areaid; 222 ushort_t ospf_chksum; 223 ushort_t ospf_authtype; 224 uchar_t ospf_authdata[OSPF_AUTH_SIZE]; 225 union { 226 227 /* Hello packet */ 228 struct { 229 struct in_addr hello_mask; 230 ushort_t hello_helloint; 231 uchar_t hello_options; 232 uchar_t hello_priority; 233 uint32_t hello_deadint; 234 struct in_addr hello_dr; 235 struct in_addr hello_bdr; 236 struct in_addr hello_neighbor[1]; /* may repeat */ 237 } un_hello; 238 239 /* Database Description packet */ 240 struct { 241 uchar_t db_zero[2]; 242 uchar_t db_options; 243 uchar_t db_flags; 244 uint32_t db_seq; 245 struct lsa_hdr db_lshdr[1]; /* may repeat */ 246 } un_db; 247 248 /* Link State Request */ 249 struct lsr { 250 uint32_t ls_type; 251 struct in_addr ls_stateid; 252 struct in_addr ls_router; 253 } un_lsr[1]; /* may repeat */ 254 255 /* Link State Update */ 256 struct { 257 uint32_t lsu_count; 258 struct lsa lsu_lsa[1]; /* may repeat */ 259 } un_lsu; 260 261 /* Link State Acknowledgement */ 262 struct { 263 struct lsa_hdr lsa_lshdr[1]; /* may repeat */ 264 } un_lsa; 265 } ospf_un; 266 }; 267 268 #define ospf_hello ospf_un.un_hello 269 #define ospf_db ospf_un.un_db 270 #define ospf_lsr ospf_un.un_lsr 271 #define ospf_lsu ospf_un.un_lsu 272 #define ospf_lsa ospf_un.un_lsa 273 274 275 276 #ifdef __cplusplus 277 } 278 #endif 279 280 #endif /* _OSPF_H */ 281