1/* $OpenBSD: eigrp.h,v 1.6 2016/09/02 16:34:20 renato Exp $ */ 2 3/* 4 * Copyright (c) 2015 Renato Westphal <renato@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/* EIGRP protocol definitions */ 20 21#ifndef _EIGRP_H_ 22#define _EIGRP_H_ 23 24/* misc */ 25#define EIGRP_VERSION 2 26#define IPPROTO_EIGRP 88 27#define EIGRP_IP_TTL 2 28 29/* EIGRP multicast group addresses */ 30#define AllEIGRPRouters_v4 "224.0.0.10" 31#define AllEIGRPRouters_v6 "ff02::a" 32 33#define EIGRP_INFINITE_METRIC ((uint32_t )(~0)) 34 35#define RTP_RTRNS_INTERVAL 5 36#define RTP_RTRNS_MAX_ATTEMPTS 16 37 38#define RTP_ACK_TIMEOUT 100000 39 40#define EIGRP_VERSION_MAJOR 1 41#define EIGRP_VERSION_MINOR 2 42 43#define EIGRP_MIN_AS 1 44#define EIGRP_MAX_AS 65535 45 46#define DEFAULT_HELLO_INTERVAL 5 47#define MIN_HELLO_INTERVAL 1 48#define MAX_HELLO_INTERVAL 65535 49 50#define DEFAULT_HELLO_HOLDTIME 15 51#define MIN_HELLO_HOLDTIME 1 52#define MAX_HELLO_HOLDTIME 65535 53 54#define EIGRP_SCALING_FACTOR 256 55 56#define DEFAULT_DELAY 10 57#define MIN_DELAY 1 58#define MAX_DELAY 16777215 59 60#define DEFAULT_BANDWIDTH 100000 61#define MIN_BANDWIDTH 1 62#define MAX_BANDWIDTH 10000000 63 64#define DEFAULT_RELIABILITY 255 65#define MIN_RELIABILITY 1 66#define MAX_RELIABILITY 255 67 68#define DEFAULT_LOAD 1 69#define MIN_LOAD 1 70#define MAX_LOAD 255 71 72#define MIN_MTU 1 73#define MAX_MTU 65535 74 75#define MIN_KVALUE 0 76#define MAX_KVALUE 254 77 78#define DEFAULT_ACTIVE_TIMEOUT 3 79#define MIN_ACTIVE_TIMEOUT 0 80#define MAX_ACTIVE_TIMEOUT 65535 81 82#define DEFAULT_MAXIMUM_HOPS 100 83#define MIN_MAXIMUM_HOPS 1 84#define MAX_MAXIMUM_HOPS 255 85 86#define DEFAULT_MAXIMUM_PATHS 4 87#define MIN_MAXIMUM_PATHS 1 88#define MAX_MAXIMUM_PATHS 32 89 90#define DEFAULT_VARIANCE 1 91#define MIN_VARIANCE 1 92#define MAX_VARIANCE 128 93 94#define EIGRP_HEADER_VERSION 2 95 96#define EIGRP_VRID_UNICAST_AF 0x0000 97#define EIGRP_VRID_MULTICAST_AF 0x0001 98#define EIGRP_VRID_UNICAST_SF 0x8000 99 100/* EIGRP packet types */ 101#define EIGRP_OPC_UPDATE 1 102#define EIGRP_OPC_REQUEST 2 103#define EIGRP_OPC_QUERY 3 104#define EIGRP_OPC_REPLY 4 105#define EIGRP_OPC_HELLO 5 106#define EIGRP_OPC_PROBE 7 107#define EIGRP_OPC_SIAQUERY 10 108#define EIGRP_OPC_SIAREPLY 11 109 110struct eigrp_hdr { 111 uint8_t version; 112 uint8_t opcode; 113 uint16_t chksum; 114 uint32_t flags; 115 uint32_t seq_num; 116 uint32_t ack_num; 117 uint16_t vrid; 118 uint16_t as; 119}; 120/* EIGRP header flags */ 121#define EIGRP_HDR_FLAG_INIT 0x01 122#define EIGRP_HDR_FLAG_CR 0x02 123#define EIGRP_HDR_FLAG_RS 0x04 124#define EIGRP_HDR_FLAG_EOT 0x08 125 126/* TLV record */ 127struct tlv { 128 uint16_t type; 129 uint16_t length; 130}; 131#define TLV_HDR_LEN 4 132 133struct tlv_parameter { 134 uint16_t type; 135 uint16_t length; 136 uint8_t kvalues[6]; 137 uint16_t holdtime; 138}; 139 140struct tlv_sw_version { 141 uint16_t type; 142 uint16_t length; 143 uint8_t vendor_os_major; 144 uint8_t vendor_os_minor; 145 uint8_t eigrp_major; 146 uint8_t eigrp_minor; 147}; 148 149struct tlv_mcast_seq { 150 uint16_t type; 151 uint16_t length; 152 uint32_t seq; 153}; 154 155struct classic_metric { 156 uint32_t delay; 157 uint32_t bandwidth; 158 uint8_t mtu[3]; /* 3 bytes, yeah... */ 159 uint8_t hop_count; 160 uint8_t reliability; 161 uint8_t load; 162 uint8_t tag; 163 uint8_t flags; 164}; 165#define F_METRIC_SRC_WITHDRAW 0x01 166#define F_METRIC_C_DEFAULT 0x02 167#define F_METRIC_ACTIVE 0x04 168 169struct classic_emetric { 170 uint32_t routerid; 171 uint32_t as; 172 uint32_t tag; 173 uint32_t metric; 174 uint16_t reserved; 175 uint8_t protocol; 176 uint8_t flags; 177}; 178 179#define EIGRP_EXT_PROTO_IGRP 1 180#define EIGRP_EXT_PROTO_EIGRP 2 181#define EIGRP_EXT_PROTO_STATIC 3 182#define EIGRP_EXT_PROTO_RIP 4 183#define EIGRP_EXT_PROTO_HELLO 5 184#define EIGRP_EXT_PROTO_OSPF 6 185#define EIGRP_EXT_PROTO_ISIS 7 186#define EIGRP_EXT_PROTO_EGP 8 187#define EIGRP_EXT_PROTO_BGP 9 188#define EIGRP_EXT_PROTO_IDRP 10 189#define EIGRP_EXT_PROTO_CONN 11 190 191/* EIGRP TLV types (v1.2) */ 192#define TLV_PROTO_GENERAL 0x0000 193#define TLV_PROTO_IPV4 0x0100 194#define TLV_PROTO_IPV6 0x0400 195#define TLV_PROTO_MASK 0xff00 196 197#define TLV_ROUTE_REQUEST 0x0001 198#define TLV_ROUTE_INTERNAL 0x0002 199#define TLV_ROUTE_EXTERNAL 0x0003 200#define TLV_ROUTE_COMMUNITY 0x0004 201 202#define TLV_TYPE_PARAMETER (TLV_PROTO_GENERAL | 0x0001) 203#define TLV_TYPE_AUTH (TLV_PROTO_GENERAL | 0x0002) 204#define TLV_TYPE_SEQ (TLV_PROTO_GENERAL | 0x0003) 205#define TLV_TYPE_SW_VERSION (TLV_PROTO_GENERAL | 0x0004) 206#define TLV_TYPE_MCAST_SEQ (TLV_PROTO_GENERAL | 0x0005) 207#define TLV_TYPE_PEER_TERM (TLV_PROTO_GENERAL | 0x0007) 208#define TLV_TYPE_IPV4_REQUEST (TLV_PROTO_IPV4 | TLV_ROUTE_REQUEST) 209#define TLV_TYPE_IPV4_INTERNAL (TLV_PROTO_IPV4 | TLV_ROUTE_INTERNAL) 210#define TLV_TYPE_IPV4_EXTERNAL (TLV_PROTO_IPV4 | TLV_ROUTE_EXTERNAL) 211#define TLV_TYPE_IPV4_COMMUNITY (TLV_PROTO_IPV4 | TLV_ROUTE_COMMUNITY) 212#define TLV_TYPE_IPV6_REQUEST (TLV_PROTO_IPV6 | TLV_ROUTE_REQUEST) 213#define TLV_TYPE_IPV6_INTERNAL (TLV_PROTO_IPV6 | TLV_ROUTE_INTERNAL) 214#define TLV_TYPE_IPV6_EXTERNAL (TLV_PROTO_IPV6 | TLV_ROUTE_EXTERNAL) 215#define TLV_TYPE_IPV6_COMMUNITY (TLV_PROTO_IPV6 | TLV_ROUTE_COMMUNITY) 216#define TLV_TYPE_MASK 0x00ff 217 218/* TLV lengths */ 219#define TLV_TYPE_PARAMETER_LEN 0x000C 220#define TLV_TYPE_SW_VERSION_LEN 0x0008 221#define TLV_TYPE_MCAST_SEQ_LEN 0x0008 222#define TLV_TYPE_IPV4_INT_MIN_LEN 0x0019 223#define TLV_TYPE_IPV6_INT_MIN_LEN 0x0025 224 225#endif /* _EIGRP_H_ */ 226