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.
diff --git a/ripd/ChangeLog b/ripd/ChangeLog
index 0d7b5bc..13c34b5 100644
--- a/ripd/ChangeLog
+++ b/ripd/ChangeLog
@@ -1,3 +1,8 @@
+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.
+
2004-03-18 sowmini.varadhan@sun.com
* ripd.c: rip_send_packet can get null connected address when
diff --git a/ripd/ripd.c b/ripd/ripd.c
index 22777e5..dd9427c 100644
--- a/ripd/ripd.c
+++ b/ripd/ripd.c
@@ -387,7 +387,7 @@
int ret;
struct prefix_ipv4 p;
struct route_node *rp;
- struct rip_info *rinfo;
+ struct rip_info *rinfo, rinfotmp;
struct rip_interface *ri;
struct in_addr *nexthop;
u_char oldmetric;
@@ -560,13 +560,27 @@
if (same)
rip_timeout_update (rinfo);
+
+ /* Fill in a minimaly temporary rip_info structure, for a future
+ rip_distance_apply() use) */
+ memset (&rinfo,0,sizeof(rinfotmp));
+ IPV4_ADDR_COPY (&rinfotmp.from, &from->sin_addr);
+ 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; do the following actions: */
- if ((same && rinfo->metric != rte->metric) ||
- (rte->metric < rinfo->metric) ||
- (same && (rinfo->metric == rte->metric) && ntohs(rte->tag) != rinfo->tag))
+ 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