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