]> git.proxmox.com Git - mirror_frr.git/blob - ripd/ripd.c
Merge pull request #2807 from mjstapp/configure_help_fixes
[mirror_frr.git] / ripd / ripd.c
1 /* RIP version 1 and 2.
2 * Copyright (C) 2005 6WIND <alain.ritoux@6wind.com>
3 * Copyright (C) 1997, 98, 99 Kunihiro Ishiguro <kunihiro@zebra.org>
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <zebra.h>
23
24 #include "vrf.h"
25 #include "if.h"
26 #include "command.h"
27 #include "prefix.h"
28 #include "table.h"
29 #include "thread.h"
30 #include "memory.h"
31 #include "log.h"
32 #include "stream.h"
33 #include "filter.h"
34 #include "sockunion.h"
35 #include "sockopt.h"
36 #include "routemap.h"
37 #include "if_rmap.h"
38 #include "plist.h"
39 #include "distribute.h"
40 #include "md5.h"
41 #include "keychain.h"
42 #include "privs.h"
43
44 #include "ripd/ripd.h"
45 #include "ripd/rip_debug.h"
46
47 DEFINE_QOBJ_TYPE(rip)
48
49 /* UDP receive buffer size */
50 #define RIP_UDP_RCV_BUF 41600
51
52 /* RIP Structure. */
53 struct rip *rip = NULL;
54
55 /* RIP neighbor address table. */
56 struct route_table *rip_neighbor_table;
57
58 /* RIP route changes. */
59 long rip_global_route_changes = 0;
60
61 /* RIP queries. */
62 long rip_global_queries = 0;
63
64 /* Prototypes. */
65 static void rip_event(enum rip_event, int);
66 static void rip_output_process(struct connected *, struct sockaddr_in *, int,
67 uint8_t);
68 static int rip_triggered_update(struct thread *);
69 static int rip_update_jitter(unsigned long);
70
71 /* RIP output routes type. */
72 enum { rip_all_route, rip_changed_route };
73
74 /* RIP command strings. */
75 static const struct message rip_msg[] = {{RIP_REQUEST, "REQUEST"},
76 {RIP_RESPONSE, "RESPONSE"},
77 {RIP_TRACEON, "TRACEON"},
78 {RIP_TRACEOFF, "TRACEOFF"},
79 {RIP_POLL, "POLL"},
80 {RIP_POLL_ENTRY, "POLL ENTRY"},
81 {0}};
82
83 /* Utility function to set boradcast option to the socket. */
84 static int sockopt_broadcast(int sock)
85 {
86 int ret;
87 int on = 1;
88
89 ret = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char *)&on,
90 sizeof on);
91 if (ret < 0) {
92 zlog_warn("can't set sockopt SO_BROADCAST to socket %d", sock);
93 return -1;
94 }
95 return 0;
96 }
97
98 static int rip_route_rte(struct rip_info *rinfo)
99 {
100 return (rinfo->type == ZEBRA_ROUTE_RIP
101 && rinfo->sub_type == RIP_ROUTE_RTE);
102 }
103
104 static struct rip_info *rip_info_new(void)
105 {
106 return XCALLOC(MTYPE_RIP_INFO, sizeof(struct rip_info));
107 }
108
109 void rip_info_free(struct rip_info *rinfo)
110 {
111 XFREE(MTYPE_RIP_INFO, rinfo);
112 }
113
114 /* RIP route garbage collect timer. */
115 static int rip_garbage_collect(struct thread *t)
116 {
117 struct rip_info *rinfo;
118 struct route_node *rp;
119
120 rinfo = THREAD_ARG(t);
121 rinfo->t_garbage_collect = NULL;
122
123 /* Off timeout timer. */
124 RIP_TIMER_OFF(rinfo->t_timeout);
125
126 /* Get route_node pointer. */
127 rp = rinfo->rp;
128
129 /* Unlock route_node. */
130 listnode_delete(rp->info, rinfo);
131 if (list_isempty((struct list *)rp->info)) {
132 list_delete_and_null((struct list **)&rp->info);
133 route_unlock_node(rp);
134 }
135
136 /* Free RIP routing information. */
137 rip_info_free(rinfo);
138
139 return 0;
140 }
141
142 static void rip_timeout_update(struct rip_info *rinfo);
143
144 /* Add new route to the ECMP list.
145 * RETURN: the new entry added in the list, or NULL if it is not the first
146 * entry and ECMP is not allowed.
147 */
148 struct rip_info *rip_ecmp_add(struct rip_info *rinfo_new)
149 {
150 struct route_node *rp = rinfo_new->rp;
151 struct rip_info *rinfo = NULL;
152 struct list *list = NULL;
153
154 if (rp->info == NULL)
155 rp->info = list_new();
156 list = (struct list *)rp->info;
157
158 /* If ECMP is not allowed and some entry already exists in the list,
159 * do nothing. */
160 if (listcount(list) && !rip->ecmp)
161 return NULL;
162
163 rinfo = rip_info_new();
164 memcpy(rinfo, rinfo_new, sizeof(struct rip_info));
165 listnode_add(list, rinfo);
166
167 if (rip_route_rte(rinfo)) {
168 rip_timeout_update(rinfo);
169 rip_zebra_ipv4_add(rp);
170 }
171
172 /* Set the route change flag on the first entry. */
173 rinfo = listgetdata(listhead(list));
174 SET_FLAG(rinfo->flags, RIP_RTF_CHANGED);
175
176 /* Signal the output process to trigger an update (see section 2.5). */
177 rip_event(RIP_TRIGGERED_UPDATE, 0);
178
179 return rinfo;
180 }
181
182 /* Replace the ECMP list with the new route.
183 * RETURN: the new entry added in the list
184 */
185 struct rip_info *rip_ecmp_replace(struct rip_info *rinfo_new)
186 {
187 struct route_node *rp = rinfo_new->rp;
188 struct list *list = (struct list *)rp->info;
189 struct rip_info *rinfo = NULL, *tmp_rinfo = NULL;
190 struct listnode *node = NULL, *nextnode = NULL;
191
192 if (list == NULL || listcount(list) == 0)
193 return rip_ecmp_add(rinfo_new);
194
195 /* Get the first entry */
196 rinfo = listgetdata(listhead(list));
197
198 /* Learnt route replaced by a local one. Delete it from zebra. */
199 if (rip_route_rte(rinfo) && !rip_route_rte(rinfo_new))
200 if (CHECK_FLAG(rinfo->flags, RIP_RTF_FIB))
201 rip_zebra_ipv4_delete(rp);
202
203 /* Re-use the first entry, and delete the others. */
204 for (ALL_LIST_ELEMENTS(list, node, nextnode, tmp_rinfo))
205 if (tmp_rinfo != rinfo) {
206 RIP_TIMER_OFF(tmp_rinfo->t_timeout);
207 RIP_TIMER_OFF(tmp_rinfo->t_garbage_collect);
208 list_delete_node(list, node);
209 rip_info_free(tmp_rinfo);
210 }
211
212 RIP_TIMER_OFF(rinfo->t_timeout);
213 RIP_TIMER_OFF(rinfo->t_garbage_collect);
214 memcpy(rinfo, rinfo_new, sizeof(struct rip_info));
215
216 if (rip_route_rte(rinfo)) {
217 rip_timeout_update(rinfo);
218 /* The ADD message implies an update. */
219 rip_zebra_ipv4_add(rp);
220 }
221
222 /* Set the route change flag. */
223 SET_FLAG(rinfo->flags, RIP_RTF_CHANGED);
224
225 /* Signal the output process to trigger an update (see section 2.5). */
226 rip_event(RIP_TRIGGERED_UPDATE, 0);
227
228 return rinfo;
229 }
230
231 /* Delete one route from the ECMP list.
232 * RETURN:
233 * null - the entry is freed, and other entries exist in the list
234 * the entry - the entry is the last one in the list; its metric is set
235 * to INFINITY, and the garbage collector is started for it
236 */
237 struct rip_info *rip_ecmp_delete(struct rip_info *rinfo)
238 {
239 struct route_node *rp = rinfo->rp;
240 struct list *list = (struct list *)rp->info;
241
242 RIP_TIMER_OFF(rinfo->t_timeout);
243
244 if (listcount(list) > 1) {
245 /* Some other ECMP entries still exist. Just delete this entry.
246 */
247 RIP_TIMER_OFF(rinfo->t_garbage_collect);
248 listnode_delete(list, rinfo);
249 if (rip_route_rte(rinfo)
250 && CHECK_FLAG(rinfo->flags, RIP_RTF_FIB))
251 /* The ADD message implies the update. */
252 rip_zebra_ipv4_add(rp);
253 rip_info_free(rinfo);
254 rinfo = NULL;
255 } else {
256 assert(rinfo == listgetdata(listhead(list)));
257
258 /* This is the only entry left in the list. We must keep it in
259 * the list for garbage collection time, with INFINITY metric.
260 */
261
262 rinfo->metric = RIP_METRIC_INFINITY;
263 RIP_TIMER_ON(rinfo->t_garbage_collect, rip_garbage_collect,
264 rip->garbage_time);
265
266 if (rip_route_rte(rinfo)
267 && CHECK_FLAG(rinfo->flags, RIP_RTF_FIB))
268 rip_zebra_ipv4_delete(rp);
269 }
270
271 /* Set the route change flag on the first entry. */
272 rinfo = listgetdata(listhead(list));
273 SET_FLAG(rinfo->flags, RIP_RTF_CHANGED);
274
275 /* Signal the output process to trigger an update (see section 2.5). */
276 rip_event(RIP_TRIGGERED_UPDATE, 0);
277
278 return rinfo;
279 }
280
281 /* Timeout RIP routes. */
282 static int rip_timeout(struct thread *t)
283 {
284 rip_ecmp_delete((struct rip_info *)THREAD_ARG(t));
285 return 0;
286 }
287
288 static void rip_timeout_update(struct rip_info *rinfo)
289 {
290 if (rinfo->metric != RIP_METRIC_INFINITY) {
291 RIP_TIMER_OFF(rinfo->t_timeout);
292 RIP_TIMER_ON(rinfo->t_timeout, rip_timeout, rip->timeout_time);
293 }
294 }
295
296 static int rip_filter(int rip_distribute, struct prefix_ipv4 *p,
297 struct rip_interface *ri)
298 {
299 struct distribute *dist;
300 struct access_list *alist;
301 struct prefix_list *plist;
302 int distribute = rip_distribute == RIP_FILTER_OUT ? DISTRIBUTE_V4_OUT
303 : DISTRIBUTE_V4_IN;
304 const char *inout = rip_distribute == RIP_FILTER_OUT ? "out" : "in";
305
306 /* Input distribute-list filtering. */
307 if (ri->list[rip_distribute]) {
308 if (access_list_apply(ri->list[rip_distribute],
309 (struct prefix *)p)
310 == FILTER_DENY) {
311 if (IS_RIP_DEBUG_PACKET)
312 zlog_debug("%s/%d filtered by distribute %s",
313 inet_ntoa(p->prefix), p->prefixlen,
314 inout);
315 return -1;
316 }
317 }
318 if (ri->prefix[rip_distribute]) {
319 if (prefix_list_apply(ri->prefix[rip_distribute],
320 (struct prefix *)p)
321 == PREFIX_DENY) {
322 if (IS_RIP_DEBUG_PACKET)
323 zlog_debug("%s/%d filtered by prefix-list %s",
324 inet_ntoa(p->prefix), p->prefixlen,
325 inout);
326 return -1;
327 }
328 }
329
330 /* All interface filter check. */
331 dist = distribute_lookup(NULL);
332 if (dist) {
333 if (dist->list[distribute]) {
334 alist = access_list_lookup(AFI_IP,
335 dist->list[distribute]);
336
337 if (alist) {
338 if (access_list_apply(alist, (struct prefix *)p)
339 == FILTER_DENY) {
340 if (IS_RIP_DEBUG_PACKET)
341 zlog_debug(
342 "%s/%d filtered by distribute %s",
343 inet_ntoa(p->prefix),
344 p->prefixlen, inout);
345 return -1;
346 }
347 }
348 }
349 if (dist->prefix[distribute]) {
350 plist = prefix_list_lookup(AFI_IP,
351 dist->prefix[distribute]);
352
353 if (plist) {
354 if (prefix_list_apply(plist, (struct prefix *)p)
355 == PREFIX_DENY) {
356 if (IS_RIP_DEBUG_PACKET)
357 zlog_debug(
358 "%s/%d filtered by prefix-list %s",
359 inet_ntoa(p->prefix),
360 p->prefixlen, inout);
361 return -1;
362 }
363 }
364 }
365 }
366 return 0;
367 }
368
369 /* Check nexthop address validity. */
370 static int rip_nexthop_check(struct in_addr *addr)
371 {
372 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
373 struct interface *ifp;
374 struct listnode *cnode;
375 struct connected *ifc;
376 struct prefix *p;
377
378 /* If nexthop address matches local configured address then it is
379 invalid nexthop. */
380
381 FOR_ALL_INTERFACES (vrf, ifp) {
382 for (ALL_LIST_ELEMENTS_RO(ifp->connected, cnode, ifc)) {
383 p = ifc->address;
384
385 if (p->family == AF_INET
386 && IPV4_ADDR_SAME(&p->u.prefix4, addr))
387 return -1;
388 }
389 }
390 return 0;
391 }
392
393 /* RIP add route to routing table. */
394 static void rip_rte_process(struct rte *rte, struct sockaddr_in *from,
395 struct interface *ifp)
396 {
397 int ret;
398 struct prefix_ipv4 p;
399 struct route_node *rp;
400 struct rip_info *rinfo = NULL, newinfo;
401 struct rip_interface *ri;
402 struct in_addr *nexthop;
403 int same = 0;
404 unsigned char old_dist, new_dist;
405 struct list *list = NULL;
406 struct listnode *node = NULL;
407
408 /* Make prefix structure. */
409 memset(&p, 0, sizeof(struct prefix_ipv4));
410 p.family = AF_INET;
411 p.prefix = rte->prefix;
412 p.prefixlen = ip_masklen(rte->mask);
413
414 /* Make sure mask is applied. */
415 apply_mask_ipv4(&p);
416
417 /* Apply input filters. */
418 ri = ifp->info;
419
420 ret = rip_filter(RIP_FILTER_IN, &p, ri);
421 if (ret < 0)
422 return;
423
424 memset(&newinfo, 0, sizeof(newinfo));
425 newinfo.type = ZEBRA_ROUTE_RIP;
426 newinfo.sub_type = RIP_ROUTE_RTE;
427 newinfo.nh.gate.ipv4 = rte->nexthop;
428 newinfo.from = from->sin_addr;
429 newinfo.nh.ifindex = ifp->ifindex;
430 newinfo.nh.type = NEXTHOP_TYPE_IPV4_IFINDEX;
431 newinfo.metric = rte->metric;
432 newinfo.metric_out = rte->metric; /* XXX */
433 newinfo.tag = ntohs(rte->tag); /* XXX */
434
435 /* Modify entry according to the interface routemap. */
436 if (ri->routemap[RIP_FILTER_IN]) {
437 int ret;
438
439 /* The object should be of the type of rip_info */
440 ret = route_map_apply(ri->routemap[RIP_FILTER_IN],
441 (struct prefix *)&p, RMAP_RIP, &newinfo);
442
443 if (ret == RMAP_DENYMATCH) {
444 if (IS_RIP_DEBUG_PACKET)
445 zlog_debug(
446 "RIP %s/%d is filtered by route-map in",
447 inet_ntoa(p.prefix), p.prefixlen);
448 return;
449 }
450
451 /* Get back the object */
452 rte->nexthop = newinfo.nexthop_out;
453 rte->tag = htons(newinfo.tag_out); /* XXX */
454 rte->metric = newinfo.metric_out; /* XXX: the routemap uses the
455 metric_out field */
456 }
457
458 /* Once the entry has been validated, update the metric by
459 adding the cost of the network on wich the message
460 arrived. If the result is greater than infinity, use infinity
461 (RFC2453 Sec. 3.9.2) */
462 /* Zebra ripd can handle offset-list in. */
463 ret = rip_offset_list_apply_in(&p, ifp, &rte->metric);
464
465 /* If offset-list does not modify the metric use interface's
466 metric. */
467 if (!ret)
468 rte->metric += ifp->metric ? ifp->metric : 1;
469
470 if (rte->metric > RIP_METRIC_INFINITY)
471 rte->metric = RIP_METRIC_INFINITY;
472
473 /* Set nexthop pointer. */
474 if (rte->nexthop.s_addr == 0)
475 nexthop = &from->sin_addr;
476 else
477 nexthop = &rte->nexthop;
478
479 /* Check if nexthop address is myself, then do nothing. */
480 if (rip_nexthop_check(nexthop) < 0) {
481 if (IS_RIP_DEBUG_PACKET)
482 zlog_debug("Nexthop address %s is myself",
483 inet_ntoa(*nexthop));
484 return;
485 }
486
487 /* Get index for the prefix. */
488 rp = route_node_get(rip->table, (struct prefix *)&p);
489
490 newinfo.rp = rp;
491 newinfo.nh.gate.ipv4 = *nexthop;
492 newinfo.nh.type = NEXTHOP_TYPE_IPV4;
493 newinfo.metric = rte->metric;
494 newinfo.tag = ntohs(rte->tag);
495 newinfo.distance = rip_distance_apply(&newinfo);
496
497 new_dist = newinfo.distance ? newinfo.distance
498 : ZEBRA_RIP_DISTANCE_DEFAULT;
499
500 /* Check to see whether there is already RIP route on the table. */
501 if ((list = rp->info) != NULL)
502 for (ALL_LIST_ELEMENTS_RO(list, node, rinfo)) {
503 /* Need to compare with redistributed entry or local
504 * entry */
505 if (!rip_route_rte(rinfo))
506 break;
507
508 if (IPV4_ADDR_SAME(&rinfo->from, &from->sin_addr)
509 && IPV4_ADDR_SAME(&rinfo->nh.gate.ipv4, nexthop))
510 break;
511
512 if (!listnextnode(node)) {
513 /* Not found in the list */
514
515 if (rte->metric > rinfo->metric) {
516 /* New route has a greater metric.
517 * Discard it. */
518 route_unlock_node(rp);
519 return;
520 }
521
522 if (rte->metric < rinfo->metric)
523 /* New route has a smaller metric.
524 * Replace the ECMP list
525 * with the new one in below. */
526 break;
527
528 /* Metrics are same. We compare the distances.
529 */
530 old_dist = rinfo->distance
531 ? rinfo->distance
532 : ZEBRA_RIP_DISTANCE_DEFAULT;
533
534 if (new_dist > old_dist) {
535 /* New route has a greater distance.
536 * Discard it. */
537 route_unlock_node(rp);
538 return;
539 }
540
541 if (new_dist < old_dist)
542 /* New route has a smaller distance.
543 * Replace the ECMP list
544 * with the new one in below. */
545 break;
546
547 /* Metrics and distances are both same. Keep
548 * "rinfo" null and
549 * the new route is added in the ECMP list in
550 * below. */
551 }
552 }
553
554 if (rinfo) {
555 /* Local static route. */
556 if (rinfo->type == ZEBRA_ROUTE_RIP
557 && ((rinfo->sub_type == RIP_ROUTE_STATIC)
558 || (rinfo->sub_type == RIP_ROUTE_DEFAULT))
559 && rinfo->metric != RIP_METRIC_INFINITY) {
560 route_unlock_node(rp);
561 return;
562 }
563
564 /* Redistributed route check. */
565 if (rinfo->type != ZEBRA_ROUTE_RIP
566 && rinfo->metric != RIP_METRIC_INFINITY) {
567 old_dist = rinfo->distance;
568 /* Only routes directly connected to an interface
569 * (nexthop == 0)
570 * may have a valid NULL distance */
571 if (rinfo->nh.gate.ipv4.s_addr != 0)
572 old_dist = old_dist
573 ? old_dist
574 : ZEBRA_RIP_DISTANCE_DEFAULT;
575 /* If imported route does not have STRICT precedence,
576 mark it as a ghost */
577 if (new_dist <= old_dist
578 && rte->metric != RIP_METRIC_INFINITY)
579 rip_ecmp_replace(&newinfo);
580
581 route_unlock_node(rp);
582 return;
583 }
584 }
585
586 if (!rinfo) {
587 if (rp->info)
588 route_unlock_node(rp);
589
590 /* Now, check to see whether there is already an explicit route
591 for the destination prefix. If there is no such route, add
592 this route to the routing table, unless the metric is
593 infinity (there is no point in adding a route which
594 unusable). */
595 if (rte->metric != RIP_METRIC_INFINITY)
596 rip_ecmp_add(&newinfo);
597 } else {
598 /* Route is there but we are not sure the route is RIP or not.
599 */
600
601 /* If there is an existing route, compare the next hop address
602 to the address of the router from which the datagram came.
603 If this datagram is from the same router as the existing
604 route, reinitialize the timeout. */
605 same = (IPV4_ADDR_SAME(&rinfo->from, &from->sin_addr)
606 && (rinfo->nh.ifindex == ifp->ifindex));
607
608 old_dist = rinfo->distance ? rinfo->distance
609 : ZEBRA_RIP_DISTANCE_DEFAULT;
610
611 /* Next, compare the metrics. If the datagram is from the same
612 router as the existing route, and the new metric is different
613 than the old one; or, if the new metric is lower than the old
614 one, or if the tag has been changed; or if there is a route
615 with a lower administrave distance; or an update of the
616 distance on the actual route; do the following actions: */
617 if ((same && rinfo->metric != rte->metric)
618 || (rte->metric < rinfo->metric)
619 || ((same) && (rinfo->metric == rte->metric)
620 && (newinfo.tag != rinfo->tag))
621 || (old_dist > new_dist)
622 || ((old_dist != new_dist) && same)) {
623 if (listcount(list) == 1) {
624 if (newinfo.metric != RIP_METRIC_INFINITY)
625 rip_ecmp_replace(&newinfo);
626 else
627 rip_ecmp_delete(rinfo);
628 } else {
629 if (newinfo.metric < rinfo->metric)
630 rip_ecmp_replace(&newinfo);
631 else if (newinfo.metric > rinfo->metric)
632 rip_ecmp_delete(rinfo);
633 else if (new_dist < old_dist)
634 rip_ecmp_replace(&newinfo);
635 else if (new_dist > old_dist)
636 rip_ecmp_delete(rinfo);
637 else {
638 int update = CHECK_FLAG(rinfo->flags,
639 RIP_RTF_FIB)
640 ? 1
641 : 0;
642
643 assert(newinfo.metric
644 != RIP_METRIC_INFINITY);
645
646 RIP_TIMER_OFF(rinfo->t_timeout);
647 RIP_TIMER_OFF(rinfo->t_garbage_collect);
648 memcpy(rinfo, &newinfo,
649 sizeof(struct rip_info));
650 rip_timeout_update(rinfo);
651
652 if (update)
653 rip_zebra_ipv4_add(rp);
654
655 /* - Set the route change flag on the
656 * first entry. */
657 rinfo = listgetdata(listhead(list));
658 SET_FLAG(rinfo->flags, RIP_RTF_CHANGED);
659 rip_event(RIP_TRIGGERED_UPDATE, 0);
660 }
661 }
662 } else /* same & no change */
663 rip_timeout_update(rinfo);
664
665 /* Unlock tempolary lock of the route. */
666 route_unlock_node(rp);
667 }
668 }
669
670 /* Dump RIP packet */
671 static void rip_packet_dump(struct rip_packet *packet, int size,
672 const char *sndrcv)
673 {
674 caddr_t lim;
675 struct rte *rte;
676 const char *command_str;
677 char pbuf[BUFSIZ], nbuf[BUFSIZ];
678 uint8_t netmask = 0;
679 uint8_t *p;
680
681 /* Set command string. */
682 if (packet->command > 0 && packet->command < RIP_COMMAND_MAX)
683 command_str = lookup_msg(rip_msg, packet->command, NULL);
684 else
685 command_str = "unknown";
686
687 /* Dump packet header. */
688 zlog_debug("%s %s version %d packet size %d", sndrcv, command_str,
689 packet->version, size);
690
691 /* Dump each routing table entry. */
692 rte = packet->rte;
693
694 for (lim = (caddr_t)packet + size; (caddr_t)rte < lim; rte++) {
695 if (packet->version == RIPv2) {
696 netmask = ip_masklen(rte->mask);
697
698 if (rte->family == htons(RIP_FAMILY_AUTH)) {
699 if (rte->tag
700 == htons(RIP_AUTH_SIMPLE_PASSWORD)) {
701 p = (uint8_t *)&rte->prefix;
702
703 zlog_debug(
704 " family 0x%X type %d auth string: %s",
705 ntohs(rte->family),
706 ntohs(rte->tag), p);
707 } else if (rte->tag == htons(RIP_AUTH_MD5)) {
708 struct rip_md5_info *md5;
709
710 md5 = (struct rip_md5_info *)&packet
711 ->rte;
712
713 zlog_debug(
714 " family 0x%X type %d (MD5 authentication)",
715 ntohs(md5->family),
716 ntohs(md5->type));
717 zlog_debug(
718 " RIP-2 packet len %d Key ID %d"
719 " Auth Data len %d",
720 ntohs(md5->packet_len),
721 md5->keyid, md5->auth_len);
722 zlog_debug(" Sequence Number %ld",
723 (unsigned long)ntohl(
724 md5->sequence));
725 } else if (rte->tag == htons(RIP_AUTH_DATA)) {
726 p = (uint8_t *)&rte->prefix;
727
728 zlog_debug(
729 " family 0x%X type %d (MD5 data)",
730 ntohs(rte->family),
731 ntohs(rte->tag));
732 zlog_debug(
733 " MD5: %02X%02X%02X%02X%02X%02X%02X%02X"
734 "%02X%02X%02X%02X%02X%02X%02X%02X",
735 p[0], p[1], p[2], p[3], p[4],
736 p[5], p[6], p[7], p[8], p[9],
737 p[10], p[11], p[12], p[13],
738 p[14], p[15]);
739 } else {
740 zlog_debug(
741 " family 0x%X type %d (Unknown auth type)",
742 ntohs(rte->family),
743 ntohs(rte->tag));
744 }
745 } else
746 zlog_debug(
747 " %s/%d -> %s family %d tag %" ROUTE_TAG_PRI
748 " metric %ld",
749 inet_ntop(AF_INET, &rte->prefix, pbuf,
750 BUFSIZ),
751 netmask,
752 inet_ntop(AF_INET, &rte->nexthop, nbuf,
753 BUFSIZ),
754 ntohs(rte->family),
755 (route_tag_t)ntohs(rte->tag),
756 (unsigned long)ntohl(rte->metric));
757 } else {
758 zlog_debug(
759 " %s family %d tag %" ROUTE_TAG_PRI
760 " metric %ld",
761 inet_ntop(AF_INET, &rte->prefix, pbuf, BUFSIZ),
762 ntohs(rte->family),
763 (route_tag_t)ntohs(rte->tag),
764 (unsigned long)ntohl(rte->metric));
765 }
766 }
767 }
768
769 /* Check if the destination address is valid (unicast; not net 0
770 or 127) (RFC2453 Section 3.9.2 - Page 26). But we don't
771 check net 0 because we accept default route. */
772 static int rip_destination_check(struct in_addr addr)
773 {
774 uint32_t destination;
775
776 /* Convert to host byte order. */
777 destination = ntohl(addr.s_addr);
778
779 if (IPV4_NET127(destination))
780 return 0;
781
782 /* Net 0 may match to the default route. */
783 if (IPV4_NET0(destination) && destination != 0)
784 return 0;
785
786 /* Unicast address must belong to class A, B, C. */
787 if (IN_CLASSA(destination))
788 return 1;
789 if (IN_CLASSB(destination))
790 return 1;
791 if (IN_CLASSC(destination))
792 return 1;
793
794 return 0;
795 }
796
797 /* RIP version 2 authentication. */
798 static int rip_auth_simple_password(struct rte *rte, struct sockaddr_in *from,
799 struct interface *ifp)
800 {
801 struct rip_interface *ri;
802 char *auth_str = (char *)rte + offsetof(struct rte, prefix);
803 int i;
804
805 /* reject passwords with zeros in the middle of the string */
806 for (i = strnlen(auth_str, 16); i < 16; i++) {
807 if (auth_str[i] != '\0')
808 return 0;
809 }
810
811 if (IS_RIP_DEBUG_EVENT)
812 zlog_debug("RIPv2 simple password authentication from %s",
813 inet_ntoa(from->sin_addr));
814
815 ri = ifp->info;
816
817 if (ri->auth_type != RIP_AUTH_SIMPLE_PASSWORD
818 || rte->tag != htons(RIP_AUTH_SIMPLE_PASSWORD))
819 return 0;
820
821 /* Simple password authentication. */
822 if (ri->auth_str) {
823 if (strncmp(auth_str, ri->auth_str, 16) == 0)
824 return 1;
825 }
826 if (ri->key_chain) {
827 struct keychain *keychain;
828 struct key *key;
829
830 keychain = keychain_lookup(ri->key_chain);
831 if (keychain == NULL || keychain->key == NULL)
832 return 0;
833
834 key = key_match_for_accept(keychain, auth_str);
835 if (key)
836 return 1;
837 }
838 return 0;
839 }
840
841 /* RIP version 2 authentication with MD5. */
842 static int rip_auth_md5(struct rip_packet *packet, struct sockaddr_in *from,
843 int length, struct interface *ifp)
844 {
845 struct rip_interface *ri;
846 struct rip_md5_info *md5;
847 struct rip_md5_data *md5data;
848 struct keychain *keychain;
849 struct key *key;
850 MD5_CTX ctx;
851 uint8_t digest[RIP_AUTH_MD5_SIZE];
852 uint16_t packet_len;
853 char auth_str[RIP_AUTH_MD5_SIZE];
854
855 if (IS_RIP_DEBUG_EVENT)
856 zlog_debug("RIPv2 MD5 authentication from %s",
857 inet_ntoa(from->sin_addr));
858
859 ri = ifp->info;
860 md5 = (struct rip_md5_info *)&packet->rte;
861
862 /* Check auth type. */
863 if (ri->auth_type != RIP_AUTH_MD5 || md5->type != htons(RIP_AUTH_MD5))
864 return 0;
865
866 /* If the authentication length is less than 16, then it must be wrong
867 * for
868 * any interpretation of rfc2082. Some implementations also interpret
869 * this as RIP_HEADER_SIZE+ RIP_AUTH_MD5_SIZE, aka
870 * RIP_AUTH_MD5_COMPAT_SIZE.
871 */
872 if (!((md5->auth_len == RIP_AUTH_MD5_SIZE)
873 || (md5->auth_len == RIP_AUTH_MD5_COMPAT_SIZE))) {
874 if (IS_RIP_DEBUG_EVENT)
875 zlog_debug(
876 "RIPv2 MD5 authentication, strange authentication "
877 "length field %d",
878 md5->auth_len);
879 return 0;
880 }
881
882 /* grab and verify check packet length */
883 packet_len = ntohs(md5->packet_len);
884
885 if (packet_len > (length - RIP_HEADER_SIZE - RIP_AUTH_MD5_SIZE)) {
886 if (IS_RIP_DEBUG_EVENT)
887 zlog_debug(
888 "RIPv2 MD5 authentication, packet length field %d "
889 "greater than received length %d!",
890 md5->packet_len, length);
891 return 0;
892 }
893
894 /* retrieve authentication data */
895 md5data = (struct rip_md5_data *)(((uint8_t *)packet) + packet_len);
896
897 memset(auth_str, 0, RIP_AUTH_MD5_SIZE);
898
899 if (ri->key_chain) {
900 keychain = keychain_lookup(ri->key_chain);
901 if (keychain == NULL)
902 return 0;
903
904 key = key_lookup_for_accept(keychain, md5->keyid);
905 if (key == NULL || key->string == NULL)
906 return 0;
907
908 strncpy(auth_str, key->string, RIP_AUTH_MD5_SIZE);
909 } else if (ri->auth_str)
910 strncpy(auth_str, ri->auth_str, RIP_AUTH_MD5_SIZE);
911
912 if (auth_str[0] == 0)
913 return 0;
914
915 /* MD5 digest authentication. */
916 memset(&ctx, 0, sizeof(ctx));
917 MD5Init(&ctx);
918 MD5Update(&ctx, packet, packet_len + RIP_HEADER_SIZE);
919 MD5Update(&ctx, auth_str, RIP_AUTH_MD5_SIZE);
920 MD5Final(digest, &ctx);
921
922 if (memcmp(md5data->digest, digest, RIP_AUTH_MD5_SIZE) == 0)
923 return packet_len;
924 else
925 return 0;
926 }
927
928 /* Pick correct auth string for sends, prepare auth_str buffer for use.
929 * (left justified and padded).
930 *
931 * presumes one of ri or key is valid, and that the auth strings they point
932 * to are nul terminated. If neither are present, auth_str will be fully
933 * zero padded.
934 *
935 */
936 static void rip_auth_prepare_str_send(struct rip_interface *ri, struct key *key,
937 char *auth_str, int len)
938 {
939 assert(ri || key);
940
941 memset(auth_str, 0, len);
942 if (key && key->string)
943 strncpy(auth_str, key->string, len);
944 else if (ri->auth_str)
945 strncpy(auth_str, ri->auth_str, len);
946
947 return;
948 }
949
950 /* Write RIPv2 simple password authentication information
951 *
952 * auth_str is presumed to be 2 bytes and correctly prepared
953 * (left justified and zero padded).
954 */
955 static void rip_auth_simple_write(struct stream *s, char *auth_str, int len)
956 {
957 assert(s && len == RIP_AUTH_SIMPLE_SIZE);
958
959 stream_putw(s, RIP_FAMILY_AUTH);
960 stream_putw(s, RIP_AUTH_SIMPLE_PASSWORD);
961 stream_put(s, auth_str, RIP_AUTH_SIMPLE_SIZE);
962
963 return;
964 }
965
966 /* write RIPv2 MD5 "authentication header"
967 * (uses the auth key data field)
968 *
969 * Digest offset field is set to 0.
970 *
971 * returns: offset of the digest offset field, which must be set when
972 * length to the auth-data MD5 digest is known.
973 */
974 static size_t rip_auth_md5_ah_write(struct stream *s, struct rip_interface *ri,
975 struct key *key)
976 {
977 size_t doff = 0;
978
979 assert(s && ri && ri->auth_type == RIP_AUTH_MD5);
980
981 /* MD5 authentication. */
982 stream_putw(s, RIP_FAMILY_AUTH);
983 stream_putw(s, RIP_AUTH_MD5);
984
985 /* MD5 AH digest offset field.
986 *
987 * Set to placeholder value here, to true value when RIP-2 Packet length
988 * is known. Actual value is set in .....().
989 */
990 doff = stream_get_endp(s);
991 stream_putw(s, 0);
992
993 /* Key ID. */
994 if (key)
995 stream_putc(s, key->index % 256);
996 else
997 stream_putc(s, 1);
998
999 /* Auth Data Len. Set 16 for MD5 authentication data. Older ripds
1000 * however expect RIP_HEADER_SIZE + RIP_AUTH_MD5_SIZE so we allow for
1001 * this
1002 * to be configurable.
1003 */
1004 stream_putc(s, ri->md5_auth_len);
1005
1006 /* Sequence Number (non-decreasing). */
1007 /* RFC2080: The value used in the sequence number is
1008 arbitrary, but two suggestions are the time of the
1009 message's creation or a simple message counter. */
1010 stream_putl(s, time(NULL));
1011
1012 /* Reserved field must be zero. */
1013 stream_putl(s, 0);
1014 stream_putl(s, 0);
1015
1016 return doff;
1017 }
1018
1019 /* If authentication is in used, write the appropriate header
1020 * returns stream offset to which length must later be written
1021 * or 0 if this is not required
1022 */
1023 static size_t rip_auth_header_write(struct stream *s, struct rip_interface *ri,
1024 struct key *key, char *auth_str, int len)
1025 {
1026 assert(ri->auth_type != RIP_NO_AUTH);
1027
1028 switch (ri->auth_type) {
1029 case RIP_AUTH_SIMPLE_PASSWORD:
1030 rip_auth_prepare_str_send(ri, key, auth_str, len);
1031 rip_auth_simple_write(s, auth_str, len);
1032 return 0;
1033 case RIP_AUTH_MD5:
1034 return rip_auth_md5_ah_write(s, ri, key);
1035 }
1036 assert(1);
1037 return 0;
1038 }
1039
1040 /* Write RIPv2 MD5 authentication data trailer */
1041 static void rip_auth_md5_set(struct stream *s, struct rip_interface *ri,
1042 size_t doff, char *auth_str, int authlen)
1043 {
1044 unsigned long len;
1045 MD5_CTX ctx;
1046 unsigned char digest[RIP_AUTH_MD5_SIZE];
1047
1048 /* Make it sure this interface is configured as MD5
1049 authentication. */
1050 assert((ri->auth_type == RIP_AUTH_MD5)
1051 && (authlen == RIP_AUTH_MD5_SIZE));
1052 assert(doff > 0);
1053
1054 /* Get packet length. */
1055 len = stream_get_endp(s);
1056
1057 /* Check packet length. */
1058 if (len < (RIP_HEADER_SIZE + RIP_RTE_SIZE)) {
1059 zlog_err(
1060 "rip_auth_md5_set(): packet length %ld is less than minimum length.",
1061 len);
1062 return;
1063 }
1064
1065 /* Set the digest offset length in the header */
1066 stream_putw_at(s, doff, len);
1067
1068 /* Set authentication data. */
1069 stream_putw(s, RIP_FAMILY_AUTH);
1070 stream_putw(s, RIP_AUTH_DATA);
1071
1072 /* Generate a digest for the RIP packet. */
1073 memset(&ctx, 0, sizeof(ctx));
1074 MD5Init(&ctx);
1075 MD5Update(&ctx, STREAM_DATA(s), stream_get_endp(s));
1076 MD5Update(&ctx, auth_str, RIP_AUTH_MD5_SIZE);
1077 MD5Final(digest, &ctx);
1078
1079 /* Copy the digest to the packet. */
1080 stream_write(s, digest, RIP_AUTH_MD5_SIZE);
1081 }
1082
1083 /* RIP routing information. */
1084 static void rip_response_process(struct rip_packet *packet, int size,
1085 struct sockaddr_in *from,
1086 struct connected *ifc)
1087 {
1088 caddr_t lim;
1089 struct rte *rte;
1090 struct prefix_ipv4 ifaddr;
1091 struct prefix_ipv4 ifaddrclass;
1092 int subnetted;
1093
1094 memset(&ifaddr, 0, sizeof(ifaddr));
1095 /* We don't know yet. */
1096 subnetted = -1;
1097
1098 /* The Response must be ignored if it is not from the RIP
1099 port. (RFC2453 - Sec. 3.9.2)*/
1100 if (from->sin_port != htons(RIP_PORT_DEFAULT)) {
1101 zlog_info("response doesn't come from RIP port: %d",
1102 from->sin_port);
1103 rip_peer_bad_packet(from);
1104 return;
1105 }
1106
1107 /* The datagram's IPv4 source address should be checked to see
1108 whether the datagram is from a valid neighbor; the source of the
1109 datagram must be on a directly connected network (RFC2453 - Sec.
1110 3.9.2) */
1111 if (if_lookup_address((void *)&from->sin_addr, AF_INET, VRF_DEFAULT)
1112 == NULL) {
1113 zlog_info(
1114 "This datagram doesn't came from a valid neighbor: %s",
1115 inet_ntoa(from->sin_addr));
1116 rip_peer_bad_packet(from);
1117 return;
1118 }
1119
1120 /* It is also worth checking to see whether the response is from one
1121 of the router's own addresses. */
1122
1123 ; /* Alredy done in rip_read () */
1124
1125 /* Update RIP peer. */
1126 rip_peer_update(from, packet->version);
1127
1128 /* Set RTE pointer. */
1129 rte = packet->rte;
1130
1131 for (lim = (caddr_t)packet + size; (caddr_t)rte < lim; rte++) {
1132 /* RIPv2 authentication check. */
1133 /* If the Address Family Identifier of the first (and only the
1134 first) entry in the message is 0xFFFF, then the remainder of
1135 the entry contains the authentication. */
1136 /* If the packet gets here it means authentication enabled */
1137 /* Check is done in rip_read(). So, just skipping it */
1138 if (packet->version == RIPv2 && rte == packet->rte
1139 && rte->family == htons(RIP_FAMILY_AUTH))
1140 continue;
1141
1142 if (rte->family != htons(AF_INET)) {
1143 /* Address family check. RIP only supports AF_INET. */
1144 zlog_info("Unsupported family %d from %s.",
1145 ntohs(rte->family),
1146 inet_ntoa(from->sin_addr));
1147 continue;
1148 }
1149
1150 /* - is the destination address valid (e.g., unicast; not net 0
1151 or 127) */
1152 if (!rip_destination_check(rte->prefix)) {
1153 zlog_info(
1154 "Network is net 0 or net 127 or it is not unicast network");
1155 rip_peer_bad_route(from);
1156 continue;
1157 }
1158
1159 /* Convert metric value to host byte order. */
1160 rte->metric = ntohl(rte->metric);
1161
1162 /* - is the metric valid (i.e., between 1 and 16, inclusive) */
1163 if (!(rte->metric >= 1 && rte->metric <= 16)) {
1164 zlog_info("Route's metric is not in the 1-16 range.");
1165 rip_peer_bad_route(from);
1166 continue;
1167 }
1168
1169 /* RIPv1 does not have nexthop value. */
1170 if (packet->version == RIPv1 && rte->nexthop.s_addr != 0) {
1171 zlog_info("RIPv1 packet with nexthop value %s",
1172 inet_ntoa(rte->nexthop));
1173 rip_peer_bad_route(from);
1174 continue;
1175 }
1176
1177 /* That is, if the provided information is ignored, a possibly
1178 sub-optimal, but absolutely valid, route may be taken. If
1179 the received Next Hop is not directly reachable, it should be
1180 treated as 0.0.0.0. */
1181 if (packet->version == RIPv2 && rte->nexthop.s_addr != 0) {
1182 uint32_t addrval;
1183
1184 /* Multicast address check. */
1185 addrval = ntohl(rte->nexthop.s_addr);
1186 if (IN_CLASSD(addrval)) {
1187 zlog_info(
1188 "Nexthop %s is multicast address, skip this rte",
1189 inet_ntoa(rte->nexthop));
1190 continue;
1191 }
1192
1193 if (!if_lookup_address((void *)&rte->nexthop, AF_INET,
1194 VRF_DEFAULT)) {
1195 struct route_node *rn;
1196 struct rip_info *rinfo;
1197
1198 rn = route_node_match_ipv4(rip->table,
1199 &rte->nexthop);
1200
1201 if (rn) {
1202 rinfo = rn->info;
1203
1204 if (rinfo->type == ZEBRA_ROUTE_RIP
1205 && rinfo->sub_type
1206 == RIP_ROUTE_RTE) {
1207 if (IS_RIP_DEBUG_EVENT)
1208 zlog_debug(
1209 "Next hop %s is on RIP network. Set nexthop to the packet's originator",
1210 inet_ntoa(
1211 rte->nexthop));
1212 rte->nexthop = rinfo->from;
1213 } else {
1214 if (IS_RIP_DEBUG_EVENT)
1215 zlog_debug(
1216 "Next hop %s is not directly reachable. Treat it as 0.0.0.0",
1217 inet_ntoa(
1218 rte->nexthop));
1219 rte->nexthop.s_addr = 0;
1220 }
1221
1222 route_unlock_node(rn);
1223 } else {
1224 if (IS_RIP_DEBUG_EVENT)
1225 zlog_debug(
1226 "Next hop %s is not directly reachable. Treat it as 0.0.0.0",
1227 inet_ntoa(
1228 rte->nexthop));
1229 rte->nexthop.s_addr = 0;
1230 }
1231 }
1232 }
1233
1234 /* For RIPv1, there won't be a valid netmask.
1235
1236 This is a best guess at the masks. If everyone was using old
1237 Ciscos before the 'ip subnet zero' option, it would be almost
1238 right too :-)
1239
1240 Cisco summarize ripv1 advertisments to the classful boundary
1241 (/16 for class B's) except when the RIP packet does to inside
1242 the classful network in question. */
1243
1244 if ((packet->version == RIPv1 && rte->prefix.s_addr != 0)
1245 || (packet->version == RIPv2
1246 && (rte->prefix.s_addr != 0
1247 && rte->mask.s_addr == 0))) {
1248 uint32_t destination;
1249
1250 if (subnetted == -1) {
1251 memcpy(&ifaddr, ifc->address,
1252 sizeof(struct prefix_ipv4));
1253 memcpy(&ifaddrclass, &ifaddr,
1254 sizeof(struct prefix_ipv4));
1255 apply_classful_mask_ipv4(&ifaddrclass);
1256 subnetted = 0;
1257 if (ifaddr.prefixlen > ifaddrclass.prefixlen)
1258 subnetted = 1;
1259 }
1260
1261 destination = ntohl(rte->prefix.s_addr);
1262
1263 if (IN_CLASSA(destination))
1264 masklen2ip(8, &rte->mask);
1265 else if (IN_CLASSB(destination))
1266 masklen2ip(16, &rte->mask);
1267 else if (IN_CLASSC(destination))
1268 masklen2ip(24, &rte->mask);
1269
1270 if (subnetted == 1)
1271 masklen2ip(ifaddrclass.prefixlen,
1272 (struct in_addr *)&destination);
1273 if ((subnetted == 1)
1274 && ((rte->prefix.s_addr & destination)
1275 == ifaddrclass.prefix.s_addr)) {
1276 masklen2ip(ifaddr.prefixlen, &rte->mask);
1277 if ((rte->prefix.s_addr & rte->mask.s_addr)
1278 != rte->prefix.s_addr)
1279 masklen2ip(32, &rte->mask);
1280 if (IS_RIP_DEBUG_EVENT)
1281 zlog_debug("Subnetted route %s",
1282 inet_ntoa(rte->prefix));
1283 } else {
1284 if ((rte->prefix.s_addr & rte->mask.s_addr)
1285 != rte->prefix.s_addr)
1286 continue;
1287 }
1288
1289 if (IS_RIP_DEBUG_EVENT) {
1290 zlog_debug("Resultant route %s",
1291 inet_ntoa(rte->prefix));
1292 zlog_debug("Resultant mask %s",
1293 inet_ntoa(rte->mask));
1294 }
1295 }
1296
1297 /* In case of RIPv2, if prefix in RTE is not netmask applied one
1298 ignore the entry. */
1299 if ((packet->version == RIPv2) && (rte->mask.s_addr != 0)
1300 && ((rte->prefix.s_addr & rte->mask.s_addr)
1301 != rte->prefix.s_addr)) {
1302 zlog_warn(
1303 "RIPv2 address %s is not mask /%d applied one",
1304 inet_ntoa(rte->prefix), ip_masklen(rte->mask));
1305 rip_peer_bad_route(from);
1306 continue;
1307 }
1308
1309 /* Default route's netmask is ignored. */
1310 if (packet->version == RIPv2 && (rte->prefix.s_addr == 0)
1311 && (rte->mask.s_addr != 0)) {
1312 if (IS_RIP_DEBUG_EVENT)
1313 zlog_debug(
1314 "Default route with non-zero netmask. Set zero to netmask");
1315 rte->mask.s_addr = 0;
1316 }
1317
1318 /* Routing table updates. */
1319 rip_rte_process(rte, from, ifc->ifp);
1320 }
1321 }
1322
1323 /* Make socket for RIP protocol. */
1324 static int rip_create_socket(void)
1325 {
1326 int ret;
1327 int sock;
1328 struct sockaddr_in addr;
1329
1330 memset(&addr, 0, sizeof(struct sockaddr_in));
1331 addr.sin_family = AF_INET;
1332 addr.sin_addr.s_addr = INADDR_ANY;
1333 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1334 addr.sin_len = sizeof(struct sockaddr_in);
1335 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1336 /* sending port must always be the RIP port */
1337 addr.sin_port = htons(RIP_PORT_DEFAULT);
1338
1339 /* Make datagram socket. */
1340 sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
1341 if (sock < 0) {
1342 zlog_err("Cannot create UDP socket: %s", safe_strerror(errno));
1343 exit(1);
1344 }
1345
1346 sockopt_broadcast(sock);
1347 sockopt_reuseaddr(sock);
1348 sockopt_reuseport(sock);
1349 setsockopt_ipv4_multicast_loop(sock, 0);
1350 #ifdef RIP_RECVMSG
1351 setsockopt_pktinfo(sock);
1352 #endif /* RIP_RECVMSG */
1353 #ifdef IPTOS_PREC_INTERNETCONTROL
1354 setsockopt_ipv4_tos(sock, IPTOS_PREC_INTERNETCONTROL);
1355 #endif
1356
1357 if (ripd_privs.change(ZPRIVS_RAISE))
1358 zlog_err("rip_create_socket: could not raise privs");
1359 setsockopt_so_recvbuf(sock, RIP_UDP_RCV_BUF);
1360 if ((ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr))) < 0)
1361
1362 {
1363 int save_errno = errno;
1364 if (ripd_privs.change(ZPRIVS_LOWER))
1365 zlog_err("rip_create_socket: could not lower privs");
1366
1367 zlog_err("%s: Can't bind socket %d to %s port %d: %s", __func__,
1368 sock, inet_ntoa(addr.sin_addr),
1369 (int)ntohs(addr.sin_port), safe_strerror(save_errno));
1370
1371 close(sock);
1372 return ret;
1373 }
1374
1375 if (ripd_privs.change(ZPRIVS_LOWER))
1376 zlog_err("rip_create_socket: could not lower privs");
1377
1378 return sock;
1379 }
1380
1381 /* RIP packet send to destination address, on interface denoted by
1382 * by connected argument. NULL to argument denotes destination should be
1383 * should be RIP multicast group
1384 */
1385 static int rip_send_packet(uint8_t *buf, int size, struct sockaddr_in *to,
1386 struct connected *ifc)
1387 {
1388 int ret;
1389 struct sockaddr_in sin;
1390
1391 assert(ifc != NULL);
1392
1393 if (IS_RIP_DEBUG_PACKET) {
1394 #define ADDRESS_SIZE 20
1395 char dst[ADDRESS_SIZE];
1396 dst[ADDRESS_SIZE - 1] = '\0';
1397
1398 if (to) {
1399 strncpy(dst, inet_ntoa(to->sin_addr), ADDRESS_SIZE - 1);
1400 } else {
1401 sin.sin_addr.s_addr = htonl(INADDR_RIP_GROUP);
1402 strncpy(dst, inet_ntoa(sin.sin_addr), ADDRESS_SIZE - 1);
1403 }
1404 #undef ADDRESS_SIZE
1405 zlog_debug("rip_send_packet %s > %s (%s)",
1406 inet_ntoa(ifc->address->u.prefix4), dst,
1407 ifc->ifp->name);
1408 }
1409
1410 if (CHECK_FLAG(ifc->flags, ZEBRA_IFA_SECONDARY)) {
1411 /*
1412 * ZEBRA_IFA_SECONDARY is set on linux when an interface is
1413 * configured
1414 * with multiple addresses on the same subnet: the first address
1415 * on the subnet is configured "primary", and all subsequent
1416 * addresses
1417 * on that subnet are treated as "secondary" addresses.
1418 * In order to avoid routing-table bloat on other rip listeners,
1419 * we do not send out RIP packets with ZEBRA_IFA_SECONDARY
1420 * source addrs.
1421 * XXX Since Linux is the only system for which the
1422 * ZEBRA_IFA_SECONDARY
1423 * flag is set, we would end up sending a packet for a
1424 * "secondary"
1425 * source address on non-linux systems.
1426 */
1427 if (IS_RIP_DEBUG_PACKET)
1428 zlog_debug("duplicate dropped");
1429 return 0;
1430 }
1431
1432 /* Make destination address. */
1433 memset(&sin, 0, sizeof(struct sockaddr_in));
1434 sin.sin_family = AF_INET;
1435 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1436 sin.sin_len = sizeof(struct sockaddr_in);
1437 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1438
1439 /* When destination is specified, use it's port and address. */
1440 if (to) {
1441 sin.sin_port = to->sin_port;
1442 sin.sin_addr = to->sin_addr;
1443 } else {
1444 sin.sin_port = htons(RIP_PORT_DEFAULT);
1445 sin.sin_addr.s_addr = htonl(INADDR_RIP_GROUP);
1446
1447 rip_interface_multicast_set(rip->sock, ifc);
1448 }
1449
1450 ret = sendto(rip->sock, buf, size, 0, (struct sockaddr *)&sin,
1451 sizeof(struct sockaddr_in));
1452
1453 if (IS_RIP_DEBUG_EVENT)
1454 zlog_debug("SEND to %s.%d", inet_ntoa(sin.sin_addr),
1455 ntohs(sin.sin_port));
1456
1457 if (ret < 0)
1458 zlog_warn("can't send packet : %s", safe_strerror(errno));
1459
1460 return ret;
1461 }
1462
1463 /* Add redistributed route to RIP table. */
1464 void rip_redistribute_add(int type, int sub_type, struct prefix_ipv4 *p,
1465 struct nexthop *nh, unsigned int metric,
1466 unsigned char distance, route_tag_t tag)
1467 {
1468 int ret;
1469 struct route_node *rp = NULL;
1470 struct rip_info *rinfo = NULL, newinfo;
1471 struct list *list = NULL;
1472
1473 /* Redistribute route */
1474 ret = rip_destination_check(p->prefix);
1475 if (!ret)
1476 return;
1477
1478 rp = route_node_get(rip->table, (struct prefix *)p);
1479
1480 memset(&newinfo, 0, sizeof(struct rip_info));
1481 newinfo.type = type;
1482 newinfo.sub_type = sub_type;
1483 newinfo.metric = 1;
1484 newinfo.external_metric = metric;
1485 newinfo.distance = distance;
1486 if (tag <= UINT16_MAX) /* RIP only supports 16 bit tags */
1487 newinfo.tag = tag;
1488 newinfo.rp = rp;
1489 newinfo.nh = *nh;
1490
1491 if ((list = rp->info) != NULL && listcount(list) != 0) {
1492 rinfo = listgetdata(listhead(list));
1493
1494 if (rinfo->type == ZEBRA_ROUTE_CONNECT
1495 && rinfo->sub_type == RIP_ROUTE_INTERFACE
1496 && rinfo->metric != RIP_METRIC_INFINITY) {
1497 route_unlock_node(rp);
1498 return;
1499 }
1500
1501 /* Manually configured RIP route check. */
1502 if (rinfo->type == ZEBRA_ROUTE_RIP
1503 && ((rinfo->sub_type == RIP_ROUTE_STATIC)
1504 || (rinfo->sub_type == RIP_ROUTE_DEFAULT))) {
1505 if (type != ZEBRA_ROUTE_RIP
1506 || ((sub_type != RIP_ROUTE_STATIC)
1507 && (sub_type != RIP_ROUTE_DEFAULT))) {
1508 route_unlock_node(rp);
1509 return;
1510 }
1511 }
1512
1513 (void)rip_ecmp_replace(&newinfo);
1514 route_unlock_node(rp);
1515 } else
1516 (void)rip_ecmp_add(&newinfo);
1517
1518 if (IS_RIP_DEBUG_EVENT) {
1519 zlog_debug("Redistribute new prefix %s/%d",
1520 inet_ntoa(p->prefix), p->prefixlen);
1521 }
1522
1523 rip_event(RIP_TRIGGERED_UPDATE, 0);
1524 }
1525
1526 /* Delete redistributed route from RIP table. */
1527 void rip_redistribute_delete(int type, int sub_type, struct prefix_ipv4 *p,
1528 ifindex_t ifindex)
1529 {
1530 int ret;
1531 struct route_node *rp;
1532 struct rip_info *rinfo;
1533
1534 ret = rip_destination_check(p->prefix);
1535 if (!ret)
1536 return;
1537
1538 rp = route_node_lookup(rip->table, (struct prefix *)p);
1539 if (rp) {
1540 struct list *list = rp->info;
1541
1542 if (list != NULL && listcount(list) != 0) {
1543 rinfo = listgetdata(listhead(list));
1544 if (rinfo != NULL && rinfo->type == type
1545 && rinfo->sub_type == sub_type
1546 && rinfo->nh.ifindex == ifindex) {
1547 /* Perform poisoned reverse. */
1548 rinfo->metric = RIP_METRIC_INFINITY;
1549 RIP_TIMER_ON(rinfo->t_garbage_collect,
1550 rip_garbage_collect,
1551 rip->garbage_time);
1552 RIP_TIMER_OFF(rinfo->t_timeout);
1553 rinfo->flags |= RIP_RTF_CHANGED;
1554
1555 if (IS_RIP_DEBUG_EVENT)
1556 zlog_debug(
1557 "Poison %s/%d on the interface %s with an "
1558 "infinity metric [delete]",
1559 inet_ntoa(p->prefix),
1560 p->prefixlen,
1561 ifindex2ifname(ifindex,
1562 VRF_DEFAULT));
1563
1564 rip_event(RIP_TRIGGERED_UPDATE, 0);
1565 }
1566 }
1567 route_unlock_node(rp);
1568 }
1569 }
1570
1571 /* Response to request called from rip_read ().*/
1572 static void rip_request_process(struct rip_packet *packet, int size,
1573 struct sockaddr_in *from, struct connected *ifc)
1574 {
1575 caddr_t lim;
1576 struct rte *rte;
1577 struct prefix_ipv4 p;
1578 struct route_node *rp;
1579 struct rip_info *rinfo;
1580 struct rip_interface *ri;
1581
1582 /* Does not reponse to the requests on the loopback interfaces */
1583 if (if_is_loopback(ifc->ifp))
1584 return;
1585
1586 /* Check RIP process is enabled on this interface. */
1587 ri = ifc->ifp->info;
1588 if (!ri->running)
1589 return;
1590
1591 /* When passive interface is specified, suppress responses */
1592 if (ri->passive)
1593 return;
1594
1595 /* RIP peer update. */
1596 rip_peer_update(from, packet->version);
1597
1598 lim = ((caddr_t)packet) + size;
1599 rte = packet->rte;
1600
1601 /* The Request is processed entry by entry. If there are no
1602 entries, no response is given. */
1603 if (lim == (caddr_t)rte)
1604 return;
1605
1606 /* There is one special case. If there is exactly one entry in the
1607 request, and it has an address family identifier of zero and a
1608 metric of infinity (i.e., 16), then this is a request to send the
1609 entire routing table. */
1610 if (lim == ((caddr_t)(rte + 1)) && ntohs(rte->family) == 0
1611 && ntohl(rte->metric) == RIP_METRIC_INFINITY) {
1612 /* All route with split horizon */
1613 rip_output_process(ifc, from, rip_all_route, packet->version);
1614 } else {
1615 if (ntohs(rte->family) != AF_INET)
1616 return;
1617
1618 /* Examine the list of RTEs in the Request one by one. For each
1619 entry, look up the destination in the router's routing
1620 database and, if there is a route, put that route's metric in
1621 the metric field of the RTE. If there is no explicit route
1622 to the specified destination, put infinity in the metric
1623 field. Once all the entries have been filled in, change the
1624 command from Request to Response and send the datagram back
1625 to the requestor. */
1626 p.family = AF_INET;
1627
1628 for (; ((caddr_t)rte) < lim; rte++) {
1629 p.prefix = rte->prefix;
1630 p.prefixlen = ip_masklen(rte->mask);
1631 apply_mask_ipv4(&p);
1632
1633 rp = route_node_lookup(rip->table, (struct prefix *)&p);
1634 if (rp) {
1635 rinfo = listgetdata(
1636 listhead((struct list *)rp->info));
1637 rte->metric = htonl(rinfo->metric);
1638 route_unlock_node(rp);
1639 } else
1640 rte->metric = htonl(RIP_METRIC_INFINITY);
1641 }
1642 packet->command = RIP_RESPONSE;
1643
1644 (void)rip_send_packet((uint8_t *)packet, size, from, ifc);
1645 }
1646 rip_global_queries++;
1647 }
1648
1649 #if RIP_RECVMSG
1650 /* Set IPv6 packet info to the socket. */
1651 static int setsockopt_pktinfo(int sock)
1652 {
1653 int ret;
1654 int val = 1;
1655
1656 ret = setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &val, sizeof(val));
1657 if (ret < 0)
1658 zlog_warn("Can't setsockopt IP_PKTINFO : %s",
1659 safe_strerror(errno));
1660 return ret;
1661 }
1662
1663 /* Read RIP packet by recvmsg function. */
1664 int rip_recvmsg(int sock, uint8_t *buf, int size, struct sockaddr_in *from,
1665 ifindex_t *ifindex)
1666 {
1667 int ret;
1668 struct msghdr msg;
1669 struct iovec iov;
1670 struct cmsghdr *ptr;
1671 char adata[1024];
1672
1673 memset(&msg, 0, sizeof(msg));
1674 msg.msg_name = (void *)from;
1675 msg.msg_namelen = sizeof(struct sockaddr_in);
1676 msg.msg_iov = &iov;
1677 msg.msg_iovlen = 1;
1678 msg.msg_control = (void *)adata;
1679 msg.msg_controllen = sizeof adata;
1680 iov.iov_base = buf;
1681 iov.iov_len = size;
1682
1683 ret = recvmsg(sock, &msg, 0);
1684 if (ret < 0)
1685 return ret;
1686
1687 for (ptr = ZCMSG_FIRSTHDR(&msg); ptr != NULL;
1688 ptr = CMSG_NXTHDR(&msg, ptr))
1689 if (ptr->cmsg_level == IPPROTO_IP
1690 && ptr->cmsg_type == IP_PKTINFO) {
1691 struct in_pktinfo *pktinfo;
1692 int i;
1693
1694 pktinfo = (struct in_pktinfo *)CMSG_DATA(ptr);
1695 i = pktinfo->ipi_ifindex;
1696 }
1697 return ret;
1698 }
1699
1700 /* RIP packet read function. */
1701 int rip_read_new(struct thread *t)
1702 {
1703 int ret;
1704 int sock;
1705 char buf[RIP_PACKET_MAXSIZ];
1706 struct sockaddr_in from;
1707 ifindex_t ifindex;
1708
1709 /* Fetch socket then register myself. */
1710 sock = THREAD_FD(t);
1711 rip_event(RIP_READ, sock);
1712
1713 /* Read RIP packet. */
1714 ret = rip_recvmsg(sock, buf, RIP_PACKET_MAXSIZ, &from, (int *)&ifindex);
1715 if (ret < 0) {
1716 zlog_warn("Can't read RIP packet: %s", safe_strerror(errno));
1717 return ret;
1718 }
1719
1720 return ret;
1721 }
1722 #endif /* RIP_RECVMSG */
1723
1724 /* First entry point of RIP packet. */
1725 static int rip_read(struct thread *t)
1726 {
1727 int sock;
1728 int ret;
1729 int rtenum;
1730 union rip_buf rip_buf;
1731 struct rip_packet *packet;
1732 struct sockaddr_in from;
1733 int len;
1734 int vrecv;
1735 socklen_t fromlen;
1736 struct interface *ifp = NULL;
1737 struct connected *ifc;
1738 struct rip_interface *ri;
1739 struct prefix p;
1740
1741 /* Fetch socket then register myself. */
1742 sock = THREAD_FD(t);
1743 rip->t_read = NULL;
1744
1745 /* Add myself to tne next event */
1746 rip_event(RIP_READ, sock);
1747
1748 /* RIPd manages only IPv4. */
1749 memset(&from, 0, sizeof(struct sockaddr_in));
1750 fromlen = sizeof(struct sockaddr_in);
1751
1752 len = recvfrom(sock, (char *)&rip_buf.buf, sizeof(rip_buf.buf), 0,
1753 (struct sockaddr *)&from, &fromlen);
1754 if (len < 0) {
1755 zlog_info("recvfrom failed: %s", safe_strerror(errno));
1756 return len;
1757 }
1758
1759 /* Check is this packet comming from myself? */
1760 if (if_check_address(from.sin_addr)) {
1761 if (IS_RIP_DEBUG_PACKET)
1762 zlog_debug("ignore packet comes from myself");
1763 return -1;
1764 }
1765
1766 /* Which interface is this packet comes from. */
1767 ifc = if_lookup_address((void *)&from.sin_addr, AF_INET, VRF_DEFAULT);
1768 if (ifc)
1769 ifp = ifc->ifp;
1770
1771 /* RIP packet received */
1772 if (IS_RIP_DEBUG_EVENT)
1773 zlog_debug("RECV packet from %s port %d on %s",
1774 inet_ntoa(from.sin_addr), ntohs(from.sin_port),
1775 ifp ? ifp->name : "unknown");
1776
1777 /* If this packet come from unknown interface, ignore it. */
1778 if (ifp == NULL) {
1779 zlog_info(
1780 "rip_read: cannot find interface for packet from %s port %d",
1781 inet_ntoa(from.sin_addr), ntohs(from.sin_port));
1782 return -1;
1783 }
1784
1785 p.family = AF_INET;
1786 p.u.prefix4 = from.sin_addr;
1787 p.prefixlen = IPV4_MAX_BITLEN;
1788
1789 ifc = connected_lookup_prefix(ifp, &p);
1790
1791 if (ifc == NULL) {
1792 zlog_info(
1793 "rip_read: cannot find connected address for packet from %s "
1794 "port %d on interface %s",
1795 inet_ntoa(from.sin_addr), ntohs(from.sin_port),
1796 ifp->name);
1797 return -1;
1798 }
1799
1800 /* Packet length check. */
1801 if (len < RIP_PACKET_MINSIZ) {
1802 zlog_warn("packet size %d is smaller than minimum size %d", len,
1803 RIP_PACKET_MINSIZ);
1804 rip_peer_bad_packet(&from);
1805 return len;
1806 }
1807 if (len > RIP_PACKET_MAXSIZ) {
1808 zlog_warn("packet size %d is larger than max size %d", len,
1809 RIP_PACKET_MAXSIZ);
1810 rip_peer_bad_packet(&from);
1811 return len;
1812 }
1813
1814 /* Packet alignment check. */
1815 if ((len - RIP_PACKET_MINSIZ) % 20) {
1816 zlog_warn("packet size %d is wrong for RIP packet alignment",
1817 len);
1818 rip_peer_bad_packet(&from);
1819 return len;
1820 }
1821
1822 /* Set RTE number. */
1823 rtenum = ((len - RIP_PACKET_MINSIZ) / 20);
1824
1825 /* For easy to handle. */
1826 packet = &rip_buf.rip_packet;
1827
1828 /* RIP version check. */
1829 if (packet->version == 0) {
1830 zlog_info("version 0 with command %d received.",
1831 packet->command);
1832 rip_peer_bad_packet(&from);
1833 return -1;
1834 }
1835
1836 /* Dump RIP packet. */
1837 if (IS_RIP_DEBUG_RECV)
1838 rip_packet_dump(packet, len, "RECV");
1839
1840 /* RIP version adjust. This code should rethink now. RFC1058 says
1841 that "Version 1 implementations are to ignore this extra data and
1842 process only the fields specified in this document.". So RIPv3
1843 packet should be treated as RIPv1 ignoring must be zero field. */
1844 if (packet->version > RIPv2)
1845 packet->version = RIPv2;
1846
1847 /* Is RIP running or is this RIP neighbor ?*/
1848 ri = ifp->info;
1849 if (!ri->running && !rip_neighbor_lookup(&from)) {
1850 if (IS_RIP_DEBUG_EVENT)
1851 zlog_debug("RIP is not enabled on interface %s.",
1852 ifp->name);
1853 rip_peer_bad_packet(&from);
1854 return -1;
1855 }
1856
1857 /* RIP Version check. RFC2453, 4.6 and 5.1 */
1858 vrecv = ((ri->ri_receive == RI_RIP_UNSPEC) ? rip->version_recv
1859 : ri->ri_receive);
1860 if (vrecv == RI_RIP_VERSION_NONE
1861 || ((packet->version == RIPv1) && !(vrecv & RIPv1))
1862 || ((packet->version == RIPv2) && !(vrecv & RIPv2))) {
1863 if (IS_RIP_DEBUG_PACKET)
1864 zlog_debug(
1865 " packet's v%d doesn't fit to if version spec",
1866 packet->version);
1867 rip_peer_bad_packet(&from);
1868 return -1;
1869 }
1870
1871 /* RFC2453 5.2 If the router is not configured to authenticate RIP-2
1872 messages, then RIP-1 and unauthenticated RIP-2 messages will be
1873 accepted; authenticated RIP-2 messages shall be discarded. */
1874 if ((ri->auth_type == RIP_NO_AUTH) && rtenum
1875 && (packet->version == RIPv2)
1876 && (packet->rte->family == htons(RIP_FAMILY_AUTH))) {
1877 if (IS_RIP_DEBUG_EVENT)
1878 zlog_debug(
1879 "packet RIPv%d is dropped because authentication disabled",
1880 packet->version);
1881 rip_peer_bad_packet(&from);
1882 return -1;
1883 }
1884
1885 /* RFC:
1886 If the router is configured to authenticate RIP-2 messages, then
1887 RIP-1 messages and RIP-2 messages which pass authentication
1888 testing shall be accepted; unauthenticated and failed
1889 authentication RIP-2 messages shall be discarded. For maximum
1890 security, RIP-1 messages should be ignored when authentication is
1891 in use (see section 4.1); otherwise, the routing information from
1892 authenticated messages will be propagated by RIP-1 routers in an
1893 unauthenticated manner.
1894 */
1895 /* We make an exception for RIPv1 REQUEST packets, to which we'll
1896 * always reply regardless of authentication settings, because:
1897 *
1898 * - if there other authorised routers on-link, the REQUESTor can
1899 * passively obtain the routing updates anyway
1900 * - if there are no other authorised routers on-link, RIP can
1901 * easily be disabled for the link to prevent giving out information
1902 * on state of this routers RIP routing table..
1903 *
1904 * I.e. if RIPv1 has any place anymore these days, it's as a very
1905 * simple way to distribute routing information (e.g. to embedded
1906 * hosts / appliances) and the ability to give out RIPv1
1907 * routing-information freely, while still requiring RIPv2
1908 * authentication for any RESPONSEs might be vaguely useful.
1909 */
1910 if (ri->auth_type != RIP_NO_AUTH && packet->version == RIPv1) {
1911 /* Discard RIPv1 messages other than REQUESTs */
1912 if (packet->command != RIP_REQUEST) {
1913 if (IS_RIP_DEBUG_PACKET)
1914 zlog_debug(
1915 "RIPv1"
1916 " dropped because authentication enabled");
1917 rip_peer_bad_packet(&from);
1918 return -1;
1919 }
1920 } else if (ri->auth_type != RIP_NO_AUTH) {
1921 const char *auth_desc;
1922
1923 if (rtenum == 0) {
1924 /* There definitely is no authentication in the packet.
1925 */
1926 if (IS_RIP_DEBUG_PACKET)
1927 zlog_debug(
1928 "RIPv2 authentication failed: no auth RTE in packet");
1929 rip_peer_bad_packet(&from);
1930 return -1;
1931 }
1932
1933 /* First RTE must be an Authentication Family RTE */
1934 if (packet->rte->family != htons(RIP_FAMILY_AUTH)) {
1935 if (IS_RIP_DEBUG_PACKET)
1936 zlog_debug(
1937 "RIPv2"
1938 " dropped because authentication enabled");
1939 rip_peer_bad_packet(&from);
1940 return -1;
1941 }
1942
1943 /* Check RIPv2 authentication. */
1944 switch (ntohs(packet->rte->tag)) {
1945 case RIP_AUTH_SIMPLE_PASSWORD:
1946 auth_desc = "simple";
1947 ret = rip_auth_simple_password(packet->rte, &from, ifp);
1948 break;
1949
1950 case RIP_AUTH_MD5:
1951 auth_desc = "MD5";
1952 ret = rip_auth_md5(packet, &from, len, ifp);
1953 /* Reset RIP packet length to trim MD5 data. */
1954 len = ret;
1955 break;
1956
1957 default:
1958 ret = 0;
1959 auth_desc = "unknown type";
1960 if (IS_RIP_DEBUG_PACKET)
1961 zlog_debug(
1962 "RIPv2 Unknown authentication type %d",
1963 ntohs(packet->rte->tag));
1964 }
1965
1966 if (ret) {
1967 if (IS_RIP_DEBUG_PACKET)
1968 zlog_debug("RIPv2 %s authentication success",
1969 auth_desc);
1970 } else {
1971 if (IS_RIP_DEBUG_PACKET)
1972 zlog_debug("RIPv2 %s authentication failure",
1973 auth_desc);
1974 rip_peer_bad_packet(&from);
1975 return -1;
1976 }
1977 }
1978
1979 /* Process each command. */
1980 switch (packet->command) {
1981 case RIP_RESPONSE:
1982 rip_response_process(packet, len, &from, ifc);
1983 break;
1984 case RIP_REQUEST:
1985 case RIP_POLL:
1986 rip_request_process(packet, len, &from, ifc);
1987 break;
1988 case RIP_TRACEON:
1989 case RIP_TRACEOFF:
1990 zlog_info(
1991 "Obsolete command %s received, please sent it to routed",
1992 lookup_msg(rip_msg, packet->command, NULL));
1993 rip_peer_bad_packet(&from);
1994 break;
1995 case RIP_POLL_ENTRY:
1996 zlog_info("Obsolete command %s received",
1997 lookup_msg(rip_msg, packet->command, NULL));
1998 rip_peer_bad_packet(&from);
1999 break;
2000 default:
2001 zlog_info("Unknown RIP command %d received", packet->command);
2002 rip_peer_bad_packet(&from);
2003 break;
2004 }
2005
2006 return len;
2007 }
2008
2009 /* Write routing table entry to the stream and return next index of
2010 the routing table entry in the stream. */
2011 static int rip_write_rte(int num, struct stream *s, struct prefix_ipv4 *p,
2012 uint8_t version, struct rip_info *rinfo)
2013 {
2014 struct in_addr mask;
2015
2016 /* Write routing table entry. */
2017 if (version == RIPv1) {
2018 stream_putw(s, AF_INET);
2019 stream_putw(s, 0);
2020 stream_put_ipv4(s, p->prefix.s_addr);
2021 stream_put_ipv4(s, 0);
2022 stream_put_ipv4(s, 0);
2023 stream_putl(s, rinfo->metric_out);
2024 } else {
2025 masklen2ip(p->prefixlen, &mask);
2026
2027 stream_putw(s, AF_INET);
2028 stream_putw(s, rinfo->tag_out);
2029 stream_put_ipv4(s, p->prefix.s_addr);
2030 stream_put_ipv4(s, mask.s_addr);
2031 stream_put_ipv4(s, rinfo->nexthop_out.s_addr);
2032 stream_putl(s, rinfo->metric_out);
2033 }
2034
2035 return ++num;
2036 }
2037
2038 /* Send update to the ifp or spcified neighbor. */
2039 void rip_output_process(struct connected *ifc, struct sockaddr_in *to,
2040 int route_type, uint8_t version)
2041 {
2042 int ret;
2043 struct stream *s;
2044 struct route_node *rp;
2045 struct rip_info *rinfo;
2046 struct rip_interface *ri;
2047 struct prefix_ipv4 *p;
2048 struct prefix_ipv4 classfull;
2049 struct prefix_ipv4 ifaddrclass;
2050 struct key *key = NULL;
2051 /* this might need to made dynamic if RIP ever supported auth methods
2052 with larger key string sizes */
2053 char auth_str[RIP_AUTH_SIMPLE_SIZE];
2054 size_t doff = 0; /* offset of digest offset field */
2055 int num = 0;
2056 int rtemax;
2057 int subnetted = 0;
2058 struct list *list = NULL;
2059 struct listnode *listnode = NULL;
2060
2061 /* Logging output event. */
2062 if (IS_RIP_DEBUG_EVENT) {
2063 if (to)
2064 zlog_debug("update routes to neighbor %s",
2065 inet_ntoa(to->sin_addr));
2066 else
2067 zlog_debug("update routes on interface %s ifindex %d",
2068 ifc->ifp->name, ifc->ifp->ifindex);
2069 }
2070
2071 /* Set output stream. */
2072 s = rip->obuf;
2073
2074 /* Reset stream and RTE counter. */
2075 stream_reset(s);
2076 rtemax = RIP_MAX_RTE;
2077
2078 /* Get RIP interface. */
2079 ri = ifc->ifp->info;
2080
2081 /* If output interface is in simple password authentication mode, we
2082 need space for authentication data. */
2083 if (ri->auth_type == RIP_AUTH_SIMPLE_PASSWORD)
2084 rtemax -= 1;
2085
2086 /* If output interface is in MD5 authentication mode, we need space
2087 for authentication header and data. */
2088 if (ri->auth_type == RIP_AUTH_MD5)
2089 rtemax -= 2;
2090
2091 /* If output interface is in simple password authentication mode
2092 and string or keychain is specified we need space for auth. data */
2093 if (ri->auth_type != RIP_NO_AUTH) {
2094 if (ri->key_chain) {
2095 struct keychain *keychain;
2096
2097 keychain = keychain_lookup(ri->key_chain);
2098 if (keychain)
2099 key = key_lookup_for_send(keychain);
2100 }
2101 /* to be passed to auth functions later */
2102 rip_auth_prepare_str_send(ri, key, auth_str,
2103 RIP_AUTH_SIMPLE_SIZE);
2104 if (strlen(auth_str) == 0)
2105 return;
2106 }
2107
2108 if (version == RIPv1) {
2109 memcpy(&ifaddrclass, ifc->address, sizeof(struct prefix_ipv4));
2110 apply_classful_mask_ipv4(&ifaddrclass);
2111 subnetted = 0;
2112 if (ifc->address->prefixlen > ifaddrclass.prefixlen)
2113 subnetted = 1;
2114 }
2115
2116 for (rp = route_top(rip->table); rp; rp = route_next(rp))
2117 if ((list = rp->info) != NULL && listcount(list) != 0) {
2118 rinfo = listgetdata(listhead(list));
2119 /* For RIPv1, if we are subnetted, output subnets in our
2120 * network */
2121 /* that have the same mask as the output "interface".
2122 * For other */
2123 /* networks, only the classfull version is output. */
2124
2125 if (version == RIPv1) {
2126 p = (struct prefix_ipv4 *)&rp->p;
2127
2128 if (IS_RIP_DEBUG_PACKET)
2129 zlog_debug(
2130 "RIPv1 mask check, %s/%d considered for output",
2131 inet_ntoa(rp->p.u.prefix4),
2132 rp->p.prefixlen);
2133
2134 if (subnetted
2135 && prefix_match(
2136 (struct prefix *)&ifaddrclass,
2137 &rp->p)) {
2138 if ((ifc->address->prefixlen
2139 != rp->p.prefixlen)
2140 && (rp->p.prefixlen != 32))
2141 continue;
2142 } else {
2143 memcpy(&classfull, &rp->p,
2144 sizeof(struct prefix_ipv4));
2145 apply_classful_mask_ipv4(&classfull);
2146 if (rp->p.u.prefix4.s_addr != 0
2147 && classfull.prefixlen
2148 != rp->p.prefixlen)
2149 continue;
2150 }
2151 if (IS_RIP_DEBUG_PACKET)
2152 zlog_debug(
2153 "RIPv1 mask check, %s/%d made it through",
2154 inet_ntoa(rp->p.u.prefix4),
2155 rp->p.prefixlen);
2156 } else
2157 p = (struct prefix_ipv4 *)&rp->p;
2158
2159 /* Apply output filters. */
2160 ret = rip_filter(RIP_FILTER_OUT, p, ri);
2161 if (ret < 0)
2162 continue;
2163
2164 /* Changed route only output. */
2165 if (route_type == rip_changed_route
2166 && (!(rinfo->flags & RIP_RTF_CHANGED)))
2167 continue;
2168
2169 /* Split horizon. */
2170 /* if (split_horizon == rip_split_horizon) */
2171 if (ri->split_horizon == RIP_SPLIT_HORIZON) {
2172 /*
2173 * We perform split horizon for RIP and
2174 * connected route.
2175 * For rip routes, we want to suppress the route
2176 * if we would
2177 * end up sending the route back on the
2178 * interface that we
2179 * learned it from, with a higher metric. For
2180 * connected routes,
2181 * we suppress the route if the prefix is a
2182 * subset of the
2183 * source address that we are going to use for
2184 * the packet
2185 * (in order to handle the case when multiple
2186 * subnets are
2187 * configured on the same interface).
2188 */
2189 int suppress = 0;
2190 struct rip_info *tmp_rinfo = NULL;
2191 struct connected *tmp_ifc = NULL;
2192
2193 for (ALL_LIST_ELEMENTS_RO(list, listnode,
2194 tmp_rinfo))
2195 if (tmp_rinfo->type == ZEBRA_ROUTE_RIP
2196 && tmp_rinfo->nh.ifindex
2197 == ifc->ifp->ifindex) {
2198 suppress = 1;
2199 break;
2200 }
2201
2202 if (!suppress
2203 && rinfo->type == ZEBRA_ROUTE_CONNECT) {
2204 for (ALL_LIST_ELEMENTS_RO(
2205 ifc->ifp->connected,
2206 listnode, tmp_ifc))
2207 if (prefix_match(
2208 (struct prefix *)p,
2209 tmp_ifc->address)) {
2210 suppress = 1;
2211 break;
2212 }
2213 }
2214
2215 if (suppress)
2216 continue;
2217 }
2218
2219 /* Preparation for route-map. */
2220 rinfo->metric_set = 0;
2221 rinfo->nexthop_out.s_addr = 0;
2222 rinfo->metric_out = rinfo->metric;
2223 rinfo->tag_out = rinfo->tag;
2224 rinfo->ifindex_out = ifc->ifp->ifindex;
2225
2226 /* In order to avoid some local loops,
2227 * if the RIP route has a nexthop via this interface,
2228 * keep the nexthop,
2229 * otherwise set it to 0. The nexthop should not be
2230 * propagated
2231 * beyond the local broadcast/multicast area in order
2232 * to avoid an IGP multi-level recursive look-up.
2233 * see (4.4)
2234 */
2235 if (rinfo->nh.ifindex == ifc->ifp->ifindex)
2236 rinfo->nexthop_out = rinfo->nh.gate.ipv4;
2237
2238 /* Interface route-map */
2239 if (ri->routemap[RIP_FILTER_OUT]) {
2240 ret = route_map_apply(
2241 ri->routemap[RIP_FILTER_OUT],
2242 (struct prefix *)p, RMAP_RIP, rinfo);
2243
2244 if (ret == RMAP_DENYMATCH) {
2245 if (IS_RIP_DEBUG_PACKET)
2246 zlog_debug(
2247 "RIP %s/%d is filtered by route-map out",
2248 inet_ntoa(p->prefix),
2249 p->prefixlen);
2250 continue;
2251 }
2252 }
2253
2254 /* Apply redistribute route map - continue, if deny */
2255 if (rip->route_map[rinfo->type].name
2256 && rinfo->sub_type != RIP_ROUTE_INTERFACE) {
2257 ret = route_map_apply(
2258 rip->route_map[rinfo->type].map,
2259 (struct prefix *)p, RMAP_RIP, rinfo);
2260
2261 if (ret == RMAP_DENYMATCH) {
2262 if (IS_RIP_DEBUG_PACKET)
2263 zlog_debug(
2264 "%s/%d is filtered by route-map",
2265 inet_ntoa(p->prefix),
2266 p->prefixlen);
2267 continue;
2268 }
2269 }
2270
2271 /* When route-map does not set metric. */
2272 if (!rinfo->metric_set) {
2273 /* If redistribute metric is set. */
2274 if (rip->route_map[rinfo->type].metric_config
2275 && rinfo->metric != RIP_METRIC_INFINITY) {
2276 rinfo->metric_out =
2277 rip->route_map[rinfo->type]
2278 .metric;
2279 } else {
2280 /* If the route is not connected or
2281 localy generated
2282 one, use default-metric value*/
2283 if (rinfo->type != ZEBRA_ROUTE_RIP
2284 && rinfo->type
2285 != ZEBRA_ROUTE_CONNECT
2286 && rinfo->metric
2287 != RIP_METRIC_INFINITY)
2288 rinfo->metric_out =
2289 rip->default_metric;
2290 }
2291 }
2292
2293 /* Apply offset-list */
2294 if (rinfo->metric != RIP_METRIC_INFINITY)
2295 rip_offset_list_apply_out(p, ifc->ifp,
2296 &rinfo->metric_out);
2297
2298 if (rinfo->metric_out > RIP_METRIC_INFINITY)
2299 rinfo->metric_out = RIP_METRIC_INFINITY;
2300
2301 /* Perform split-horizon with poisoned reverse
2302 * for RIP and connected routes.
2303 **/
2304 if (ri->split_horizon
2305 == RIP_SPLIT_HORIZON_POISONED_REVERSE) {
2306 /*
2307 * We perform split horizon for RIP and
2308 * connected route.
2309 * For rip routes, we want to suppress the route
2310 * if we would
2311 * end up sending the route back on the
2312 * interface that we
2313 * learned it from, with a higher metric. For
2314 * connected routes,
2315 * we suppress the route if the prefix is a
2316 * subset of the
2317 * source address that we are going to use for
2318 * the packet
2319 * (in order to handle the case when multiple
2320 * subnets are
2321 * configured on the same interface).
2322 */
2323 struct rip_info *tmp_rinfo = NULL;
2324 struct connected *tmp_ifc = NULL;
2325
2326 for (ALL_LIST_ELEMENTS_RO(list, listnode,
2327 tmp_rinfo))
2328 if (tmp_rinfo->type == ZEBRA_ROUTE_RIP
2329 && tmp_rinfo->nh.ifindex
2330 == ifc->ifp->ifindex)
2331 rinfo->metric_out =
2332 RIP_METRIC_INFINITY;
2333
2334 if (rinfo->metric_out != RIP_METRIC_INFINITY
2335 && rinfo->type == ZEBRA_ROUTE_CONNECT) {
2336 for (ALL_LIST_ELEMENTS_RO(
2337 ifc->ifp->connected,
2338 listnode, tmp_ifc))
2339 if (prefix_match(
2340 (struct prefix *)p,
2341 tmp_ifc->address)) {
2342 rinfo->metric_out =
2343 RIP_METRIC_INFINITY;
2344 break;
2345 }
2346 }
2347 }
2348
2349 /* Prepare preamble, auth headers, if needs be */
2350 if (num == 0) {
2351 stream_putc(s, RIP_RESPONSE);
2352 stream_putc(s, version);
2353 stream_putw(s, 0);
2354
2355 /* auth header for !v1 && !no_auth */
2356 if ((ri->auth_type != RIP_NO_AUTH)
2357 && (version != RIPv1))
2358 doff = rip_auth_header_write(
2359 s, ri, key, auth_str,
2360 RIP_AUTH_SIMPLE_SIZE);
2361 }
2362
2363 /* Write RTE to the stream. */
2364 num = rip_write_rte(num, s, p, version, rinfo);
2365 if (num == rtemax) {
2366 if (version == RIPv2
2367 && ri->auth_type == RIP_AUTH_MD5)
2368 rip_auth_md5_set(s, ri, doff, auth_str,
2369 RIP_AUTH_SIMPLE_SIZE);
2370
2371 ret = rip_send_packet(STREAM_DATA(s),
2372 stream_get_endp(s), to,
2373 ifc);
2374
2375 if (ret >= 0 && IS_RIP_DEBUG_SEND)
2376 rip_packet_dump((struct rip_packet *)
2377 STREAM_DATA(s),
2378 stream_get_endp(s),
2379 "SEND");
2380 num = 0;
2381 stream_reset(s);
2382 }
2383 }
2384
2385 /* Flush unwritten RTE. */
2386 if (num != 0) {
2387 if (version == RIPv2 && ri->auth_type == RIP_AUTH_MD5)
2388 rip_auth_md5_set(s, ri, doff, auth_str,
2389 RIP_AUTH_SIMPLE_SIZE);
2390
2391 ret = rip_send_packet(STREAM_DATA(s), stream_get_endp(s), to,
2392 ifc);
2393
2394 if (ret >= 0 && IS_RIP_DEBUG_SEND)
2395 rip_packet_dump((struct rip_packet *)STREAM_DATA(s),
2396 stream_get_endp(s), "SEND");
2397 stream_reset(s);
2398 }
2399
2400 /* Statistics updates. */
2401 ri->sent_updates++;
2402 }
2403
2404 /* Send RIP packet to the interface. */
2405 static void rip_update_interface(struct connected *ifc, uint8_t version,
2406 int route_type)
2407 {
2408 struct interface *ifp = ifc->ifp;
2409 struct rip_interface *ri = ifp->info;
2410 struct sockaddr_in to;
2411
2412 /* When RIP version is 2 and multicast enable interface. */
2413 if (version == RIPv2 && !ri->v2_broadcast && if_is_multicast(ifp)) {
2414 if (IS_RIP_DEBUG_EVENT)
2415 zlog_debug("multicast announce on %s ", ifp->name);
2416
2417 rip_output_process(ifc, NULL, route_type, version);
2418 return;
2419 }
2420
2421 /* If we can't send multicast packet, send it with unicast. */
2422 if (if_is_broadcast(ifp) || if_is_pointopoint(ifp)) {
2423 if (ifc->address->family == AF_INET) {
2424 /* Destination address and port setting. */
2425 memset(&to, 0, sizeof(struct sockaddr_in));
2426 if (ifc->destination)
2427 /* use specified broadcast or peer destination
2428 * addr */
2429 to.sin_addr = ifc->destination->u.prefix4;
2430 else if (ifc->address->prefixlen < IPV4_MAX_PREFIXLEN)
2431 /* calculate the appropriate broadcast address
2432 */
2433 to.sin_addr.s_addr = ipv4_broadcast_addr(
2434 ifc->address->u.prefix4.s_addr,
2435 ifc->address->prefixlen);
2436 else
2437 /* do not know where to send the packet */
2438 return;
2439 to.sin_port = htons(RIP_PORT_DEFAULT);
2440
2441 if (IS_RIP_DEBUG_EVENT)
2442 zlog_debug("%s announce to %s on %s",
2443 CONNECTED_PEER(ifc) ? "unicast"
2444 : "broadcast",
2445 inet_ntoa(to.sin_addr), ifp->name);
2446
2447 rip_output_process(ifc, &to, route_type, version);
2448 }
2449 }
2450 }
2451
2452 /* Update send to all interface and neighbor. */
2453 static void rip_update_process(int route_type)
2454 {
2455 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
2456 struct listnode *ifnode, *ifnnode;
2457 struct connected *connected;
2458 struct interface *ifp;
2459 struct rip_interface *ri;
2460 struct route_node *rp;
2461 struct sockaddr_in to;
2462 struct prefix *p;
2463
2464 /* Send RIP update to each interface. */
2465 FOR_ALL_INTERFACES (vrf, ifp) {
2466 if (if_is_loopback(ifp))
2467 continue;
2468
2469 if (!if_is_operative(ifp))
2470 continue;
2471
2472 /* Fetch RIP interface information. */
2473 ri = ifp->info;
2474
2475 /* When passive interface is specified, suppress announce to the
2476 interface. */
2477 if (ri->passive)
2478 continue;
2479
2480 if (ri->running) {
2481 /*
2482 * If there is no version configuration in the
2483 * interface,
2484 * use rip's version setting.
2485 */
2486 int vsend = ((ri->ri_send == RI_RIP_UNSPEC)
2487 ? rip->version_send
2488 : ri->ri_send);
2489
2490 if (IS_RIP_DEBUG_EVENT)
2491 zlog_debug("SEND UPDATE to %s ifindex %d",
2492 ifp->name, ifp->ifindex);
2493
2494 /* send update on each connected network */
2495 for (ALL_LIST_ELEMENTS(ifp->connected, ifnode, ifnnode,
2496 connected)) {
2497 if (connected->address->family == AF_INET) {
2498 if (vsend & RIPv1)
2499 rip_update_interface(
2500 connected, RIPv1,
2501 route_type);
2502 if ((vsend & RIPv2)
2503 && if_is_multicast(ifp))
2504 rip_update_interface(
2505 connected, RIPv2,
2506 route_type);
2507 }
2508 }
2509 }
2510 }
2511
2512 /* RIP send updates to each neighbor. */
2513 for (rp = route_top(rip->neighbor); rp; rp = route_next(rp))
2514 if (rp->info != NULL) {
2515 p = &rp->p;
2516
2517 connected = if_lookup_address(&p->u.prefix4, AF_INET,
2518 VRF_DEFAULT);
2519 if (!connected) {
2520 zlog_warn(
2521 "Neighbor %s doesnt have connected interface!",
2522 inet_ntoa(p->u.prefix4));
2523 continue;
2524 }
2525
2526 /* Set destination address and port */
2527 memset(&to, 0, sizeof(struct sockaddr_in));
2528 to.sin_addr = p->u.prefix4;
2529 to.sin_port = htons(RIP_PORT_DEFAULT);
2530
2531 /* RIP version is rip's configuration. */
2532 rip_output_process(connected, &to, route_type,
2533 rip->version_send);
2534 }
2535 }
2536
2537 /* RIP's periodical timer. */
2538 static int rip_update(struct thread *t)
2539 {
2540 /* Clear timer pointer. */
2541 rip->t_update = NULL;
2542
2543 if (IS_RIP_DEBUG_EVENT)
2544 zlog_debug("update timer fire!");
2545
2546 /* Process update output. */
2547 rip_update_process(rip_all_route);
2548
2549 /* Triggered updates may be suppressed if a regular update is due by
2550 the time the triggered update would be sent. */
2551 RIP_TIMER_OFF(rip->t_triggered_interval);
2552 rip->trigger = 0;
2553
2554 /* Register myself. */
2555 rip_event(RIP_UPDATE_EVENT, 0);
2556
2557 return 0;
2558 }
2559
2560 /* Walk down the RIP routing table then clear changed flag. */
2561 static void rip_clear_changed_flag(void)
2562 {
2563 struct route_node *rp;
2564 struct rip_info *rinfo = NULL;
2565 struct list *list = NULL;
2566 struct listnode *listnode = NULL;
2567
2568 for (rp = route_top(rip->table); rp; rp = route_next(rp))
2569 if ((list = rp->info) != NULL)
2570 for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) {
2571 UNSET_FLAG(rinfo->flags, RIP_RTF_CHANGED);
2572 /* This flag can be set only on the first entry.
2573 */
2574 break;
2575 }
2576 }
2577
2578 /* Triggered update interval timer. */
2579 static int rip_triggered_interval(struct thread *t)
2580 {
2581 int rip_triggered_update(struct thread *);
2582
2583 rip->t_triggered_interval = NULL;
2584
2585 if (rip->trigger) {
2586 rip->trigger = 0;
2587 rip_triggered_update(t);
2588 }
2589 return 0;
2590 }
2591
2592 /* Execute triggered update. */
2593 static int rip_triggered_update(struct thread *t)
2594 {
2595 int interval;
2596
2597 /* Clear thred pointer. */
2598 rip->t_triggered_update = NULL;
2599
2600 /* Cancel interval timer. */
2601 RIP_TIMER_OFF(rip->t_triggered_interval);
2602 rip->trigger = 0;
2603
2604 /* Logging triggered update. */
2605 if (IS_RIP_DEBUG_EVENT)
2606 zlog_debug("triggered update!");
2607
2608 /* Split Horizon processing is done when generating triggered
2609 updates as well as normal updates (see section 2.6). */
2610 rip_update_process(rip_changed_route);
2611
2612 /* Once all of the triggered updates have been generated, the route
2613 change flags should be cleared. */
2614 rip_clear_changed_flag();
2615
2616 /* After a triggered update is sent, a timer should be set for a
2617 random interval between 1 and 5 seconds. If other changes that
2618 would trigger updates occur before the timer expires, a single
2619 update is triggered when the timer expires. */
2620 interval = (random() % 5) + 1;
2621
2622 rip->t_triggered_interval = NULL;
2623 thread_add_timer(master, rip_triggered_interval, NULL, interval,
2624 &rip->t_triggered_interval);
2625
2626 return 0;
2627 }
2628
2629 /* Withdraw redistributed route. */
2630 void rip_redistribute_withdraw(int type)
2631 {
2632 struct route_node *rp;
2633 struct rip_info *rinfo = NULL;
2634 struct list *list = NULL;
2635
2636 if (!rip)
2637 return;
2638
2639 for (rp = route_top(rip->table); rp; rp = route_next(rp))
2640 if ((list = rp->info) != NULL) {
2641 rinfo = listgetdata(listhead(list));
2642 if (rinfo->type == type
2643 && rinfo->sub_type != RIP_ROUTE_INTERFACE) {
2644 /* Perform poisoned reverse. */
2645 rinfo->metric = RIP_METRIC_INFINITY;
2646 RIP_TIMER_ON(rinfo->t_garbage_collect,
2647 rip_garbage_collect,
2648 rip->garbage_time);
2649 RIP_TIMER_OFF(rinfo->t_timeout);
2650 rinfo->flags |= RIP_RTF_CHANGED;
2651
2652 if (IS_RIP_DEBUG_EVENT) {
2653 struct prefix_ipv4 *p =
2654 (struct prefix_ipv4 *)&rp->p;
2655
2656 zlog_debug(
2657 "Poisone %s/%d on the interface %s with an infinity metric [withdraw]",
2658 inet_ntoa(p->prefix),
2659 p->prefixlen,
2660 ifindex2ifname(
2661 rinfo->nh.ifindex,
2662 VRF_DEFAULT));
2663 }
2664
2665 rip_event(RIP_TRIGGERED_UPDATE, 0);
2666 }
2667 }
2668 }
2669
2670 /* Create new RIP instance and set it to global variable. */
2671 static int rip_create(void)
2672 {
2673 rip = XCALLOC(MTYPE_RIP, sizeof(struct rip));
2674
2675 /* Set initial value. */
2676 rip->version_send = RI_RIP_VERSION_2;
2677 rip->version_recv = RI_RIP_VERSION_1_AND_2;
2678 rip->update_time = RIP_UPDATE_TIMER_DEFAULT;
2679 rip->timeout_time = RIP_TIMEOUT_TIMER_DEFAULT;
2680 rip->garbage_time = RIP_GARBAGE_TIMER_DEFAULT;
2681 rip->default_metric = RIP_DEFAULT_METRIC_DEFAULT;
2682
2683 /* Initialize RIP routig table. */
2684 rip->table = route_table_init();
2685 rip->route = route_table_init();
2686 rip->neighbor = route_table_init();
2687
2688 /* Make output stream. */
2689 rip->obuf = stream_new(1500);
2690
2691 /* Make socket. */
2692 rip->sock = rip_create_socket();
2693 if (rip->sock < 0)
2694 return rip->sock;
2695
2696 /* Create read and timer thread. */
2697 rip_event(RIP_READ, rip->sock);
2698 rip_event(RIP_UPDATE_EVENT, 1);
2699
2700 QOBJ_REG(rip, rip);
2701
2702 return 0;
2703 }
2704
2705 /* Sned RIP request to the destination. */
2706 int rip_request_send(struct sockaddr_in *to, struct interface *ifp,
2707 uint8_t version, struct connected *connected)
2708 {
2709 struct rte *rte;
2710 struct rip_packet rip_packet;
2711 struct listnode *node, *nnode;
2712
2713 memset(&rip_packet, 0, sizeof(rip_packet));
2714
2715 rip_packet.command = RIP_REQUEST;
2716 rip_packet.version = version;
2717 rte = rip_packet.rte;
2718 rte->metric = htonl(RIP_METRIC_INFINITY);
2719
2720 if (connected) {
2721 /*
2722 * connected is only sent for ripv1 case, or when
2723 * interface does not support multicast. Caller loops
2724 * over each connected address for this case.
2725 */
2726 if (rip_send_packet((uint8_t *)&rip_packet, sizeof(rip_packet),
2727 to, connected)
2728 != sizeof(rip_packet))
2729 return -1;
2730 else
2731 return sizeof(rip_packet);
2732 }
2733
2734 /* send request on each connected network */
2735 for (ALL_LIST_ELEMENTS(ifp->connected, node, nnode, connected)) {
2736 struct prefix_ipv4 *p;
2737
2738 p = (struct prefix_ipv4 *)connected->address;
2739
2740 if (p->family != AF_INET)
2741 continue;
2742
2743 if (rip_send_packet((uint8_t *)&rip_packet, sizeof(rip_packet),
2744 to, connected)
2745 != sizeof(rip_packet))
2746 return -1;
2747 }
2748 return sizeof(rip_packet);
2749 }
2750
2751 static int rip_update_jitter(unsigned long time)
2752 {
2753 #define JITTER_BOUND 4
2754 /* We want to get the jitter to +/- 1/JITTER_BOUND the interval.
2755 Given that, we cannot let time be less than JITTER_BOUND seconds.
2756 The RIPv2 RFC says jitter should be small compared to
2757 update_time. We consider 1/JITTER_BOUND to be small.
2758 */
2759
2760 int jitter_input = time;
2761 int jitter;
2762
2763 if (jitter_input < JITTER_BOUND)
2764 jitter_input = JITTER_BOUND;
2765
2766 jitter = (((random() % ((jitter_input * 2) + 1)) - jitter_input));
2767
2768 return jitter / JITTER_BOUND;
2769 }
2770
2771 void rip_event(enum rip_event event, int sock)
2772 {
2773 int jitter = 0;
2774
2775 switch (event) {
2776 case RIP_READ:
2777 rip->t_read = NULL;
2778 thread_add_read(master, rip_read, NULL, sock, &rip->t_read);
2779 break;
2780 case RIP_UPDATE_EVENT:
2781 RIP_TIMER_OFF(rip->t_update);
2782 jitter = rip_update_jitter(rip->update_time);
2783 thread_add_timer(master, rip_update, NULL,
2784 sock ? 2 : rip->update_time + jitter,
2785 &rip->t_update);
2786 break;
2787 case RIP_TRIGGERED_UPDATE:
2788 if (rip->t_triggered_interval)
2789 rip->trigger = 1;
2790 else
2791 thread_add_event(master, rip_triggered_update, NULL, 0,
2792 &rip->t_triggered_update);
2793 break;
2794 default:
2795 break;
2796 }
2797 }
2798
2799 DEFUN_NOSH (router_rip,
2800 router_rip_cmd,
2801 "router rip",
2802 "Enable a routing process\n"
2803 "Routing Information Protocol (RIP)\n")
2804 {
2805 int ret;
2806
2807 /* If rip is not enabled before. */
2808 if (!rip) {
2809 ret = rip_create();
2810 if (ret < 0) {
2811 zlog_info("Can't create RIP");
2812 return CMD_WARNING_CONFIG_FAILED;
2813 }
2814 }
2815 VTY_PUSH_CONTEXT(RIP_NODE, rip);
2816
2817 return CMD_SUCCESS;
2818 }
2819
2820 DEFUN (no_router_rip,
2821 no_router_rip_cmd,
2822 "no router rip",
2823 NO_STR
2824 "Enable a routing process\n"
2825 "Routing Information Protocol (RIP)\n")
2826 {
2827 if (rip)
2828 rip_clean();
2829 return CMD_SUCCESS;
2830 }
2831
2832 DEFUN (rip_version,
2833 rip_version_cmd,
2834 "version (1-2)",
2835 "Set routing protocol version\n"
2836 "version\n")
2837 {
2838 int idx_number = 1;
2839 int version;
2840
2841 version = atoi(argv[idx_number]->arg);
2842 if (version != RIPv1 && version != RIPv2) {
2843 vty_out(vty, "invalid rip version %d\n", version);
2844 return CMD_WARNING_CONFIG_FAILED;
2845 }
2846 rip->version_send = version;
2847 rip->version_recv = version;
2848
2849 return CMD_SUCCESS;
2850 }
2851
2852 DEFUN (no_rip_version,
2853 no_rip_version_cmd,
2854 "no version [(1-2)]",
2855 NO_STR
2856 "Set routing protocol version\n"
2857 "Version\n")
2858 {
2859 /* Set RIP version to the default. */
2860 rip->version_send = RI_RIP_VERSION_2;
2861 rip->version_recv = RI_RIP_VERSION_1_AND_2;
2862
2863 return CMD_SUCCESS;
2864 }
2865
2866
2867 DEFUN (rip_route,
2868 rip_route_cmd,
2869 "route A.B.C.D/M",
2870 "RIP static route configuration\n"
2871 "IP prefix <network>/<length>\n")
2872 {
2873 int idx_ipv4_prefixlen = 1;
2874 int ret;
2875 struct nexthop nh;
2876 struct prefix_ipv4 p;
2877 struct route_node *node;
2878
2879 memset(&nh, 0, sizeof(nh));
2880 nh.type = NEXTHOP_TYPE_IPV4;
2881
2882 ret = str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
2883 if (ret < 0) {
2884 vty_out(vty, "Malformed address\n");
2885 return CMD_WARNING_CONFIG_FAILED;
2886 }
2887 apply_mask_ipv4(&p);
2888
2889 /* For router rip configuration. */
2890 node = route_node_get(rip->route, (struct prefix *)&p);
2891
2892 if (node->info) {
2893 vty_out(vty, "There is already same static route.\n");
2894 route_unlock_node(node);
2895 return CMD_WARNING;
2896 }
2897
2898 node->info = (void *)1;
2899
2900 rip_redistribute_add(ZEBRA_ROUTE_RIP, RIP_ROUTE_STATIC, &p, &nh, 0, 0,
2901 0);
2902
2903 return CMD_SUCCESS;
2904 }
2905
2906 DEFUN (no_rip_route,
2907 no_rip_route_cmd,
2908 "no route A.B.C.D/M",
2909 NO_STR
2910 "RIP static route configuration\n"
2911 "IP prefix <network>/<length>\n")
2912 {
2913 int idx_ipv4_prefixlen = 2;
2914 int ret;
2915 struct prefix_ipv4 p;
2916 struct route_node *node;
2917
2918 ret = str2prefix_ipv4(argv[idx_ipv4_prefixlen]->arg, &p);
2919 if (ret < 0) {
2920 vty_out(vty, "Malformed address\n");
2921 return CMD_WARNING_CONFIG_FAILED;
2922 }
2923 apply_mask_ipv4(&p);
2924
2925 /* For router rip configuration. */
2926 node = route_node_lookup(rip->route, (struct prefix *)&p);
2927 if (!node) {
2928 vty_out(vty, "Can't find route %s.\n",
2929 argv[idx_ipv4_prefixlen]->arg);
2930 return CMD_WARNING_CONFIG_FAILED;
2931 }
2932
2933 rip_redistribute_delete(ZEBRA_ROUTE_RIP, RIP_ROUTE_STATIC, &p, 0);
2934 route_unlock_node(node);
2935
2936 node->info = NULL;
2937 route_unlock_node(node);
2938
2939 return CMD_SUCCESS;
2940 }
2941
2942 #if 0
2943 static void
2944 rip_update_default_metric (void)
2945 {
2946 struct route_node *np;
2947 struct rip_info *rinfo = NULL;
2948 struct list *list = NULL;
2949 struct listnode *listnode = NULL;
2950
2951 for (np = route_top (rip->table); np; np = route_next (np))
2952 if ((list = np->info) != NULL)
2953 for (ALL_LIST_ELEMENTS_RO (list, listnode, rinfo))
2954 if (rinfo->type != ZEBRA_ROUTE_RIP && rinfo->type != ZEBRA_ROUTE_CONNECT)
2955 rinfo->metric = rip->default_metric;
2956 }
2957 #endif
2958
2959 DEFUN (rip_default_metric,
2960 rip_default_metric_cmd,
2961 "default-metric (1-16)",
2962 "Set a metric of redistribute routes\n"
2963 "Default metric\n")
2964 {
2965 int idx_number = 1;
2966 if (rip) {
2967 rip->default_metric = atoi(argv[idx_number]->arg);
2968 /* rip_update_default_metric (); */
2969 }
2970 return CMD_SUCCESS;
2971 }
2972
2973 DEFUN (no_rip_default_metric,
2974 no_rip_default_metric_cmd,
2975 "no default-metric [(1-16)]",
2976 NO_STR
2977 "Set a metric of redistribute routes\n"
2978 "Default metric\n")
2979 {
2980 if (rip) {
2981 rip->default_metric = RIP_DEFAULT_METRIC_DEFAULT;
2982 /* rip_update_default_metric (); */
2983 }
2984 return CMD_SUCCESS;
2985 }
2986
2987
2988 DEFUN (rip_timers,
2989 rip_timers_cmd,
2990 "timers basic (5-2147483647) (5-2147483647) (5-2147483647)",
2991 "Adjust routing timers\n"
2992 "Basic routing protocol update timers\n"
2993 "Routing table update timer value in second. Default is 30.\n"
2994 "Routing information timeout timer. Default is 180.\n"
2995 "Garbage collection timer. Default is 120.\n")
2996 {
2997 int idx_number = 2;
2998 int idx_number_2 = 3;
2999 int idx_number_3 = 4;
3000 unsigned long update;
3001 unsigned long timeout;
3002 unsigned long garbage;
3003 char *endptr = NULL;
3004 unsigned long RIP_TIMER_MAX = 2147483647;
3005 unsigned long RIP_TIMER_MIN = 5;
3006
3007 update = strtoul(argv[idx_number]->arg, &endptr, 10);
3008 if (update > RIP_TIMER_MAX || update < RIP_TIMER_MIN
3009 || *endptr != '\0') {
3010 vty_out(vty, "update timer value error\n");
3011 return CMD_WARNING_CONFIG_FAILED;
3012 }
3013
3014 timeout = strtoul(argv[idx_number_2]->arg, &endptr, 10);
3015 if (timeout > RIP_TIMER_MAX || timeout < RIP_TIMER_MIN
3016 || *endptr != '\0') {
3017 vty_out(vty, "timeout timer value error\n");
3018 return CMD_WARNING_CONFIG_FAILED;
3019 }
3020
3021 garbage = strtoul(argv[idx_number_3]->arg, &endptr, 10);
3022 if (garbage > RIP_TIMER_MAX || garbage < RIP_TIMER_MIN
3023 || *endptr != '\0') {
3024 vty_out(vty, "garbage timer value error\n");
3025 return CMD_WARNING_CONFIG_FAILED;
3026 }
3027
3028 /* Set each timer value. */
3029 rip->update_time = update;
3030 rip->timeout_time = timeout;
3031 rip->garbage_time = garbage;
3032
3033 /* Reset update timer thread. */
3034 rip_event(RIP_UPDATE_EVENT, 0);
3035
3036 return CMD_SUCCESS;
3037 }
3038
3039 DEFUN (no_rip_timers,
3040 no_rip_timers_cmd,
3041 "no timers basic [(0-65535) (0-65535) (0-65535)]",
3042 NO_STR
3043 "Adjust routing timers\n"
3044 "Basic routing protocol update timers\n"
3045 "Routing table update timer value in second. Default is 30.\n"
3046 "Routing information timeout timer. Default is 180.\n"
3047 "Garbage collection timer. Default is 120.\n")
3048 {
3049 /* Set each timer value to the default. */
3050 rip->update_time = RIP_UPDATE_TIMER_DEFAULT;
3051 rip->timeout_time = RIP_TIMEOUT_TIMER_DEFAULT;
3052 rip->garbage_time = RIP_GARBAGE_TIMER_DEFAULT;
3053
3054 /* Reset update timer thread. */
3055 rip_event(RIP_UPDATE_EVENT, 0);
3056
3057 return CMD_SUCCESS;
3058 }
3059
3060
3061 struct route_table *rip_distance_table;
3062
3063 struct rip_distance {
3064 /* Distance value for the IP source prefix. */
3065 uint8_t distance;
3066
3067 /* Name of the access-list to be matched. */
3068 char *access_list;
3069 };
3070
3071 static struct rip_distance *rip_distance_new(void)
3072 {
3073 return XCALLOC(MTYPE_RIP_DISTANCE, sizeof(struct rip_distance));
3074 }
3075
3076 static void rip_distance_free(struct rip_distance *rdistance)
3077 {
3078 XFREE(MTYPE_RIP_DISTANCE, rdistance);
3079 }
3080
3081 static int rip_distance_set(struct vty *vty, const char *distance_str,
3082 const char *ip_str, const char *access_list_str)
3083 {
3084 int ret;
3085 struct prefix_ipv4 p;
3086 uint8_t distance;
3087 struct route_node *rn;
3088 struct rip_distance *rdistance;
3089
3090 ret = str2prefix_ipv4(ip_str, &p);
3091 if (ret == 0) {
3092 vty_out(vty, "Malformed prefix\n");
3093 return CMD_WARNING_CONFIG_FAILED;
3094 }
3095
3096 distance = atoi(distance_str);
3097
3098 /* Get RIP distance node. */
3099 rn = route_node_get(rip_distance_table, (struct prefix *)&p);
3100 if (rn->info) {
3101 rdistance = rn->info;
3102 route_unlock_node(rn);
3103 } else {
3104 rdistance = rip_distance_new();
3105 rn->info = rdistance;
3106 }
3107
3108 /* Set distance value. */
3109 rdistance->distance = distance;
3110
3111 /* Reset access-list configuration. */
3112 if (rdistance->access_list) {
3113 free(rdistance->access_list);
3114 rdistance->access_list = NULL;
3115 }
3116 if (access_list_str)
3117 rdistance->access_list = strdup(access_list_str);
3118
3119 return CMD_SUCCESS;
3120 }
3121
3122 static int rip_distance_unset(struct vty *vty, const char *distance_str,
3123 const char *ip_str, const char *access_list_str)
3124 {
3125 int ret;
3126 struct prefix_ipv4 p;
3127 struct route_node *rn;
3128 struct rip_distance *rdistance;
3129
3130 ret = str2prefix_ipv4(ip_str, &p);
3131 if (ret == 0) {
3132 vty_out(vty, "Malformed prefix\n");
3133 return CMD_WARNING_CONFIG_FAILED;
3134 }
3135
3136 rn = route_node_lookup(rip_distance_table, (struct prefix *)&p);
3137 if (!rn) {
3138 vty_out(vty, "Can't find specified prefix\n");
3139 return CMD_WARNING_CONFIG_FAILED;
3140 }
3141
3142 rdistance = rn->info;
3143
3144 if (rdistance->access_list)
3145 free(rdistance->access_list);
3146 rip_distance_free(rdistance);
3147
3148 rn->info = NULL;
3149 route_unlock_node(rn);
3150 route_unlock_node(rn);
3151
3152 return CMD_SUCCESS;
3153 }
3154
3155 static void rip_distance_reset(void)
3156 {
3157 struct route_node *rn;
3158 struct rip_distance *rdistance;
3159
3160 for (rn = route_top(rip_distance_table); rn; rn = route_next(rn))
3161 if ((rdistance = rn->info) != NULL) {
3162 if (rdistance->access_list)
3163 free(rdistance->access_list);
3164 rip_distance_free(rdistance);
3165 rn->info = NULL;
3166 route_unlock_node(rn);
3167 }
3168 }
3169
3170 /* Apply RIP information to distance method. */
3171 uint8_t rip_distance_apply(struct rip_info *rinfo)
3172 {
3173 struct route_node *rn;
3174 struct prefix_ipv4 p;
3175 struct rip_distance *rdistance;
3176 struct access_list *alist;
3177
3178 if (!rip)
3179 return 0;
3180
3181 memset(&p, 0, sizeof(struct prefix_ipv4));
3182 p.family = AF_INET;
3183 p.prefix = rinfo->from;
3184 p.prefixlen = IPV4_MAX_BITLEN;
3185
3186 /* Check source address. */
3187 rn = route_node_match(rip_distance_table, (struct prefix *)&p);
3188 if (rn) {
3189 rdistance = rn->info;
3190 route_unlock_node(rn);
3191
3192 if (rdistance->access_list) {
3193 alist = access_list_lookup(AFI_IP,
3194 rdistance->access_list);
3195 if (alist == NULL)
3196 return 0;
3197 if (access_list_apply(alist, &rinfo->rp->p)
3198 == FILTER_DENY)
3199 return 0;
3200
3201 return rdistance->distance;
3202 } else
3203 return rdistance->distance;
3204 }
3205
3206 if (rip->distance)
3207 return rip->distance;
3208
3209 return 0;
3210 }
3211
3212 static void rip_distance_show(struct vty *vty)
3213 {
3214 struct route_node *rn;
3215 struct rip_distance *rdistance;
3216 int header = 1;
3217 char buf[BUFSIZ];
3218
3219 vty_out(vty, " Distance: (default is %d)\n",
3220 rip->distance ? rip->distance : ZEBRA_RIP_DISTANCE_DEFAULT);
3221
3222 for (rn = route_top(rip_distance_table); rn; rn = route_next(rn))
3223 if ((rdistance = rn->info) != NULL) {
3224 if (header) {
3225 vty_out(vty,
3226 " Address Distance List\n");
3227 header = 0;
3228 }
3229 sprintf(buf, "%s/%d", inet_ntoa(rn->p.u.prefix4),
3230 rn->p.prefixlen);
3231 vty_out(vty, " %-20s %4d %s\n", buf,
3232 rdistance->distance,
3233 rdistance->access_list ? rdistance->access_list
3234 : "");
3235 }
3236 }
3237
3238 DEFUN (rip_distance,
3239 rip_distance_cmd,
3240 "distance (1-255)",
3241 "Administrative distance\n"
3242 "Distance value\n")
3243 {
3244 int idx_number = 1;
3245 rip->distance = atoi(argv[idx_number]->arg);
3246 return CMD_SUCCESS;
3247 }
3248
3249 DEFUN (no_rip_distance,
3250 no_rip_distance_cmd,
3251 "no distance (1-255)",
3252 NO_STR
3253 "Administrative distance\n"
3254 "Distance value\n")
3255 {
3256 rip->distance = 0;
3257 return CMD_SUCCESS;
3258 }
3259
3260 DEFUN (rip_distance_source,
3261 rip_distance_source_cmd,
3262 "distance (1-255) A.B.C.D/M",
3263 "Administrative distance\n"
3264 "Distance value\n"
3265 "IP source prefix\n")
3266 {
3267 int idx_number = 1;
3268 int idx_ipv4_prefixlen = 2;
3269 rip_distance_set(vty, argv[idx_number]->arg,
3270 argv[idx_ipv4_prefixlen]->arg, NULL);
3271 return CMD_SUCCESS;
3272 }
3273
3274 DEFUN (no_rip_distance_source,
3275 no_rip_distance_source_cmd,
3276 "no distance (1-255) A.B.C.D/M",
3277 NO_STR
3278 "Administrative distance\n"
3279 "Distance value\n"
3280 "IP source prefix\n")
3281 {
3282 int idx_number = 2;
3283 int idx_ipv4_prefixlen = 3;
3284 rip_distance_unset(vty, argv[idx_number]->arg,
3285 argv[idx_ipv4_prefixlen]->arg, NULL);
3286 return CMD_SUCCESS;
3287 }
3288
3289 DEFUN (rip_distance_source_access_list,
3290 rip_distance_source_access_list_cmd,
3291 "distance (1-255) A.B.C.D/M WORD",
3292 "Administrative distance\n"
3293 "Distance value\n"
3294 "IP source prefix\n"
3295 "Access list name\n")
3296 {
3297 int idx_number = 1;
3298 int idx_ipv4_prefixlen = 2;
3299 int idx_word = 3;
3300 rip_distance_set(vty, argv[idx_number]->arg,
3301 argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg);
3302 return CMD_SUCCESS;
3303 }
3304
3305 DEFUN (no_rip_distance_source_access_list,
3306 no_rip_distance_source_access_list_cmd,
3307 "no distance (1-255) A.B.C.D/M WORD",
3308 NO_STR
3309 "Administrative distance\n"
3310 "Distance value\n"
3311 "IP source prefix\n"
3312 "Access list name\n")
3313 {
3314 int idx_number = 2;
3315 int idx_ipv4_prefixlen = 3;
3316 int idx_word = 4;
3317 rip_distance_unset(vty, argv[idx_number]->arg,
3318 argv[idx_ipv4_prefixlen]->arg, argv[idx_word]->arg);
3319 return CMD_SUCCESS;
3320 }
3321
3322 /* Update ECMP routes to zebra when ECMP is disabled. */
3323 static void rip_ecmp_disable(void)
3324 {
3325 struct route_node *rp;
3326 struct rip_info *rinfo, *tmp_rinfo;
3327 struct list *list;
3328 struct listnode *node, *nextnode;
3329
3330 if (!rip)
3331 return;
3332
3333 for (rp = route_top(rip->table); rp; rp = route_next(rp))
3334 if ((list = rp->info) != NULL && listcount(list) > 1) {
3335 rinfo = listgetdata(listhead(list));
3336 if (!rip_route_rte(rinfo))
3337 continue;
3338
3339 /* Drop all other entries, except the first one. */
3340 for (ALL_LIST_ELEMENTS(list, node, nextnode, tmp_rinfo))
3341 if (tmp_rinfo != rinfo) {
3342 RIP_TIMER_OFF(tmp_rinfo->t_timeout);
3343 RIP_TIMER_OFF(
3344 tmp_rinfo->t_garbage_collect);
3345 list_delete_node(list, node);
3346 rip_info_free(tmp_rinfo);
3347 }
3348
3349 /* Update zebra. */
3350 rip_zebra_ipv4_add(rp);
3351
3352 /* Set the route change flag. */
3353 SET_FLAG(rinfo->flags, RIP_RTF_CHANGED);
3354
3355 /* Signal the output process to trigger an update. */
3356 rip_event(RIP_TRIGGERED_UPDATE, 0);
3357 }
3358 }
3359
3360 DEFUN (rip_allow_ecmp,
3361 rip_allow_ecmp_cmd,
3362 "allow-ecmp",
3363 "Allow Equal Cost MultiPath\n")
3364 {
3365 if (rip->ecmp) {
3366 vty_out(vty, "ECMP is already enabled.\n");
3367 return CMD_WARNING;
3368 }
3369
3370 rip->ecmp = 1;
3371 zlog_info("ECMP is enabled.");
3372 return CMD_SUCCESS;
3373 }
3374
3375 DEFUN (no_rip_allow_ecmp,
3376 no_rip_allow_ecmp_cmd,
3377 "no allow-ecmp",
3378 NO_STR
3379 "Allow Equal Cost MultiPath\n")
3380 {
3381 if (!rip->ecmp) {
3382 vty_out(vty, "ECMP is already disabled.\n");
3383 return CMD_WARNING;
3384 }
3385
3386 rip->ecmp = 0;
3387 zlog_info("ECMP is disabled.");
3388 rip_ecmp_disable();
3389 return CMD_SUCCESS;
3390 }
3391
3392 /* Print out routes update time. */
3393 static void rip_vty_out_uptime(struct vty *vty, struct rip_info *rinfo)
3394 {
3395 time_t clock;
3396 struct tm *tm;
3397 #define TIME_BUF 25
3398 char timebuf[TIME_BUF];
3399 struct thread *thread;
3400
3401 if ((thread = rinfo->t_timeout) != NULL) {
3402 clock = thread_timer_remain_second(thread);
3403 tm = gmtime(&clock);
3404 strftime(timebuf, TIME_BUF, "%M:%S", tm);
3405 vty_out(vty, "%5s", timebuf);
3406 } else if ((thread = rinfo->t_garbage_collect) != NULL) {
3407 clock = thread_timer_remain_second(thread);
3408 tm = gmtime(&clock);
3409 strftime(timebuf, TIME_BUF, "%M:%S", tm);
3410 vty_out(vty, "%5s", timebuf);
3411 }
3412 }
3413
3414 static const char *rip_route_type_print(int sub_type)
3415 {
3416 switch (sub_type) {
3417 case RIP_ROUTE_RTE:
3418 return "n";
3419 case RIP_ROUTE_STATIC:
3420 return "s";
3421 case RIP_ROUTE_DEFAULT:
3422 return "d";
3423 case RIP_ROUTE_REDISTRIBUTE:
3424 return "r";
3425 case RIP_ROUTE_INTERFACE:
3426 return "i";
3427 default:
3428 return "?";
3429 }
3430 }
3431
3432 DEFUN (show_ip_rip,
3433 show_ip_rip_cmd,
3434 "show ip rip",
3435 SHOW_STR
3436 IP_STR
3437 "Show RIP routes\n")
3438 {
3439 struct route_node *np;
3440 struct rip_info *rinfo = NULL;
3441 struct list *list = NULL;
3442 struct listnode *listnode = NULL;
3443
3444 if (!rip)
3445 return CMD_SUCCESS;
3446
3447 vty_out(vty,
3448 "Codes: R - RIP, C - connected, S - Static, O - OSPF, B - BGP\n"
3449 "Sub-codes:\n"
3450 " (n) - normal, (s) - static, (d) - default, (r) - redistribute,\n"
3451 " (i) - interface\n\n"
3452 " Network Next Hop Metric From Tag Time\n");
3453
3454 for (np = route_top(rip->table); np; np = route_next(np))
3455 if ((list = np->info) != NULL)
3456 for (ALL_LIST_ELEMENTS_RO(list, listnode, rinfo)) {
3457 int len;
3458
3459 len = vty_out(
3460 vty, "%c(%s) %s/%d",
3461 /* np->lock, For debugging. */
3462 zebra_route_char(rinfo->type),
3463 rip_route_type_print(rinfo->sub_type),
3464 inet_ntoa(np->p.u.prefix4),
3465 np->p.prefixlen);
3466
3467 len = 24 - len;
3468
3469 if (len > 0)
3470 vty_out(vty, "%*s", len, " ");
3471
3472 switch (rinfo->nh.type) {
3473 case NEXTHOP_TYPE_IPV4:
3474 case NEXTHOP_TYPE_IPV4_IFINDEX:
3475 vty_out(vty, "%-20s %2d ",
3476 inet_ntoa(rinfo->nh.gate.ipv4),
3477 rinfo->metric);
3478 break;
3479 case NEXTHOP_TYPE_IFINDEX:
3480 vty_out(vty,
3481 "0.0.0.0 %2d ",
3482 rinfo->metric);
3483 break;
3484 case NEXTHOP_TYPE_BLACKHOLE:
3485 vty_out(vty,
3486 "blackhole %2d ",
3487 rinfo->metric);
3488 break;
3489 case NEXTHOP_TYPE_IPV6:
3490 case NEXTHOP_TYPE_IPV6_IFINDEX:
3491 vty_out(vty,
3492 "V6 Address Hidden %2d ",
3493 rinfo->metric);
3494 break;
3495 }
3496
3497 /* Route which exist in kernel routing table. */
3498 if ((rinfo->type == ZEBRA_ROUTE_RIP)
3499 && (rinfo->sub_type == RIP_ROUTE_RTE)) {
3500 vty_out(vty, "%-15s ",
3501 inet_ntoa(rinfo->from));
3502 vty_out(vty, "%3" ROUTE_TAG_PRI " ",
3503 (route_tag_t)rinfo->tag);
3504 rip_vty_out_uptime(vty, rinfo);
3505 } else if (rinfo->metric
3506 == RIP_METRIC_INFINITY) {
3507 vty_out(vty, "self ");
3508 vty_out(vty, "%3" ROUTE_TAG_PRI " ",
3509 (route_tag_t)rinfo->tag);
3510 rip_vty_out_uptime(vty, rinfo);
3511 } else {
3512 if (rinfo->external_metric) {
3513 len = vty_out(
3514 vty, "self (%s:%d)",
3515 zebra_route_string(
3516 rinfo->type),
3517 rinfo->external_metric);
3518 len = 16 - len;
3519 if (len > 0)
3520 vty_out(vty, "%*s", len,
3521 " ");
3522 } else
3523 vty_out(vty,
3524 "self ");
3525 vty_out(vty, "%3" ROUTE_TAG_PRI,
3526 (route_tag_t)rinfo->tag);
3527 }
3528
3529 vty_out(vty, "\n");
3530 }
3531 return CMD_SUCCESS;
3532 }
3533
3534 /* Vincent: formerly, it was show_ip_protocols_rip: "show ip protocols" */
3535 DEFUN (show_ip_rip_status,
3536 show_ip_rip_status_cmd,
3537 "show ip rip status",
3538 SHOW_STR
3539 IP_STR
3540 "Show RIP routes\n"
3541 "IP routing protocol process parameters and statistics\n")
3542 {
3543 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
3544 struct interface *ifp;
3545 struct rip_interface *ri;
3546 extern const struct message ri_version_msg[];
3547 const char *send_version;
3548 const char *receive_version;
3549
3550 if (!rip)
3551 return CMD_SUCCESS;
3552
3553 vty_out(vty, "Routing Protocol is \"rip\"\n");
3554 vty_out(vty, " Sending updates every %ld seconds with +/-50%%,",
3555 rip->update_time);
3556 vty_out(vty, " next due in %lu seconds\n",
3557 thread_timer_remain_second(rip->t_update));
3558 vty_out(vty, " Timeout after %ld seconds,", rip->timeout_time);
3559 vty_out(vty, " garbage collect after %ld seconds\n", rip->garbage_time);
3560
3561 /* Filtering status show. */
3562 config_show_distribute(vty);
3563
3564 /* Default metric information. */
3565 vty_out(vty, " Default redistribution metric is %d\n",
3566 rip->default_metric);
3567
3568 /* Redistribute information. */
3569 vty_out(vty, " Redistributing:");
3570 config_write_rip_redistribute(vty, 0);
3571 vty_out(vty, "\n");
3572
3573 vty_out(vty, " Default version control: send version %s,",
3574 lookup_msg(ri_version_msg, rip->version_send, NULL));
3575 if (rip->version_recv == RI_RIP_VERSION_1_AND_2)
3576 vty_out(vty, " receive any version \n");
3577 else
3578 vty_out(vty, " receive version %s \n",
3579 lookup_msg(ri_version_msg, rip->version_recv, NULL));
3580
3581 vty_out(vty, " Interface Send Recv Key-chain\n");
3582
3583 FOR_ALL_INTERFACES (vrf, ifp) {
3584 ri = ifp->info;
3585
3586 if (!ri->running)
3587 continue;
3588
3589 if (ri->enable_network || ri->enable_interface) {
3590 if (ri->ri_send == RI_RIP_UNSPEC)
3591 send_version =
3592 lookup_msg(ri_version_msg,
3593 rip->version_send, NULL);
3594 else
3595 send_version = lookup_msg(ri_version_msg,
3596 ri->ri_send, NULL);
3597
3598 if (ri->ri_receive == RI_RIP_UNSPEC)
3599 receive_version =
3600 lookup_msg(ri_version_msg,
3601 rip->version_recv, NULL);
3602 else
3603 receive_version = lookup_msg(
3604 ri_version_msg, ri->ri_receive, NULL);
3605
3606 vty_out(vty, " %-17s%-3s %-3s %s\n", ifp->name,
3607 send_version, receive_version,
3608 ri->key_chain ? ri->key_chain : "");
3609 }
3610 }
3611
3612 vty_out(vty, " Routing for Networks:\n");
3613 config_write_rip_network(vty, 0);
3614
3615 {
3616 int found_passive = 0;
3617 FOR_ALL_INTERFACES (vrf, ifp) {
3618 ri = ifp->info;
3619
3620 if ((ri->enable_network || ri->enable_interface)
3621 && ri->passive) {
3622 if (!found_passive) {
3623 vty_out(vty,
3624 " Passive Interface(s):\n");
3625 found_passive = 1;
3626 }
3627 vty_out(vty, " %s\n", ifp->name);
3628 }
3629 }
3630 }
3631
3632 vty_out(vty, " Routing Information Sources:\n");
3633 vty_out(vty,
3634 " Gateway BadPackets BadRoutes Distance Last Update\n");
3635 rip_peer_display(vty);
3636
3637 rip_distance_show(vty);
3638
3639 return CMD_SUCCESS;
3640 }
3641
3642 /* RIP configuration write function. */
3643 static int config_write_rip(struct vty *vty)
3644 {
3645 int write = 0;
3646 struct route_node *rn;
3647 struct rip_distance *rdistance;
3648
3649 if (rip) {
3650 /* Router RIP statement. */
3651 vty_out(vty, "router rip\n");
3652 write++;
3653
3654 /* RIP version statement. Default is RIP version 2. */
3655 if (rip->version_send != RI_RIP_VERSION_2
3656 || rip->version_recv != RI_RIP_VERSION_1_AND_2)
3657 vty_out(vty, " version %d\n", rip->version_send);
3658
3659 /* RIP timer configuration. */
3660 if (rip->update_time != RIP_UPDATE_TIMER_DEFAULT
3661 || rip->timeout_time != RIP_TIMEOUT_TIMER_DEFAULT
3662 || rip->garbage_time != RIP_GARBAGE_TIMER_DEFAULT)
3663 vty_out(vty, " timers basic %lu %lu %lu\n",
3664 rip->update_time, rip->timeout_time,
3665 rip->garbage_time);
3666
3667 /* Default information configuration. */
3668 if (rip->default_information) {
3669 if (rip->default_information_route_map)
3670 vty_out(vty,
3671 " default-information originate route-map %s\n",
3672 rip->default_information_route_map);
3673 else
3674 vty_out(vty,
3675 " default-information originate\n");
3676 }
3677
3678 /* Redistribute configuration. */
3679 config_write_rip_redistribute(vty, 1);
3680
3681 /* RIP offset-list configuration. */
3682 config_write_rip_offset_list(vty);
3683
3684 /* RIP enabled network and interface configuration. */
3685 config_write_rip_network(vty, 1);
3686
3687 /* RIP default metric configuration */
3688 if (rip->default_metric != RIP_DEFAULT_METRIC_DEFAULT)
3689 vty_out(vty, " default-metric %d\n",
3690 rip->default_metric);
3691
3692 /* Distribute configuration. */
3693 write += config_write_distribute(vty);
3694
3695 /* Interface routemap configuration */
3696 write += config_write_if_rmap(vty);
3697
3698 /* Distance configuration. */
3699 if (rip->distance)
3700 vty_out(vty, " distance %d\n", rip->distance);
3701
3702 /* RIP source IP prefix distance configuration. */
3703 for (rn = route_top(rip_distance_table); rn;
3704 rn = route_next(rn))
3705 if ((rdistance = rn->info) != NULL)
3706 vty_out(vty, " distance %d %s/%d %s\n",
3707 rdistance->distance,
3708 inet_ntoa(rn->p.u.prefix4),
3709 rn->p.prefixlen,
3710 rdistance->access_list
3711 ? rdistance->access_list
3712 : "");
3713
3714 /* ECMP configuration. */
3715 if (rip->ecmp)
3716 vty_out(vty, " allow-ecmp\n");
3717
3718 /* RIP static route configuration. */
3719 for (rn = route_top(rip->route); rn; rn = route_next(rn))
3720 if (rn->info)
3721 vty_out(vty, " route %s/%d\n",
3722 inet_ntoa(rn->p.u.prefix4),
3723 rn->p.prefixlen);
3724 }
3725 return write;
3726 }
3727
3728 /* RIP node structure. */
3729 static struct cmd_node rip_node = {RIP_NODE, "%s(config-router)# ", 1};
3730
3731 /* Distribute-list update functions. */
3732 static void rip_distribute_update(struct distribute *dist)
3733 {
3734 struct interface *ifp;
3735 struct rip_interface *ri;
3736 struct access_list *alist;
3737 struct prefix_list *plist;
3738
3739 if (!dist->ifname)
3740 return;
3741
3742 ifp = if_lookup_by_name(dist->ifname, VRF_DEFAULT);
3743 if (ifp == NULL)
3744 return;
3745
3746 ri = ifp->info;
3747
3748 if (dist->list[DISTRIBUTE_V4_IN]) {
3749 alist = access_list_lookup(AFI_IP,
3750 dist->list[DISTRIBUTE_V4_IN]);
3751 if (alist)
3752 ri->list[RIP_FILTER_IN] = alist;
3753 else
3754 ri->list[RIP_FILTER_IN] = NULL;
3755 } else
3756 ri->list[RIP_FILTER_IN] = NULL;
3757
3758 if (dist->list[DISTRIBUTE_V4_OUT]) {
3759 alist = access_list_lookup(AFI_IP,
3760 dist->list[DISTRIBUTE_V4_OUT]);
3761 if (alist)
3762 ri->list[RIP_FILTER_OUT] = alist;
3763 else
3764 ri->list[RIP_FILTER_OUT] = NULL;
3765 } else
3766 ri->list[RIP_FILTER_OUT] = NULL;
3767
3768 if (dist->prefix[DISTRIBUTE_V4_IN]) {
3769 plist = prefix_list_lookup(AFI_IP,
3770 dist->prefix[DISTRIBUTE_V4_IN]);
3771 if (plist)
3772 ri->prefix[RIP_FILTER_IN] = plist;
3773 else
3774 ri->prefix[RIP_FILTER_IN] = NULL;
3775 } else
3776 ri->prefix[RIP_FILTER_IN] = NULL;
3777
3778 if (dist->prefix[DISTRIBUTE_V4_OUT]) {
3779 plist = prefix_list_lookup(AFI_IP,
3780 dist->prefix[DISTRIBUTE_V4_OUT]);
3781 if (plist)
3782 ri->prefix[RIP_FILTER_OUT] = plist;
3783 else
3784 ri->prefix[RIP_FILTER_OUT] = NULL;
3785 } else
3786 ri->prefix[RIP_FILTER_OUT] = NULL;
3787 }
3788
3789 void rip_distribute_update_interface(struct interface *ifp)
3790 {
3791 struct distribute *dist;
3792
3793 dist = distribute_lookup(ifp->name);
3794 if (dist)
3795 rip_distribute_update(dist);
3796 }
3797
3798 /* Update all interface's distribute list. */
3799 /* ARGSUSED */
3800 static void rip_distribute_update_all(struct prefix_list *notused)
3801 {
3802 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
3803 struct interface *ifp;
3804
3805 FOR_ALL_INTERFACES (vrf, ifp)
3806 rip_distribute_update_interface(ifp);
3807 }
3808 /* ARGSUSED */
3809 static void rip_distribute_update_all_wrapper(struct access_list *notused)
3810 {
3811 rip_distribute_update_all(NULL);
3812 }
3813
3814 /* Delete all added rip route. */
3815 void rip_clean(void)
3816 {
3817 int i;
3818 struct route_node *rp;
3819 struct rip_info *rinfo = NULL;
3820 struct list *list = NULL;
3821 struct listnode *listnode = NULL;
3822
3823 if (rip) {
3824 QOBJ_UNREG(rip);
3825
3826 /* Clear RIP routes */
3827 for (rp = route_top(rip->table); rp; rp = route_next(rp))
3828 if ((list = rp->info) != NULL) {
3829 rinfo = listgetdata(listhead(list));
3830 if (rip_route_rte(rinfo))
3831 rip_zebra_ipv4_delete(rp);
3832
3833 for (ALL_LIST_ELEMENTS_RO(list, listnode,
3834 rinfo)) {
3835 RIP_TIMER_OFF(rinfo->t_timeout);
3836 RIP_TIMER_OFF(rinfo->t_garbage_collect);
3837 rip_info_free(rinfo);
3838 }
3839 list_delete_and_null(&list);
3840 rp->info = NULL;
3841 route_unlock_node(rp);
3842 }
3843
3844 /* Cancel RIP related timers. */
3845 RIP_TIMER_OFF(rip->t_update);
3846 RIP_TIMER_OFF(rip->t_triggered_update);
3847 RIP_TIMER_OFF(rip->t_triggered_interval);
3848
3849 /* Cancel read thread. */
3850 THREAD_READ_OFF(rip->t_read);
3851
3852 /* Close RIP socket. */
3853 if (rip->sock >= 0) {
3854 close(rip->sock);
3855 rip->sock = -1;
3856 }
3857
3858 stream_free(rip->obuf);
3859 /* Static RIP route configuration. */
3860 for (rp = route_top(rip->route); rp; rp = route_next(rp))
3861 if (rp->info) {
3862 rp->info = NULL;
3863 route_unlock_node(rp);
3864 }
3865
3866 /* RIP neighbor configuration. */
3867 for (rp = route_top(rip->neighbor); rp; rp = route_next(rp))
3868 if (rp->info) {
3869 rp->info = NULL;
3870 route_unlock_node(rp);
3871 }
3872
3873 /* Redistribute related clear. */
3874 if (rip->default_information_route_map)
3875 free(rip->default_information_route_map);
3876
3877 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
3878 if (rip->route_map[i].name)
3879 free(rip->route_map[i].name);
3880
3881 XFREE(MTYPE_ROUTE_TABLE, rip->table);
3882 XFREE(MTYPE_ROUTE_TABLE, rip->route);
3883 XFREE(MTYPE_ROUTE_TABLE, rip->neighbor);
3884
3885 XFREE(MTYPE_RIP, rip);
3886 rip = NULL;
3887 }
3888
3889 rip_clean_network();
3890 rip_passive_nondefault_clean();
3891 rip_offset_clean();
3892 rip_interfaces_clean();
3893 rip_distance_reset();
3894 rip_redistribute_clean();
3895 }
3896
3897 /* Reset all values to the default settings. */
3898 void rip_reset(void)
3899 {
3900 /* Reset global counters. */
3901 rip_global_route_changes = 0;
3902 rip_global_queries = 0;
3903
3904 /* Call ripd related reset functions. */
3905 rip_debug_reset();
3906 rip_route_map_reset();
3907
3908 /* Call library reset functions. */
3909 vty_reset();
3910 access_list_reset();
3911 prefix_list_reset();
3912
3913 distribute_list_reset();
3914
3915 rip_interfaces_reset();
3916 rip_distance_reset();
3917
3918 rip_zclient_reset();
3919 }
3920
3921 static void rip_if_rmap_update(struct if_rmap *if_rmap)
3922 {
3923 struct interface *ifp;
3924 struct rip_interface *ri;
3925 struct route_map *rmap;
3926
3927 ifp = if_lookup_by_name(if_rmap->ifname, VRF_DEFAULT);
3928 if (ifp == NULL)
3929 return;
3930
3931 ri = ifp->info;
3932
3933 if (if_rmap->routemap[IF_RMAP_IN]) {
3934 rmap = route_map_lookup_by_name(if_rmap->routemap[IF_RMAP_IN]);
3935 if (rmap)
3936 ri->routemap[IF_RMAP_IN] = rmap;
3937 else
3938 ri->routemap[IF_RMAP_IN] = NULL;
3939 } else
3940 ri->routemap[RIP_FILTER_IN] = NULL;
3941
3942 if (if_rmap->routemap[IF_RMAP_OUT]) {
3943 rmap = route_map_lookup_by_name(if_rmap->routemap[IF_RMAP_OUT]);
3944 if (rmap)
3945 ri->routemap[IF_RMAP_OUT] = rmap;
3946 else
3947 ri->routemap[IF_RMAP_OUT] = NULL;
3948 } else
3949 ri->routemap[RIP_FILTER_OUT] = NULL;
3950 }
3951
3952 void rip_if_rmap_update_interface(struct interface *ifp)
3953 {
3954 struct if_rmap *if_rmap;
3955
3956 if_rmap = if_rmap_lookup(ifp->name);
3957 if (if_rmap)
3958 rip_if_rmap_update(if_rmap);
3959 }
3960
3961 static void rip_routemap_update_redistribute(void)
3962 {
3963 int i;
3964
3965 if (rip) {
3966 for (i = 0; i < ZEBRA_ROUTE_MAX; i++) {
3967 if (rip->route_map[i].name)
3968 rip->route_map[i].map =
3969 route_map_lookup_by_name(
3970 rip->route_map[i].name);
3971 }
3972 }
3973 }
3974
3975 /* ARGSUSED */
3976 static void rip_routemap_update(const char *notused)
3977 {
3978 struct vrf *vrf = vrf_lookup_by_id(VRF_DEFAULT);
3979 struct interface *ifp;
3980
3981 FOR_ALL_INTERFACES (vrf, ifp)
3982 rip_if_rmap_update_interface(ifp);
3983
3984 rip_routemap_update_redistribute();
3985 }
3986
3987 /* Allocate new rip structure and set default value. */
3988 void rip_init(void)
3989 {
3990 /* Install top nodes. */
3991 install_node(&rip_node, config_write_rip);
3992
3993 /* Install rip commands. */
3994 install_element(VIEW_NODE, &show_ip_rip_cmd);
3995 install_element(VIEW_NODE, &show_ip_rip_status_cmd);
3996 install_element(CONFIG_NODE, &router_rip_cmd);
3997 install_element(CONFIG_NODE, &no_router_rip_cmd);
3998
3999 install_default(RIP_NODE);
4000 install_element(RIP_NODE, &rip_version_cmd);
4001 install_element(RIP_NODE, &no_rip_version_cmd);
4002 install_element(RIP_NODE, &rip_default_metric_cmd);
4003 install_element(RIP_NODE, &no_rip_default_metric_cmd);
4004 install_element(RIP_NODE, &rip_timers_cmd);
4005 install_element(RIP_NODE, &no_rip_timers_cmd);
4006 install_element(RIP_NODE, &rip_route_cmd);
4007 install_element(RIP_NODE, &no_rip_route_cmd);
4008 install_element(RIP_NODE, &rip_distance_cmd);
4009 install_element(RIP_NODE, &no_rip_distance_cmd);
4010 install_element(RIP_NODE, &rip_distance_source_cmd);
4011 install_element(RIP_NODE, &no_rip_distance_source_cmd);
4012 install_element(RIP_NODE, &rip_distance_source_access_list_cmd);
4013 install_element(RIP_NODE, &no_rip_distance_source_access_list_cmd);
4014 install_element(RIP_NODE, &rip_allow_ecmp_cmd);
4015 install_element(RIP_NODE, &no_rip_allow_ecmp_cmd);
4016
4017 /* Debug related init. */
4018 rip_debug_init();
4019
4020 /* Access list install. */
4021 access_list_init();
4022 access_list_add_hook(rip_distribute_update_all_wrapper);
4023 access_list_delete_hook(rip_distribute_update_all_wrapper);
4024
4025 /* Prefix list initialize.*/
4026 prefix_list_init();
4027 prefix_list_add_hook(rip_distribute_update_all);
4028 prefix_list_delete_hook(rip_distribute_update_all);
4029
4030 /* Distribute list install. */
4031 distribute_list_init(RIP_NODE);
4032 distribute_list_add_hook(rip_distribute_update);
4033 distribute_list_delete_hook(rip_distribute_update);
4034
4035 /* Route-map */
4036 rip_route_map_init();
4037 rip_offset_init();
4038
4039 route_map_add_hook(rip_routemap_update);
4040 route_map_delete_hook(rip_routemap_update);
4041
4042 if_rmap_init(RIP_NODE);
4043 if_rmap_hook_add(rip_if_rmap_update);
4044 if_rmap_hook_delete(rip_if_rmap_update);
4045
4046 /* Distance control. */
4047 rip_distance_table = route_table_init();
4048 }