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