diff options
Diffstat (limited to 'ripd')
-rw-r--r-- | ripd/ChangeLog | 9 | ||||
-rw-r--r-- | ripd/ripd.c | 343 |
2 files changed, 178 insertions, 174 deletions
diff --git a/ripd/ChangeLog b/ripd/ChangeLog index 13c34b58..9f4e1bad 100644 --- a/ripd/ChangeLog +++ b/ripd/ChangeLog @@ -1,7 +1,12 @@ +2004-05-03 Paul Jakma <paul@dishone.st> + + * ripd.c: (rip_rte_process) fix typo in merge of previous patch + and run function through indent. + 2004-03-19 Jean-Yves Simon <lethalwp@tiscali.be> - * ripd.c: make ripd also check on administrative distance of his - own links to update routes. + * ripd.c: (rip_rte_process) make ripd also check on + administrative distance of his own links to update routes. 2004-03-18 sowmini.varadhan@sun.com diff --git a/ripd/ripd.c b/ripd/ripd.c index dd9427c5..d520af0e 100644 --- a/ripd/ripd.c +++ b/ripd/ripd.c @@ -381,8 +381,7 @@ rip_nexthop_check (struct in_addr *addr) /* RIP add route to routing table. */ void rip_rte_process (struct rte *rte, struct sockaddr_in *from, - struct interface *ifp) - + struct interface *ifp) { int ret; struct prefix_ipv4 p; @@ -418,29 +417,29 @@ rip_rte_process (struct rte *rte, struct sockaddr_in *from, memset (&newinfo, 0, sizeof (newinfo)); newinfo.type = ZEBRA_ROUTE_RIP; newinfo.sub_type = RIP_ROUTE_RTE; - newinfo.nexthop= rte->nexthop; - newinfo.from = from->sin_addr; - newinfo.ifindex= ifp->ifindex; + newinfo.nexthop = rte->nexthop; + newinfo.from = from->sin_addr; + newinfo.ifindex = ifp->ifindex; newinfo.metric = rte->metric; newinfo.metric_out = rte->metric; /* XXX */ - newinfo.tag = ntohs(rte->tag); /* XXX */ + newinfo.tag = ntohs (rte->tag); /* XXX */ /* The object should be of the type of rip_info */ - ret = route_map_apply (ri->routemap[RIP_FILTER_IN], - (struct prefix *)&p, RMAP_RIP, &newinfo); + ret = route_map_apply (ri->routemap[RIP_FILTER_IN], + (struct prefix *) &p, RMAP_RIP, &newinfo); if (ret == RMAP_DENYMATCH) - { - if (IS_RIP_DEBUG_PACKET) - zlog_info ("RIP %s/%d is filtered by route-map in", - inet_ntoa (p.prefix), p.prefixlen); - return; - } + { + if (IS_RIP_DEBUG_PACKET) + zlog_info ("RIP %s/%d is filtered by route-map in", + inet_ntoa (p.prefix), p.prefixlen); + return; + } /* Get back the object */ - rte->nexthop = newinfo.nexthop_out; - rte->tag = htons(newinfo.tag_out); /* XXX */ - rte->metric = newinfo.metric_out; /* XXX: the routemap uses the metric_out field */ + rte->nexthop = newinfo.nexthop_out; + rte->tag = htons (newinfo.tag_out); /* XXX */ + rte->metric = newinfo.metric_out; /* XXX: the routemap uses the metric_out field */ } /* Once the entry has been validated, update the metric by @@ -452,7 +451,7 @@ rip_rte_process (struct rte *rte, struct sockaddr_in *from, /* If offset-list does not modify the metric use interface's metric. */ - if (! ret) + if (!ret) rte->metric += ifp->metric; if (rte->metric > RIP_METRIC_INFINITY) @@ -468,7 +467,7 @@ rip_rte_process (struct rte *rte, struct sockaddr_in *from, if (rip_nexthop_check (nexthop) < 0) { if (IS_RIP_DEBUG_PACKET) - zlog_info ("Nexthop address %s is myself", inet_ntoa (*nexthop)); + zlog_info ("Nexthop address %s is myself", inet_ntoa (*nexthop)); return; } @@ -482,191 +481,191 @@ rip_rte_process (struct rte *rte, struct sockaddr_in *from, { /* Redistributed route check. */ if (rinfo->type != ZEBRA_ROUTE_RIP - && rinfo->metric != RIP_METRIC_INFINITY) - return; + && rinfo->metric != RIP_METRIC_INFINITY) + return; /* Local static route. */ if (rinfo->type == ZEBRA_ROUTE_RIP - && ((rinfo->sub_type == RIP_ROUTE_STATIC) || - (rinfo->sub_type == RIP_ROUTE_DEFAULT)) - && rinfo->metric != RIP_METRIC_INFINITY) - return; + && ((rinfo->sub_type == RIP_ROUTE_STATIC) || + (rinfo->sub_type == RIP_ROUTE_DEFAULT)) + && rinfo->metric != RIP_METRIC_INFINITY) + return; } - - if (! rinfo) + + if (!rinfo) { /* Now, check to see whether there is already an explicit route - for the destination prefix. If there is no such route, add - this route to the routing table, unless the metric is - infinity (there is no point in adding a route which - unusable). */ + for the destination prefix. If there is no such route, add + this route to the routing table, unless the metric is + infinity (there is no point in adding a route which + unusable). */ if (rte->metric != RIP_METRIC_INFINITY) - { - rinfo = rip_info_new (); - - /* - Setting the destination prefix and length to those in - the RTE. */ - rinfo->rp = rp; - - /* - Setting the metric to the newly calculated metric (as - described above). */ - rinfo->metric = rte->metric; - rinfo->tag = ntohs (rte->tag); - - /* - Set the next hop address to be the address of the router - from which the datagram came or the next hop address - specified by a next hop RTE. */ - IPV4_ADDR_COPY (&rinfo->nexthop, nexthop); - IPV4_ADDR_COPY (&rinfo->from, &from->sin_addr); - rinfo->ifindex = ifp->ifindex; - - /* - Initialize the timeout for the route. If the - garbage-collection timer is running for this route, stop it - (see section 2.3 for a discussion of the timers). */ - rip_timeout_update (rinfo); - - /* - Set the route change flag. */ - rinfo->flags |= RIP_RTF_CHANGED; - - /* - Signal the output process to trigger an update (see section - 2.5). */ - rip_event (RIP_TRIGGERED_UPDATE, 0); - - /* Finally, route goes into the kernel. */ - rinfo->type = ZEBRA_ROUTE_RIP; - rinfo->sub_type = RIP_ROUTE_RTE; - - /* Set distance value. */ - rinfo->distance = rip_distance_apply (rinfo); - - rp->info = rinfo; - rip_zebra_ipv4_add (&p, &rinfo->nexthop, rinfo->metric, - rinfo->distance); - rinfo->flags |= RIP_RTF_FIB; - } + { + rinfo = rip_info_new (); + + /* - Setting the destination prefix and length to those in + the RTE. */ + rinfo->rp = rp; + + /* - Setting the metric to the newly calculated metric (as + described above). */ + rinfo->metric = rte->metric; + rinfo->tag = ntohs (rte->tag); + + /* - Set the next hop address to be the address of the router + from which the datagram came or the next hop address + specified by a next hop RTE. */ + IPV4_ADDR_COPY (&rinfo->nexthop, nexthop); + IPV4_ADDR_COPY (&rinfo->from, &from->sin_addr); + rinfo->ifindex = ifp->ifindex; + + /* - Initialize the timeout for the route. If the + garbage-collection timer is running for this route, stop it + (see section 2.3 for a discussion of the timers). */ + rip_timeout_update (rinfo); + + /* - Set the route change flag. */ + rinfo->flags |= RIP_RTF_CHANGED; + + /* - Signal the output process to trigger an update (see section + 2.5). */ + rip_event (RIP_TRIGGERED_UPDATE, 0); + + /* Finally, route goes into the kernel. */ + rinfo->type = ZEBRA_ROUTE_RIP; + rinfo->sub_type = RIP_ROUTE_RTE; + + /* Set distance value. */ + rinfo->distance = rip_distance_apply (rinfo); + + rp->info = rinfo; + rip_zebra_ipv4_add (&p, &rinfo->nexthop, rinfo->metric, + rinfo->distance); + rinfo->flags |= RIP_RTF_FIB; + } } else { /* Route is there but we are not sure the route is RIP or not. */ rinfo = rp->info; - + /* If there is an existing route, compare the next hop address - to the address of the router from which the datagram came. - If this datagram is from the same router as the existing - route, reinitialize the timeout. */ + to the address of the router from which the datagram came. + If this datagram is from the same router as the existing + route, reinitialize the timeout. */ same = (IPV4_ADDR_SAME (&rinfo->from, &from->sin_addr) - && (rinfo->ifindex == ifp->ifindex)); + && (rinfo->ifindex == ifp->ifindex)); if (same) - rip_timeout_update (rinfo); + rip_timeout_update (rinfo); /* Fill in a minimaly temporary rip_info structure, for a future rip_distance_apply() use) */ - memset (&rinfo,0,sizeof(rinfotmp)); + memset (&rinfotmp, 0, sizeof (rinfotmp)); IPV4_ADDR_COPY (&rinfotmp.from, &from->sin_addr); - rinfotmp.rp=rinfo->rp; + rinfotmp.rp = rinfo->rp; /* Next, compare the metrics. If the datagram is from the same - router as the existing route, and the new metric is different - than the old one; or, if the new metric is lower than the old - one, or if the tag has been changed; or if there is a route - with a lower administrave distance; or an update of the - distance on the actual route; do the following actions: */ - if (( same && rinfo->metric != rte->metric ) - || ( rte->metric < rinfo->metric ) - || ( (same) - && (rinfo->metric == rte->metric) - && ntohs(rte->tag) != rinfo->tag ) - || ( rinfo->distance > rip_distance_apply (&rinfotmp) ) - || ( (rinfo->distance != rip_distance_apply (rinfo)) && same )) - { - /* - Adopt the route from the datagram. That is, put the - new metric in, and adjust the next hop address (if - necessary). */ - oldmetric = rinfo->metric; - rinfo->metric = rte->metric; - rinfo->tag = ntohs (rte->tag); - IPV4_ADDR_COPY (&rinfo->from, &from->sin_addr); - rinfo->ifindex = ifp->ifindex; - rinfo->distance = rip_distance_apply (rinfo); - - /* Should a new route to this network be established - while the garbage-collection timer is running, the - new route will replace the one that is about to be - deleted. In this case the garbage-collection timer - must be cleared. */ - - if (oldmetric == RIP_METRIC_INFINITY && - rinfo->metric < RIP_METRIC_INFINITY) - { - rinfo->type = ZEBRA_ROUTE_RIP; - rinfo->sub_type = RIP_ROUTE_RTE; + router as the existing route, and the new metric is different + than the old one; or, if the new metric is lower than the old + one, or if the tag has been changed; or if there is a route + with a lower administrave distance; or an update of the + distance on the actual route; do the following actions: */ + if ((same && rinfo->metric != rte->metric) + || (rte->metric < rinfo->metric) + || ((same) + && (rinfo->metric == rte->metric) + && ntohs (rte->tag) != rinfo->tag) + || (rinfo->distance > rip_distance_apply (&rinfotmp)) + || ((rinfo->distance != rip_distance_apply (rinfo)) && same)) + { + /* - Adopt the route from the datagram. That is, put the + new metric in, and adjust the next hop address (if + necessary). */ + oldmetric = rinfo->metric; + rinfo->metric = rte->metric; + rinfo->tag = ntohs (rte->tag); + IPV4_ADDR_COPY (&rinfo->from, &from->sin_addr); + rinfo->ifindex = ifp->ifindex; + rinfo->distance = rip_distance_apply (rinfo); + + /* Should a new route to this network be established + while the garbage-collection timer is running, the + new route will replace the one that is about to be + deleted. In this case the garbage-collection timer + must be cleared. */ + + if (oldmetric == RIP_METRIC_INFINITY && + rinfo->metric < RIP_METRIC_INFINITY) + { + rinfo->type = ZEBRA_ROUTE_RIP; + rinfo->sub_type = RIP_ROUTE_RTE; - RIP_TIMER_OFF (rinfo->t_garbage_collect); + RIP_TIMER_OFF (rinfo->t_garbage_collect); - if (! IPV4_ADDR_SAME (&rinfo->nexthop, nexthop)) - IPV4_ADDR_COPY (&rinfo->nexthop, nexthop); + if (!IPV4_ADDR_SAME (&rinfo->nexthop, nexthop)) + IPV4_ADDR_COPY (&rinfo->nexthop, nexthop); - rip_zebra_ipv4_add (&p, nexthop, rinfo->metric, - rinfo->distance); - rinfo->flags |= RIP_RTF_FIB; - } + rip_zebra_ipv4_add (&p, nexthop, rinfo->metric, + rinfo->distance); + rinfo->flags |= RIP_RTF_FIB; + } - /* Update nexthop and/or metric value. */ - if (oldmetric != RIP_METRIC_INFINITY) - { - rip_zebra_ipv4_delete (&p, &rinfo->nexthop, oldmetric); - rip_zebra_ipv4_add (&p, nexthop, rinfo->metric, - rinfo->distance); - rinfo->flags |= RIP_RTF_FIB; + /* Update nexthop and/or metric value. */ + if (oldmetric != RIP_METRIC_INFINITY) + { + rip_zebra_ipv4_delete (&p, &rinfo->nexthop, oldmetric); + rip_zebra_ipv4_add (&p, nexthop, rinfo->metric, + rinfo->distance); + rinfo->flags |= RIP_RTF_FIB; - if (! IPV4_ADDR_SAME (&rinfo->nexthop, nexthop)) - IPV4_ADDR_COPY (&rinfo->nexthop, nexthop); - } + if (!IPV4_ADDR_SAME (&rinfo->nexthop, nexthop)) + IPV4_ADDR_COPY (&rinfo->nexthop, nexthop); + } - /* - Set the route change flag and signal the output process - to trigger an update. */ - rinfo->flags |= RIP_RTF_CHANGED; - rip_event (RIP_TRIGGERED_UPDATE, 0); + /* - Set the route change flag and signal the output process + to trigger an update. */ + rinfo->flags |= RIP_RTF_CHANGED; + rip_event (RIP_TRIGGERED_UPDATE, 0); - /* - If the new metric is infinity, start the deletion - process (described above); */ - if (rinfo->metric == RIP_METRIC_INFINITY) - { - /* If the new metric is infinity, the deletion process - begins for the route, which is no longer used for - routing packets. Note that the deletion process is - started only when the metric is first set to - infinity. If the metric was already infinity, then a - new deletion process is not started. */ - if (oldmetric != RIP_METRIC_INFINITY) - { - /* - The garbage-collection timer is set for 120 seconds. */ - RIP_TIMER_ON (rinfo->t_garbage_collect, - rip_garbage_collect, rip->garbage_time); - RIP_TIMER_OFF (rinfo->t_timeout); - - /* - The metric for the route is set to 16 - (infinity). This causes the route to be removed - from service.*/ - rip_zebra_ipv4_delete (&p, &rinfo->nexthop, oldmetric); - rinfo->flags &= ~RIP_RTF_FIB; - - /* - The route change flag is to indicate that this - entry has been changed. */ - /* - The output process is signalled to trigger a + /* - If the new metric is infinity, start the deletion + process (described above); */ + if (rinfo->metric == RIP_METRIC_INFINITY) + { + /* If the new metric is infinity, the deletion process + begins for the route, which is no longer used for + routing packets. Note that the deletion process is + started only when the metric is first set to + infinity. If the metric was already infinity, then a + new deletion process is not started. */ + if (oldmetric != RIP_METRIC_INFINITY) + { + /* - The garbage-collection timer is set for 120 seconds. */ + RIP_TIMER_ON (rinfo->t_garbage_collect, + rip_garbage_collect, rip->garbage_time); + RIP_TIMER_OFF (rinfo->t_timeout); + + /* - The metric for the route is set to 16 + (infinity). This causes the route to be removed + from service. */ + rip_zebra_ipv4_delete (&p, &rinfo->nexthop, oldmetric); + rinfo->flags &= ~RIP_RTF_FIB; + + /* - The route change flag is to indicate that this + entry has been changed. */ + /* - The output process is signalled to trigger a response. */ - ; /* Above processes are already done previously. */ - } - } - else - { - /* otherwise, re-initialize the timeout. */ - rip_timeout_update (rinfo); - } - } + ; /* Above processes are already done previously. */ + } + } + else + { + /* otherwise, re-initialize the timeout. */ + rip_timeout_update (rinfo); + } + } /* Unlock tempolary lock of the route. */ route_unlock_node (rp); } |