1*9171581dSmarkus /* $OpenBSD: ospf.h,v 1.23 2013/01/17 09:14:15 markus Exp $ */ 2204df0f8Sclaudio 3204df0f8Sclaudio /* 4367f601bSnorby * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org> 5204df0f8Sclaudio * 6204df0f8Sclaudio * Permission to use, copy, modify, and distribute this software for any 7204df0f8Sclaudio * purpose with or without fee is hereby granted, provided that the above 8204df0f8Sclaudio * copyright notice and this permission notice appear in all copies. 9204df0f8Sclaudio * 10204df0f8Sclaudio * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11204df0f8Sclaudio * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12204df0f8Sclaudio * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13204df0f8Sclaudio * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14204df0f8Sclaudio * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15204df0f8Sclaudio * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16204df0f8Sclaudio * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17204df0f8Sclaudio */ 18204df0f8Sclaudio 19204df0f8Sclaudio /* OSPF protocol definitions */ 20204df0f8Sclaudio 21204df0f8Sclaudio #ifndef _OSPF_H_ 22204df0f8Sclaudio #define _OSPF_H_ 23204df0f8Sclaudio 24204df0f8Sclaudio #include <netinet/in.h> 25370c8b16Sguenther #include <stddef.h> 26204df0f8Sclaudio 27204df0f8Sclaudio /* misc */ 28204df0f8Sclaudio #define OSPF_VERSION 2 29204df0f8Sclaudio #define IPPROTO_OSPF 89 30204df0f8Sclaudio #define AllSPFRouters "224.0.0.5" 31204df0f8Sclaudio #define AllDRouters "224.0.0.6" 32204df0f8Sclaudio 335909657cSnorby #define DEFAULT_METRIC 10 34f373ed5aSclaudio #define DEFAULT_REDIST_METRIC 100 35204df0f8Sclaudio #define MIN_METRIC 1 36ee89e4e9Sclaudio #define MAX_METRIC 65535 /* sum & as-ext lsa use 24bit metrics */ 37204df0f8Sclaudio 3844ca2d17Sclaudio #define DEFAULT_PRIORITY 1 39204df0f8Sclaudio #define MIN_PRIORITY 0 40204df0f8Sclaudio #define MAX_PRIORITY 255 41204df0f8Sclaudio 42204df0f8Sclaudio #define DEFAULT_HELLO_INTERVAL 10 43204df0f8Sclaudio #define MIN_HELLO_INTERVAL 1 44204df0f8Sclaudio #define MAX_HELLO_INTERVAL 65535 45204df0f8Sclaudio 467afdfd2dSdlg /* msec */ 477afdfd2dSdlg #define DEFAULT_FAST_INTERVAL 333 487afdfd2dSdlg #define MIN_FAST_INTERVAL 50 497afdfd2dSdlg #define MAX_FAST_INTERVAL 333 507afdfd2dSdlg 51204df0f8Sclaudio #define DEFAULT_RTR_DEAD_TIME 40 527afdfd2dSdlg #define FAST_RTR_DEAD_TIME 1 53204df0f8Sclaudio #define MIN_RTR_DEAD_TIME 2 54204df0f8Sclaudio #define MAX_RTR_DEAD_TIME 2147483647 55204df0f8Sclaudio 56204df0f8Sclaudio #define DEFAULT_RXMT_INTERVAL 5 57204df0f8Sclaudio #define MIN_RXMT_INTERVAL 5 58204df0f8Sclaudio #define MAX_RXMT_INTERVAL 3600 59204df0f8Sclaudio 601084cfe8Snorby #define DEFAULT_TRANSMIT_DELAY 1 611084cfe8Snorby #define MIN_TRANSMIT_DELAY 1 621084cfe8Snorby #define MAX_TRANSMIT_DELAY 3600 63204df0f8Sclaudio 64*9171581dSmarkus #define DEFAULT_ADJ_TMOUT 120 65204df0f8Sclaudio 6637cea71bSnorby #define DEFAULT_NBR_TMOUT 86400 /* 24 hours */ 6737cea71bSnorby 6837877ca4Sdlg /* msec */ 6937877ca4Sdlg #define DEFAULT_SPF_DELAY 1000 7037877ca4Sdlg #define MIN_SPF_DELAY 10 7137877ca4Sdlg #define MAX_SPF_DELAY 10000 723ada9d8fSnorby 7337877ca4Sdlg /* msec */ 7437877ca4Sdlg #define DEFAULT_SPF_HOLDTIME 5000 7537877ca4Sdlg #define MIN_SPF_HOLDTIME 10 7637877ca4Sdlg #define MAX_SPF_HOLDTIME 5000 773ada9d8fSnorby 78fddf39b9Ssthen /* msec */ 79fddf39b9Ssthen #define KR_RELOAD_TIMER 250 80fddf39b9Ssthen #define KR_RELOAD_HOLD_TIMER 5000 81fddf39b9Ssthen 8203431b74Snorby #define MIN_MD_ID 0 8303431b74Snorby #define MAX_MD_ID 255 8403431b74Snorby 85eee4aafbSnorby #define MAX_SIMPLE_AUTH_LEN 8 86eee4aafbSnorby 87204df0f8Sclaudio /* OSPF compatibility flags */ 88097ed198Sclaudio #define OSPF_OPTION_MT 0x01 89204df0f8Sclaudio #define OSPF_OPTION_E 0x02 90204df0f8Sclaudio #define OSPF_OPTION_MC 0x04 91204df0f8Sclaudio #define OSPF_OPTION_NP 0x08 92204df0f8Sclaudio #define OSPF_OPTION_EA 0x10 93204df0f8Sclaudio #define OSPF_OPTION_DC 0x20 94097ed198Sclaudio #define OSPF_OPTION_O 0x40 /* only on DD options */ 95097ed198Sclaudio #define OSPF_OPTION_DN 0x80 /* only on LSA options */ 96204df0f8Sclaudio 97204df0f8Sclaudio /* OSPF packet types */ 98204df0f8Sclaudio #define PACKET_TYPE_HELLO 1 99204df0f8Sclaudio #define PACKET_TYPE_DD 2 100204df0f8Sclaudio #define PACKET_TYPE_LS_REQUEST 3 101204df0f8Sclaudio #define PACKET_TYPE_LS_UPDATE 4 102204df0f8Sclaudio #define PACKET_TYPE_LS_ACK 5 103204df0f8Sclaudio 104204df0f8Sclaudio /* OSPF auth types */ 105204df0f8Sclaudio #define AUTH_TYPE_NONE 0 106204df0f8Sclaudio #define AUTH_TYPE_SIMPLE 1 107204df0f8Sclaudio #define AUTH_TYPE_CRYPT 2 108204df0f8Sclaudio 109204df0f8Sclaudio #define MIN_AUTHTYPE 0 110204df0f8Sclaudio #define MAX_AUTHTYPE 2 111204df0f8Sclaudio 112204df0f8Sclaudio /* LSA */ 113204df0f8Sclaudio #define LS_REFRESH_TIME 1800 114204df0f8Sclaudio #define MIN_LS_INTERVAL 5 115204df0f8Sclaudio #define MIN_LS_ARRIVAL 1 116204df0f8Sclaudio #define DEFAULT_AGE 0 117204df0f8Sclaudio #define MAX_AGE 3600 118204df0f8Sclaudio #define CHECK_AGE 300 119204df0f8Sclaudio #define MAX_AGE_DIFF 900 120204df0f8Sclaudio #define LS_INFINITY 0xffffff 121fd136cabSclaudio #define RESV_SEQ_NUM 0x80000000 /* reserved and "unused" */ 122204df0f8Sclaudio #define INIT_SEQ_NUM 0x80000001 123204df0f8Sclaudio #define MAX_SEQ_NUM 0x7fffffff 124204df0f8Sclaudio 125204df0f8Sclaudio /* OSPF header */ 12603431b74Snorby struct crypt { 12703431b74Snorby u_int16_t dummy; 12803431b74Snorby u_int8_t keyid; 12903431b74Snorby u_int8_t len; 13003431b74Snorby u_int32_t seq_num; 13103431b74Snorby }; 13203431b74Snorby 133204df0f8Sclaudio struct ospf_hdr { 134204df0f8Sclaudio u_int8_t version; 135204df0f8Sclaudio u_int8_t type; 136204df0f8Sclaudio u_int16_t len; 137204df0f8Sclaudio u_int32_t rtr_id; 138204df0f8Sclaudio u_int32_t area_id; 139204df0f8Sclaudio u_int16_t chksum; 140204df0f8Sclaudio u_int16_t auth_type; 141204df0f8Sclaudio union { 142eee4aafbSnorby char simple[MAX_SIMPLE_AUTH_LEN]; 14303431b74Snorby struct crypt crypt; 144204df0f8Sclaudio } auth_key; 145204df0f8Sclaudio }; 146204df0f8Sclaudio 147204df0f8Sclaudio /* Hello header (type 1) */ 148204df0f8Sclaudio struct hello_hdr { 149204df0f8Sclaudio u_int32_t mask; 150204df0f8Sclaudio u_int16_t hello_interval; 151204df0f8Sclaudio u_int8_t opts; 152204df0f8Sclaudio u_int8_t rtr_priority; 153204df0f8Sclaudio u_int32_t rtr_dead_interval; 154204df0f8Sclaudio u_int32_t d_rtr; 155204df0f8Sclaudio u_int32_t bd_rtr; 156204df0f8Sclaudio }; 157204df0f8Sclaudio 158204df0f8Sclaudio /* Database Description header (type 2) */ 159204df0f8Sclaudio struct db_dscrp_hdr { 160204df0f8Sclaudio u_int16_t iface_mtu; 161204df0f8Sclaudio u_int8_t opts; 162204df0f8Sclaudio u_int8_t bits; 163204df0f8Sclaudio u_int32_t dd_seq_num; 164204df0f8Sclaudio }; 165204df0f8Sclaudio 166204df0f8Sclaudio #define OSPF_DBD_MS 0x01 167204df0f8Sclaudio #define OSPF_DBD_M 0x02 168204df0f8Sclaudio #define OSPF_DBD_I 0x04 169204df0f8Sclaudio 170204df0f8Sclaudio /* Link State Request header (type 3) */ 171204df0f8Sclaudio struct ls_req_hdr { 172204df0f8Sclaudio u_int32_t type; 173204df0f8Sclaudio u_int32_t ls_id; 174204df0f8Sclaudio u_int32_t adv_rtr; 175204df0f8Sclaudio }; 176204df0f8Sclaudio 177204df0f8Sclaudio /* Link State Update header (type 4) */ 178204df0f8Sclaudio struct ls_upd_hdr { 179204df0f8Sclaudio u_int32_t num_lsa; 180204df0f8Sclaudio }; 181204df0f8Sclaudio 182204df0f8Sclaudio #define LSA_TYPE_ROUTER 1 183204df0f8Sclaudio #define LSA_TYPE_NETWORK 2 184204df0f8Sclaudio #define LSA_TYPE_SUM_NETWORK 3 185204df0f8Sclaudio #define LSA_TYPE_SUM_ROUTER 4 186204df0f8Sclaudio #define LSA_TYPE_EXTERNAL 5 187097ed198Sclaudio #define LSA_TYPE_LINK_OPAQ 9 188097ed198Sclaudio #define LSA_TYPE_AREA_OPAQ 10 189097ed198Sclaudio #define LSA_TYPE_AS_OPAQ 11 190204df0f8Sclaudio 191204df0f8Sclaudio #define LINK_TYPE_POINTTOPOINT 1 192204df0f8Sclaudio #define LINK_TYPE_TRANSIT_NET 2 193204df0f8Sclaudio #define LINK_TYPE_STUB_NET 3 194204df0f8Sclaudio #define LINK_TYPE_VIRTUAL 4 195204df0f8Sclaudio 196204df0f8Sclaudio /* LSA headers */ 197ee89e4e9Sclaudio #define LSA_METRIC_MASK 0x00ffffff /* only for sum & as-ext */ 198ee89e4e9Sclaudio #define LSA_ASEXT_E_FLAG 0x80000000 199ee89e4e9Sclaudio 200097ed198Sclaudio /* for some reason they thought 24bit types are fun, make them less a hazard */ 201097ed198Sclaudio #define LSA_24_MASK 0xffffff 202097ed198Sclaudio #define LSA_24_GETHI(x) \ 203097ed198Sclaudio ((x) >> 24) 204097ed198Sclaudio #define LSA_24_GETLO(x) \ 205097ed198Sclaudio ((x) & LSA_24_MASK) 206097ed198Sclaudio #define LSA_24_SETHI(x, y) \ 207097ed198Sclaudio ((x) = ((x) & LSA_24_MASK) | (((y) & 0xff) << 24)) 208097ed198Sclaudio #define LSA_24_SETLO(x, y) \ 209097ed198Sclaudio ((x) = ((y) & LSA_24_MASK) | ((x) & ~LSA_24_MASK)) 210097ed198Sclaudio 211097ed198Sclaudio 2123ada9d8fSnorby #define OSPF_RTR_B 0x01 2133ada9d8fSnorby #define OSPF_RTR_E 0x02 2143ada9d8fSnorby #define OSPF_RTR_V 0x04 2153ada9d8fSnorby 216204df0f8Sclaudio struct lsa_rtr { 217204df0f8Sclaudio u_int8_t flags; 218204df0f8Sclaudio u_int8_t dummy; 219204df0f8Sclaudio u_int16_t nlinks; 220204df0f8Sclaudio }; 221204df0f8Sclaudio 222204df0f8Sclaudio struct lsa_rtr_link { 223204df0f8Sclaudio u_int32_t id; 224204df0f8Sclaudio u_int32_t data; 225204df0f8Sclaudio u_int8_t type; 226204df0f8Sclaudio u_int8_t num_tos; 227204df0f8Sclaudio u_int16_t metric; 228204df0f8Sclaudio }; 229204df0f8Sclaudio 230204df0f8Sclaudio struct lsa_net { 231204df0f8Sclaudio u_int32_t mask; 232204df0f8Sclaudio u_int32_t att_rtr[1]; 233204df0f8Sclaudio }; 234204df0f8Sclaudio 2353ada9d8fSnorby struct lsa_net_link { 2363ada9d8fSnorby u_int32_t att_rtr; 2373ada9d8fSnorby }; 2383ada9d8fSnorby 239204df0f8Sclaudio struct lsa_sum { 240204df0f8Sclaudio u_int32_t mask; 241204df0f8Sclaudio u_int32_t metric; /* only lower 24 bit */ 242204df0f8Sclaudio }; 243204df0f8Sclaudio 244ee89e4e9Sclaudio struct lsa_asext { 245ee89e4e9Sclaudio u_int32_t mask; 246ee89e4e9Sclaudio u_int32_t metric; /* lower 24 bit plus E bit */ 247ee89e4e9Sclaudio u_int32_t fw_addr; 248ee89e4e9Sclaudio u_int32_t ext_tag; 249ee89e4e9Sclaudio }; 250ee89e4e9Sclaudio 251204df0f8Sclaudio struct lsa_hdr { 252204df0f8Sclaudio u_int16_t age; 253204df0f8Sclaudio u_int8_t opts; 254204df0f8Sclaudio u_int8_t type; 255204df0f8Sclaudio u_int32_t ls_id; 256204df0f8Sclaudio u_int32_t adv_rtr; 257fd136cabSclaudio u_int32_t seq_num; 258204df0f8Sclaudio u_int16_t ls_chksum; 259204df0f8Sclaudio u_int16_t len; 260204df0f8Sclaudio }; 261204df0f8Sclaudio 262370c8b16Sguenther #define LS_CKSUM_OFFSET offsetof(struct lsa_hdr, ls_chksum) 263204df0f8Sclaudio 264204df0f8Sclaudio struct lsa { 265204df0f8Sclaudio struct lsa_hdr hdr; 266204df0f8Sclaudio union { 267204df0f8Sclaudio struct lsa_rtr rtr; 268204df0f8Sclaudio struct lsa_net net; 269204df0f8Sclaudio struct lsa_sum sum; 270ee89e4e9Sclaudio struct lsa_asext asext; 271204df0f8Sclaudio } data; 272204df0f8Sclaudio }; 273204df0f8Sclaudio 274204df0f8Sclaudio #endif /* !_OSPF_H_ */ 275