1/* $OpenBSD: ospf.h,v 1.23 2013/01/17 09:14:15 markus Exp $ */ 2 3/* 4 * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19/* OSPF protocol definitions */ 20 21#ifndef _OSPF_H_ 22#define _OSPF_H_ 23 24#include <netinet/in.h> 25#include <stddef.h> 26 27/* misc */ 28#define OSPF_VERSION 2 29#define IPPROTO_OSPF 89 30#define AllSPFRouters "224.0.0.5" 31#define AllDRouters "224.0.0.6" 32 33#define DEFAULT_METRIC 10 34#define DEFAULT_REDIST_METRIC 100 35#define MIN_METRIC 1 36#define MAX_METRIC 65535 /* sum & as-ext lsa use 24bit metrics */ 37 38#define DEFAULT_PRIORITY 1 39#define MIN_PRIORITY 0 40#define MAX_PRIORITY 255 41 42#define DEFAULT_HELLO_INTERVAL 10 43#define MIN_HELLO_INTERVAL 1 44#define MAX_HELLO_INTERVAL 65535 45 46/* msec */ 47#define DEFAULT_FAST_INTERVAL 333 48#define MIN_FAST_INTERVAL 50 49#define MAX_FAST_INTERVAL 333 50 51#define DEFAULT_RTR_DEAD_TIME 40 52#define FAST_RTR_DEAD_TIME 1 53#define MIN_RTR_DEAD_TIME 2 54#define MAX_RTR_DEAD_TIME 2147483647 55 56#define DEFAULT_RXMT_INTERVAL 5 57#define MIN_RXMT_INTERVAL 5 58#define MAX_RXMT_INTERVAL 3600 59 60#define DEFAULT_TRANSMIT_DELAY 1 61#define MIN_TRANSMIT_DELAY 1 62#define MAX_TRANSMIT_DELAY 3600 63 64#define DEFAULT_ADJ_TMOUT 120 65 66#define DEFAULT_NBR_TMOUT 86400 /* 24 hours */ 67 68/* msec */ 69#define DEFAULT_SPF_DELAY 1000 70#define MIN_SPF_DELAY 10 71#define MAX_SPF_DELAY 10000 72 73/* msec */ 74#define DEFAULT_SPF_HOLDTIME 5000 75#define MIN_SPF_HOLDTIME 10 76#define MAX_SPF_HOLDTIME 5000 77 78/* msec */ 79#define KR_RELOAD_TIMER 250 80#define KR_RELOAD_HOLD_TIMER 5000 81 82#define MIN_MD_ID 0 83#define MAX_MD_ID 255 84 85#define MAX_SIMPLE_AUTH_LEN 8 86 87/* OSPF compatibility flags */ 88#define OSPF_OPTION_MT 0x01 89#define OSPF_OPTION_E 0x02 90#define OSPF_OPTION_MC 0x04 91#define OSPF_OPTION_NP 0x08 92#define OSPF_OPTION_EA 0x10 93#define OSPF_OPTION_DC 0x20 94#define OSPF_OPTION_O 0x40 /* only on DD options */ 95#define OSPF_OPTION_DN 0x80 /* only on LSA options */ 96 97/* OSPF packet types */ 98#define PACKET_TYPE_HELLO 1 99#define PACKET_TYPE_DD 2 100#define PACKET_TYPE_LS_REQUEST 3 101#define PACKET_TYPE_LS_UPDATE 4 102#define PACKET_TYPE_LS_ACK 5 103 104/* OSPF auth types */ 105#define AUTH_TYPE_NONE 0 106#define AUTH_TYPE_SIMPLE 1 107#define AUTH_TYPE_CRYPT 2 108 109#define MIN_AUTHTYPE 0 110#define MAX_AUTHTYPE 2 111 112/* LSA */ 113#define LS_REFRESH_TIME 1800 114#define MIN_LS_INTERVAL 5 115#define MIN_LS_ARRIVAL 1 116#define DEFAULT_AGE 0 117#define MAX_AGE 3600 118#define CHECK_AGE 300 119#define MAX_AGE_DIFF 900 120#define LS_INFINITY 0xffffff 121#define RESV_SEQ_NUM 0x80000000 /* reserved and "unused" */ 122#define INIT_SEQ_NUM 0x80000001 123#define MAX_SEQ_NUM 0x7fffffff 124 125/* OSPF header */ 126struct crypt { 127 u_int16_t dummy; 128 u_int8_t keyid; 129 u_int8_t len; 130 u_int32_t seq_num; 131}; 132 133struct ospf_hdr { 134 u_int8_t version; 135 u_int8_t type; 136 u_int16_t len; 137 u_int32_t rtr_id; 138 u_int32_t area_id; 139 u_int16_t chksum; 140 u_int16_t auth_type; 141 union { 142 char simple[MAX_SIMPLE_AUTH_LEN]; 143 struct crypt crypt; 144 } auth_key; 145}; 146 147/* Hello header (type 1) */ 148struct hello_hdr { 149 u_int32_t mask; 150 u_int16_t hello_interval; 151 u_int8_t opts; 152 u_int8_t rtr_priority; 153 u_int32_t rtr_dead_interval; 154 u_int32_t d_rtr; 155 u_int32_t bd_rtr; 156}; 157 158/* Database Description header (type 2) */ 159struct db_dscrp_hdr { 160 u_int16_t iface_mtu; 161 u_int8_t opts; 162 u_int8_t bits; 163 u_int32_t dd_seq_num; 164}; 165 166#define OSPF_DBD_MS 0x01 167#define OSPF_DBD_M 0x02 168#define OSPF_DBD_I 0x04 169 170/* Link State Request header (type 3) */ 171struct ls_req_hdr { 172 u_int32_t type; 173 u_int32_t ls_id; 174 u_int32_t adv_rtr; 175}; 176 177/* Link State Update header (type 4) */ 178struct ls_upd_hdr { 179 u_int32_t num_lsa; 180}; 181 182#define LSA_TYPE_ROUTER 1 183#define LSA_TYPE_NETWORK 2 184#define LSA_TYPE_SUM_NETWORK 3 185#define LSA_TYPE_SUM_ROUTER 4 186#define LSA_TYPE_EXTERNAL 5 187#define LSA_TYPE_LINK_OPAQ 9 188#define LSA_TYPE_AREA_OPAQ 10 189#define LSA_TYPE_AS_OPAQ 11 190 191#define LINK_TYPE_POINTTOPOINT 1 192#define LINK_TYPE_TRANSIT_NET 2 193#define LINK_TYPE_STUB_NET 3 194#define LINK_TYPE_VIRTUAL 4 195 196/* LSA headers */ 197#define LSA_METRIC_MASK 0x00ffffff /* only for sum & as-ext */ 198#define LSA_ASEXT_E_FLAG 0x80000000 199 200/* for some reason they thought 24bit types are fun, make them less a hazard */ 201#define LSA_24_MASK 0xffffff 202#define LSA_24_GETHI(x) \ 203 ((x) >> 24) 204#define LSA_24_GETLO(x) \ 205 ((x) & LSA_24_MASK) 206#define LSA_24_SETHI(x, y) \ 207 ((x) = ((x) & LSA_24_MASK) | (((y) & 0xff) << 24)) 208#define LSA_24_SETLO(x, y) \ 209 ((x) = ((y) & LSA_24_MASK) | ((x) & ~LSA_24_MASK)) 210 211 212#define OSPF_RTR_B 0x01 213#define OSPF_RTR_E 0x02 214#define OSPF_RTR_V 0x04 215 216struct lsa_rtr { 217 u_int8_t flags; 218 u_int8_t dummy; 219 u_int16_t nlinks; 220}; 221 222struct lsa_rtr_link { 223 u_int32_t id; 224 u_int32_t data; 225 u_int8_t type; 226 u_int8_t num_tos; 227 u_int16_t metric; 228}; 229 230struct lsa_net { 231 u_int32_t mask; 232 u_int32_t att_rtr[1]; 233}; 234 235struct lsa_net_link { 236 u_int32_t att_rtr; 237}; 238 239struct lsa_sum { 240 u_int32_t mask; 241 u_int32_t metric; /* only lower 24 bit */ 242}; 243 244struct lsa_asext { 245 u_int32_t mask; 246 u_int32_t metric; /* lower 24 bit plus E bit */ 247 u_int32_t fw_addr; 248 u_int32_t ext_tag; 249}; 250 251struct lsa_hdr { 252 u_int16_t age; 253 u_int8_t opts; 254 u_int8_t type; 255 u_int32_t ls_id; 256 u_int32_t adv_rtr; 257 u_int32_t seq_num; 258 u_int16_t ls_chksum; 259 u_int16_t len; 260}; 261 262#define LS_CKSUM_OFFSET offsetof(struct lsa_hdr, ls_chksum) 263 264struct lsa { 265 struct lsa_hdr hdr; 266 union { 267 struct lsa_rtr rtr; 268 struct lsa_net net; 269 struct lsa_sum sum; 270 struct lsa_asext asext; 271 } data; 272}; 273 274#endif /* !_OSPF_H_ */ 275