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