]> git.proxmox.com Git - mirror_frr.git/blob - eigrpd/eigrp_structs.h
Merge pull request #1921 from donaldsharp/pim_stuff
[mirror_frr.git] / eigrpd / eigrp_structs.h
1 /*
2 * EIGRP Definition of Data Structures.
3 * Copyright (C) 2013-2016
4 * Authors:
5 * Donnie Savage
6 * Jan Janovic
7 * Matej Perina
8 * Peter Orsag
9 * Peter Paluch
10 * Frantisek Gazo
11 * Tomas Hvorkovy
12 * Martin Kontsek
13 * Lukas Koribsky
14 *
15 * This file is part of GNU Zebra.
16 *
17 * GNU Zebra is free software; you can redistribute it and/or modify it
18 * under the terms of the GNU General Public License as published by the
19 * Free Software Foundation; either version 2, or (at your option) any
20 * later version.
21 *
22 * GNU Zebra is distributed in the hope that it will be useful, but
23 * WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 * General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License along
28 * with this program; see the file COPYING; if not, write to the Free Software
29 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
30 */
31
32 #ifndef _ZEBRA_EIGRP_STRUCTS_H_
33 #define _ZEBRA_EIGRP_STRUCTS_H_
34
35 #include "filter.h"
36
37 #include "eigrpd/eigrp_const.h"
38 #include "eigrpd/eigrp_macros.h"
39
40 /* EIGRP master for system wide configuration and variables. */
41 struct eigrp_master {
42 /* EIGRP instance. */
43 struct list *eigrp;
44
45 /* EIGRP thread master. */
46 struct thread_master *master;
47
48 /* Zebra interface list. */
49 struct list *iflist;
50
51 /* EIGRP start time. */
52 time_t start_time;
53
54 /* Various EIGRP global configuration. */
55 uint8_t options;
56
57 #define EIGRP_MASTER_SHUTDOWN (1 << 0) /* deferred-shutdown */
58 };
59
60 struct eigrp_metrics {
61 uint32_t delay;
62 uint32_t bandwidth;
63 unsigned char mtu[3];
64 uint8_t hop_count;
65 uint8_t reliability;
66 uint8_t load;
67 uint8_t tag;
68 uint8_t flags;
69 };
70
71 struct eigrp {
72 uint16_t AS; /* Autonomous system number */
73 uint16_t vrid; /* Virtual Router ID */
74 uint8_t k_values[6]; /*Array for K values configuration*/
75 uint8_t variance; /*Metric variance multiplier*/
76 uint8_t max_paths; /*Maximum allowed paths for 1 prefix*/
77
78 /*Name of this EIGRP instance*/
79 char *name;
80
81 /* EIGRP Router ID. */
82 uint32_t router_id; /* Configured automatically. */
83 uint32_t router_id_static; /* Configured manually. */
84
85 struct list *eiflist; /* eigrp interfaces */
86 uint8_t passive_interface_default; /* passive-interface default */
87
88 unsigned int fd;
89 unsigned int maxsndbuflen;
90
91 uint32_t sequence_number; /*Global EIGRP sequence number*/
92
93 struct stream *ibuf;
94 struct list *oi_write_q;
95
96 /*Threads*/
97 struct thread *t_write;
98 struct thread *t_read;
99 struct thread *t_distribute; /* timer for distribute list */
100
101 struct route_table *networks; /* EIGRP config networks. */
102
103 struct route_table *topology_table;
104
105 uint64_t serno; /* Global serial number counter for topology entry
106 changes*/
107 uint64_t serno_last_update; /* Highest serial number of information send
108 by last update*/
109 struct list *topology_changes_internalIPV4;
110 struct list *topology_changes_externalIPV4;
111
112 /*Neighbor self*/
113 struct eigrp_neighbor *neighbor_self;
114
115 /*Configured metric for redistributed routes*/
116 struct eigrp_metrics dmetric[ZEBRA_ROUTE_MAX + 1];
117 int redistribute; /* Num of redistributed protocols. */
118
119 /* Access-list. */
120 struct access_list *list[EIGRP_FILTER_MAX];
121 /* Prefix-list. */
122 struct prefix_list *prefix[EIGRP_FILTER_MAX];
123 /* Route-map. */
124 struct route_map *routemap[EIGRP_FILTER_MAX];
125
126 /* For redistribute route map. */
127 struct {
128 char *name;
129 struct route_map *map;
130 int metric_config;
131 uint32_t metric;
132 } route_map[ZEBRA_ROUTE_MAX];
133
134 QOBJ_FIELDS
135 };
136 DECLARE_QOBJ_TYPE(eigrp)
137
138 struct eigrp_if_params {
139 uint8_t passive_interface;
140 uint32_t v_hello;
141 uint16_t v_wait;
142 uint8_t type; /* type of interface */
143 uint32_t bandwidth;
144 uint32_t delay;
145 uint8_t reliability;
146 uint8_t load;
147
148 char *auth_keychain; /* Associated keychain with interface*/
149 int auth_type; /* EIGRP authentication type */
150 };
151
152 enum { MEMBER_ALLROUTERS = 0,
153 MEMBER_MAX,
154 };
155
156 /*EIGRP interface structure*/
157 struct eigrp_interface {
158 struct eigrp_if_params params;
159
160 /*multicast group refcnts */
161 bool member_allrouters;
162
163 /* This interface's parent eigrp instance. */
164 struct eigrp *eigrp;
165
166 /* Interface data from zebra. */
167 struct interface *ifp;
168
169 /* Packet send buffer. */
170 struct eigrp_fifo *obuf; /* Output queue */
171
172 /* To which multicast groups do we currently belong? */
173
174
175 uint8_t multicast_memberships;
176
177 /* EIGRP Network Type. */
178 uint8_t type;
179
180 struct prefix *address; /* Interface prefix */
181 struct connected *connected; /* Pointer to connected */
182
183 /* Neighbor information. */
184 struct list *nbrs; /* EIGRP Neighbor List */
185
186 /* Threads. */
187 struct thread *t_hello; /* timer */
188 struct thread *t_distribute; /* timer for distribute list */
189
190 int on_write_q;
191
192 /* Statistics fields. */
193 uint32_t hello_in; /* Hello message input count. */
194 uint32_t update_in; /* Update message input count. */
195 uint32_t query_in; /* Querry message input count. */
196 uint32_t reply_in; /* Reply message input count. */
197 uint32_t hello_out; /* Hello message output count. */
198 uint32_t update_out; /* Update message output count. */
199 uint32_t query_out; /* Query message output count. */
200 uint32_t reply_out; /* Reply message output count. */
201 uint32_t siaQuery_in;
202 uint32_t siaQuery_out;
203 uint32_t siaReply_in;
204 uint32_t siaReply_out;
205 uint32_t ack_out;
206 uint32_t ack_in;
207
208 uint32_t crypt_seqnum; /* Cryptographic Sequence Number */
209
210 /* Access-list. */
211 struct access_list *list[EIGRP_FILTER_MAX];
212 /* Prefix-list. */
213 struct prefix_list *prefix[EIGRP_FILTER_MAX];
214 /* Route-map. */
215 struct route_map *routemap[EIGRP_FILTER_MAX];
216 };
217
218 /* Determines if it is first or last packet
219 * when packet consists of multiple packet
220 * chunks because of many route TLV
221 * (all won't fit into one packet) */
222 enum Packet_part_type {
223 EIGRP_PACKET_PART_NA,
224 EIGRP_PACKET_PART_FIRST,
225 EIGRP_PACKET_PART_LAST
226 };
227
228 /* Neighbor Data Structure */
229 struct eigrp_neighbor {
230 /* This neighbor's parent eigrp interface. */
231 struct eigrp_interface *ei;
232
233 /* EIGRP neighbor Information */
234 uint8_t state; /* neigbor status. */
235
236 uint32_t recv_sequence_number; /* Last received sequence Number. */
237 uint32_t init_sequence_number;
238
239 /*If packet is unacknowledged, we try to send it again 16 times*/
240 uint8_t retrans_counter;
241
242 struct in_addr src; /* Neighbor Src address. */
243
244 uint8_t os_rel_major; // system version - just for show
245 uint8_t os_rel_minor; // system version - just for show
246 uint8_t tlv_rel_major; // eigrp version - tells us what TLV format to
247 // use
248 uint8_t tlv_rel_minor; // eigrp version - tells us what TLV format to
249 // use
250
251 uint8_t K1;
252 uint8_t K2;
253 uint8_t K3;
254 uint8_t K4;
255 uint8_t K5;
256 uint8_t K6;
257
258 /* Timer values. */
259 uint16_t v_holddown;
260
261 /* Threads. */
262 struct thread *t_holddown;
263 struct thread *t_nbr_send_gr; /* thread for sending multiple GR packet
264 chunks */
265
266 struct eigrp_fifo *retrans_queue;
267 struct eigrp_fifo *multicast_queue;
268
269 uint32_t crypt_seqnum; /* Cryptographic Sequence Number. */
270
271 /* prefixes not received from neighbor during Graceful restart */
272 struct list *nbr_gr_prefixes;
273 /* prefixes not yet send to neighbor during Graceful restart */
274 struct list *nbr_gr_prefixes_send;
275 /* if packet is first or last during Graceful restart */
276 enum Packet_part_type nbr_gr_packet_type;
277 };
278
279 //---------------------------------------------------------------------------------------------------------------------------------------------
280
281
282 struct eigrp_packet {
283 struct eigrp_packet *next;
284 struct eigrp_packet *previous;
285
286 /* Pointer to data stream. */
287 struct stream *s;
288
289 /* IP destination address. */
290 struct in_addr dst;
291
292 /*Packet retransmission thread*/
293 struct thread *t_retrans_timer;
294
295 /*Packet retransmission counter*/
296 uint8_t retrans_counter;
297
298 uint32_t sequence_number;
299
300 /* EIGRP packet length. */
301 uint16_t length;
302
303 struct eigrp_neighbor *nbr;
304 };
305
306 struct eigrp_fifo {
307 struct eigrp_packet *head;
308 struct eigrp_packet *tail;
309
310 unsigned long count;
311 };
312
313 struct eigrp_header {
314 uint8_t version;
315 uint8_t opcode;
316 uint16_t checksum;
317 uint32_t flags;
318 uint32_t sequence;
319 uint32_t ack;
320 uint16_t vrid;
321 uint16_t ASNumber;
322 char *tlv[0];
323
324 } __attribute__((packed));
325
326
327 /**
328 * Generic TLV type used for packet decoding.
329 *
330 * +-----+------------------+
331 * | | | |
332 * | Type| Len | Vector |
333 * | | | |
334 * +-----+------------------+
335 */
336 struct eigrp_tlv_hdr_type {
337 uint16_t type;
338 uint16_t length;
339 uint8_t value[0];
340 } __attribute__((packed));
341
342 struct TLV_Parameter_Type {
343 uint16_t type;
344 uint16_t length;
345 uint8_t K1;
346 uint8_t K2;
347 uint8_t K3;
348 uint8_t K4;
349 uint8_t K5;
350 uint8_t K6;
351 uint16_t hold_time;
352 } __attribute__((packed));
353
354 struct TLV_MD5_Authentication_Type {
355 uint16_t type;
356 uint16_t length;
357 uint16_t auth_type;
358 uint16_t auth_length;
359 uint32_t key_id;
360 uint32_t key_sequence;
361 uint8_t Nullpad[8];
362 uint8_t digest[EIGRP_AUTH_TYPE_MD5_LEN];
363
364 } __attribute__((packed));
365
366 struct TLV_SHA256_Authentication_Type {
367 uint16_t type;
368 uint16_t length;
369 uint16_t auth_type;
370 uint16_t auth_length;
371 uint32_t key_id;
372 uint32_t key_sequence;
373 uint8_t Nullpad[8];
374 uint8_t digest[EIGRP_AUTH_TYPE_SHA256_LEN];
375
376 } __attribute__((packed));
377
378 struct TLV_Sequence_Type {
379 uint16_t type;
380 uint16_t length;
381 uint8_t addr_length;
382 struct in_addr *addresses;
383 } __attribute__((packed));
384
385 struct TLV_Next_Multicast_Sequence {
386 uint16_t type;
387 uint16_t length;
388 uint32_t multicast_sequence;
389 } __attribute__((packed));
390
391 struct TLV_Software_Type {
392 uint16_t type;
393 uint16_t length;
394 uint8_t vender_major;
395 uint8_t vender_minor;
396 uint8_t eigrp_major;
397 uint8_t eigrp_minor;
398 } __attribute__((packed));
399
400 struct TLV_IPv4_Internal_type {
401 uint16_t type;
402 uint16_t length;
403 struct in_addr forward;
404
405 /*Metrics*/
406 struct eigrp_metrics metric;
407
408 uint8_t prefix_length;
409
410 unsigned char destination_part[4];
411 struct in_addr destination;
412 } __attribute__((packed));
413
414 struct TLV_IPv4_External_type {
415 uint16_t type;
416 uint16_t length;
417 struct in_addr next_hop;
418 struct in_addr originating_router;
419 uint32_t originating_as;
420 uint32_t administrative_tag;
421 uint32_t external_metric;
422 uint16_t reserved;
423 uint8_t external_protocol;
424 uint8_t external_flags;
425
426 /*Metrics*/
427 struct eigrp_metrics metric;
428
429 uint8_t prefix_length;
430 unsigned char destination_part[4];
431 struct in_addr destination;
432 } __attribute__((packed));
433
434 /* EIGRP Peer Termination TLV - used for hard restart */
435 struct TLV_Peer_Termination_type {
436 uint16_t type;
437 uint16_t length;
438 uint8_t unknown;
439 uint32_t neighbor_ip;
440 } __attribute__((packed));
441
442 /* Who executed Graceful restart */
443 enum GR_type { EIGRP_GR_MANUAL, EIGRP_GR_FILTER };
444
445 //---------------------------------------------------------------------------------------------------------------------------------------------
446
447 /* EIGRP Topology table node structure */
448 struct eigrp_prefix_entry {
449 struct list *entries, *rij;
450 uint32_t fdistance; // FD
451 uint32_t rdistance; // RD
452 uint32_t distance; // D
453 struct eigrp_metrics reported_metric; // RD for sending
454
455 uint8_t nt; // network type
456 uint8_t state; // route fsm state
457 uint8_t af; // address family
458 uint8_t req_action; // required action
459
460 struct prefix *destination;
461
462 // If network type is REMOTE_EXTERNAL, pointer will have reference to
463 // its external TLV
464 struct TLV_IPv4_External_type *extTLV;
465
466 uint64_t serno; /*Serial number for this entry. Increased with each
467 change of entry*/
468 };
469
470 /* EIGRP Topology table record structure */
471 struct eigrp_nexthop_entry {
472 struct eigrp_prefix_entry *prefix;
473 uint32_t reported_distance; // distance reported by neighbor
474 uint32_t distance; // sum of reported distance and link cost to
475 // advertised neighbor
476
477 struct eigrp_metrics reported_metric;
478 struct eigrp_metrics total_metric;
479
480 struct eigrp_neighbor *adv_router; // ip address of advertising neighbor
481 uint8_t flags; // used for marking successor and FS
482
483 struct eigrp_interface *ei; // pointer for case of connected entry
484 };
485
486 //---------------------------------------------------------------------------------------------------------------------------------------------
487 typedef enum {
488 EIGRP_CONNECTED,
489 EIGRP_INT,
490 EIGRP_EXT,
491 } msg_data_t;
492
493 /* EIGRP Finite State Machine */
494
495 struct eigrp_fsm_action_message {
496 uint8_t packet_type; // UPDATE, QUERY, SIAQUERY, SIAREPLY
497 struct eigrp *eigrp; // which thread sent mesg
498 struct eigrp_neighbor *adv_router; // advertising neighbor
499 struct eigrp_nexthop_entry *entry;
500 struct eigrp_prefix_entry *prefix;
501 msg_data_t data_type; // internal or external tlv type
502 struct eigrp_metrics metrics;
503 enum metric_change change;
504 };
505
506 #endif /* _ZEBRA_EIGRP_STRUCTURES_H_ */