Line data Source code
1 : /* RIP related values and structures.
2 : * Copyright (C) 1997, 1998, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
3 : *
4 : * This file is part of GNU Zebra.
5 : *
6 : * GNU Zebra is free software; you can redistribute it and/or modify it
7 : * under the terms of the GNU General Public License as published by the
8 : * Free Software Foundation; either version 2, or (at your option) any
9 : * later version.
10 : *
11 : * GNU Zebra is distributed in the hope that it will be useful, but
12 : * WITHOUT ANY WARRANTY; without even the implied warranty of
13 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 : * General Public License for more details.
15 : *
16 : * You should have received a copy of the GNU General Public License along
17 : * with this program; see the file COPYING; if not, write to the Free Software
18 : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 : */
20 :
21 : #ifndef _ZEBRA_RIP_H
22 : #define _ZEBRA_RIP_H
23 :
24 : #include "hook.h"
25 : #include "nexthop.h"
26 : #include "distribute.h"
27 : #include "memory.h"
28 :
29 : /* RIP version number. */
30 : #define RIPv1 1
31 : #define RIPv2 2
32 : /* N.B. stuff will break if
33 : (RIPv1 != RI_RIP_VERSION_1) || (RIPv2 != RI_RIP_VERSION_2) */
34 :
35 :
36 : /* RIP command list. */
37 : #define RIP_REQUEST 1
38 : #define RIP_RESPONSE 2
39 : #define RIP_TRACEON 3 /* Obsolete */
40 : #define RIP_TRACEOFF 4 /* Obsolete */
41 : #define RIP_POLL 5
42 : #define RIP_POLL_ENTRY 6
43 : #define RIP_COMMAND_MAX 7
44 :
45 : /* RIP metric infinity value.*/
46 : #define RIP_METRIC_INFINITY 16
47 :
48 : /* Normal RIP packet min and max size. */
49 : #define RIP_PACKET_MINSIZ 4
50 : #define RIP_PACKET_MAXSIZ 512
51 :
52 : #define RIP_HEADER_SIZE 4
53 : #define RIP_RTE_SIZE 20
54 :
55 : /* Max count of routing table entry in one rip packet. */
56 : #define RIP_MAX_RTE ((RIP_PACKET_MAXSIZ - RIP_HEADER_SIZE) / RIP_RTE_SIZE)
57 :
58 : /* RIP version 2 multicast address. */
59 : #ifndef INADDR_RIP_GROUP
60 : #define INADDR_RIP_GROUP 0xe0000009 /* 224.0.0.9 */
61 : #endif
62 :
63 : /* RIP peer timeout value. */
64 : #define RIP_PEER_TIMER_DEFAULT 180
65 :
66 : /* RIP port number. */
67 : #define RIP_PORT_DEFAULT 520
68 : #define RIP_VTY_PORT 2602
69 :
70 : /* Default configuration file name. */
71 : #define RIPD_DEFAULT_CONFIG "ripd.conf"
72 :
73 : /* RIP route types. */
74 : #define RIP_ROUTE_RTE 0
75 : #define RIP_ROUTE_STATIC 1
76 : #define RIP_ROUTE_DEFAULT 2
77 : #define RIP_ROUTE_REDISTRIBUTE 3
78 : #define RIP_ROUTE_INTERFACE 4
79 :
80 : /* RIPv2 special RTE family types */
81 : #define RIP_FAMILY_AUTH 0xffff
82 :
83 : /* RIPv2 authentication types, for RIP_FAMILY_AUTH RTE's */
84 : #define RIP_NO_AUTH 0
85 : #define RIP_AUTH_DATA 1
86 : #define RIP_AUTH_SIMPLE_PASSWORD 2
87 : #define RIP_AUTH_MD5 3
88 :
89 : /* RIPv2 Simple authentication */
90 : #define RIP_AUTH_SIMPLE_SIZE 16
91 :
92 : /* RIPv2 MD5 authentication. */
93 : #define RIP_AUTH_MD5_SIZE 16
94 : #define RIP_AUTH_MD5_COMPAT_SIZE RIP_RTE_SIZE
95 :
96 : /* YANG paths */
97 : #define RIP_INSTANCE "/frr-ripd:ripd/instance"
98 : #define RIP_IFACE "/frr-interface:lib/interface/frr-ripd:rip"
99 :
100 : DECLARE_MGROUP(RIPD);
101 :
102 : /* RIP structure. */
103 : struct rip {
104 : RB_ENTRY(rip) entry;
105 :
106 : /* VRF this routing instance is associated with. */
107 : char *vrf_name;
108 :
109 : /* VRF backpointer (might be NULL if the VRF doesn't exist). */
110 : struct vrf *vrf;
111 :
112 : /* Status of the routing instance. */
113 : bool enabled;
114 :
115 : /* RIP socket. */
116 : int sock;
117 :
118 : /* Default version of rip instance. */
119 : int version_send; /* version 1 or 2 (but not both) */
120 : int version_recv; /* version 1 or 2 or both */
121 :
122 : /* Output buffer of RIP. */
123 : struct stream *obuf;
124 :
125 : /* RIP routing information base. */
126 : struct route_table *table;
127 :
128 : /* RIP static neighbors. */
129 : struct route_table *neighbor;
130 :
131 : /* Linked list of RIP peers. */
132 : struct list *peer_list;
133 :
134 : /* RIP threads. */
135 : struct thread *t_read;
136 :
137 : /* Update and garbage timer. */
138 : struct thread *t_update;
139 :
140 : /* Triggered update hack. */
141 : int trigger;
142 : struct thread *t_triggered_update;
143 : struct thread *t_triggered_interval;
144 :
145 : /* RIP timer values. */
146 : uint32_t update_time;
147 : uint32_t timeout_time;
148 : uint32_t garbage_time;
149 :
150 : /* RIP default metric. */
151 : uint8_t default_metric;
152 :
153 : /* RIP default distance. */
154 : uint8_t distance;
155 : struct route_table *distance_table;
156 :
157 : /* RIP ECMP flag */
158 : bool ecmp;
159 :
160 : /* Are we in passive-interface default mode? */
161 : bool passive_default;
162 :
163 : /* RIP enabled interfaces. */
164 : vector enable_interface;
165 :
166 : /* RIP enabled networks. */
167 : struct route_table *enable_network;
168 :
169 : /* Vector to store passive-interface name. */
170 : vector passive_nondefault;
171 :
172 : /* RIP offset-lists. */
173 : struct list *offset_list_master;
174 :
175 : /* RIP redistribute configuration. */
176 : struct {
177 : bool enabled;
178 : struct {
179 : char *name;
180 : struct route_map *map;
181 : } route_map;
182 : bool metric_config;
183 : uint8_t metric;
184 : } redist[ZEBRA_ROUTE_MAX];
185 :
186 : /* For distribute-list container */
187 : struct distribute_ctx *distribute_ctx;
188 :
189 : /* For if_rmap container */
190 : struct if_rmap_ctx *if_rmap_ctx;
191 :
192 : /* Counters for SNMP. */
193 : struct {
194 : /* RIP route changes. */
195 : long route_changes;
196 :
197 : /* RIP queries. */
198 : long queries;
199 : } counters;
200 : };
201 : RB_HEAD(rip_instance_head, rip);
202 69 : RB_PROTOTYPE(rip_instance_head, rip, entry, rip_instance_compare)
203 :
204 : /* RIP routing table entry which belong to rip_packet. */
205 : struct rte {
206 : uint16_t family; /* Address family of this route. */
207 : uint16_t tag; /* Route Tag which included in RIP2 packet. */
208 : struct in_addr prefix; /* Prefix of rip route. */
209 : struct in_addr mask; /* Netmask of rip route. */
210 : struct in_addr nexthop; /* Next hop of rip route. */
211 : uint32_t metric; /* Metric value of rip route. */
212 : };
213 :
214 : /* RIP packet structure. */
215 : struct rip_packet {
216 : unsigned char command; /* Command type of RIP packet. */
217 : unsigned char version; /* RIP version which coming from peer. */
218 : unsigned char pad1; /* Padding of RIP packet header. */
219 : unsigned char pad2; /* Same as above. */
220 : struct rte rte[1]; /* Address structure. */
221 : };
222 :
223 : /* Buffer to read RIP packet. */
224 : union rip_buf {
225 : struct rip_packet rip_packet;
226 : char buf[RIP_PACKET_MAXSIZ];
227 : };
228 :
229 : /* RIP route information. */
230 : struct rip_info {
231 : /* This route's type. */
232 : int type;
233 :
234 : /* Sub type. */
235 : int sub_type;
236 :
237 : /* RIP nexthop. */
238 : struct nexthop nh;
239 : struct in_addr from;
240 :
241 : /* Metric of this route. */
242 : uint32_t metric;
243 :
244 : /* External metric of this route.
245 : if learnt from an externalm proto */
246 : uint32_t external_metric;
247 :
248 : /* Tag information of this route. */
249 : uint16_t tag;
250 :
251 : /* Flags of RIP route. */
252 : #define RIP_RTF_FIB 1
253 : #define RIP_RTF_CHANGED 2
254 : uint8_t flags;
255 :
256 : /* Garbage collect timer. */
257 : struct thread *t_timeout;
258 : struct thread *t_garbage_collect;
259 :
260 : /* Route-map futures - this variables can be changed. */
261 : struct in_addr nexthop_out;
262 : uint8_t metric_set;
263 : uint32_t metric_out;
264 : uint16_t tag_out;
265 : ifindex_t ifindex_out;
266 :
267 : struct route_node *rp;
268 :
269 : uint8_t distance;
270 : };
271 :
272 : typedef enum {
273 : RIP_NO_SPLIT_HORIZON = 0,
274 : RIP_SPLIT_HORIZON,
275 : RIP_SPLIT_HORIZON_POISONED_REVERSE
276 : } split_horizon_policy_t;
277 :
278 : /* RIP specific interface configuration. */
279 : struct rip_interface {
280 : /* Parent routing instance. */
281 : struct rip *rip;
282 :
283 : /* RIP is enabled on this interface. */
284 : int enable_network;
285 : int enable_interface;
286 :
287 : /* RIP is running on this interface. */
288 : int running;
289 :
290 : /* RIP version control. */
291 : int ri_send;
292 : int ri_receive;
293 :
294 : /* RIPv2 broadcast mode */
295 : bool v2_broadcast;
296 :
297 : /* RIPv2 authentication type. */
298 : int auth_type;
299 :
300 : /* RIPv2 authentication string. */
301 : char *auth_str;
302 :
303 : /* RIPv2 authentication key chain. */
304 : char *key_chain;
305 :
306 : /* value to use for md5->auth_len */
307 : int md5_auth_len;
308 :
309 : /* Split horizon flag. */
310 : split_horizon_policy_t split_horizon;
311 :
312 : /* For filter type slot. */
313 : #define RIP_FILTER_IN 0
314 : #define RIP_FILTER_OUT 1
315 : #define RIP_FILTER_MAX 2
316 :
317 : /* Access-list. */
318 : struct access_list *list[RIP_FILTER_MAX];
319 :
320 : /* Prefix-list. */
321 : struct prefix_list *prefix[RIP_FILTER_MAX];
322 :
323 : /* Route-map. */
324 : struct route_map *routemap[RIP_FILTER_MAX];
325 :
326 : /* Wake up thread. */
327 : struct thread *t_wakeup;
328 :
329 : /* Interface statistics. */
330 : int recv_badpackets;
331 : int recv_badroutes;
332 : int sent_updates;
333 :
334 : /* Passive interface. */
335 : int passive;
336 : };
337 :
338 : /* RIP peer information. */
339 : struct rip_peer {
340 : /* Parent routing instance. */
341 : struct rip *rip;
342 :
343 : /* Peer address. */
344 : struct in_addr addr;
345 :
346 : /* Peer RIP tag value. */
347 : int domain;
348 :
349 : /* Last update time. */
350 : time_t uptime;
351 :
352 : /* Peer RIP version. */
353 : uint8_t version;
354 :
355 : /* Statistics. */
356 : int recv_badpackets;
357 : int recv_badroutes;
358 :
359 : /* Timeout thread. */
360 : struct thread *t_timeout;
361 : };
362 :
363 : struct rip_distance {
364 : /* Distance value for the IP source prefix. */
365 : uint8_t distance;
366 :
367 : /* Name of the access-list to be matched. */
368 : char *access_list;
369 : };
370 :
371 : struct rip_md5_info {
372 : uint16_t family;
373 : uint16_t type;
374 : uint16_t packet_len;
375 : uint8_t keyid;
376 : uint8_t auth_len;
377 : uint32_t sequence;
378 : uint32_t reserv1;
379 : uint32_t reserv2;
380 : };
381 :
382 : struct rip_md5_data {
383 : uint16_t family;
384 : uint16_t type;
385 : uint8_t digest[16];
386 : };
387 :
388 : /* RIP accepet/announce methods. */
389 : #define RI_RIP_UNSPEC 0
390 : #define RI_RIP_VERSION_1 1
391 : #define RI_RIP_VERSION_2 2
392 : #define RI_RIP_VERSION_1_AND_2 3
393 : #define RI_RIP_VERSION_NONE 4
394 : /* N.B. stuff will break if
395 : (RIPv1 != RI_RIP_VERSION_1) || (RIPv2 != RI_RIP_VERSION_2) */
396 :
397 : /* RIP event. */
398 : enum rip_event {
399 : RIP_READ,
400 : RIP_UPDATE_EVENT,
401 : RIP_TRIGGERED_UPDATE,
402 : };
403 :
404 : /* Macro for timer turn on. */
405 : #define RIP_TIMER_ON(T,F,V) thread_add_timer (master, (F), rinfo, (V), &(T))
406 :
407 : #define RIP_OFFSET_LIST_IN 0
408 : #define RIP_OFFSET_LIST_OUT 1
409 : #define RIP_OFFSET_LIST_MAX 2
410 :
411 : struct rip_offset_list {
412 : /* Parent routing instance. */
413 : struct rip *rip;
414 :
415 : char *ifname;
416 :
417 : struct {
418 : char *alist_name;
419 : /* struct access_list *alist; */
420 : uint8_t metric;
421 : } direct[RIP_OFFSET_LIST_MAX];
422 : };
423 :
424 : /* Prototypes. */
425 : extern void rip_init(void);
426 : extern void rip_clean(struct rip *rip);
427 : extern void rip_clean_network(struct rip *rip);
428 : extern void rip_interfaces_clean(struct rip *rip);
429 : extern int rip_passive_nondefault_set(struct rip *rip, const char *ifname);
430 : extern int rip_passive_nondefault_unset(struct rip *rip, const char *ifname);
431 : extern void rip_passive_nondefault_clean(struct rip *rip);
432 : extern void rip_if_init(void);
433 : extern void rip_route_map_init(void);
434 : extern void rip_zebra_vrf_register(struct vrf *vrf);
435 : extern void rip_zebra_vrf_deregister(struct vrf *vrf);
436 : extern void rip_zclient_init(struct thread_master *);
437 : extern void rip_zclient_stop(void);
438 : extern int if_check_address(struct rip *rip, struct in_addr addr);
439 : extern struct rip *rip_lookup_by_vrf_id(vrf_id_t vrf_id);
440 : extern struct rip *rip_lookup_by_vrf_name(const char *vrf_name);
441 : extern struct rip *rip_create(const char *vrf_name, struct vrf *vrf,
442 : int socket);
443 :
444 : extern int rip_request_send(struct sockaddr_in *, struct interface *, uint8_t,
445 : struct connected *);
446 : extern int rip_neighbor_lookup(struct rip *rip, struct sockaddr_in *from);
447 : extern int rip_neighbor_add(struct rip *rip, struct prefix_ipv4 *p);
448 : extern int rip_neighbor_delete(struct rip *rip, struct prefix_ipv4 *p);
449 :
450 : extern int rip_enable_network_add(struct rip *rip, struct prefix *p);
451 : extern int rip_enable_network_delete(struct rip *rip, struct prefix *p);
452 : extern int rip_enable_if_add(struct rip *rip, const char *ifname);
453 : extern int rip_enable_if_delete(struct rip *rip, const char *ifname);
454 :
455 : extern void rip_event(struct rip *rip, enum rip_event event, int sock);
456 : extern void rip_ecmp_disable(struct rip *rip);
457 :
458 : extern int rip_create_socket(struct vrf *vrf);
459 :
460 : extern int rip_redistribute_check(struct rip *rip, int type);
461 : extern void rip_redistribute_conf_update(struct rip *rip, int type);
462 : extern void rip_redistribute_conf_delete(struct rip *rip, int type);
463 : extern void rip_redistribute_add(struct rip *rip, int type, int sub_type,
464 : struct prefix_ipv4 *p, struct nexthop *nh,
465 : unsigned int metric, unsigned char distance,
466 : route_tag_t tag);
467 : extern void rip_redistribute_delete(struct rip *rip, int type, int sub_type,
468 : struct prefix_ipv4 *p, ifindex_t ifindex);
469 : extern void rip_redistribute_withdraw(struct rip *rip, int type);
470 : extern void rip_zebra_ipv4_add(struct rip *rip, struct route_node *rp);
471 : extern void rip_zebra_ipv4_delete(struct rip *rip, struct route_node *rp);
472 : extern void rip_interface_multicast_set(int, struct connected *);
473 : extern void rip_distribute_update_interface(struct interface *);
474 : extern void rip_if_rmap_update_interface(struct interface *ifp);
475 :
476 : extern int rip_show_network_config(struct vty *vty, struct rip *rip);
477 : extern void rip_show_redistribute_config(struct vty *vty, struct rip *rip);
478 :
479 : extern void rip_peer_update(struct rip *rip, struct sockaddr_in *from,
480 : uint8_t version);
481 : extern void rip_peer_bad_route(struct rip *rip, struct sockaddr_in *from);
482 : extern void rip_peer_bad_packet(struct rip *rip, struct sockaddr_in *from);
483 : extern void rip_peer_display(struct vty *vty, struct rip *rip);
484 : extern struct rip_peer *rip_peer_lookup(struct rip *rip, struct in_addr *addr);
485 : extern struct rip_peer *rip_peer_lookup_next(struct rip *rip,
486 : struct in_addr *addr);
487 : extern int rip_peer_list_cmp(struct rip_peer *p1, struct rip_peer *p2);
488 : extern void rip_peer_list_del(void *arg);
489 :
490 : extern void rip_info_free(struct rip_info *);
491 : extern struct rip *rip_info_get_instance(const struct rip_info *rinfo);
492 : extern struct rip_distance *rip_distance_new(void);
493 : extern void rip_distance_free(struct rip_distance *rdistance);
494 : extern uint8_t rip_distance_apply(struct rip *rip, struct rip_info *rinfo);
495 : extern void rip_redistribute_enable(struct rip *rip);
496 : extern void rip_redistribute_disable(struct rip *rip);
497 :
498 : extern int rip_route_rte(struct rip_info *rinfo);
499 : extern struct rip_info *rip_ecmp_add(struct rip *rip,
500 : struct rip_info *rinfo_new);
501 : extern struct rip_info *rip_ecmp_replace(struct rip *rip,
502 : struct rip_info *rinfo_new);
503 : extern struct rip_info *rip_ecmp_delete(struct rip *rip,
504 : struct rip_info *rinfo);
505 :
506 : extern struct rip_offset_list *rip_offset_list_new(struct rip *rip,
507 : const char *ifname);
508 : extern void offset_list_del(struct rip_offset_list *offset);
509 : extern void offset_list_free(struct rip_offset_list *offset);
510 : extern struct rip_offset_list *rip_offset_list_lookup(struct rip *rip,
511 : const char *ifname);
512 : extern int rip_offset_list_apply_in(struct prefix_ipv4 *, struct interface *,
513 : uint32_t *);
514 : extern int rip_offset_list_apply_out(struct prefix_ipv4 *, struct interface *,
515 : uint32_t *);
516 : extern int offset_list_cmp(struct rip_offset_list *o1,
517 : struct rip_offset_list *o2);
518 :
519 : extern void rip_vrf_init(void);
520 : extern void rip_vrf_terminate(void);
521 : extern void rip_cli_init(void);
522 :
523 : extern struct zebra_privs_t ripd_privs;
524 : extern struct rip_instance_head rip_instances;
525 :
526 : /* Master thread structure. */
527 : extern struct thread_master *master;
528 :
529 : DECLARE_HOOK(rip_ifaddr_add, (struct connected * ifc), (ifc));
530 : DECLARE_HOOK(rip_ifaddr_del, (struct connected * ifc), (ifc));
531 :
532 : #endif /* _ZEBRA_RIP_H */
|