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>
5 * This file is part of GNU Zebra.
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
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.
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING. If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
34 #include "sockunion.h"
39 #include "distribute.h"
44 #include "ripd/ripd.h"
45 #include "ripd/rip_debug.h"
47 /* UDP receive buffer size */
48 #define RIP_UDP_RCV_BUF 41600
50 /* privileges global */
51 extern struct zebra_privs_t ripd_privs;
54 struct rip *rip = NULL;
56 /* RIP neighbor address table. */
57 struct route_table *rip_neighbor_table;
59 /* RIP route changes. */
60 long rip_global_route_changes = 0;
63 long rip_global_queries = 0;
66 static void rip_event (enum rip_event, int);
67 static void rip_output_process (struct connected *, struct sockaddr_in *, int, u_char);
68 static int rip_triggered_update (struct thread *);
69 static int rip_update_jitter (unsigned long);
71 /* RIP output routes type. */
78 /* RIP command strings. */
79 static const struct message rip_msg[] =
81 {RIP_REQUEST, "REQUEST"},
82 {RIP_RESPONSE, "RESPONSE"},
83 {RIP_TRACEON, "TRACEON"},
84 {RIP_TRACEOFF, "TRACEOFF"},
86 {RIP_POLL_ENTRY, "POLL ENTRY"},
90 /* Utility function to set boradcast option to the socket. */
92 sockopt_broadcast (int sock)
97 ret = setsockopt (sock, SOL_SOCKET, SO_BROADCAST, (char *) &on, sizeof on);
100 zlog_warn ("can't set sockopt SO_BROADCAST to socket %d", sock);
107 rip_route_rte (struct rip_info *rinfo)
109 return (rinfo->type == ZEBRA_ROUTE_RIP && rinfo->sub_type == RIP_ROUTE_RTE);
112 static struct rip_info *
115 return XCALLOC (MTYPE_RIP_INFO, sizeof (struct rip_info));
119 rip_info_free (struct rip_info *rinfo)
121 XFREE (MTYPE_RIP_INFO, rinfo);
124 /* RIP route garbage collect timer. */
126 rip_garbage_collect (struct thread *t)
128 struct rip_info *rinfo;
129 struct route_node *rp;
131 rinfo = THREAD_ARG (t);
132 rinfo->t_garbage_collect = NULL;
134 /* Off timeout timer. */
135 RIP_TIMER_OFF (rinfo->t_timeout);
137 /* Get route_node pointer. */
140 /* Unlock route_node. */
141 listnode_delete (rp->info, rinfo);
142 if (list_isempty ((struct list *)rp->info))
144 list_free (rp->info);
146 route_unlock_node (rp);
149 /* Free RIP routing information. */
150 rip_info_free (rinfo);
155 static void rip_timeout_update (struct rip_info *rinfo);
157 /* Add new route to the ECMP list.
158 * RETURN: the new entry added in the list, or NULL if it is not the first
159 * entry and ECMP is not allowed.
162 rip_ecmp_add (struct rip_info *rinfo_new)
164 struct route_node *rp = rinfo_new->rp;
165 struct rip_info *rinfo = NULL;
166 struct list *list = NULL;
168 if (rp->info == NULL)
169 rp->info = list_new ();
170 list = (struct list *)rp->info;
172 /* If ECMP is not allowed and some entry already exists in the list,
174 if (listcount (list) && !rip->ecmp)
177 rinfo = rip_info_new ();
178 memcpy (rinfo, rinfo_new, sizeof (struct rip_info));
179 listnode_add (list, rinfo);
181 if (rip_route_rte (rinfo))
183 rip_timeout_update (rinfo);
184 rip_zebra_ipv4_add (rp);
187 /* Set the route change flag on the first entry. */
188 rinfo = listgetdata (listhead (list));
189 SET_FLAG (rinfo->flags, RIP_RTF_CHANGED);
191 /* Signal the output process to trigger an update (see section 2.5). */
192 rip_event (RIP_TRIGGERED_UPDATE, 0);
197 /* Replace the ECMP list with the new route.
198 * RETURN: the new entry added in the list
201 rip_ecmp_replace (struct rip_info *rinfo_new)
203 struct route_node *rp = rinfo_new->rp;
204 struct list *list = (struct list *)rp->info;
205 struct rip_info *rinfo = NULL, *tmp_rinfo = NULL;
206 struct listnode *node = NULL, *nextnode = NULL;
208 if (list == NULL || listcount (list) == 0)
209 return rip_ecmp_add (rinfo_new);
211 /* Get the first entry */
212 rinfo = listgetdata (listhead (list));
214 /* Learnt route replaced by a local one. Delete it from zebra. */
215 if (rip_route_rte (rinfo) && !rip_route_rte (rinfo_new))
216 if (CHECK_FLAG (rinfo->flags, RIP_RTF_FIB))
217 rip_zebra_ipv4_delete (rp);
219 /* Re-use the first entry, and delete the others. */
220 for (ALL_LIST_ELEMENTS (list, node, nextnode, tmp_rinfo))
221 if (tmp_rinfo != rinfo)
223 RIP_TIMER_OFF (tmp_rinfo->t_timeout);
224 RIP_TIMER_OFF (tmp_rinfo->t_garbage_collect);
225 list_delete_node (list, node);
226 rip_info_free (tmp_rinfo);
229 RIP_TIMER_OFF (rinfo->t_timeout);
230 RIP_TIMER_OFF (rinfo->t_garbage_collect);
231 memcpy (rinfo, rinfo_new, sizeof (struct rip_info));
233 if (rip_route_rte (rinfo))
235 rip_timeout_update (rinfo);
236 /* The ADD message implies an update. */
237 rip_zebra_ipv4_add (rp);
240 /* Set the route change flag. */
241 SET_FLAG (rinfo->flags, RIP_RTF_CHANGED);
243 /* Signal the output process to trigger an update (see section 2.5). */
244 rip_event (RIP_TRIGGERED_UPDATE, 0);
249 /* Delete one route from the ECMP list.
251 * null - the entry is freed, and other entries exist in the list
252 * the entry - the entry is the last one in the list; its metric is set
253 * to INFINITY, and the garbage collector is started for it
256 rip_ecmp_delete (struct rip_info *rinfo)
258 struct route_node *rp = rinfo->rp;
259 struct list *list = (struct list *)rp->info;
261 RIP_TIMER_OFF (rinfo->t_timeout);
263 if (listcount (list) > 1)
265 /* Some other ECMP entries still exist. Just delete this entry. */
266 RIP_TIMER_OFF (rinfo->t_garbage_collect);
267 listnode_delete (list, rinfo);
268 if (rip_route_rte (rinfo) && CHECK_FLAG (rinfo->flags, RIP_RTF_FIB))
269 /* The ADD message implies the update. */
270 rip_zebra_ipv4_add (rp);
271 rip_info_free (rinfo);
276 assert (rinfo == listgetdata (listhead (list)));
278 /* This is the only entry left in the list. We must keep it in
279 * the list for garbage collection time, with INFINITY metric. */
281 rinfo->metric = RIP_METRIC_INFINITY;
282 RIP_TIMER_ON (rinfo->t_garbage_collect,
283 rip_garbage_collect, rip->garbage_time);
285 if (rip_route_rte (rinfo) && CHECK_FLAG (rinfo->flags, RIP_RTF_FIB))
286 rip_zebra_ipv4_delete (rp);
289 /* Set the route change flag on the first entry. */
290 rinfo = listgetdata (listhead (list));
291 SET_FLAG (rinfo->flags, RIP_RTF_CHANGED);
293 /* Signal the output process to trigger an update (see section 2.5). */
294 rip_event (RIP_TRIGGERED_UPDATE, 0);
299 /* Timeout RIP routes. */
301 rip_timeout (struct thread *t)
303 rip_ecmp_delete ((struct rip_info *)THREAD_ARG (t));
308 rip_timeout_update (struct rip_info *rinfo)
310 if (rinfo->metric != RIP_METRIC_INFINITY)
312 RIP_TIMER_OFF (rinfo->t_timeout);
313 RIP_TIMER_ON (rinfo->t_timeout, rip_timeout, rip->timeout_time);
318 rip_filter (int rip_distribute, struct prefix_ipv4 *p, struct rip_interface *ri)
320 struct distribute *dist;
321 struct access_list *alist;
322 struct prefix_list *plist;
323 int distribute = rip_distribute == RIP_FILTER_OUT ?
324 DISTRIBUTE_V4_OUT : DISTRIBUTE_V4_IN;
325 const char *inout = rip_distribute == RIP_FILTER_OUT ? "out" : "in";
327 /* Input distribute-list filtering. */
328 if (ri->list[rip_distribute])
330 if (access_list_apply (ri->list[rip_distribute],
331 (struct prefix *) p) == FILTER_DENY)
333 if (IS_RIP_DEBUG_PACKET)
334 zlog_debug ("%s/%d filtered by distribute %s",
335 inet_ntoa (p->prefix), p->prefixlen, inout);
339 if (ri->prefix[rip_distribute])
341 if (prefix_list_apply (ri->prefix[rip_distribute],
342 (struct prefix *) p) == PREFIX_DENY)
344 if (IS_RIP_DEBUG_PACKET)
345 zlog_debug ("%s/%d filtered by prefix-list %s",
346 inet_ntoa (p->prefix), p->prefixlen, inout);
351 /* All interface filter check. */
352 dist = distribute_lookup (NULL);
355 if (dist->list[distribute])
357 alist = access_list_lookup (AFI_IP, dist->list[distribute]);
361 if (access_list_apply (alist, (struct prefix *) p) == FILTER_DENY)
363 if (IS_RIP_DEBUG_PACKET)
364 zlog_debug ("%s/%d filtered by distribute %s",
365 inet_ntoa (p->prefix), p->prefixlen, inout);
370 if (dist->prefix[distribute])
372 plist = prefix_list_lookup (AFI_IP, dist->prefix[distribute]);
376 if (prefix_list_apply (plist,
377 (struct prefix *) p) == PREFIX_DENY)
379 if (IS_RIP_DEBUG_PACKET)
380 zlog_debug ("%s/%d filtered by prefix-list %s",
381 inet_ntoa (p->prefix), p->prefixlen, inout);
390 /* Check nexthop address validity. */
392 rip_nexthop_check (struct in_addr *addr)
394 struct listnode *node;
395 struct listnode *cnode;
396 struct interface *ifp;
397 struct connected *ifc;
400 /* If nexthop address matches local configured address then it is
402 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
404 for (ALL_LIST_ELEMENTS_RO (ifp->connected, cnode, ifc))
408 if (p->family == AF_INET
409 && IPV4_ADDR_SAME (&p->u.prefix4, addr))
416 /* RIP add route to routing table. */
418 rip_rte_process (struct rte *rte, struct sockaddr_in *from,
419 struct interface *ifp)
422 struct prefix_ipv4 p;
423 struct route_node *rp;
424 struct rip_info *rinfo = NULL, newinfo;
425 struct rip_interface *ri;
426 struct in_addr *nexthop;
428 unsigned char old_dist, new_dist;
429 struct list *list = NULL;
430 struct listnode *node = NULL;
432 /* Make prefix structure. */
433 memset (&p, 0, sizeof (struct prefix_ipv4));
435 p.prefix = rte->prefix;
436 p.prefixlen = ip_masklen (rte->mask);
438 /* Make sure mask is applied. */
439 apply_mask_ipv4 (&p);
441 /* Apply input filters. */
444 ret = rip_filter (RIP_FILTER_IN, &p, ri);
448 memset (&newinfo, 0, sizeof (newinfo));
449 newinfo.type = ZEBRA_ROUTE_RIP;
450 newinfo.sub_type = RIP_ROUTE_RTE;
451 newinfo.nexthop = rte->nexthop;
452 newinfo.from = from->sin_addr;
453 newinfo.ifindex = ifp->ifindex;
454 newinfo.metric = rte->metric;
455 newinfo.metric_out = rte->metric; /* XXX */
456 newinfo.tag = ntohs (rte->tag); /* XXX */
458 /* Modify entry according to the interface routemap. */
459 if (ri->routemap[RIP_FILTER_IN])
463 /* The object should be of the type of rip_info */
464 ret = route_map_apply (ri->routemap[RIP_FILTER_IN],
465 (struct prefix *) &p, RMAP_RIP, &newinfo);
467 if (ret == RMAP_DENYMATCH)
469 if (IS_RIP_DEBUG_PACKET)
470 zlog_debug ("RIP %s/%d is filtered by route-map in",
471 inet_ntoa (p.prefix), p.prefixlen);
475 /* Get back the object */
476 rte->nexthop = newinfo.nexthop_out;
477 rte->tag = htons (newinfo.tag_out); /* XXX */
478 rte->metric = newinfo.metric_out; /* XXX: the routemap uses the metric_out field */
481 /* Once the entry has been validated, update the metric by
482 adding the cost of the network on wich the message
483 arrived. If the result is greater than infinity, use infinity
484 (RFC2453 Sec. 3.9.2) */
485 /* Zebra ripd can handle offset-list in. */
486 ret = rip_offset_list_apply_in (&p, ifp, &rte->metric);
488 /* If offset-list does not modify the metric use interface's
491 rte->metric += ifp->metric ? ifp->metric : 1;
493 if (rte->metric > RIP_METRIC_INFINITY)
494 rte->metric = RIP_METRIC_INFINITY;
496 /* Set nexthop pointer. */
497 if (rte->nexthop.s_addr == 0)
498 nexthop = &from->sin_addr;
500 nexthop = &rte->nexthop;
502 /* Check if nexthop address is myself, then do nothing. */
503 if (rip_nexthop_check (nexthop) < 0)
505 if (IS_RIP_DEBUG_PACKET)
506 zlog_debug ("Nexthop address %s is myself", inet_ntoa (*nexthop));
510 /* Get index for the prefix. */
511 rp = route_node_get (rip->table, (struct prefix *) &p);
514 newinfo.nexthop = *nexthop;
515 newinfo.metric = rte->metric;
516 newinfo.tag = ntohs (rte->tag);
517 newinfo.distance = rip_distance_apply (&newinfo);
519 new_dist = newinfo.distance ? newinfo.distance : ZEBRA_RIP_DISTANCE_DEFAULT;
521 /* Check to see whether there is already RIP route on the table. */
522 if ((list = rp->info) != NULL)
523 for (ALL_LIST_ELEMENTS_RO (list, node, rinfo))
525 /* Need to compare with redistributed entry or local entry */
526 if (!rip_route_rte (rinfo))
529 if (IPV4_ADDR_SAME (&rinfo->from, &from->sin_addr) &&
530 IPV4_ADDR_SAME (&rinfo->nexthop, nexthop))
533 if (!listnextnode (node))
535 /* Not found in the list */
537 if (rte->metric > rinfo->metric)
539 /* New route has a greater metric. Discard it. */
540 route_unlock_node (rp);
544 if (rte->metric < rinfo->metric)
545 /* New route has a smaller metric. Replace the ECMP list
546 * with the new one in below. */
549 /* Metrics are same. We compare the distances. */
550 old_dist = rinfo->distance ? \
551 rinfo->distance : ZEBRA_RIP_DISTANCE_DEFAULT;
553 if (new_dist > old_dist)
555 /* New route has a greater distance. Discard it. */
556 route_unlock_node (rp);
560 if (new_dist < old_dist)
561 /* New route has a smaller distance. Replace the ECMP list
562 * with the new one in below. */
565 /* Metrics and distances are both same. Keep "rinfo" null and
566 * the new route is added in the ECMP list in below. */
572 /* Local static route. */
573 if (rinfo->type == ZEBRA_ROUTE_RIP
574 && ((rinfo->sub_type == RIP_ROUTE_STATIC) ||
575 (rinfo->sub_type == RIP_ROUTE_DEFAULT))
576 && rinfo->metric != RIP_METRIC_INFINITY)
578 route_unlock_node (rp);
582 /* Redistributed route check. */
583 if (rinfo->type != ZEBRA_ROUTE_RIP
584 && rinfo->metric != RIP_METRIC_INFINITY)
586 old_dist = rinfo->distance;
587 /* Only routes directly connected to an interface (nexthop == 0)
588 * may have a valid NULL distance */
589 if (rinfo->nexthop.s_addr != 0)
590 old_dist = old_dist ? old_dist : ZEBRA_RIP_DISTANCE_DEFAULT;
591 /* If imported route does not have STRICT precedence,
592 mark it as a ghost */
593 if (new_dist <= old_dist && rte->metric != RIP_METRIC_INFINITY)
594 rip_ecmp_replace (&newinfo);
596 route_unlock_node (rp);
604 route_unlock_node (rp);
606 /* Now, check to see whether there is already an explicit route
607 for the destination prefix. If there is no such route, add
608 this route to the routing table, unless the metric is
609 infinity (there is no point in adding a route which
611 if (rte->metric != RIP_METRIC_INFINITY)
612 rip_ecmp_add (&newinfo);
616 /* Route is there but we are not sure the route is RIP or not. */
618 /* If there is an existing route, compare the next hop address
619 to the address of the router from which the datagram came.
620 If this datagram is from the same router as the existing
621 route, reinitialize the timeout. */
622 same = (IPV4_ADDR_SAME (&rinfo->from, &from->sin_addr)
623 && (rinfo->ifindex == ifp->ifindex));
625 old_dist = rinfo->distance ? \
626 rinfo->distance : ZEBRA_RIP_DISTANCE_DEFAULT;
628 /* Next, compare the metrics. If the datagram is from the same
629 router as the existing route, and the new metric is different
630 than the old one; or, if the new metric is lower than the old
631 one, or if the tag has been changed; or if there is a route
632 with a lower administrave distance; or an update of the
633 distance on the actual route; do the following actions: */
634 if ((same && rinfo->metric != rte->metric)
635 || (rte->metric < rinfo->metric)
637 && (rinfo->metric == rte->metric)
638 && (newinfo.tag != rinfo->tag))
639 || (old_dist > new_dist)
640 || ((old_dist != new_dist) && same))
642 if (listcount (list) == 1)
644 if (newinfo.metric != RIP_METRIC_INFINITY)
645 rip_ecmp_replace (&newinfo);
647 rip_ecmp_delete (rinfo);
651 if (newinfo.metric < rinfo->metric)
652 rip_ecmp_replace (&newinfo);
653 else if (newinfo.metric > rinfo->metric)
654 rip_ecmp_delete (rinfo);
655 else if (new_dist < old_dist)
656 rip_ecmp_replace (&newinfo);
657 else if (new_dist > old_dist)
658 rip_ecmp_delete (rinfo);
661 int update = CHECK_FLAG (rinfo->flags, RIP_RTF_FIB) ? 1 : 0;
663 assert (newinfo.metric != RIP_METRIC_INFINITY);
665 RIP_TIMER_OFF (rinfo->t_timeout);
666 RIP_TIMER_OFF (rinfo->t_garbage_collect);
667 memcpy (rinfo, &newinfo, sizeof (struct rip_info));
668 rip_timeout_update (rinfo);
671 rip_zebra_ipv4_add (rp);
673 /* - Set the route change flag on the first entry. */
674 rinfo = listgetdata (listhead (list));
675 SET_FLAG (rinfo->flags, RIP_RTF_CHANGED);
676 rip_event (RIP_TRIGGERED_UPDATE, 0);
680 else /* same & no change */
681 rip_timeout_update (rinfo);
683 /* Unlock tempolary lock of the route. */
684 route_unlock_node (rp);
688 /* Dump RIP packet */
690 rip_packet_dump (struct rip_packet *packet, int size, const char *sndrcv)
694 const char *command_str;
695 char pbuf[BUFSIZ], nbuf[BUFSIZ];
699 /* Set command string. */
700 if (packet->command > 0 && packet->command < RIP_COMMAND_MAX)
701 command_str = lookup (rip_msg, packet->command);
703 command_str = "unknown";
705 /* Dump packet header. */
706 zlog_debug ("%s %s version %d packet size %d",
707 sndrcv, command_str, packet->version, size);
709 /* Dump each routing table entry. */
712 for (lim = (caddr_t) packet + size; (caddr_t) rte < lim; rte++)
714 if (packet->version == RIPv2)
716 netmask = ip_masklen (rte->mask);
718 if (rte->family == htons (RIP_FAMILY_AUTH))
720 if (rte->tag == htons (RIP_AUTH_SIMPLE_PASSWORD))
722 p = (u_char *)&rte->prefix;
724 zlog_debug (" family 0x%X type %d auth string: %s",
725 ntohs (rte->family), ntohs (rte->tag), p);
727 else if (rte->tag == htons (RIP_AUTH_MD5))
729 struct rip_md5_info *md5;
731 md5 = (struct rip_md5_info *) &packet->rte;
733 zlog_debug (" family 0x%X type %d (MD5 authentication)",
734 ntohs (md5->family), ntohs (md5->type));
735 zlog_debug (" RIP-2 packet len %d Key ID %d"
737 ntohs (md5->packet_len), md5->keyid,
739 zlog_debug (" Sequence Number %ld",
740 (u_long) ntohl (md5->sequence));
742 else if (rte->tag == htons (RIP_AUTH_DATA))
744 p = (u_char *)&rte->prefix;
746 zlog_debug (" family 0x%X type %d (MD5 data)",
747 ntohs (rte->family), ntohs (rte->tag));
748 zlog_debug (" MD5: %02X%02X%02X%02X%02X%02X%02X%02X"
749 "%02X%02X%02X%02X%02X%02X%02X%02X",
750 p[0], p[1], p[2], p[3], p[4], p[5], p[6],
751 p[7], p[8], p[9], p[10], p[11], p[12], p[13],
756 zlog_debug (" family 0x%X type %d (Unknown auth type)",
757 ntohs (rte->family), ntohs (rte->tag));
761 zlog_debug (" %s/%d -> %s family %d tag %d metric %ld",
762 inet_ntop (AF_INET, &rte->prefix, pbuf, BUFSIZ),
763 netmask, inet_ntop (AF_INET, &rte->nexthop, nbuf,
764 BUFSIZ), ntohs (rte->family),
765 ntohs (rte->tag), (u_long) ntohl (rte->metric));
769 zlog_debug (" %s family %d tag %d metric %ld",
770 inet_ntop (AF_INET, &rte->prefix, pbuf, BUFSIZ),
771 ntohs (rte->family), ntohs (rte->tag),
772 (u_long)ntohl (rte->metric));
777 /* Check if the destination address is valid (unicast; not net 0
778 or 127) (RFC2453 Section 3.9.2 - Page 26). But we don't
779 check net 0 because we accept default route. */
781 rip_destination_check (struct in_addr addr)
783 u_int32_t destination;
785 /* Convert to host byte order. */
786 destination = ntohl (addr.s_addr);
788 if (IPV4_NET127 (destination))
791 /* Net 0 may match to the default route. */
792 if (IPV4_NET0 (destination) && destination != 0)
795 /* Unicast address must belong to class A, B, C. */
796 if (IN_CLASSA (destination))
798 if (IN_CLASSB (destination))
800 if (IN_CLASSC (destination))
806 /* RIP version 2 authentication. */
808 rip_auth_simple_password (struct rte *rte, struct sockaddr_in *from,
809 struct interface *ifp)
811 struct rip_interface *ri;
814 if (IS_RIP_DEBUG_EVENT)
815 zlog_debug ("RIPv2 simple password authentication from %s",
816 inet_ntoa (from->sin_addr));
820 if (ri->auth_type != RIP_AUTH_SIMPLE_PASSWORD
821 || rte->tag != htons(RIP_AUTH_SIMPLE_PASSWORD))
824 /* Simple password authentication. */
827 auth_str = (char *) &rte->prefix;
829 if (strncmp (auth_str, ri->auth_str, 16) == 0)
834 struct keychain *keychain;
837 keychain = keychain_lookup (ri->key_chain);
838 if (keychain == NULL)
841 key = key_match_for_accept (keychain, (char *) &rte->prefix);
848 /* RIP version 2 authentication with MD5. */
850 rip_auth_md5 (struct rip_packet *packet, struct sockaddr_in *from,
851 int length, struct interface *ifp)
853 struct rip_interface *ri;
854 struct rip_md5_info *md5;
855 struct rip_md5_data *md5data;
856 struct keychain *keychain;
859 u_char digest[RIP_AUTH_MD5_SIZE];
860 u_int16_t packet_len;
861 char auth_str[RIP_AUTH_MD5_SIZE];
863 if (IS_RIP_DEBUG_EVENT)
864 zlog_debug ("RIPv2 MD5 authentication from %s",
865 inet_ntoa (from->sin_addr));
868 md5 = (struct rip_md5_info *) &packet->rte;
870 /* Check auth type. */
871 if (ri->auth_type != RIP_AUTH_MD5 || md5->type != htons(RIP_AUTH_MD5))
874 /* If the authentication length is less than 16, then it must be wrong for
875 * any interpretation of rfc2082. Some implementations also interpret
876 * this as RIP_HEADER_SIZE+ RIP_AUTH_MD5_SIZE, aka RIP_AUTH_MD5_COMPAT_SIZE.
878 if ( !((md5->auth_len == RIP_AUTH_MD5_SIZE)
879 || (md5->auth_len == RIP_AUTH_MD5_COMPAT_SIZE)))
881 if (IS_RIP_DEBUG_EVENT)
882 zlog_debug ("RIPv2 MD5 authentication, strange authentication "
883 "length field %d", md5->auth_len);
887 /* grab and verify check packet length */
888 packet_len = ntohs (md5->packet_len);
890 if (packet_len > (length - RIP_HEADER_SIZE - RIP_AUTH_MD5_SIZE))
892 if (IS_RIP_DEBUG_EVENT)
893 zlog_debug ("RIPv2 MD5 authentication, packet length field %d "
894 "greater than received length %d!",
895 md5->packet_len, length);
899 /* retrieve authentication data */
900 md5data = (struct rip_md5_data *) (((u_char *) packet) + packet_len);
902 memset (auth_str, 0, RIP_AUTH_MD5_SIZE);
906 keychain = keychain_lookup (ri->key_chain);
907 if (keychain == NULL)
910 key = key_lookup_for_accept (keychain, md5->keyid);
914 strncpy (auth_str, key->string, RIP_AUTH_MD5_SIZE);
916 else if (ri->auth_str)
917 strncpy (auth_str, ri->auth_str, RIP_AUTH_MD5_SIZE);
919 if (auth_str[0] == 0)
922 /* MD5 digest authentication. */
923 memset (&ctx, 0, sizeof(ctx));
925 MD5Update(&ctx, packet, packet_len + RIP_HEADER_SIZE);
926 MD5Update(&ctx, auth_str, RIP_AUTH_MD5_SIZE);
927 MD5Final(digest, &ctx);
929 if (memcmp (md5data->digest, digest, RIP_AUTH_MD5_SIZE) == 0)
935 /* Pick correct auth string for sends, prepare auth_str buffer for use.
936 * (left justified and padded).
938 * presumes one of ri or key is valid, and that the auth strings they point
939 * to are nul terminated. If neither are present, auth_str will be fully
944 rip_auth_prepare_str_send (struct rip_interface *ri, struct key *key,
945 char *auth_str, int len)
949 memset (auth_str, 0, len);
950 if (key && key->string)
951 strncpy (auth_str, key->string, len);
952 else if (ri->auth_str)
953 strncpy (auth_str, ri->auth_str, len);
958 /* Write RIPv2 simple password authentication information
960 * auth_str is presumed to be 2 bytes and correctly prepared
961 * (left justified and zero padded).
964 rip_auth_simple_write (struct stream *s, char *auth_str, int len)
966 assert (s && len == RIP_AUTH_SIMPLE_SIZE);
968 stream_putw (s, RIP_FAMILY_AUTH);
969 stream_putw (s, RIP_AUTH_SIMPLE_PASSWORD);
970 stream_put (s, auth_str, RIP_AUTH_SIMPLE_SIZE);
975 /* write RIPv2 MD5 "authentication header"
976 * (uses the auth key data field)
978 * Digest offset field is set to 0.
980 * returns: offset of the digest offset field, which must be set when
981 * length to the auth-data MD5 digest is known.
984 rip_auth_md5_ah_write (struct stream *s, struct rip_interface *ri,
989 assert (s && ri && ri->auth_type == RIP_AUTH_MD5);
991 /* MD5 authentication. */
992 stream_putw (s, RIP_FAMILY_AUTH);
993 stream_putw (s, RIP_AUTH_MD5);
995 /* MD5 AH digest offset field.
997 * Set to placeholder value here, to true value when RIP-2 Packet length
998 * is known. Actual value is set in .....().
1000 doff = stream_get_endp(s);
1005 stream_putc (s, key->index % 256);
1009 /* Auth Data Len. Set 16 for MD5 authentication data. Older ripds
1010 * however expect RIP_HEADER_SIZE + RIP_AUTH_MD5_SIZE so we allow for this
1011 * to be configurable.
1013 stream_putc (s, ri->md5_auth_len);
1015 /* Sequence Number (non-decreasing). */
1016 /* RFC2080: The value used in the sequence number is
1017 arbitrary, but two suggestions are the time of the
1018 message's creation or a simple message counter. */
1019 stream_putl (s, time (NULL));
1021 /* Reserved field must be zero. */
1028 /* If authentication is in used, write the appropriate header
1029 * returns stream offset to which length must later be written
1030 * or 0 if this is not required
1033 rip_auth_header_write (struct stream *s, struct rip_interface *ri,
1034 struct key *key, char *auth_str, int len)
1036 assert (ri->auth_type != RIP_NO_AUTH);
1038 switch (ri->auth_type)
1040 case RIP_AUTH_SIMPLE_PASSWORD:
1041 rip_auth_prepare_str_send (ri, key, auth_str, len);
1042 rip_auth_simple_write (s, auth_str, len);
1045 return rip_auth_md5_ah_write (s, ri, key);
1051 /* Write RIPv2 MD5 authentication data trailer */
1053 rip_auth_md5_set (struct stream *s, struct rip_interface *ri, size_t doff,
1054 char *auth_str, int authlen)
1058 unsigned char digest[RIP_AUTH_MD5_SIZE];
1060 /* Make it sure this interface is configured as MD5
1062 assert ((ri->auth_type == RIP_AUTH_MD5) && (authlen == RIP_AUTH_MD5_SIZE));
1065 /* Get packet length. */
1066 len = stream_get_endp(s);
1068 /* Check packet length. */
1069 if (len < (RIP_HEADER_SIZE + RIP_RTE_SIZE))
1071 zlog_err ("rip_auth_md5_set(): packet length %ld is less than minimum length.", len);
1075 /* Set the digest offset length in the header */
1076 stream_putw_at (s, doff, len);
1078 /* Set authentication data. */
1079 stream_putw (s, RIP_FAMILY_AUTH);
1080 stream_putw (s, RIP_AUTH_DATA);
1082 /* Generate a digest for the RIP packet. */
1083 memset(&ctx, 0, sizeof(ctx));
1085 MD5Update(&ctx, STREAM_DATA (s), stream_get_endp (s));
1086 MD5Update(&ctx, auth_str, RIP_AUTH_MD5_SIZE);
1087 MD5Final(digest, &ctx);
1089 /* Copy the digest to the packet. */
1090 stream_write (s, digest, RIP_AUTH_MD5_SIZE);
1093 /* RIP routing information. */
1095 rip_response_process (struct rip_packet *packet, int size,
1096 struct sockaddr_in *from, struct connected *ifc)
1100 struct prefix_ipv4 ifaddr;
1101 struct prefix_ipv4 ifaddrclass;
1104 memset(&ifaddr, 0, sizeof(ifaddr));
1105 /* We don't know yet. */
1108 /* The Response must be ignored if it is not from the RIP
1109 port. (RFC2453 - Sec. 3.9.2)*/
1110 if (from->sin_port != htons(RIP_PORT_DEFAULT))
1112 zlog_info ("response doesn't come from RIP port: %d",
1114 rip_peer_bad_packet (from);
1118 /* The datagram's IPv4 source address should be checked to see
1119 whether the datagram is from a valid neighbor; the source of the
1120 datagram must be on a directly connected network (RFC2453 - Sec. 3.9.2) */
1121 if (if_lookup_address(from->sin_addr) == NULL)
1123 zlog_info ("This datagram doesn't came from a valid neighbor: %s",
1124 inet_ntoa (from->sin_addr));
1125 rip_peer_bad_packet (from);
1129 /* It is also worth checking to see whether the response is from one
1130 of the router's own addresses. */
1132 ; /* Alredy done in rip_read () */
1134 /* Update RIP peer. */
1135 rip_peer_update (from, packet->version);
1137 /* Set RTE pointer. */
1140 for (lim = (caddr_t) packet + size; (caddr_t) rte < lim; rte++)
1142 /* RIPv2 authentication check. */
1143 /* If the Address Family Identifier of the first (and only the
1144 first) entry in the message is 0xFFFF, then the remainder of
1145 the entry contains the authentication. */
1146 /* If the packet gets here it means authentication enabled */
1147 /* Check is done in rip_read(). So, just skipping it */
1148 if (packet->version == RIPv2 &&
1149 rte == packet->rte &&
1150 rte->family == htons(RIP_FAMILY_AUTH))
1153 if (rte->family != htons(AF_INET))
1155 /* Address family check. RIP only supports AF_INET. */
1156 zlog_info ("Unsupported family %d from %s.",
1157 ntohs (rte->family), inet_ntoa (from->sin_addr));
1161 /* - is the destination address valid (e.g., unicast; not net 0
1163 if (! rip_destination_check (rte->prefix))
1165 zlog_info ("Network is net 0 or net 127 or it is not unicast network");
1166 rip_peer_bad_route (from);
1170 /* Convert metric value to host byte order. */
1171 rte->metric = ntohl (rte->metric);
1173 /* - is the metric valid (i.e., between 1 and 16, inclusive) */
1174 if (! (rte->metric >= 1 && rte->metric <= 16))
1176 zlog_info ("Route's metric is not in the 1-16 range.");
1177 rip_peer_bad_route (from);
1181 /* RIPv1 does not have nexthop value. */
1182 if (packet->version == RIPv1 && rte->nexthop.s_addr != 0)
1184 zlog_info ("RIPv1 packet with nexthop value %s",
1185 inet_ntoa (rte->nexthop));
1186 rip_peer_bad_route (from);
1190 /* That is, if the provided information is ignored, a possibly
1191 sub-optimal, but absolutely valid, route may be taken. If
1192 the received Next Hop is not directly reachable, it should be
1193 treated as 0.0.0.0. */
1194 if (packet->version == RIPv2 && rte->nexthop.s_addr != 0)
1198 /* Multicast address check. */
1199 addrval = ntohl (rte->nexthop.s_addr);
1200 if (IN_CLASSD (addrval))
1202 zlog_info ("Nexthop %s is multicast address, skip this rte",
1203 inet_ntoa (rte->nexthop));
1207 if (! if_lookup_address (rte->nexthop))
1209 struct route_node *rn;
1210 struct rip_info *rinfo;
1212 rn = route_node_match_ipv4 (rip->table, &rte->nexthop);
1218 if (rinfo->type == ZEBRA_ROUTE_RIP
1219 && rinfo->sub_type == RIP_ROUTE_RTE)
1221 if (IS_RIP_DEBUG_EVENT)
1222 zlog_debug ("Next hop %s is on RIP network. Set nexthop to the packet's originator", inet_ntoa (rte->nexthop));
1223 rte->nexthop = rinfo->from;
1227 if (IS_RIP_DEBUG_EVENT)
1228 zlog_debug ("Next hop %s is not directly reachable. Treat it as 0.0.0.0", inet_ntoa (rte->nexthop));
1229 rte->nexthop.s_addr = 0;
1232 route_unlock_node (rn);
1236 if (IS_RIP_DEBUG_EVENT)
1237 zlog_debug ("Next hop %s is not directly reachable. Treat it as 0.0.0.0", inet_ntoa (rte->nexthop));
1238 rte->nexthop.s_addr = 0;
1244 /* For RIPv1, there won't be a valid netmask.
1246 This is a best guess at the masks. If everyone was using old
1247 Ciscos before the 'ip subnet zero' option, it would be almost
1250 Cisco summarize ripv1 advertisments to the classful boundary
1251 (/16 for class B's) except when the RIP packet does to inside
1252 the classful network in question. */
1254 if ((packet->version == RIPv1 && rte->prefix.s_addr != 0)
1255 || (packet->version == RIPv2
1256 && (rte->prefix.s_addr != 0 && rte->mask.s_addr == 0)))
1258 u_int32_t destination;
1260 if (subnetted == -1)
1262 memcpy (&ifaddr, ifc->address, sizeof (struct prefix_ipv4));
1263 memcpy (&ifaddrclass, &ifaddr, sizeof (struct prefix_ipv4));
1264 apply_classful_mask_ipv4 (&ifaddrclass);
1266 if (ifaddr.prefixlen > ifaddrclass.prefixlen)
1270 destination = ntohl (rte->prefix.s_addr);
1272 if (IN_CLASSA (destination))
1273 masklen2ip (8, &rte->mask);
1274 else if (IN_CLASSB (destination))
1275 masklen2ip (16, &rte->mask);
1276 else if (IN_CLASSC (destination))
1277 masklen2ip (24, &rte->mask);
1280 masklen2ip (ifaddrclass.prefixlen,
1281 (struct in_addr *) &destination);
1282 if ((subnetted == 1) && ((rte->prefix.s_addr & destination) ==
1283 ifaddrclass.prefix.s_addr))
1285 masklen2ip (ifaddr.prefixlen, &rte->mask);
1286 if ((rte->prefix.s_addr & rte->mask.s_addr) != rte->prefix.s_addr)
1287 masklen2ip (32, &rte->mask);
1288 if (IS_RIP_DEBUG_EVENT)
1289 zlog_debug ("Subnetted route %s", inet_ntoa (rte->prefix));
1293 if ((rte->prefix.s_addr & rte->mask.s_addr) != rte->prefix.s_addr)
1297 if (IS_RIP_DEBUG_EVENT)
1299 zlog_debug ("Resultant route %s", inet_ntoa (rte->prefix));
1300 zlog_debug ("Resultant mask %s", inet_ntoa (rte->mask));
1304 /* In case of RIPv2, if prefix in RTE is not netmask applied one
1305 ignore the entry. */
1306 if ((packet->version == RIPv2)
1307 && (rte->mask.s_addr != 0)
1308 && ((rte->prefix.s_addr & rte->mask.s_addr) != rte->prefix.s_addr))
1310 zlog_warn ("RIPv2 address %s is not mask /%d applied one",
1311 inet_ntoa (rte->prefix), ip_masklen (rte->mask));
1312 rip_peer_bad_route (from);
1316 /* Default route sanity check */
1317 if (packet->version == RIPv2
1318 && (rte->mask.s_addr == 0)
1319 && (rte->prefix.s_addr != 0))
1321 if (IS_RIP_DEBUG_EVENT)
1322 zlog_warn ("Malformed route, zero netmask "
1323 "with non-zero addr - dropping route!");
1324 rip_peer_bad_route (from);
1328 /* Routing table updates. */
1329 rip_rte_process (rte, from, ifc->ifp);
1333 /* Make socket for RIP protocol. */
1335 rip_create_socket (struct sockaddr_in *from)
1339 struct sockaddr_in addr;
1341 memset (&addr, 0, sizeof (struct sockaddr_in));
1345 addr.sin_family = AF_INET;
1346 addr.sin_addr.s_addr = INADDR_ANY;
1347 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1348 addr.sin_len = sizeof (struct sockaddr_in);
1349 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1351 memcpy(&addr, from, sizeof(addr));
1354 /* sending port must always be the RIP port */
1355 addr.sin_port = htons (RIP_PORT_DEFAULT);
1357 /* Make datagram socket. */
1358 sock = socket (AF_INET, SOCK_DGRAM, 0);
1361 zlog_err("Cannot create UDP socket: %s", safe_strerror(errno));
1365 sockopt_broadcast (sock);
1366 sockopt_reuseaddr (sock);
1367 sockopt_reuseport (sock);
1369 setsockopt_pktinfo (sock);
1370 #endif /* RIP_RECVMSG */
1371 #ifdef IPTOS_PREC_INTERNETCONTROL
1372 setsockopt_ipv4_tos (sock, IPTOS_PREC_INTERNETCONTROL);
1375 if (ripd_privs.change (ZPRIVS_RAISE))
1376 zlog_err ("rip_create_socket: could not raise privs");
1377 setsockopt_so_recvbuf (sock, RIP_UDP_RCV_BUF);
1378 if ( (ret = bind (sock, (struct sockaddr *) & addr, sizeof (addr))) < 0)
1381 int save_errno = errno;
1382 if (ripd_privs.change (ZPRIVS_LOWER))
1383 zlog_err ("rip_create_socket: could not lower privs");
1385 zlog_err("%s: Can't bind socket %d to %s port %d: %s", __func__,
1386 sock, inet_ntoa(addr.sin_addr),
1387 (int) ntohs(addr.sin_port),
1388 safe_strerror(save_errno));
1394 if (ripd_privs.change (ZPRIVS_LOWER))
1395 zlog_err ("rip_create_socket: could not lower privs");
1400 /* RIP packet send to destination address, on interface denoted by
1401 * by connected argument. NULL to argument denotes destination should be
1402 * should be RIP multicast group
1405 rip_send_packet (u_char * buf, int size, struct sockaddr_in *to,
1406 struct connected *ifc)
1409 struct sockaddr_in sin;
1411 assert (ifc != NULL);
1413 if (IS_RIP_DEBUG_PACKET)
1415 #define ADDRESS_SIZE 20
1416 char dst[ADDRESS_SIZE];
1417 dst[ADDRESS_SIZE - 1] = '\0';
1421 strncpy (dst, inet_ntoa(to->sin_addr), ADDRESS_SIZE - 1);
1425 sin.sin_addr.s_addr = htonl (INADDR_RIP_GROUP);
1426 strncpy (dst, inet_ntoa(sin.sin_addr), ADDRESS_SIZE - 1);
1429 zlog_debug("rip_send_packet %s > %s (%s)",
1430 inet_ntoa(ifc->address->u.prefix4),
1431 dst, ifc->ifp->name);
1434 if ( CHECK_FLAG (ifc->flags, ZEBRA_IFA_SECONDARY) )
1437 * ZEBRA_IFA_SECONDARY is set on linux when an interface is configured
1438 * with multiple addresses on the same subnet: the first address
1439 * on the subnet is configured "primary", and all subsequent addresses
1440 * on that subnet are treated as "secondary" addresses.
1441 * In order to avoid routing-table bloat on other rip listeners,
1442 * we do not send out RIP packets with ZEBRA_IFA_SECONDARY source addrs.
1443 * XXX Since Linux is the only system for which the ZEBRA_IFA_SECONDARY
1444 * flag is set, we would end up sending a packet for a "secondary"
1445 * source address on non-linux systems.
1447 if (IS_RIP_DEBUG_PACKET)
1448 zlog_debug("duplicate dropped");
1452 /* Make destination address. */
1453 memset (&sin, 0, sizeof (struct sockaddr_in));
1454 sin.sin_family = AF_INET;
1455 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1456 sin.sin_len = sizeof (struct sockaddr_in);
1457 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1459 /* When destination is specified, use it's port and address. */
1462 sin.sin_port = to->sin_port;
1463 sin.sin_addr = to->sin_addr;
1464 send_sock = rip->sock;
1468 struct sockaddr_in from;
1470 sin.sin_port = htons (RIP_PORT_DEFAULT);
1471 sin.sin_addr.s_addr = htonl (INADDR_RIP_GROUP);
1473 /* multicast send should bind to local interface address */
1474 memset (&from, 0, sizeof (from));
1475 from.sin_family = AF_INET;
1476 from.sin_port = htons (RIP_PORT_DEFAULT);
1477 from.sin_addr = ifc->address->u.prefix4;
1478 #ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
1479 from.sin_len = sizeof (struct sockaddr_in);
1480 #endif /* HAVE_STRUCT_SOCKADDR_IN_SIN_LEN */
1483 * we have to open a new socket for each packet because this
1484 * is the most portable way to bind to a different source
1485 * ipv4 address for each packet.
1487 if ( (send_sock = rip_create_socket (&from)) < 0)
1489 zlog_warn("rip_send_packet could not create socket.");
1492 rip_interface_multicast_set (send_sock, ifc);
1495 ret = sendto (send_sock, buf, size, 0, (struct sockaddr *)&sin,
1496 sizeof (struct sockaddr_in));
1498 if (IS_RIP_DEBUG_EVENT)
1499 zlog_debug ("SEND to %s.%d", inet_ntoa(sin.sin_addr),
1500 ntohs (sin.sin_port));
1503 zlog_warn ("can't send packet : %s", safe_strerror (errno));
1511 /* Add redistributed route to RIP table. */
1513 rip_redistribute_add (int type, int sub_type, struct prefix_ipv4 *p,
1514 ifindex_t ifindex, struct in_addr *nexthop,
1515 unsigned int metric, unsigned char distance,
1519 struct route_node *rp = NULL;
1520 struct rip_info *rinfo = NULL, newinfo;
1521 struct list *list = NULL;
1523 /* Redistribute route */
1524 ret = rip_destination_check (p->prefix);
1528 rp = route_node_get (rip->table, (struct prefix *) p);
1530 memset (&newinfo, 0, sizeof (struct rip_info));
1531 newinfo.type = type;
1532 newinfo.sub_type = sub_type;
1533 newinfo.ifindex = ifindex;
1535 newinfo.external_metric = metric;
1536 newinfo.distance = distance;
1537 if (tag <= UINT16_MAX) /* RIP only supports 16 bit tags */
1541 newinfo.nexthop = *nexthop;
1543 if ((list = rp->info) != NULL && listcount (list) != 0)
1545 rinfo = listgetdata (listhead (list));
1547 if (rinfo->type == ZEBRA_ROUTE_CONNECT
1548 && rinfo->sub_type == RIP_ROUTE_INTERFACE
1549 && rinfo->metric != RIP_METRIC_INFINITY)
1551 route_unlock_node (rp);
1555 /* Manually configured RIP route check. */
1556 if (rinfo->type == ZEBRA_ROUTE_RIP
1557 && ((rinfo->sub_type == RIP_ROUTE_STATIC) ||
1558 (rinfo->sub_type == RIP_ROUTE_DEFAULT)) )
1560 if (type != ZEBRA_ROUTE_RIP || ((sub_type != RIP_ROUTE_STATIC) &&
1561 (sub_type != RIP_ROUTE_DEFAULT)))
1563 route_unlock_node (rp);
1568 rinfo = rip_ecmp_replace (&newinfo);
1569 route_unlock_node (rp);
1572 rinfo = rip_ecmp_add (&newinfo);
1574 if (IS_RIP_DEBUG_EVENT) {
1576 zlog_debug ("Redistribute new prefix %s/%d on the interface %s",
1577 inet_ntoa(p->prefix), p->prefixlen,
1578 ifindex2ifname(ifindex));
1580 zlog_debug ("Redistribute new prefix %s/%d with nexthop %s on the interface %s",
1581 inet_ntoa(p->prefix), p->prefixlen, inet_ntoa(rinfo->nexthop),
1582 ifindex2ifname(ifindex));
1585 rip_event (RIP_TRIGGERED_UPDATE, 0);
1588 /* Delete redistributed route from RIP table. */
1590 rip_redistribute_delete (int type, int sub_type, struct prefix_ipv4 *p,
1594 struct route_node *rp;
1595 struct rip_info *rinfo;
1597 ret = rip_destination_check (p->prefix);
1601 rp = route_node_lookup (rip->table, (struct prefix *) p);
1604 struct list *list = rp->info;
1606 if (list != NULL && listcount (list) != 0)
1608 rinfo = listgetdata (listhead (list));
1610 && rinfo->type == type
1611 && rinfo->sub_type == sub_type
1612 && rinfo->ifindex == ifindex)
1614 /* Perform poisoned reverse. */
1615 rinfo->metric = RIP_METRIC_INFINITY;
1616 RIP_TIMER_ON (rinfo->t_garbage_collect,
1617 rip_garbage_collect, rip->garbage_time);
1618 RIP_TIMER_OFF (rinfo->t_timeout);
1619 rinfo->flags |= RIP_RTF_CHANGED;
1621 if (IS_RIP_DEBUG_EVENT)
1622 zlog_debug ("Poisone %s/%d on the interface %s with an "
1623 "infinity metric [delete]",
1624 inet_ntoa(p->prefix), p->prefixlen,
1625 ifindex2ifname(ifindex));
1627 rip_event (RIP_TRIGGERED_UPDATE, 0);
1630 route_unlock_node (rp);
1634 /* Response to request called from rip_read ().*/
1636 rip_request_process (struct rip_packet *packet, int size,
1637 struct sockaddr_in *from, struct connected *ifc)
1641 struct prefix_ipv4 p;
1642 struct route_node *rp;
1643 struct rip_info *rinfo;
1644 struct rip_interface *ri;
1646 /* Does not reponse to the requests on the loopback interfaces */
1647 if (if_is_loopback (ifc->ifp))
1650 /* Check RIP process is enabled on this interface. */
1651 ri = ifc->ifp->info;
1655 /* When passive interface is specified, suppress responses */
1659 /* RIP peer update. */
1660 rip_peer_update (from, packet->version);
1662 lim = ((caddr_t) packet) + size;
1665 /* The Request is processed entry by entry. If there are no
1666 entries, no response is given. */
1667 if (lim == (caddr_t) rte)
1670 /* There is one special case. If there is exactly one entry in the
1671 request, and it has an address family identifier of zero and a
1672 metric of infinity (i.e., 16), then this is a request to send the
1673 entire routing table. */
1674 if (lim == ((caddr_t) (rte + 1)) &&
1675 ntohs (rte->family) == 0 &&
1676 ntohl (rte->metric) == RIP_METRIC_INFINITY)
1678 /* All route with split horizon */
1679 rip_output_process (ifc, from, rip_all_route, packet->version);
1683 /* Examine the list of RTEs in the Request one by one. For each
1684 entry, look up the destination in the router's routing
1685 database and, if there is a route, put that route's metric in
1686 the metric field of the RTE. If there is no explicit route
1687 to the specified destination, put infinity in the metric
1688 field. Once all the entries have been filled in, change the
1689 command from Request to Response and send the datagram back
1690 to the requestor. */
1693 for (; ((caddr_t) rte) < lim; rte++)
1695 p.prefix = rte->prefix;
1696 p.prefixlen = ip_masklen (rte->mask);
1697 apply_mask_ipv4 (&p);
1699 rp = route_node_lookup (rip->table, (struct prefix *) &p);
1702 rinfo = listgetdata (listhead ((struct list *)rp->info));
1703 rte->metric = htonl (rinfo->metric);
1704 route_unlock_node (rp);
1707 rte->metric = htonl (RIP_METRIC_INFINITY);
1709 packet->command = RIP_RESPONSE;
1711 rip_send_packet ((u_char *)packet, size, from, ifc);
1713 rip_global_queries++;
1717 /* Set IPv6 packet info to the socket. */
1719 setsockopt_pktinfo (int sock)
1724 ret = setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &val, sizeof(val));
1726 zlog_warn ("Can't setsockopt IP_PKTINFO : %s", safe_strerror (errno));
1730 /* Read RIP packet by recvmsg function. */
1732 rip_recvmsg (int sock, u_char *buf, int size, struct sockaddr_in *from,
1738 struct cmsghdr *ptr;
1741 msg.msg_name = (void *) from;
1742 msg.msg_namelen = sizeof (struct sockaddr_in);
1745 msg.msg_control = (void *) adata;
1746 msg.msg_controllen = sizeof adata;
1750 ret = recvmsg (sock, &msg, 0);
1754 for (ptr = ZCMSG_FIRSTHDR(&msg); ptr != NULL; ptr = CMSG_NXTHDR(&msg, ptr))
1755 if (ptr->cmsg_level == IPPROTO_IP && ptr->cmsg_type == IP_PKTINFO)
1757 struct in_pktinfo *pktinfo;
1760 pktinfo = (struct in_pktinfo *) CMSG_DATA (ptr);
1761 i = pktinfo->ipi_ifindex;
1766 /* RIP packet read function. */
1768 rip_read_new (struct thread *t)
1772 char buf[RIP_PACKET_MAXSIZ];
1773 struct sockaddr_in from;
1776 /* Fetch socket then register myself. */
1777 sock = THREAD_FD (t);
1778 rip_event (RIP_READ, sock);
1780 /* Read RIP packet. */
1781 ret = rip_recvmsg (sock, buf, RIP_PACKET_MAXSIZ, &from, (int *)&ifindex);
1784 zlog_warn ("Can't read RIP packet: %s", safe_strerror (errno));
1790 #endif /* RIP_RECVMSG */
1792 /* First entry point of RIP packet. */
1794 rip_read (struct thread *t)
1799 union rip_buf rip_buf;
1800 struct rip_packet *packet;
1801 struct sockaddr_in from;
1805 struct interface *ifp;
1806 struct connected *ifc;
1807 struct rip_interface *ri;
1809 /* Fetch socket then register myself. */
1810 sock = THREAD_FD (t);
1813 /* Add myself to tne next event */
1814 rip_event (RIP_READ, sock);
1816 /* RIPd manages only IPv4. */
1817 memset (&from, 0, sizeof (struct sockaddr_in));
1818 fromlen = sizeof (struct sockaddr_in);
1820 len = recvfrom (sock, (char *)&rip_buf.buf, sizeof (rip_buf.buf), 0,
1821 (struct sockaddr *) &from, &fromlen);
1824 zlog_info ("recvfrom failed: %s", safe_strerror (errno));
1828 /* Check is this packet comming from myself? */
1829 if (if_check_address (from.sin_addr))
1831 if (IS_RIP_DEBUG_PACKET)
1832 zlog_debug ("ignore packet comes from myself");
1836 /* Which interface is this packet comes from. */
1837 ifp = if_lookup_address (from.sin_addr);
1839 /* RIP packet received */
1840 if (IS_RIP_DEBUG_EVENT)
1841 zlog_debug ("RECV packet from %s port %d on %s",
1842 inet_ntoa (from.sin_addr), ntohs (from.sin_port),
1843 ifp ? ifp->name : "unknown");
1845 /* If this packet come from unknown interface, ignore it. */
1848 zlog_info ("rip_read: cannot find interface for packet from %s port %d",
1849 inet_ntoa(from.sin_addr), ntohs (from.sin_port));
1853 ifc = connected_lookup_address (ifp, from.sin_addr);
1857 zlog_info ("rip_read: cannot find connected address for packet from %s "
1858 "port %d on interface %s",
1859 inet_ntoa(from.sin_addr), ntohs (from.sin_port), ifp->name);
1863 /* Packet length check. */
1864 if (len < RIP_PACKET_MINSIZ)
1866 zlog_warn ("packet size %d is smaller than minimum size %d",
1867 len, RIP_PACKET_MINSIZ);
1868 rip_peer_bad_packet (&from);
1871 if (len > RIP_PACKET_MAXSIZ)
1873 zlog_warn ("packet size %d is larger than max size %d",
1874 len, RIP_PACKET_MAXSIZ);
1875 rip_peer_bad_packet (&from);
1879 /* Packet alignment check. */
1880 if ((len - RIP_PACKET_MINSIZ) % 20)
1882 zlog_warn ("packet size %d is wrong for RIP packet alignment", len);
1883 rip_peer_bad_packet (&from);
1887 /* Set RTE number. */
1888 rtenum = ((len - RIP_PACKET_MINSIZ) / 20);
1890 /* For easy to handle. */
1891 packet = &rip_buf.rip_packet;
1893 /* RIP version check. */
1894 if (packet->version == 0)
1896 zlog_info ("version 0 with command %d received.", packet->command);
1897 rip_peer_bad_packet (&from);
1901 /* Dump RIP packet. */
1902 if (IS_RIP_DEBUG_RECV)
1903 rip_packet_dump (packet, len, "RECV");
1905 /* RIP version adjust. This code should rethink now. RFC1058 says
1906 that "Version 1 implementations are to ignore this extra data and
1907 process only the fields specified in this document.". So RIPv3
1908 packet should be treated as RIPv1 ignoring must be zero field. */
1909 if (packet->version > RIPv2)
1910 packet->version = RIPv2;
1912 /* Is RIP running or is this RIP neighbor ?*/
1914 if (! ri->running && ! rip_neighbor_lookup (&from))
1916 if (IS_RIP_DEBUG_EVENT)
1917 zlog_debug ("RIP is not enabled on interface %s.", ifp->name);
1918 rip_peer_bad_packet (&from);
1922 /* RIP Version check. RFC2453, 4.6 and 5.1 */
1923 vrecv = ((ri->ri_receive == RI_RIP_UNSPEC) ?
1924 rip->version_recv : ri->ri_receive);
1925 if ((packet->version == RIPv1) && !(vrecv & RIPv1))
1927 if (IS_RIP_DEBUG_PACKET)
1928 zlog_debug (" packet's v%d doesn't fit to if version spec",
1930 rip_peer_bad_packet (&from);
1933 if ((packet->version == RIPv2) && !(vrecv & RIPv2))
1935 if (IS_RIP_DEBUG_PACKET)
1936 zlog_debug (" packet's v%d doesn't fit to if version spec",
1938 rip_peer_bad_packet (&from);
1942 /* RFC2453 5.2 If the router is not configured to authenticate RIP-2
1943 messages, then RIP-1 and unauthenticated RIP-2 messages will be
1944 accepted; authenticated RIP-2 messages shall be discarded. */
1945 if ((ri->auth_type == RIP_NO_AUTH)
1947 && (packet->version == RIPv2)
1948 && (packet->rte->family == htons(RIP_FAMILY_AUTH)))
1950 if (IS_RIP_DEBUG_EVENT)
1951 zlog_debug ("packet RIPv%d is dropped because authentication disabled",
1953 rip_peer_bad_packet (&from);
1958 If the router is configured to authenticate RIP-2 messages, then
1959 RIP-1 messages and RIP-2 messages which pass authentication
1960 testing shall be accepted; unauthenticated and failed
1961 authentication RIP-2 messages shall be discarded. For maximum
1962 security, RIP-1 messages should be ignored when authentication is
1963 in use (see section 4.1); otherwise, the routing information from
1964 authenticated messages will be propagated by RIP-1 routers in an
1965 unauthenticated manner.
1967 /* We make an exception for RIPv1 REQUEST packets, to which we'll
1968 * always reply regardless of authentication settings, because:
1970 * - if there other authorised routers on-link, the REQUESTor can
1971 * passively obtain the routing updates anyway
1972 * - if there are no other authorised routers on-link, RIP can
1973 * easily be disabled for the link to prevent giving out information
1974 * on state of this routers RIP routing table..
1976 * I.e. if RIPv1 has any place anymore these days, it's as a very
1977 * simple way to distribute routing information (e.g. to embedded
1978 * hosts / appliances) and the ability to give out RIPv1
1979 * routing-information freely, while still requiring RIPv2
1980 * authentication for any RESPONSEs might be vaguely useful.
1982 if (ri->auth_type != RIP_NO_AUTH
1983 && packet->version == RIPv1)
1985 /* Discard RIPv1 messages other than REQUESTs */
1986 if (packet->command != RIP_REQUEST)
1988 if (IS_RIP_DEBUG_PACKET)
1989 zlog_debug ("RIPv1" " dropped because authentication enabled");
1990 rip_peer_bad_packet (&from);
1994 else if (ri->auth_type != RIP_NO_AUTH)
1996 const char *auth_desc;
2000 /* There definitely is no authentication in the packet. */
2001 if (IS_RIP_DEBUG_PACKET)
2002 zlog_debug ("RIPv2 authentication failed: no auth RTE in packet");
2003 rip_peer_bad_packet (&from);
2007 /* First RTE must be an Authentication Family RTE */
2008 if (packet->rte->family != htons(RIP_FAMILY_AUTH))
2010 if (IS_RIP_DEBUG_PACKET)
2011 zlog_debug ("RIPv2" " dropped because authentication enabled");
2012 rip_peer_bad_packet (&from);
2016 /* Check RIPv2 authentication. */
2017 switch (ntohs(packet->rte->tag))
2019 case RIP_AUTH_SIMPLE_PASSWORD:
2020 auth_desc = "simple";
2021 ret = rip_auth_simple_password (packet->rte, &from, ifp);
2026 ret = rip_auth_md5 (packet, &from, len, ifp);
2027 /* Reset RIP packet length to trim MD5 data. */
2033 auth_desc = "unknown type";
2034 if (IS_RIP_DEBUG_PACKET)
2035 zlog_debug ("RIPv2 Unknown authentication type %d",
2036 ntohs (packet->rte->tag));
2041 if (IS_RIP_DEBUG_PACKET)
2042 zlog_debug ("RIPv2 %s authentication success", auth_desc);
2046 if (IS_RIP_DEBUG_PACKET)
2047 zlog_debug ("RIPv2 %s authentication failure", auth_desc);
2048 rip_peer_bad_packet (&from);
2053 /* Process each command. */
2054 switch (packet->command)
2057 rip_response_process (packet, len, &from, ifc);
2061 rip_request_process (packet, len, &from, ifc);
2065 zlog_info ("Obsolete command %s received, please sent it to routed",
2066 lookup (rip_msg, packet->command));
2067 rip_peer_bad_packet (&from);
2069 case RIP_POLL_ENTRY:
2070 zlog_info ("Obsolete command %s received",
2071 lookup (rip_msg, packet->command));
2072 rip_peer_bad_packet (&from);
2075 zlog_info ("Unknown RIP command %d received", packet->command);
2076 rip_peer_bad_packet (&from);
2083 /* Write routing table entry to the stream and return next index of
2084 the routing table entry in the stream. */
2086 rip_write_rte (int num, struct stream *s, struct prefix_ipv4 *p,
2087 u_char version, struct rip_info *rinfo)
2089 struct in_addr mask;
2091 /* Write routing table entry. */
2092 if (version == RIPv1)
2094 stream_putw (s, AF_INET);
2096 stream_put_ipv4 (s, p->prefix.s_addr);
2097 stream_put_ipv4 (s, 0);
2098 stream_put_ipv4 (s, 0);
2099 stream_putl (s, rinfo->metric_out);
2103 masklen2ip (p->prefixlen, &mask);
2105 stream_putw (s, AF_INET);
2106 stream_putw (s, rinfo->tag_out);
2107 stream_put_ipv4 (s, p->prefix.s_addr);
2108 stream_put_ipv4 (s, mask.s_addr);
2109 stream_put_ipv4 (s, rinfo->nexthop_out.s_addr);
2110 stream_putl (s, rinfo->metric_out);
2116 /* Send update to the ifp or spcified neighbor. */
2118 rip_output_process (struct connected *ifc, struct sockaddr_in *to,
2119 int route_type, u_char version)
2123 struct route_node *rp;
2124 struct rip_info *rinfo;
2125 struct rip_interface *ri;
2126 struct prefix_ipv4 *p;
2127 struct prefix_ipv4 classfull;
2128 struct prefix_ipv4 ifaddrclass;
2129 struct key *key = NULL;
2130 /* this might need to made dynamic if RIP ever supported auth methods
2131 with larger key string sizes */
2132 char auth_str[RIP_AUTH_SIMPLE_SIZE];
2133 size_t doff = 0; /* offset of digest offset field */
2137 struct list *list = NULL;
2138 struct listnode *listnode = NULL;
2140 /* Logging output event. */
2141 if (IS_RIP_DEBUG_EVENT)
2144 zlog_debug ("update routes to neighbor %s", inet_ntoa (to->sin_addr));
2146 zlog_debug ("update routes on interface %s ifindex %d",
2147 ifc->ifp->name, ifc->ifp->ifindex);
2150 /* Set output stream. */
2153 /* Reset stream and RTE counter. */
2155 rtemax = RIP_MAX_RTE;
2157 /* Get RIP interface. */
2158 ri = ifc->ifp->info;
2160 /* If output interface is in simple password authentication mode, we
2161 need space for authentication data. */
2162 if (ri->auth_type == RIP_AUTH_SIMPLE_PASSWORD)
2165 /* If output interface is in MD5 authentication mode, we need space
2166 for authentication header and data. */
2167 if (ri->auth_type == RIP_AUTH_MD5)
2170 /* If output interface is in simple password authentication mode
2171 and string or keychain is specified we need space for auth. data */
2172 if (ri->auth_type != RIP_NO_AUTH)
2176 struct keychain *keychain;
2178 keychain = keychain_lookup (ri->key_chain);
2180 key = key_lookup_for_send (keychain);
2182 /* to be passed to auth functions later */
2183 rip_auth_prepare_str_send (ri, key, auth_str, RIP_AUTH_SIMPLE_SIZE);
2186 if (version == RIPv1)
2188 memcpy (&ifaddrclass, ifc->address, sizeof (struct prefix_ipv4));
2189 apply_classful_mask_ipv4 (&ifaddrclass);
2191 if (ifc->address->prefixlen > ifaddrclass.prefixlen)
2195 for (rp = route_top (rip->table); rp; rp = route_next (rp))
2196 if ((list = rp->info) != NULL && listcount (list) != 0)
2198 rinfo = listgetdata (listhead (list));
2199 /* For RIPv1, if we are subnetted, output subnets in our network */
2200 /* that have the same mask as the output "interface". For other */
2201 /* networks, only the classfull version is output. */
2203 if (version == RIPv1)
2205 p = (struct prefix_ipv4 *) &rp->p;
2207 if (IS_RIP_DEBUG_PACKET)
2208 zlog_debug("RIPv1 mask check, %s/%d considered for output",
2209 inet_ntoa (rp->p.u.prefix4), rp->p.prefixlen);
2212 prefix_match ((struct prefix *) &ifaddrclass, &rp->p))
2214 if ((ifc->address->prefixlen != rp->p.prefixlen) &&
2215 (rp->p.prefixlen != 32))
2220 memcpy (&classfull, &rp->p, sizeof(struct prefix_ipv4));
2221 apply_classful_mask_ipv4(&classfull);
2222 if (rp->p.u.prefix4.s_addr != 0 &&
2223 classfull.prefixlen != rp->p.prefixlen)
2226 if (IS_RIP_DEBUG_PACKET)
2227 zlog_debug("RIPv1 mask check, %s/%d made it through",
2228 inet_ntoa (rp->p.u.prefix4), rp->p.prefixlen);
2231 p = (struct prefix_ipv4 *) &rp->p;
2233 /* Apply output filters. */
2234 ret = rip_filter (RIP_FILTER_OUT, p, ri);
2238 /* Changed route only output. */
2239 if (route_type == rip_changed_route &&
2240 (! (rinfo->flags & RIP_RTF_CHANGED)))
2243 /* Split horizon. */
2244 /* if (split_horizon == rip_split_horizon) */
2245 if (ri->split_horizon == RIP_SPLIT_HORIZON)
2248 * We perform split horizon for RIP and connected route.
2249 * For rip routes, we want to suppress the route if we would
2250 * end up sending the route back on the interface that we
2251 * learned it from, with a higher metric. For connected routes,
2252 * we suppress the route if the prefix is a subset of the
2253 * source address that we are going to use for the packet
2254 * (in order to handle the case when multiple subnets are
2255 * configured on the same interface).
2258 struct rip_info *tmp_rinfo = NULL;
2260 for (ALL_LIST_ELEMENTS_RO (list, listnode, tmp_rinfo))
2261 if (tmp_rinfo->type == ZEBRA_ROUTE_RIP &&
2262 tmp_rinfo->ifindex == ifc->ifp->ifindex)
2268 if (!suppress && rinfo->type == ZEBRA_ROUTE_CONNECT &&
2269 prefix_match((struct prefix *)p, ifc->address))
2276 /* Preparation for route-map. */
2277 rinfo->metric_set = 0;
2278 rinfo->nexthop_out.s_addr = 0;
2279 rinfo->metric_out = rinfo->metric;
2280 rinfo->tag_out = rinfo->tag;
2281 rinfo->ifindex_out = ifc->ifp->ifindex;
2283 /* In order to avoid some local loops,
2284 * if the RIP route has a nexthop via this interface, keep the nexthop,
2285 * otherwise set it to 0. The nexthop should not be propagated
2286 * beyond the local broadcast/multicast area in order
2287 * to avoid an IGP multi-level recursive look-up.
2290 if (rinfo->ifindex == ifc->ifp->ifindex)
2291 rinfo->nexthop_out = rinfo->nexthop;
2293 /* Interface route-map */
2294 if (ri->routemap[RIP_FILTER_OUT])
2296 ret = route_map_apply (ri->routemap[RIP_FILTER_OUT],
2297 (struct prefix *) p, RMAP_RIP,
2300 if (ret == RMAP_DENYMATCH)
2302 if (IS_RIP_DEBUG_PACKET)
2303 zlog_debug ("RIP %s/%d is filtered by route-map out",
2304 inet_ntoa (p->prefix), p->prefixlen);
2309 /* Apply redistribute route map - continue, if deny */
2310 if (rip->route_map[rinfo->type].name
2311 && rinfo->sub_type != RIP_ROUTE_INTERFACE)
2313 ret = route_map_apply (rip->route_map[rinfo->type].map,
2314 (struct prefix *)p, RMAP_RIP, rinfo);
2316 if (ret == RMAP_DENYMATCH)
2318 if (IS_RIP_DEBUG_PACKET)
2319 zlog_debug ("%s/%d is filtered by route-map",
2320 inet_ntoa (p->prefix), p->prefixlen);
2325 /* When route-map does not set metric. */
2326 if (! rinfo->metric_set)
2328 /* If redistribute metric is set. */
2329 if (rip->route_map[rinfo->type].metric_config
2330 && rinfo->metric != RIP_METRIC_INFINITY)
2332 rinfo->metric_out = rip->route_map[rinfo->type].metric;
2336 /* If the route is not connected or localy generated
2337 one, use default-metric value*/
2338 if (rinfo->type != ZEBRA_ROUTE_RIP
2339 && rinfo->type != ZEBRA_ROUTE_CONNECT
2340 && rinfo->metric != RIP_METRIC_INFINITY)
2341 rinfo->metric_out = rip->default_metric;
2345 /* Apply offset-list */
2346 if (rinfo->metric != RIP_METRIC_INFINITY)
2347 rip_offset_list_apply_out (p, ifc->ifp, &rinfo->metric_out);
2349 if (rinfo->metric_out > RIP_METRIC_INFINITY)
2350 rinfo->metric_out = RIP_METRIC_INFINITY;
2352 /* Perform split-horizon with poisoned reverse
2353 * for RIP and connected routes.
2355 if (ri->split_horizon == RIP_SPLIT_HORIZON_POISONED_REVERSE) {
2357 * We perform split horizon for RIP and connected route.
2358 * For rip routes, we want to suppress the route if we would
2359 * end up sending the route back on the interface that we
2360 * learned it from, with a higher metric. For connected routes,
2361 * we suppress the route if the prefix is a subset of the
2362 * source address that we are going to use for the packet
2363 * (in order to handle the case when multiple subnets are
2364 * configured on the same interface).
2366 struct rip_info *tmp_rinfo = NULL;
2368 for (ALL_LIST_ELEMENTS_RO (list, listnode, tmp_rinfo))
2370 if (tmp_rinfo->type == ZEBRA_ROUTE_RIP &&
2371 tmp_rinfo->ifindex == ifc->ifp->ifindex)
2372 rinfo->metric_out = RIP_METRIC_INFINITY;
2373 if (tmp_rinfo->type == ZEBRA_ROUTE_CONNECT &&
2374 prefix_match((struct prefix *)p, ifc->address))
2375 rinfo->metric_out = RIP_METRIC_INFINITY;
2379 /* Prepare preamble, auth headers, if needs be */
2382 stream_putc (s, RIP_RESPONSE);
2383 stream_putc (s, version);
2386 /* auth header for !v1 && !no_auth */
2387 if ( (ri->auth_type != RIP_NO_AUTH) && (version != RIPv1) )
2388 doff = rip_auth_header_write (s, ri, key, auth_str,
2389 RIP_AUTH_SIMPLE_SIZE);
2392 /* Write RTE to the stream. */
2393 num = rip_write_rte (num, s, p, version, rinfo);
2396 if (version == RIPv2 && ri->auth_type == RIP_AUTH_MD5)
2397 rip_auth_md5_set (s, ri, doff, auth_str, RIP_AUTH_SIMPLE_SIZE);
2399 ret = rip_send_packet (STREAM_DATA (s), stream_get_endp (s),
2402 if (ret >= 0 && IS_RIP_DEBUG_SEND)
2403 rip_packet_dump ((struct rip_packet *)STREAM_DATA (s),
2404 stream_get_endp(s), "SEND");
2410 /* Flush unwritten RTE. */
2413 if (version == RIPv2 && ri->auth_type == RIP_AUTH_MD5)
2414 rip_auth_md5_set (s, ri, doff, auth_str, RIP_AUTH_SIMPLE_SIZE);
2416 ret = rip_send_packet (STREAM_DATA (s), stream_get_endp (s), to, ifc);
2418 if (ret >= 0 && IS_RIP_DEBUG_SEND)
2419 rip_packet_dump ((struct rip_packet *)STREAM_DATA (s),
2420 stream_get_endp (s), "SEND");
2425 /* Statistics updates. */
2429 /* Send RIP packet to the interface. */
2431 rip_update_interface (struct connected *ifc, u_char version, int route_type)
2433 struct sockaddr_in to;
2435 /* When RIP version is 2 and multicast enable interface. */
2436 if (version == RIPv2 && if_is_multicast (ifc->ifp))
2438 if (IS_RIP_DEBUG_EVENT)
2439 zlog_debug ("multicast announce on %s ", ifc->ifp->name);
2441 rip_output_process (ifc, NULL, route_type, version);
2445 /* If we can't send multicast packet, send it with unicast. */
2446 if (if_is_broadcast (ifc->ifp) || if_is_pointopoint (ifc->ifp))
2448 if (ifc->address->family == AF_INET)
2450 /* Destination address and port setting. */
2451 memset (&to, 0, sizeof (struct sockaddr_in));
2452 if (ifc->destination)
2453 /* use specified broadcast or peer destination addr */
2454 to.sin_addr = ifc->destination->u.prefix4;
2455 else if (ifc->address->prefixlen < IPV4_MAX_PREFIXLEN)
2456 /* calculate the appropriate broadcast address */
2457 to.sin_addr.s_addr =
2458 ipv4_broadcast_addr(ifc->address->u.prefix4.s_addr,
2459 ifc->address->prefixlen);
2461 /* do not know where to send the packet */
2463 to.sin_port = htons (RIP_PORT_DEFAULT);
2465 if (IS_RIP_DEBUG_EVENT)
2466 zlog_debug("%s announce to %s on %s",
2467 CONNECTED_PEER(ifc) ? "unicast" : "broadcast",
2468 inet_ntoa (to.sin_addr), ifc->ifp->name);
2470 rip_output_process (ifc, &to, route_type, version);
2475 /* Update send to all interface and neighbor. */
2477 rip_update_process (int route_type)
2479 struct listnode *node;
2480 struct listnode *ifnode, *ifnnode;
2481 struct connected *connected;
2482 struct interface *ifp;
2483 struct rip_interface *ri;
2484 struct route_node *rp;
2485 struct sockaddr_in to;
2486 struct prefix_ipv4 *p;
2488 /* Send RIP update to each interface. */
2489 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
2491 if (if_is_loopback (ifp))
2494 if (! if_is_operative (ifp))
2497 /* Fetch RIP interface information. */
2500 /* When passive interface is specified, suppress announce to the
2508 * If there is no version configuration in the interface,
2509 * use rip's version setting.
2511 int vsend = ((ri->ri_send == RI_RIP_UNSPEC) ?
2512 rip->version_send : ri->ri_send);
2514 if (IS_RIP_DEBUG_EVENT)
2515 zlog_debug("SEND UPDATE to %s ifindex %d",
2516 ifp->name, ifp->ifindex);
2518 /* send update on each connected network */
2519 for (ALL_LIST_ELEMENTS (ifp->connected, ifnode, ifnnode, connected))
2521 if (connected->address->family == AF_INET)
2524 rip_update_interface (connected, RIPv1, route_type);
2526 rip_update_interface (connected, RIPv2, route_type);
2532 /* RIP send updates to each neighbor. */
2533 for (rp = route_top (rip->neighbor); rp; rp = route_next (rp))
2534 if (rp->info != NULL)
2536 p = (struct prefix_ipv4 *) &rp->p;
2538 ifp = if_lookup_address (p->prefix);
2541 zlog_warn ("Neighbor %s doesn't have connected interface!",
2542 inet_ntoa (p->prefix));
2546 if ( (connected = connected_lookup_address (ifp, p->prefix)) == NULL)
2548 zlog_warn ("Neighbor %s doesn't have connected network",
2549 inet_ntoa (p->prefix));
2553 /* Set destination address and port */
2554 memset (&to, 0, sizeof (struct sockaddr_in));
2555 to.sin_addr = p->prefix;
2556 to.sin_port = htons (RIP_PORT_DEFAULT);
2558 /* RIP version is rip's configuration. */
2559 rip_output_process (connected, &to, route_type, rip->version_send);
2563 /* RIP's periodical timer. */
2565 rip_update (struct thread *t)
2567 /* Clear timer pointer. */
2568 rip->t_update = NULL;
2570 if (IS_RIP_DEBUG_EVENT)
2571 zlog_debug ("update timer fire!");
2573 /* Process update output. */
2574 rip_update_process (rip_all_route);
2576 /* Triggered updates may be suppressed if a regular update is due by
2577 the time the triggered update would be sent. */
2578 if (rip->t_triggered_interval)
2580 thread_cancel (rip->t_triggered_interval);
2581 rip->t_triggered_interval = NULL;
2585 /* Register myself. */
2586 rip_event (RIP_UPDATE_EVENT, 0);
2591 /* Walk down the RIP routing table then clear changed flag. */
2593 rip_clear_changed_flag (void)
2595 struct route_node *rp;
2596 struct rip_info *rinfo = NULL;
2597 struct list *list = NULL;
2598 struct listnode *listnode = NULL;
2600 for (rp = route_top (rip->table); rp; rp = route_next (rp))
2601 if ((list = rp->info) != NULL)
2602 for (ALL_LIST_ELEMENTS_RO (list, listnode, rinfo))
2604 UNSET_FLAG (rinfo->flags, RIP_RTF_CHANGED);
2605 /* This flag can be set only on the first entry. */
2610 /* Triggered update interval timer. */
2612 rip_triggered_interval (struct thread *t)
2614 int rip_triggered_update (struct thread *);
2616 rip->t_triggered_interval = NULL;
2621 rip_triggered_update (t);
2626 /* Execute triggered update. */
2628 rip_triggered_update (struct thread *t)
2632 /* Clear thred pointer. */
2633 rip->t_triggered_update = NULL;
2635 /* Cancel interval timer. */
2636 if (rip->t_triggered_interval)
2638 thread_cancel (rip->t_triggered_interval);
2639 rip->t_triggered_interval = NULL;
2643 /* Logging triggered update. */
2644 if (IS_RIP_DEBUG_EVENT)
2645 zlog_debug ("triggered update!");
2647 /* Split Horizon processing is done when generating triggered
2648 updates as well as normal updates (see section 2.6). */
2649 rip_update_process (rip_changed_route);
2651 /* Once all of the triggered updates have been generated, the route
2652 change flags should be cleared. */
2653 rip_clear_changed_flag ();
2655 /* After a triggered update is sent, a timer should be set for a
2656 random interval between 1 and 5 seconds. If other changes that
2657 would trigger updates occur before the timer expires, a single
2658 update is triggered when the timer expires. */
2659 interval = (random () % 5) + 1;
2661 rip->t_triggered_interval =
2662 thread_add_timer (master, rip_triggered_interval, NULL, interval);
2667 /* Withdraw redistributed route. */
2669 rip_redistribute_withdraw (int type)
2671 struct route_node *rp;
2672 struct rip_info *rinfo = NULL;
2673 struct list *list = NULL;
2678 for (rp = route_top (rip->table); rp; rp = route_next (rp))
2679 if ((list = rp->info) != NULL)
2681 rinfo = listgetdata (listhead (list));
2682 if (rinfo->type == type
2683 && rinfo->sub_type != RIP_ROUTE_INTERFACE)
2685 /* Perform poisoned reverse. */
2686 rinfo->metric = RIP_METRIC_INFINITY;
2687 RIP_TIMER_ON (rinfo->t_garbage_collect,
2688 rip_garbage_collect, rip->garbage_time);
2689 RIP_TIMER_OFF (rinfo->t_timeout);
2690 rinfo->flags |= RIP_RTF_CHANGED;
2692 if (IS_RIP_DEBUG_EVENT) {
2693 struct prefix_ipv4 *p = (struct prefix_ipv4 *) &rp->p;
2695 zlog_debug ("Poisone %s/%d on the interface %s with an infinity metric [withdraw]",
2696 inet_ntoa(p->prefix), p->prefixlen,
2697 ifindex2ifname(rinfo->ifindex));
2700 rip_event (RIP_TRIGGERED_UPDATE, 0);
2705 /* Create new RIP instance and set it to global variable. */
2709 rip = XCALLOC (MTYPE_RIP, sizeof (struct rip));
2711 /* Set initial value. */
2712 rip->version_send = RI_RIP_VERSION_2;
2713 rip->version_recv = RI_RIP_VERSION_1_AND_2;
2714 rip->update_time = RIP_UPDATE_TIMER_DEFAULT;
2715 rip->timeout_time = RIP_TIMEOUT_TIMER_DEFAULT;
2716 rip->garbage_time = RIP_GARBAGE_TIMER_DEFAULT;
2717 rip->default_metric = RIP_DEFAULT_METRIC_DEFAULT;
2719 /* Initialize RIP routig table. */
2720 rip->table = route_table_init ();
2721 rip->route = route_table_init ();
2722 rip->neighbor = route_table_init ();
2724 /* Make output stream. */
2725 rip->obuf = stream_new (1500);
2728 rip->sock = rip_create_socket (NULL);
2732 /* Create read and timer thread. */
2733 rip_event (RIP_READ, rip->sock);
2734 rip_event (RIP_UPDATE_EVENT, 1);
2739 /* Sned RIP request to the destination. */
2741 rip_request_send (struct sockaddr_in *to, struct interface *ifp,
2742 u_char version, struct connected *connected)
2745 struct rip_packet rip_packet;
2746 struct listnode *node, *nnode;
2748 memset (&rip_packet, 0, sizeof (rip_packet));
2750 rip_packet.command = RIP_REQUEST;
2751 rip_packet.version = version;
2752 rte = rip_packet.rte;
2753 rte->metric = htonl (RIP_METRIC_INFINITY);
2758 * connected is only sent for ripv1 case, or when
2759 * interface does not support multicast. Caller loops
2760 * over each connected address for this case.
2762 if (rip_send_packet ((u_char *) &rip_packet, sizeof (rip_packet),
2763 to, connected) != sizeof (rip_packet))
2766 return sizeof (rip_packet);
2769 /* send request on each connected network */
2770 for (ALL_LIST_ELEMENTS (ifp->connected, node, nnode, connected))
2772 struct prefix_ipv4 *p;
2774 p = (struct prefix_ipv4 *) connected->address;
2776 if (p->family != AF_INET)
2779 if (rip_send_packet ((u_char *) &rip_packet, sizeof (rip_packet),
2780 to, connected) != sizeof (rip_packet))
2783 return sizeof (rip_packet);
2787 rip_update_jitter (unsigned long time)
2789 #define JITTER_BOUND 4
2790 /* We want to get the jitter to +/- 1/JITTER_BOUND the interval.
2791 Given that, we cannot let time be less than JITTER_BOUND seconds.
2792 The RIPv2 RFC says jitter should be small compared to
2793 update_time. We consider 1/JITTER_BOUND to be small.
2796 int jitter_input = time;
2799 if (jitter_input < JITTER_BOUND)
2800 jitter_input = JITTER_BOUND;
2802 jitter = (((random () % ((jitter_input * 2) + 1)) - jitter_input));
2804 return jitter/JITTER_BOUND;
2808 rip_event (enum rip_event event, int sock)
2815 rip->t_read = thread_add_read (master, rip_read, NULL, sock);
2817 case RIP_UPDATE_EVENT:
2820 thread_cancel (rip->t_update);
2821 rip->t_update = NULL;
2823 jitter = rip_update_jitter (rip->update_time);
2825 thread_add_timer (master, rip_update, NULL,
2826 sock ? 2 : rip->update_time + jitter);
2828 case RIP_TRIGGERED_UPDATE:
2829 if (rip->t_triggered_interval)
2831 else if (! rip->t_triggered_update)
2832 rip->t_triggered_update =
2833 thread_add_event (master, rip_triggered_update, NULL, 0);
2843 "Enable a routing process\n"
2844 "Routing Information Protocol (RIP)\n")
2848 /* If rip is not enabled before. */
2851 ret = rip_create ();
2854 zlog_info ("Can't create RIP");
2858 vty->node = RIP_NODE;
2864 DEFUN (no_router_rip,
2868 "Enable a routing process\n"
2869 "Routing Information Protocol (RIP)\n")
2879 "Set routing protocol version\n"
2884 version = atoi (argv[0]);
2885 if (version != RIPv1 && version != RIPv2)
2887 vty_out (vty, "invalid rip version %d%s", version,
2891 rip->version_send = version;
2892 rip->version_recv = version;
2897 DEFUN (no_rip_version,
2901 "Set routing protocol version\n")
2903 /* Set RIP version to the default. */
2904 rip->version_send = RI_RIP_VERSION_2;
2905 rip->version_recv = RI_RIP_VERSION_1_AND_2;
2910 ALIAS (no_rip_version,
2911 no_rip_version_val_cmd,
2914 "Set routing protocol version\n"
2920 "RIP static route configuration\n"
2921 "IP prefix <network>/<length>\n")
2924 struct prefix_ipv4 p;
2925 struct route_node *node;
2927 ret = str2prefix_ipv4 (argv[0], &p);
2930 vty_out (vty, "Malformed address%s", VTY_NEWLINE);
2933 apply_mask_ipv4 (&p);
2935 /* For router rip configuration. */
2936 node = route_node_get (rip->route, (struct prefix *) &p);
2940 vty_out (vty, "There is already same static route.%s", VTY_NEWLINE);
2941 route_unlock_node (node);
2945 node->info = (char *)"static";
2947 rip_redistribute_add (ZEBRA_ROUTE_RIP, RIP_ROUTE_STATIC, &p, 0, NULL, 0, 0, 0);
2952 DEFUN (no_rip_route,
2954 "no route A.B.C.D/M",
2956 "RIP static route configuration\n"
2957 "IP prefix <network>/<length>\n")
2960 struct prefix_ipv4 p;
2961 struct route_node *node;
2963 ret = str2prefix_ipv4 (argv[0], &p);
2966 vty_out (vty, "Malformed address%s", VTY_NEWLINE);
2969 apply_mask_ipv4 (&p);
2971 /* For router rip configuration. */
2972 node = route_node_lookup (rip->route, (struct prefix *) &p);
2975 vty_out (vty, "Can't find route %s.%s", argv[0],
2980 rip_redistribute_delete (ZEBRA_ROUTE_RIP, RIP_ROUTE_STATIC, &p, 0);
2981 route_unlock_node (node);
2984 route_unlock_node (node);
2991 rip_update_default_metric (void)
2993 struct route_node *np;
2994 struct rip_info *rinfo = NULL;
2995 struct list *list = NULL;
2996 struct listnode *listnode = NULL;
2998 for (np = route_top (rip->table); np; np = route_next (np))
2999 if ((list = np->info) != NULL)
3000 for (ALL_LIST_ELEMENTS_RO (list, listnode, rinfo))
3001 if (rinfo->type != ZEBRA_ROUTE_RIP && rinfo->type != ZEBRA_ROUTE_CONNECT)
3002 rinfo->metric = rip->default_metric;
3006 DEFUN (rip_default_metric,
3007 rip_default_metric_cmd,
3008 "default-metric <1-16>",
3009 "Set a metric of redistribute routes\n"
3014 rip->default_metric = atoi (argv[0]);
3015 /* rip_update_default_metric (); */
3020 DEFUN (no_rip_default_metric,
3021 no_rip_default_metric_cmd,
3022 "no default-metric",
3024 "Set a metric of redistribute routes\n"
3029 rip->default_metric = RIP_DEFAULT_METRIC_DEFAULT;
3030 /* rip_update_default_metric (); */
3035 ALIAS (no_rip_default_metric,
3036 no_rip_default_metric_val_cmd,
3037 "no default-metric <1-16>",
3039 "Set a metric of redistribute routes\n"
3044 "timers basic <5-2147483647> <5-2147483647> <5-2147483647>",
3045 "Adjust routing timers\n"
3046 "Basic routing protocol update timers\n"
3047 "Routing table update timer value in second. Default is 30.\n"
3048 "Routing information timeout timer. Default is 180.\n"
3049 "Garbage collection timer. Default is 120.\n")
3051 unsigned long update;
3052 unsigned long timeout;
3053 unsigned long garbage;
3054 char *endptr = NULL;
3055 unsigned long RIP_TIMER_MAX = 2147483647;
3056 unsigned long RIP_TIMER_MIN = 5;
3058 update = strtoul (argv[0], &endptr, 10);
3059 if (update > RIP_TIMER_MAX || update < RIP_TIMER_MIN || *endptr != '\0')
3061 vty_out (vty, "update timer value error%s", VTY_NEWLINE);
3065 timeout = strtoul (argv[1], &endptr, 10);
3066 if (timeout > RIP_TIMER_MAX || timeout < RIP_TIMER_MIN || *endptr != '\0')
3068 vty_out (vty, "timeout timer value error%s", VTY_NEWLINE);
3072 garbage = strtoul (argv[2], &endptr, 10);
3073 if (garbage > RIP_TIMER_MAX || garbage < RIP_TIMER_MIN || *endptr != '\0')
3075 vty_out (vty, "garbage timer value error%s", VTY_NEWLINE);
3079 /* Set each timer value. */
3080 rip->update_time = update;
3081 rip->timeout_time = timeout;
3082 rip->garbage_time = garbage;
3084 /* Reset update timer thread. */
3085 rip_event (RIP_UPDATE_EVENT, 0);
3090 DEFUN (no_rip_timers,
3094 "Adjust routing timers\n"
3095 "Basic routing protocol update timers\n")
3097 /* Set each timer value to the default. */
3098 rip->update_time = RIP_UPDATE_TIMER_DEFAULT;
3099 rip->timeout_time = RIP_TIMEOUT_TIMER_DEFAULT;
3100 rip->garbage_time = RIP_GARBAGE_TIMER_DEFAULT;
3102 /* Reset update timer thread. */
3103 rip_event (RIP_UPDATE_EVENT, 0);
3108 ALIAS (no_rip_timers,
3109 no_rip_timers_val_cmd,
3110 "no timers basic <0-65535> <0-65535> <0-65535>",
3112 "Adjust routing timers\n"
3113 "Basic routing protocol update timers\n"
3114 "Routing table update timer value in second. Default is 30.\n"
3115 "Routing information timeout timer. Default is 180.\n"
3116 "Garbage collection timer. Default is 120.\n")
3119 struct route_table *rip_distance_table;
3123 /* Distance value for the IP source prefix. */
3126 /* Name of the access-list to be matched. */
3130 static struct rip_distance *
3131 rip_distance_new (void)
3133 return XCALLOC (MTYPE_RIP_DISTANCE, sizeof (struct rip_distance));
3137 rip_distance_free (struct rip_distance *rdistance)
3139 XFREE (MTYPE_RIP_DISTANCE, rdistance);
3143 rip_distance_set (struct vty *vty, const char *distance_str, const char *ip_str,
3144 const char *access_list_str)
3147 struct prefix_ipv4 p;
3149 struct route_node *rn;
3150 struct rip_distance *rdistance;
3152 ret = str2prefix_ipv4 (ip_str, &p);
3155 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
3159 distance = atoi (distance_str);
3161 /* Get RIP distance node. */
3162 rn = route_node_get (rip_distance_table, (struct prefix *) &p);
3165 rdistance = rn->info;
3166 route_unlock_node (rn);
3170 rdistance = rip_distance_new ();
3171 rn->info = rdistance;
3174 /* Set distance value. */
3175 rdistance->distance = distance;
3177 /* Reset access-list configuration. */
3178 if (rdistance->access_list)
3180 free (rdistance->access_list);
3181 rdistance->access_list = NULL;
3183 if (access_list_str)
3184 rdistance->access_list = strdup (access_list_str);
3190 rip_distance_unset (struct vty *vty, const char *distance_str,
3191 const char *ip_str, const char *access_list_str)
3194 struct prefix_ipv4 p;
3195 struct route_node *rn;
3196 struct rip_distance *rdistance;
3198 ret = str2prefix_ipv4 (ip_str, &p);
3201 vty_out (vty, "Malformed prefix%s", VTY_NEWLINE);
3205 rn = route_node_lookup (rip_distance_table, (struct prefix *)&p);
3208 vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
3212 rdistance = rn->info;
3214 if (rdistance->access_list)
3215 free (rdistance->access_list);
3216 rip_distance_free (rdistance);
3219 route_unlock_node (rn);
3220 route_unlock_node (rn);
3226 rip_distance_reset (void)
3228 struct route_node *rn;
3229 struct rip_distance *rdistance;
3231 for (rn = route_top (rip_distance_table); rn; rn = route_next (rn))
3232 if ((rdistance = rn->info) != NULL)
3234 if (rdistance->access_list)
3235 free (rdistance->access_list);
3236 rip_distance_free (rdistance);
3238 route_unlock_node (rn);
3242 /* Apply RIP information to distance method. */
3244 rip_distance_apply (struct rip_info *rinfo)
3246 struct route_node *rn;
3247 struct prefix_ipv4 p;
3248 struct rip_distance *rdistance;
3249 struct access_list *alist;
3254 memset (&p, 0, sizeof (struct prefix_ipv4));
3256 p.prefix = rinfo->from;
3257 p.prefixlen = IPV4_MAX_BITLEN;
3259 /* Check source address. */
3260 rn = route_node_match (rip_distance_table, (struct prefix *) &p);
3263 rdistance = rn->info;
3264 route_unlock_node (rn);
3266 if (rdistance->access_list)
3268 alist = access_list_lookup (AFI_IP, rdistance->access_list);
3271 if (access_list_apply (alist, &rinfo->rp->p) == FILTER_DENY)
3274 return rdistance->distance;
3277 return rdistance->distance;
3281 return rip->distance;
3287 rip_distance_show (struct vty *vty)
3289 struct route_node *rn;
3290 struct rip_distance *rdistance;
3294 vty_out (vty, " Distance: (default is %d)%s",
3295 rip->distance ? rip->distance :ZEBRA_RIP_DISTANCE_DEFAULT,
3298 for (rn = route_top (rip_distance_table); rn; rn = route_next (rn))
3299 if ((rdistance = rn->info) != NULL)
3303 vty_out (vty, " Address Distance List%s",
3307 sprintf (buf, "%s/%d", inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen);
3308 vty_out (vty, " %-20s %4d %s%s",
3309 buf, rdistance->distance,
3310 rdistance->access_list ? rdistance->access_list : "",
3315 DEFUN (rip_distance,
3318 "Administrative distance\n"
3321 rip->distance = atoi (argv[0]);
3325 DEFUN (no_rip_distance,
3326 no_rip_distance_cmd,
3327 "no distance <1-255>",
3329 "Administrative distance\n"
3336 DEFUN (rip_distance_source,
3337 rip_distance_source_cmd,
3338 "distance <1-255> A.B.C.D/M",
3339 "Administrative distance\n"
3341 "IP source prefix\n")
3343 rip_distance_set (vty, argv[0], argv[1], NULL);
3347 DEFUN (no_rip_distance_source,
3348 no_rip_distance_source_cmd,
3349 "no distance <1-255> A.B.C.D/M",
3351 "Administrative distance\n"
3353 "IP source prefix\n")
3355 rip_distance_unset (vty, argv[0], argv[1], NULL);
3359 DEFUN (rip_distance_source_access_list,
3360 rip_distance_source_access_list_cmd,
3361 "distance <1-255> A.B.C.D/M WORD",
3362 "Administrative distance\n"
3364 "IP source prefix\n"
3365 "Access list name\n")
3367 rip_distance_set (vty, argv[0], argv[1], argv[2]);
3371 DEFUN (no_rip_distance_source_access_list,
3372 no_rip_distance_source_access_list_cmd,
3373 "no distance <1-255> A.B.C.D/M WORD",
3375 "Administrative distance\n"
3377 "IP source prefix\n"
3378 "Access list name\n")
3380 rip_distance_unset (vty, argv[0], argv[1], argv[2]);
3384 /* Update ECMP routes to zebra when ECMP is disabled. */
3386 rip_ecmp_disable (void)
3388 struct route_node *rp;
3389 struct rip_info *rinfo, *tmp_rinfo;
3391 struct listnode *node, *nextnode;
3396 for (rp = route_top (rip->table); rp; rp = route_next (rp))
3397 if ((list = rp->info) != NULL && listcount (list) > 1)
3399 rinfo = listgetdata (listhead (list));
3400 if (!rip_route_rte (rinfo))
3403 /* Drop all other entries, except the first one. */
3404 for (ALL_LIST_ELEMENTS (list, node, nextnode, tmp_rinfo))
3405 if (tmp_rinfo != rinfo)
3407 RIP_TIMER_OFF (tmp_rinfo->t_timeout);
3408 RIP_TIMER_OFF (tmp_rinfo->t_garbage_collect);
3409 list_delete_node (list, node);
3410 rip_info_free (tmp_rinfo);
3414 rip_zebra_ipv4_add (rp);
3416 /* Set the route change flag. */
3417 SET_FLAG (rinfo->flags, RIP_RTF_CHANGED);
3419 /* Signal the output process to trigger an update. */
3420 rip_event (RIP_TRIGGERED_UPDATE, 0);
3424 DEFUN (rip_allow_ecmp,
3427 "Allow Equal Cost MultiPath\n")
3431 vty_out (vty, "ECMP is already enabled.%s", VTY_NEWLINE);
3436 zlog_info ("ECMP is enabled.");
3440 DEFUN (no_rip_allow_ecmp,
3441 no_rip_allow_ecmp_cmd,
3444 "Allow Equal Cost MultiPath\n")
3448 vty_out (vty, "ECMP is already disabled.%s", VTY_NEWLINE);
3453 zlog_info ("ECMP is disabled.");
3454 rip_ecmp_disable ();
3458 /* Print out routes update time. */
3460 rip_vty_out_uptime (struct vty *vty, struct rip_info *rinfo)
3465 char timebuf [TIME_BUF];
3466 struct thread *thread;
3468 if ((thread = rinfo->t_timeout) != NULL)
3470 clock = thread_timer_remain_second (thread);
3471 tm = gmtime (&clock);
3472 strftime (timebuf, TIME_BUF, "%M:%S", tm);
3473 vty_out (vty, "%5s", timebuf);
3475 else if ((thread = rinfo->t_garbage_collect) != NULL)
3477 clock = thread_timer_remain_second (thread);
3478 tm = gmtime (&clock);
3479 strftime (timebuf, TIME_BUF, "%M:%S", tm);
3480 vty_out (vty, "%5s", timebuf);
3485 rip_route_type_print (int sub_type)
3491 case RIP_ROUTE_STATIC:
3493 case RIP_ROUTE_DEFAULT:
3495 case RIP_ROUTE_REDISTRIBUTE:
3497 case RIP_ROUTE_INTERFACE:
3509 "Show RIP routes\n")
3511 struct route_node *np;
3512 struct rip_info *rinfo = NULL;
3513 struct list *list = NULL;
3514 struct listnode *listnode = NULL;
3519 vty_out (vty, "Codes: R - RIP, C - connected, S - Static, O - OSPF, B - BGP%s"
3521 " (n) - normal, (s) - static, (d) - default, (r) - redistribute,%s"
3522 " (i) - interface%s%s"
3523 " Network Next Hop Metric From Tag Time%s",
3524 VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
3526 for (np = route_top (rip->table); np; np = route_next (np))
3527 if ((list = np->info) != NULL)
3528 for (ALL_LIST_ELEMENTS_RO (list, listnode, rinfo))
3532 len = vty_out (vty, "%c(%s) %s/%d",
3533 /* np->lock, For debugging. */
3534 zebra_route_char(rinfo->type),
3535 rip_route_type_print (rinfo->sub_type),
3536 inet_ntoa (np->p.u.prefix4), np->p.prefixlen);
3541 vty_out (vty, "%*s", len, " ");
3543 if (rinfo->nexthop.s_addr)
3544 vty_out (vty, "%-20s %2d ", inet_ntoa (rinfo->nexthop),
3547 vty_out (vty, "0.0.0.0 %2d ", rinfo->metric);
3549 /* Route which exist in kernel routing table. */
3550 if ((rinfo->type == ZEBRA_ROUTE_RIP) &&
3551 (rinfo->sub_type == RIP_ROUTE_RTE))
3553 vty_out (vty, "%-15s ", inet_ntoa (rinfo->from));
3554 vty_out (vty, "%3d ", rinfo->tag);
3555 rip_vty_out_uptime (vty, rinfo);
3557 else if (rinfo->metric == RIP_METRIC_INFINITY)
3559 vty_out (vty, "self ");
3560 vty_out (vty, "%3d ", rinfo->tag);
3561 rip_vty_out_uptime (vty, rinfo);
3565 if (rinfo->external_metric)
3567 len = vty_out (vty, "self (%s:%d)",
3568 zebra_route_string(rinfo->type),
3569 rinfo->external_metric);
3572 vty_out (vty, "%*s", len, " ");
3575 vty_out (vty, "self ");
3576 vty_out (vty, "%3d", rinfo->tag);
3579 vty_out (vty, "%s", VTY_NEWLINE);
3584 /* Vincent: formerly, it was show_ip_protocols_rip: "show ip protocols" */
3585 DEFUN (show_ip_rip_status,
3586 show_ip_rip_status_cmd,
3587 "show ip rip status",
3591 "IP routing protocol process parameters and statistics\n")
3593 struct listnode *node;
3594 struct interface *ifp;
3595 struct rip_interface *ri;
3596 extern const struct message ri_version_msg[];
3597 const char *send_version;
3598 const char *receive_version;
3603 vty_out (vty, "Routing Protocol is \"rip\"%s", VTY_NEWLINE);
3604 vty_out (vty, " Sending updates every %ld seconds with +/-50%%,",
3606 vty_out (vty, " next due in %lu seconds%s",
3607 thread_timer_remain_second(rip->t_update),
3609 vty_out (vty, " Timeout after %ld seconds,", rip->timeout_time);
3610 vty_out (vty, " garbage collect after %ld seconds%s", rip->garbage_time,
3613 /* Filtering status show. */
3614 config_show_distribute (vty);
3616 /* Default metric information. */
3617 vty_out (vty, " Default redistribution metric is %d%s",
3618 rip->default_metric, VTY_NEWLINE);
3620 /* Redistribute information. */
3621 vty_out (vty, " Redistributing:");
3622 config_write_rip_redistribute (vty, 0);
3623 vty_out (vty, "%s", VTY_NEWLINE);
3625 vty_out (vty, " Default version control: send version %s,",
3626 lookup(ri_version_msg,rip->version_send));
3627 if (rip->version_recv == RI_RIP_VERSION_1_AND_2)
3628 vty_out (vty, " receive any version %s", VTY_NEWLINE);
3630 vty_out (vty, " receive version %s %s",
3631 lookup(ri_version_msg,rip->version_recv), VTY_NEWLINE);
3633 vty_out (vty, " Interface Send Recv Key-chain%s", VTY_NEWLINE);
3635 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
3642 if (ri->enable_network || ri->enable_interface)
3644 if (ri->ri_send == RI_RIP_UNSPEC)
3645 send_version = lookup (ri_version_msg, rip->version_send);
3647 send_version = lookup (ri_version_msg, ri->ri_send);
3649 if (ri->ri_receive == RI_RIP_UNSPEC)
3650 receive_version = lookup (ri_version_msg, rip->version_recv);
3652 receive_version = lookup (ri_version_msg, ri->ri_receive);
3654 vty_out (vty, " %-17s%-3s %-3s %s%s", ifp->name,
3657 ri->key_chain ? ri->key_chain : "",
3662 vty_out (vty, " Routing for Networks:%s", VTY_NEWLINE);
3663 config_write_rip_network (vty, 0);
3666 int found_passive = 0;
3667 for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
3671 if ((ri->enable_network || ri->enable_interface) && ri->passive)
3675 vty_out (vty, " Passive Interface(s):%s", VTY_NEWLINE);
3678 vty_out (vty, " %s%s", ifp->name, VTY_NEWLINE);
3683 vty_out (vty, " Routing Information Sources:%s", VTY_NEWLINE);
3684 vty_out (vty, " Gateway BadPackets BadRoutes Distance Last Update%s", VTY_NEWLINE);
3685 rip_peer_display (vty);
3687 rip_distance_show (vty);
3692 /* RIP configuration write function. */
3694 config_write_rip (struct vty *vty)
3697 struct route_node *rn;
3698 struct rip_distance *rdistance;
3702 /* Router RIP statement. */
3703 vty_out (vty, "router rip%s", VTY_NEWLINE);
3706 /* RIP version statement. Default is RIP version 2. */
3707 if (rip->version_send != RI_RIP_VERSION_2
3708 || rip->version_recv != RI_RIP_VERSION_1_AND_2)
3709 vty_out (vty, " version %d%s", rip->version_send,
3712 /* RIP timer configuration. */
3713 if (rip->update_time != RIP_UPDATE_TIMER_DEFAULT
3714 || rip->timeout_time != RIP_TIMEOUT_TIMER_DEFAULT
3715 || rip->garbage_time != RIP_GARBAGE_TIMER_DEFAULT)
3716 vty_out (vty, " timers basic %lu %lu %lu%s",
3722 /* Default information configuration. */
3723 if (rip->default_information)
3725 if (rip->default_information_route_map)
3726 vty_out (vty, " default-information originate route-map %s%s",
3727 rip->default_information_route_map, VTY_NEWLINE);
3729 vty_out (vty, " default-information originate%s",
3733 /* Redistribute configuration. */
3734 config_write_rip_redistribute (vty, 1);
3736 /* RIP offset-list configuration. */
3737 config_write_rip_offset_list (vty);
3739 /* RIP enabled network and interface configuration. */
3740 config_write_rip_network (vty, 1);
3742 /* RIP default metric configuration */
3743 if (rip->default_metric != RIP_DEFAULT_METRIC_DEFAULT)
3744 vty_out (vty, " default-metric %d%s",
3745 rip->default_metric, VTY_NEWLINE);
3747 /* Distribute configuration. */
3748 write += config_write_distribute (vty);
3750 /* Interface routemap configuration */
3751 write += config_write_if_rmap (vty);
3753 /* Distance configuration. */
3755 vty_out (vty, " distance %d%s", rip->distance, VTY_NEWLINE);
3757 /* RIP source IP prefix distance configuration. */
3758 for (rn = route_top (rip_distance_table); rn; rn = route_next (rn))
3759 if ((rdistance = rn->info) != NULL)
3760 vty_out (vty, " distance %d %s/%d %s%s", rdistance->distance,
3761 inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
3762 rdistance->access_list ? rdistance->access_list : "",
3765 /* ECMP configuration. */
3767 vty_out (vty, " allow-ecmp%s", VTY_NEWLINE);
3769 /* RIP static route configuration. */
3770 for (rn = route_top (rip->route); rn; rn = route_next (rn))
3772 vty_out (vty, " route %s/%d%s",
3773 inet_ntoa (rn->p.u.prefix4),
3781 /* RIP node structure. */
3782 static struct cmd_node rip_node =
3785 "%s(config-router)# ",
3789 /* Distribute-list update functions. */
3791 rip_distribute_update (struct distribute *dist)
3793 struct interface *ifp;
3794 struct rip_interface *ri;
3795 struct access_list *alist;
3796 struct prefix_list *plist;
3801 ifp = if_lookup_by_name (dist->ifname);
3807 if (dist->list[DISTRIBUTE_V4_IN])
3809 alist = access_list_lookup (AFI_IP, dist->list[DISTRIBUTE_V4_IN]);
3811 ri->list[RIP_FILTER_IN] = alist;
3813 ri->list[RIP_FILTER_IN] = NULL;
3816 ri->list[RIP_FILTER_IN] = NULL;
3818 if (dist->list[DISTRIBUTE_V4_OUT])
3820 alist = access_list_lookup (AFI_IP, dist->list[DISTRIBUTE_V4_OUT]);
3822 ri->list[RIP_FILTER_OUT] = alist;
3824 ri->list[RIP_FILTER_OUT] = NULL;
3827 ri->list[RIP_FILTER_OUT] = NULL;
3829 if (dist->prefix[DISTRIBUTE_V4_IN])
3831 plist = prefix_list_lookup (AFI_IP, dist->prefix[DISTRIBUTE_V4_IN]);
3833 ri->prefix[RIP_FILTER_IN] = plist;
3835 ri->prefix[RIP_FILTER_IN] = NULL;
3838 ri->prefix[RIP_FILTER_IN] = NULL;
3840 if (dist->prefix[DISTRIBUTE_V4_OUT])
3842 plist = prefix_list_lookup (AFI_IP, dist->prefix[DISTRIBUTE_V4_OUT]);
3844 ri->prefix[RIP_FILTER_OUT] = plist;
3846 ri->prefix[RIP_FILTER_OUT] = NULL;
3849 ri->prefix[RIP_FILTER_OUT] = NULL;
3853 rip_distribute_update_interface (struct interface *ifp)
3855 struct distribute *dist;
3857 dist = distribute_lookup (ifp->name);
3859 rip_distribute_update (dist);
3862 /* Update all interface's distribute list. */
3865 rip_distribute_update_all (struct prefix_list *notused)
3867 struct interface *ifp;
3868 struct listnode *node, *nnode;
3870 for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
3871 rip_distribute_update_interface (ifp);
3875 rip_distribute_update_all_wrapper(const char *unused)
3877 rip_distribute_update_all(NULL);
3880 /* Delete all added rip route. */
3885 struct route_node *rp;
3886 struct rip_info *rinfo = NULL;
3887 struct list *list = NULL;
3888 struct listnode *listnode = NULL;
3892 /* Clear RIP routes */
3893 for (rp = route_top (rip->table); rp; rp = route_next (rp))
3894 if ((list = rp->info) != NULL)
3896 rinfo = listgetdata (listhead (list));
3897 if (rip_route_rte (rinfo))
3898 rip_zebra_ipv4_delete (rp);
3900 for (ALL_LIST_ELEMENTS_RO (list, listnode, rinfo))
3902 RIP_TIMER_OFF (rinfo->t_timeout);
3903 RIP_TIMER_OFF (rinfo->t_garbage_collect);
3904 rip_info_free (rinfo);
3908 route_unlock_node (rp);
3911 /* Cancel RIP related timers. */
3912 RIP_TIMER_OFF (rip->t_update);
3913 RIP_TIMER_OFF (rip->t_triggered_update);
3914 RIP_TIMER_OFF (rip->t_triggered_interval);
3916 /* Cancel read thread. */
3919 thread_cancel (rip->t_read);
3923 /* Close RIP socket. */
3930 /* Static RIP route configuration. */
3931 for (rp = route_top (rip->route); rp; rp = route_next (rp))
3935 route_unlock_node (rp);
3938 /* RIP neighbor configuration. */
3939 for (rp = route_top (rip->neighbor); rp; rp = route_next (rp))
3943 route_unlock_node (rp);
3946 /* Redistribute related clear. */
3947 if (rip->default_information_route_map)
3948 free (rip->default_information_route_map);
3950 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
3951 if (rip->route_map[i].name)
3952 free (rip->route_map[i].name);
3954 XFREE (MTYPE_ROUTE_TABLE, rip->table);
3955 XFREE (MTYPE_ROUTE_TABLE, rip->route);
3956 XFREE (MTYPE_ROUTE_TABLE, rip->neighbor);
3958 XFREE (MTYPE_RIP, rip);
3962 rip_clean_network ();
3963 rip_passive_nondefault_clean ();
3964 rip_offset_clean ();
3965 rip_interfaces_clean ();
3966 rip_distance_reset ();
3967 rip_redistribute_clean ();
3970 /* Reset all values to the default settings. */
3974 /* Reset global counters. */
3975 rip_global_route_changes = 0;
3976 rip_global_queries = 0;
3978 /* Call ripd related reset functions. */
3980 rip_route_map_reset ();
3982 /* Call library reset functions. */
3984 access_list_reset ();
3985 prefix_list_reset ();
3987 distribute_list_reset ();
3989 rip_interfaces_reset ();
3990 rip_distance_reset ();
3992 rip_zclient_reset ();
3996 rip_if_rmap_update (struct if_rmap *if_rmap)
3998 struct interface *ifp;
3999 struct rip_interface *ri;
4000 struct route_map *rmap;
4002 ifp = if_lookup_by_name (if_rmap->ifname);
4008 if (if_rmap->routemap[IF_RMAP_IN])
4010 rmap = route_map_lookup_by_name (if_rmap->routemap[IF_RMAP_IN]);
4012 ri->routemap[IF_RMAP_IN] = rmap;
4014 ri->routemap[IF_RMAP_IN] = NULL;
4017 ri->routemap[RIP_FILTER_IN] = NULL;
4019 if (if_rmap->routemap[IF_RMAP_OUT])
4021 rmap = route_map_lookup_by_name (if_rmap->routemap[IF_RMAP_OUT]);
4023 ri->routemap[IF_RMAP_OUT] = rmap;
4025 ri->routemap[IF_RMAP_OUT] = NULL;
4028 ri->routemap[RIP_FILTER_OUT] = NULL;
4032 rip_if_rmap_update_interface (struct interface *ifp)
4034 struct if_rmap *if_rmap;
4036 if_rmap = if_rmap_lookup (ifp->name);
4038 rip_if_rmap_update (if_rmap);
4042 rip_routemap_update_redistribute (void)
4048 for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
4050 if (rip->route_map[i].name)
4051 rip->route_map[i].map =
4052 route_map_lookup_by_name (rip->route_map[i].name);
4059 rip_routemap_update (const char *notused)
4061 struct interface *ifp;
4062 struct listnode *node, *nnode;
4064 for (ALL_LIST_ELEMENTS (iflist, node, nnode, ifp))
4065 rip_if_rmap_update_interface (ifp);
4067 rip_routemap_update_redistribute ();
4070 /* Allocate new rip structure and set default value. */
4074 /* Randomize for triggered update random(). */
4075 srandom (time (NULL));
4077 /* Install top nodes. */
4078 install_node (&rip_node, config_write_rip);
4080 /* Install rip commands. */
4081 install_element (VIEW_NODE, &show_ip_rip_cmd);
4082 install_element (VIEW_NODE, &show_ip_rip_status_cmd);
4083 install_element (CONFIG_NODE, &router_rip_cmd);
4084 install_element (CONFIG_NODE, &no_router_rip_cmd);
4086 install_default (RIP_NODE);
4087 install_element (RIP_NODE, &rip_version_cmd);
4088 install_element (RIP_NODE, &no_rip_version_cmd);
4089 install_element (RIP_NODE, &no_rip_version_val_cmd);
4090 install_element (RIP_NODE, &rip_default_metric_cmd);
4091 install_element (RIP_NODE, &no_rip_default_metric_cmd);
4092 install_element (RIP_NODE, &no_rip_default_metric_val_cmd);
4093 install_element (RIP_NODE, &rip_timers_cmd);
4094 install_element (RIP_NODE, &no_rip_timers_cmd);
4095 install_element (RIP_NODE, &no_rip_timers_val_cmd);
4096 install_element (RIP_NODE, &rip_route_cmd);
4097 install_element (RIP_NODE, &no_rip_route_cmd);
4098 install_element (RIP_NODE, &rip_distance_cmd);
4099 install_element (RIP_NODE, &no_rip_distance_cmd);
4100 install_element (RIP_NODE, &rip_distance_source_cmd);
4101 install_element (RIP_NODE, &no_rip_distance_source_cmd);
4102 install_element (RIP_NODE, &rip_distance_source_access_list_cmd);
4103 install_element (RIP_NODE, &no_rip_distance_source_access_list_cmd);
4104 install_element (RIP_NODE, &rip_allow_ecmp_cmd);
4105 install_element (RIP_NODE, &no_rip_allow_ecmp_cmd);
4107 /* Debug related init. */
4113 #endif /* HAVE_SNMP */
4115 /* Access list install. */
4116 access_list_init ();
4117 access_list_add_hook (rip_distribute_update_all_wrapper);
4118 access_list_delete_hook (rip_distribute_update_all_wrapper);
4120 /* Prefix list initialize.*/
4121 prefix_list_init ();
4122 prefix_list_add_hook (rip_distribute_update_all);
4123 prefix_list_delete_hook (rip_distribute_update_all);
4125 /* Distribute list install. */
4126 distribute_list_init (RIP_NODE);
4127 distribute_list_add_hook (rip_distribute_update);
4128 distribute_list_delete_hook (rip_distribute_update);
4131 rip_route_map_init ();
4134 route_map_add_hook (rip_routemap_update);
4135 route_map_delete_hook (rip_routemap_update);
4137 if_rmap_init (RIP_NODE);
4138 if_rmap_hook_add (rip_if_rmap_update);
4139 if_rmap_hook_delete (rip_if_rmap_update);
4141 /* Distance control. */
4142 rip_distance_table = route_table_init ();