* zebra_rib.c, rib.h: Add distance and metric arguments to the
	  rib_add_ipv6() function so that IPv6 routes in RIB can have correct
	  metric. No IPv6 routing daemon uses distance yet though.
	* zserv.c, connected.c, kernel_socket.c, rt_netlink.c,
	  rtread_proc.c,zserv.c: Pass metric and distance info to the
	  rib_add_ipv6().

	Forwardport from stable branch.
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 3e9629f..61b8b41 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,12 @@
+2005-08-27 Hasso Tepper <hasso at quagga.net>
+
+	* zebra_rib.c, rib.h: Add distance and metric arguments to the
+	  rib_add_ipv6() function so that IPv6 routes in RIB can have correct
+	  metric. No IPv6 routing daemon uses distance yet though.
+	* zserv.c, connected.c, kernel_socket.c, rt_netlink.c,
+	  rtread_proc.c,zserv.c: Pass metric and distance info to the
+	  rib_add_ipv6().
+
 2005-07-29 Paul Jakma <paul.jakma@sun.com>
 
 	* interface.c: (if_delete_update) should always be available, not
diff --git a/zebra/connected.c b/zebra/connected.c
index 46d2aab..6826908 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -308,7 +308,7 @@
     return;
 #endif
 
-  rib_add_ipv6 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0);
+  rib_add_ipv6 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0, 0, 0);
 
   rib_update ();
 }
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index b2985c9..fe7411e 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -654,7 +654,7 @@
 
       if (rtm->rtm_type == RTM_GET || rtm->rtm_type == RTM_ADD)
 	rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, zebra_flags,
-		      &p, &gate.sin6.sin6_addr, ifindex, 0);
+		      &p, &gate.sin6.sin6_addr, ifindex, 0, 0, 0);
       else
 	rib_delete_ipv6 (ZEBRA_ROUTE_KERNEL, zebra_flags,
 			 &p, &gate.sin6.sin6_addr, ifindex, 0);
diff --git a/zebra/rib.h b/zebra/rib.h
index dbd2a6b..12ed8b7 100644
--- a/zebra/rib.h
+++ b/zebra/rib.h
@@ -244,7 +244,8 @@
 #ifdef HAVE_IPV6
 extern int
 rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
-	      struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id);
+	      struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id,
+	      u_int32_t metric, u_char distance);
 
 extern int
 rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 3f22a6c..62d166b 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -793,7 +793,8 @@
       memcpy (&p.prefix, dest, 16);
       p.prefixlen = rtm->rtm_dst_len;
 
-      rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, index, table);
+      rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, flags, &p, gate, index, table,
+		    metric, 0);
     }
 #endif /* HAVE_IPV6 */
 
@@ -943,7 +944,7 @@
         }
 
       if (h->nlmsg_type == RTM_NEWROUTE)
-        rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0);
+        rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0, 0, 0);
       else
         rib_delete_ipv6 (ZEBRA_ROUTE_KERNEL, 0, &p, gate, index, 0);
     }
diff --git a/zebra/rtread_proc.c b/zebra/rtread_proc.c
index ab3891a..93ec238 100644
--- a/zebra/rtread_proc.c
+++ b/zebra/rtread_proc.c
@@ -156,7 +156,8 @@
       str2in6_addr (gate, &gateway);
       p.prefixlen = dest_plen;
 
-      rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, 0, 0);
+      rib_add_ipv6 (ZEBRA_ROUTE_KERNEL, zebra_flags, &p, &gateway, 0, 0,
+		    metric, 0);
     }
 
   fclose (fp);
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index da6a3a8..6d947c8 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1748,7 +1748,8 @@
 
 int
 rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
-	      struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id)
+	      struct in6_addr *gate, unsigned int ifindex, u_int32_t vrf_id,
+	      u_int32_t metric, u_char distance)
 {
   struct rib *rib;
   struct rib *same = NULL;
@@ -1756,9 +1757,6 @@
   struct route_node *rn;
   struct nexthop *nexthop;
 
-  int distance;
-  u_int32_t metric = 0;
-
   /* Lookup table.  */
   table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
   if (! table)
@@ -1768,7 +1766,8 @@
   apply_mask_ipv6 (p);
 
   /* Set default distance by route type. */
-  distance = route_info[type].distance;
+  if (!distance)
+    distance = route_info[type].distance;
   
   if (type == ZEBRA_ROUTE_BGP && CHECK_FLAG (flags, ZEBRA_FLAG_IBGP))
     distance = 200;
diff --git a/zebra/zserv.c b/zebra/zserv.c
index eb126fe..872ddb8 100644
--- a/zebra/zserv.c
+++ b/zebra/zserv.c
@@ -999,9 +999,11 @@
     api.metric = 0;
     
   if (IN6_IS_ADDR_UNSPECIFIED (&nexthop))
-    rib_add_ipv6 (api.type, api.flags, &p, NULL, ifindex, 0);
+    rib_add_ipv6 (api.type, api.flags, &p, NULL, ifindex, 0, api.metric,
+		  api.distance);
   else
-    rib_add_ipv6 (api.type, api.flags, &p, &nexthop, ifindex, 0);
+    rib_add_ipv6 (api.type, api.flags, &p, &nexthop, ifindex, 0, api.metric,
+		  api.distance);
   return 0;
 }