summaryrefslogtreecommitdiffstats
path: root/eigrpd/eigrp_const.h
blob: 05fbae32af5516324d6e4f8df878150372f13c81 (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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * EIGRP Definition of Constants.
 * Copyright (C) 2013-2016
 * Authors:
 *   Donnie Savage
 *   Jan Janovic
 *   Matej Perina
 *   Peter Orsag
 *   Peter Paluch
 *   Frantisek Gazo
 *   Tomas Hvorkovy
 *   Martin Kontsek
 *   Lukas Koribsky
 */

#ifndef _ZEBRA_EIGRP_CONST_H_
#define _ZEBRA_EIGRP_CONST_H_

#define EIGRP_NEIGHBOR_DOWN           0
#define EIGRP_NEIGHBOR_PENDING        1
#define EIGRP_NEIGHBOR_UP             2
#define EIGRP_NEIGHBOR_STATE_MAX      3

/*Packet requiring ack will be retransmitted again after this time*/
#define EIGRP_PACKET_RETRANS_TIME        2 /* in seconds */
#define EIGRP_PACKET_RETRANS_MAX         16 /* number of retrans attempts */
#define PLAINTEXT_LENGTH                 81

/*Metric variance multiplier*/
#define EIGRP_VARIANCE_DEFAULT  1
#define EIGRP_MAX_PATHS_DEFAULT 4

/* Return values of functions involved in packet verification */
#define MSG_OK    0
#define MSG_NG    1

#define EIGRP_HEADER_VERSION            2

/* Default protocol, port number. */
#ifndef IPPROTO_EIGRPIGP
#define IPPROTO_EIGRPIGP         88
#endif /* IPPROTO_EIGRPIGP */

#define EIGRP_AUTH_MD5_TLV_SIZE          40
#define EIGRP_AUTH_SHA256_TLV_SIZE          56

/*Cisco routers use only first 44 bytes of basic hello for their MD5
 * calculations*/
#define EIGRP_MD5_BASIC_COMPUTE       44
#define EIGRP_MD5_UPDATE_INIT_COMPUTE       40

#define EIGRP_AUTH_BASIC_HELLO_FLAG       0x01
#define EIGRP_AUTH_TID_HELLO_FLAG       0x02
#define EIGRP_AUTH_UPDATE_INIT_FLAG       0x04
#define EIGRP_AUTH_UPDATE_FLAG            0x08
#define EIGRP_AUTH_EXTRA_SALT_FLAG        0x10

#define EIGRP_NEXT_SEQUENCE_TLV_SIZE     8

/* IP TTL for EIGRP protocol. */
#define EIGRP_IP_TTL             1

/* Default configuration file name for eigrp. */
#define EIGRP_DEFAULT_CONFIG   "eigrpd.conf"

#define EIGRP_HELLO_INTERVAL_DEFAULT        5
#define EIGRP_HOLD_INTERVAL_DEFAULT         15
#define EIGRP_BANDWIDTH_DEFAULT             100000
#define EIGRP_DELAY_DEFAULT                 10
#define EIGRP_RELIABILITY_DEFAULT           255
#define EIGRP_LOAD_DEFAULT                  1

#define EIGRP_MULTICAST_ADDRESS            0xe000000A /*224.0.0.10*/

#define EIGRP_MAX_METRIC                   0xffffffffU    /*4294967295*/
enum metric_change { METRIC_DECREASE, METRIC_SAME, METRIC_INCREASE };

#define DEFAULT_ROUTE               ZEBRA_ROUTE_MAX
#define DEFAULT_ROUTE_TYPE(T) ((T) == DEFAULT_ROUTE)

#define INTERFACE_DOWN_BY_ZEBRA       1
#define INTERFACE_DOWN_BY_VTY         2
#define INTERFACE_DOWN_BY_FINAL       3

#define EIGRP_HELLO_NORMAL                    0x00
#define EIGRP_HELLO_GRACEFUL_SHUTDOWN         0x01
#define EIGRP_HELLO_ADD_SEQUENCE              0x02
#define EIGRP_HELLO_GRACEFUL_SHUTDOWN_NBR     0x04

/* EIGRP Network Type. */
#define EIGRP_IFTYPE_NONE 0
#define EIGRP_IFTYPE_POINTOPOINT 1
#define EIGRP_IFTYPE_BROADCAST 2
#define EIGRP_IFTYPE_LOOPBACK 3
#define EIGRP_IFTYPE_MAX 4

#define EIGRP_IF_ACTIVE                  0
#define EIGRP_IF_PASSIVE                 1

/* EIGRP TT destination type */
#define EIGRP_TOPOLOGY_TYPE_CONNECTED           0 // Connected network
#define EIGRP_TOPOLOGY_TYPE_REMOTE              1 // Remote internal network
#define EIGRP_TOPOLOGY_TYPE_REMOTE_EXTERNAL     2 // Remote external network

/*EIGRP TT entry flags*/
#define EIGRP_ROUTE_DESCRIPTOR_SUCCESSOR_FLAG (1 << 0)
#define EIGRP_ROUTE_DESCRIPTOR_FSUCCESSOR_FLAG (1 << 1)
#define EIGRP_ROUTE_DESCRIPTOR_INTABLE_FLAG (1 << 2)
#define EIGRP_ROUTE_DESCRIPTOR_EXTERNAL_FLAG (1 << 3)

/*EIGRP FSM state count, event count*/
#define EIGRP_FSM_STATE_MAX                  5
#define EIGRP_FSM_EVENT_MAX                  16

/*EEGRP FSM states*/
enum eigrp_fsm_states {
	EIGRP_FSM_STATE_PASSIVE,
	EIGRP_FSM_STATE_ACTIVE_0,
	EIGRP_FSM_STATE_ACTIVE_1,
	EIGRP_FSM_STATE_ACTIVE_2,
	EIGRP_FSM_STATE_ACTIVE_3,
};

/*EIGRP FSM events return values*/
#define EIGRP_FSM_NEED_UPDATE				1
#define EIGRP_FSM_NEED_QUERY				2

/*EIGRP FSM events*/
enum eigrp_fsm_events {
	/*
	 * Input event other than query from succ,
	 * FC is not satisfied
	 */
	EIGRP_FSM_EVENT_NQ_FCN,

	/* last reply, FD is reset */
	EIGRP_FSM_EVENT_LR,

	/* Query from succ, FC not satisfied */
	EIGRP_FSM_EVENT_Q_FCN,

	/* last reply, FC satisifed with current value of FDij */
	EIGRP_FSM_EVENT_LR_FCS,

	/* distance increase while in a active state */
	EIGRP_FSM_EVENT_DINC,

	/* Query from succ while in active state */
	EIGRP_FSM_EVENT_QACT,

	/* last reply, FC not satisfied */
	EIGRP_FSM_EVENT_LR_FCN,

	/*
	 * state not changed
	 * usually by receiving not last reply
	 */
	EIGRP_FSM_KEEP_STATE,
};

/**
 * External routes originate from some other protocol - these are them
 */
#define NULL_PROTID		0		/*!< unknown protocol */
#define IGRP_PROTID		1		/*!< IGRP.. whos your daddy! */
#define EIGRP_PROTID		2		/*!< EIGRP - Just flat out the best */
#define STATIC_PROTID		3		/*!< Staticly configured source */
#define RIP_PROTID		4		/*!< Routing Information Protocol */
#define HELLO_PROTID		5		/*!< Hello? RFC-891 you there? */
#define OSPF_PROTID		6		/*!< OSPF - Open Shortest Path First */
#define ISIS_PROTID		7		/*!< Intermediate System To Intermediate System */
#define EGP_PROTID		8		/*!< Exterior Gateway Protocol */
#define BGP_PROTID		9		/*!< Border Gateway Protocol */
#define IDRP_PROTID		10		/*!< InterDomain Routing Protocol */
#define CONN_PROTID		11		/*!< Connected source */

/*
 * metric k-value defaults
 */
#define EIGRP_K1_DEFAULT	1		//!< unweighed inverse bandwidth
#define EIGRP_K2_DEFAULT	0		//!< no loading term
#define EIGRP_K3_DEFAULT	1		//!< unweighted delay
#define EIGRP_K4_DEFAULT	0		//!< no reliability term
#define EIGRP_K5_DEFAULT	0		//!< no reliability term
#define EIGRP_K6_DEFAULT	0		//!< do not add in extended metrics

/*
 * EIGRP Fixed header
 */
#define EIGRP_HEADER_LEN        20U
#define EIGRP_PACKET_MAX_LEN    65535U   /* includes IP Header size. */

#define EIGRP_TLV_HDR_LENGTH    4

/**
 * EIGRP Packet Opcodes
 */
#define EIGRP_OPC_UPDATE        1       /*!< packet containing routing information */
#define EIGRP_OPC_REQUEST       2       /*!< sent to request one or more routes */
#define EIGRP_OPC_QUERY         3       /*!< sent when a routing is in active start */
#define EIGRP_OPC_REPLY         4       /*!< sent in response to a query */
#define EIGRP_OPC_HELLO         5       /*!< sent to maintain a peering session */
#define EIGRP_OPC_IPXSAP        6       /*!< IPX SAP information */
#define EIGRP_OPC_PROBE         7       /*!< for test purposes   */
#define EIGRP_OPC_ACK           8       /*!< acknowledge         */
#define EIGRP_OPC_SIAQUERY      10      /*!< QUERY - with relaxed restrictions */
#define EIGRP_OPC_SIAREPLY      11      /*!< REPLY - may contain old routing information */

/**
 * EIGRP TLV Range definitions
 *      PDM             TLV Range
 *      General         0x0000
 *      IPv4            0x0100                  ** TLVs for one and all
 *      ATALK           0x0200                  ** legacy
 *      IPX             0x0300                  ** discontinued
 *      IPv6            0x0400                  ** legacy
 *      Multiprotocol   0x0600                  ** wide metrics
 *      MultiTopology   0x00f0                  ** deprecated
 */
#define EIGRP_TLV_RANGEMASK     0xfff0          /*!< should be 0xff00 - opps */
#define EIGRP_TLV_GENERAL       0x0000

/**
 * 1.2 TLV Definitions  ** legacy
 * These are considered legacyu and are only used for backward compability with
 * older Cisco Routers.  They should not be your first choice for packet codings
 */
#define EIGRP_TLV_IPv4          0x0100          /*!< Classic IPv4 TLV encoding */
#define EIGRP_TLV_ATALK         0x0200          /*!< Classic Appletalk TLV encoding*/
#define EIGRP_TLV_IPX           0x0300          /*!< Classic IPX TLV encoding */
#define EIGRP_TLV_IPv6          0x0400          /*!< Classic IPv6 TLV encoding */

/**
 * 2.0 Multi-Protocol TLV Definitions
 * These are the current packet formats and should be used for packets
 */
#define EIGRP_TLV_MP            0x0600          /*!< Non-PDM specific encoding */

/**
 * TLV type definitions.  Generic (protocol-independent) TLV types are
 * defined here.  Protocol-specific ones are defined elsewhere.
 */
#define EIGRP_TLV_PARAMETER             (EIGRP_TLV_GENERAL | 0x0001)    /*!< eigrp parameters */
#define EIGRP_TLV_PARAMETER_LEN         (12U)
#define EIGRP_TLV_AUTH                  (EIGRP_TLV_GENERAL | 0x0002)    /*!< authentication */
#define EIGRP_TLV_SEQ                   (EIGRP_TLV_GENERAL | 0x0003)    /*!< sequenced packet */
#define EIGRP_TLV_SEQ_BASE_LEN          (5U)
#define EIGRP_TLV_SW_VERSION            (EIGRP_TLV_GENERAL | 0x0004)    /*!< software version */
#define EIGRP_TLV_SW_VERSION_LEN        (8U)
#define EIGRP_TLV_NEXT_MCAST_SEQ        (EIGRP_TLV_GENERAL | 0x0005)    /*!< sequence number */
#define EIGRP_TLV_PEER_TERMINATION      (EIGRP_TLV_GENERAL | 0x0007)    /*!< peer termination */
#define EIGRP_TLV_PEER_TERMINATION_LEN 	(9U)
#define EIGRP_TLV_PEER_TIDLIST          (EIGRP_TLV_GENERAL | 0x0008)    /*!< peer sub-topology list */

/* Older cisco routers send TIDLIST value wrong, adding for backwards
 * compatabily */
#define EIGRP_TLV_PEER_MTRLIST          (EIGRP_TLV_GENERAL | 0x00f5)

/**
 * Route Based TLVs
 */
#define EIGRP_TLV_REQUEST               0x0001
#define EIGRP_TLV_INTERNAL              0x0002
#define EIGRP_TLV_EXTERNAL              0x0003
#define EIGRP_TLV_COMMUNITY             0x0004
#define EIGRP_TLV_TYPEMASK              0x000f

#define EIGRP_TLV_IPv4_REQ              (EIGRP_TLV_IPv4 | EIGRP_TLV_REQUEST)
#define EIGRP_TLV_IPv4_INT              (EIGRP_TLV_IPv4 | EIGRP_TLV_INTERNAL)
#define EIGRP_TLV_IPv4_EXT              (EIGRP_TLV_IPv4 | EIGRP_TLV_EXTERNAL)
#define EIGRP_TLV_IPv4_COM              (EIGRP_TLV_IPv4 | EIGRP_TLV_COMMUNITY)

#define EIGRP_TLV_IPV4_SIZE_GRT_24_BIT      0x001D
#define EIGRP_TLV_IPV4_SIZE_GRT_16_BIT      0x001C
#define EIGRP_TLV_IPV4_SIZE_GRT_8_BIT       0x001B
#define EIGRP_TLV_IPV4_SIZE_GRT_0_BIT       0x001A
#define EIGRP_TLV_MAX_IPV4_BYTE             EIGRP_TLV_IPV4_SIZE_GRT_24_BIT

/* max number of TLV IPv4 prefixes in packet */
#define EIGRP_TLV_MAX_IPv4				25

/**
 *
 * extdata flag field definitions
 */
#define EIGRP_OPAQUE_EXT        0x01    /*!< Route is external */
#define EIGRP_OPAQUE_CD         0x02    /*!< Candidate default route */

/**
 * Address-Family types are taken from:
 *       http://www.iana.org/assignments/address-family-numbers
 * to provide a standards based exchange of AFI information between
 * EIGRP routers.
 */
#define EIGRP_AF_IPv4           1       /*!< IPv4 (IP version 4) */
#define EIGRP_AF_IPv6           2       /*!< IPv6 (IP version 6) */
#define EIGRP_AF_IPX            11      /*!< IPX */
#define EIGRP_AF_ATALK          12      /*!< Appletalk */
#define EIGRP_SF_COMMON         16384   /*!< Cisco Service Family */
#define EIGRP_SF_IPv4           16385   /*!< Cisco IPv4 Service Family */
#define EIGRP_SF_IPv6           16386   /*!< Cisco IPv6 Service Family */

/**
 * Authentication types supported by EIGRP
 */
#define EIGRP_AUTH_TYPE_NONE            0
#define EIGRP_AUTH_TYPE_TEXT            1
#define EIGRP_AUTH_TYPE_MD5             2
#define EIGRP_AUTH_TYPE_MD5_LEN         16
#define EIGRP_AUTH_TYPE_SHA256          3
#define EIGRP_AUTH_TYPE_SHA256_LEN      32

/**
 * opaque flag field definitions
 */
#define EIGRP_OPAQUE_SRCWD      0x01    /*!< Route Source Withdraw */
#define EIGRP_OPAQUE_ACTIVE     0x04    /*!< Route is currently in active state */
#define EIGRP_OPAQUE_REPL       0x08    /*!< Route is replicated from different tableid */

/**
 * pak flag bit field definitions - 0 (none)-7 source priority
 */
#define EIGRP_PRIV_DEFAULT      0x00    /* 0 (none)-7 source priority */
#define EIGRP_PRIV_LOW          0x01
#define EIGRP_PRIV_MEDIUM       0x04
#define EIGRP_PRIV_HIGH         0x07

/*
 * Init bit definition. First unicast transmitted Update has this
 * bit set in the flags field of the fixed header. It tells the neighbor
 * to down-load his topology table.
 */
#define EIGRP_INIT_FLAG 0x01

/*
 * CR bit (Conditionally Received) definition in flags field on header. Any
 * packets with the CR-bit set can be accepted by an EIGRP speaker if and
 * only if a previous Hello was received with the SEQUENCE_TYPE TLV present.
 *
 * This allows multicasts to be transmitted in order and reliably at the
 * same time as unicasts are transmitted.
 */
#define EIGRP_CR_FLAG 0x02

/*
 * RS bit.  The Restart flag is set in the hello and the init
 * update packets during the nsf signaling period.  A nsf-aware
 * router looks at the RS flag to detect if a peer is restarting
 * and maintain the adjacency. A restarting router looks at
 * this flag to determine if the peer is helping out with the restart.
 */
#define EIGRP_RS_FLAG 0x04

/*
 * EOT bit.  The End-of-Table flag marks the end of the start-up updates
 * sent to a new peer.  A nsf restarting router looks at this flag to
 * determine if it has finished receiving the start-up updates from all
 * peers.  A nsf-aware router waits for this flag before cleaning up
 * the stale routes from the restarting peer.
 */
#define EIGRP_EOT_FLAG 0x08

/**
 * EIGRP Virtual Router ID
 *
 * Define values to deal with EIGRP virtual router ids.  Virtual
 * router IDs are stored in the upper short of the EIGRP fixed packet
 * header.  The lower short of the packet header continues to be used
 * as asystem number.
 *
 * Virtual Router IDs are PDM-independent.  All PDMs will use
 * VRID_BASE to indicate the 'base' or 'legacy' EIGRP instance.
 * All PDMs need to initialize their vrid to VRID_BASE for compatibility
 * with legacy routers.
 * Once IPv6 supports 'MTR Multicast', it will use the same VRID as
 * IPv4.  No current plans to support VRIDs on IPX. :)
 * Initial usage of VRID is to signal usage of Multicast topology for
 * MTR.
 *
 * VRID_MCAST is a well known constant, other VRIDs will be determined
 * programmatic...
 *
 * With the addition of SAF the VRID space has been divided into two
 * segments 0x0000-0x7fff is for EIGRP and vNets, 0x8000-0xffff is
 * for saf and its associated vNets.
 */
#define EIGRP_VRID_MASK         0x8001
#define EIGRP_VRID_AF_BASE      0x0000
#define EIGRP_VRID_MCAST_BASE   0x0001
#define EIGRP_VRID_SF_BASE      0x8000

/* Extended Attributes for a destination */
#define EIGRP_ATTR_HDRLEN (2)
#define EIGRP_ATTR_MAXDATA (512)

#define EIGRP_ATTR_NOOP         0       /*!< No-Op used as offset padding */
#define EIGRP_ATTR_SCALED       1       /*!< Scaled metric values */
#define EIGRP_ATTR_TAG          2       /*!< Tag assigned by Admin for dest */
#define EIGRP_ATTR_COMM         3       /*!< Community attribute for dest */
#define EIGRP_ATTR_JITTER       4       /*!< Variation in path delay */
#define EIGRP_ATTR_QENERGY      5       /*!< Non-Active energy usage along path */
#define EIGRP_ATTR_ENERGY       6       /*!< Active energy usage along path */

/*
 * Begin EIGRP-BGP interoperability communities
 */
#define EIGRP_EXTCOMM_SOO_ASFMT         0x0003 /* Site-of-Origin, BGP AS format */
#define EIGRP_EXTCOMM_SOO_ADRFMT        0x0103 /* Site-of-Origin, BGP/EIGRP addr format */

/*
 * EIGRP Specific communities
 */
#define EIGRP_EXTCOMM_EIGRP             0x8800 /* EIGRP route information appended*/
#define EIGRP_EXTCOMM_DAD               0x8801 /* EIGRP AS + Delay           */
#define EIGRP_EXTCOMM_VRHB              0x8802 /* EIGRP Vector: Reliability + Hop + BW */
#define EIGRP_EXTCOMM_SRLM              0x8803 /* EIGRP System: Reserve +Load + MTU   */
#define EIGRP_EXTCOMM_SAR               0x8804 /* EIGRP System: Remote AS + Remote ID  */
#define EIGRP_EXTCOMM_RPM               0x8805 /* EIGRP Remote: Protocol + Metric    */
#define EIGRP_EXTCOMM_VRR               0x8806 /* EIGRP Vecmet: Rsvd + (internal) Routerid */

/*
 * EIGRP Filter constants
 */
#define EIGRP_FILTER_IN  0
#define EIGRP_FILTER_OUT 1
#define EIGRP_FILTER_MAX 2

/*
 * EIGRP Filter constants
 */
#define EIGRP_HSROLE_DEFAULT  	EIGRP_HSROLE_SPOKE
#define EIGRP_HSROLE_HUB 		0x01
#define EIGRP_HSROLE_SPOKE 		0x02

#endif /* _ZEBRA_EIGRP_CONST_H_ */