summaryrefslogtreecommitdiff
path: root/usr.sbin/eigrpd/eigrp.h
blob: 32bbdd4c4cfd9f46edde44e84f06cabc87ab49e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*	$OpenBSD: eigrp.h,v 1.4 2016/01/15 12:29:29 renato Exp $ */

/*
 * Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

/* EIGRP protocol definitions */

#ifndef _EIGRP_H_
#define _EIGRP_H_

#include <netinet/in.h>
#include <stddef.h>

/* misc */
#define EIGRP_VERSION		2
#define IPPROTO_EIGRP		88
#define EIGRP_IP_TTL		2

/* 224.0.0.10 */
#define AllEIGRPRouters_v4	0xa0000e0 /* network byte order */
/* ff02::a */
#define AllEIGRPRouters_v6 \
	{{{ 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \
	    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a }}}

#define EIGRP_INFINITE_METRIC	((uint32_t )(~0))

#define RTP_RTRNS_INTERVAL	5
#define RTP_RTRNS_MAX_ATTEMPTS	16

#define RTP_ACK_TIMEOUT		100000

#define EIGRP_VERSION_MAJOR	1
#define EIGRP_VERSION_MINOR	2

#define EIGRP_MIN_AS		1
#define EIGRP_MAX_AS		65535

#define DEFAULT_HELLO_INTERVAL	5
#define MIN_HELLO_INTERVAL	1
#define MAX_HELLO_INTERVAL	65535

#define DEFAULT_HELLO_HOLDTIME	15
#define MIN_HELLO_HOLDTIME	1
#define MAX_HELLO_HOLDTIME	65535

#define EIGRP_SCALING_FACTOR	256

#define DEFAULT_DELAY		10
#define MIN_DELAY		1
#define MAX_DELAY		16777215

#define DEFAULT_BANDWIDTH	100000
#define MIN_BANDWIDTH		1
#define MAX_BANDWIDTH		10000000

#define DEFAULT_RELIABILITY	255
#define MIN_RELIABILITY		1
#define MAX_RELIABILITY		255

#define DEFAULT_LOAD		1
#define MIN_LOAD		1
#define MAX_LOAD		255

#define MIN_MTU			1
#define MAX_MTU			65535

#define MIN_KVALUE		0
#define MAX_KVALUE		254

#define DEFAULT_ACTIVE_TIMEOUT	3
#define MIN_ACTIVE_TIMEOUT	0
#define MAX_ACTIVE_TIMEOUT	65535

#define DEFAULT_MAXIMUM_HOPS	100
#define MIN_MAXIMUM_HOPS	1
#define MAX_MAXIMUM_HOPS	255

#define DEFAULT_MAXIMUM_PATHS	4
#define MIN_MAXIMUM_PATHS	1
#define MAX_MAXIMUM_PATHS	32

#define DEFAULT_VARIANCE	1
#define MIN_VARIANCE		1
#define MAX_VARIANCE		128

#define EIGRP_HEADER_VERSION	2

#define EIGRP_VRID_UNICAST_AF	0x0000
#define EIGRP_VRID_MULTICAST_AF	0x0001
#define EIGRP_VRID_UNICAST_SF	0x8000

/* EIGRP packet types */
#define EIGRP_OPC_UPDATE	1
#define EIGRP_OPC_REQUEST	2
#define EIGRP_OPC_QUERY		3
#define EIGRP_OPC_REPLY		4
#define EIGRP_OPC_HELLO		5
#define EIGRP_OPC_PROBE		7
#define EIGRP_OPC_SIAQUERY	10
#define EIGRP_OPC_SIAREPLY	11

struct eigrp_hdr {
	uint8_t			version;
	uint8_t			opcode;
	uint16_t		chksum;
	uint32_t		flags;
	uint32_t		seq_num;
	uint32_t		ack_num;
	uint16_t		vrid;
	uint16_t		as;
};
/* EIGRP header flags */
#define EIGRP_HDR_FLAG_INIT	0x01
#define EIGRP_HDR_FLAG_CR	0x02
#define EIGRP_HDR_FLAG_RS	0x04
#define EIGRP_HDR_FLAG_EOT	0x08

/* TLV record */
struct tlv {
	uint16_t		type;
	uint16_t		length;
};
#define	TLV_HDR_LEN		4

struct tlv_parameter {
	uint16_t		type;
	uint16_t		length;
	uint8_t			kvalues[6];
	uint16_t		holdtime;
};

struct tlv_sw_version {
	uint16_t		type;
	uint16_t		length;
	uint8_t			vendor_os_major;
	uint8_t			vendor_os_minor;
	uint8_t			eigrp_major;
	uint8_t			eigrp_minor;
};

struct tlv_mcast_seq {
	uint16_t		type;
	uint16_t		length;
	uint32_t		seq;
};

struct classic_metric {
	uint32_t		delay;
	uint32_t		bandwidth;
	uint8_t			mtu[3]; /* 3 bytes, yeah... */
	uint8_t			hop_count;
	uint8_t			reliability;
	uint8_t			load;
	uint8_t			tag;
	uint8_t			flags;
};
#define F_METRIC_SRC_WITHDRAW	0x01
#define F_METRIC_C_DEFAULT	0x02
#define F_METRIC_ACTIVE		0x04

struct classic_emetric {
	uint32_t		routerid;
	uint32_t		as;
	uint32_t		tag;
	uint32_t		metric;
	uint16_t		reserved;
	uint8_t			protocol;
	uint8_t			flags;
};

#define EIGRP_EXT_PROTO_IGRP	1
#define EIGRP_EXT_PROTO_EIGRP	2
#define EIGRP_EXT_PROTO_STATIC	3
#define EIGRP_EXT_PROTO_RIP	4
#define EIGRP_EXT_PROTO_HELLO	5
#define EIGRP_EXT_PROTO_OSPF	6
#define EIGRP_EXT_PROTO_ISIS	7
#define EIGRP_EXT_PROTO_EGP	8
#define EIGRP_EXT_PROTO_BGP	9
#define EIGRP_EXT_PROTO_IDRP	10
#define EIGRP_EXT_PROTO_CONN	11

/* EIGRP TLV types (v1.2) */
#define TLV_PROTO_GENERAL	0x0000
#define TLV_PROTO_IPV4		0x0100
#define TLV_PROTO_IPV6		0x0400
#define TLV_PROTO_MASK		0xff00

#define TLV_ROUTE_REQUEST	0x0001
#define TLV_ROUTE_INTERNAL	0x0002
#define TLV_ROUTE_EXTERNAL	0x0003
#define TLV_ROUTE_COMMUNITY	0x0004

#define TLV_TYPE_PARAMETER	(TLV_PROTO_GENERAL | 0x0001)
#define TLV_TYPE_AUTH		(TLV_PROTO_GENERAL | 0x0002)
#define TLV_TYPE_SEQ		(TLV_PROTO_GENERAL | 0x0003)
#define TLV_TYPE_SW_VERSION	(TLV_PROTO_GENERAL | 0x0004)
#define TLV_TYPE_MCAST_SEQ	(TLV_PROTO_GENERAL | 0x0005)
#define TLV_TYPE_PEER_TERM	(TLV_PROTO_GENERAL | 0x0007)
#define TLV_TYPE_IPV4_REQUEST	(TLV_PROTO_IPV4 | TLV_ROUTE_REQUEST)
#define TLV_TYPE_IPV4_INTERNAL	(TLV_PROTO_IPV4 | TLV_ROUTE_INTERNAL)
#define TLV_TYPE_IPV4_EXTERNAL	(TLV_PROTO_IPV4 | TLV_ROUTE_EXTERNAL)
#define TLV_TYPE_IPV4_COMMUNITY	(TLV_PROTO_IPV4 | TLV_ROUTE_COMMUNITY)
#define TLV_TYPE_IPV6_REQUEST	(TLV_PROTO_IPV6 | TLV_ROUTE_REQUEST)
#define TLV_TYPE_IPV6_INTERNAL	(TLV_PROTO_IPV6 | TLV_ROUTE_INTERNAL)
#define TLV_TYPE_IPV6_EXTERNAL	(TLV_PROTO_IPV6 | TLV_ROUTE_EXTERNAL)
#define TLV_TYPE_IPV6_COMMUNITY	(TLV_PROTO_IPV6 | TLV_ROUTE_COMMUNITY)
#define TLV_TYPE_MASK		0x00ff

/* TLV lengths */
#define TLV_TYPE_PARAMETER_LEN		0x000C
#define TLV_TYPE_SW_VERSION_LEN		0x0008
#define TLV_TYPE_MCAST_SEQ_LEN		0x0008
#define TLV_TYPE_IPV4_INT_MIN_LEN	0x0019
#define TLV_TYPE_IPV6_INT_MIN_LEN	0x0025

#endif /* _EIGRP_H_ */