2003-06-19 Vladimir Ivaschenko <hazard@francoudi.com>

	* zebra/rt_netlink.c: Debug statements added to
          netlink_route_multipath()
	* zebra/zebra_rib.c: If route has a gateway, delete only existing
          route with that specified gateway.
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index 6a3df19..b38df20 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -1323,13 +1323,24 @@
     {
       for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
 	{
+
 	  if ((cmd == RTM_NEWROUTE 
 	       && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
 	      || (cmd == RTM_DELROUTE
 		  && CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)))
 	    {
+
 	      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
 		{
+		  if (IS_ZEBRA_DEBUG_KERNEL) {
+			zlog_info ("netlink_route_multipath(): %s %s/%d via %s if %u",
+		          lookup (nlmsg_str, cmd),
+		          inet_ntoa (p->u.prefix4),
+		          p->prefixlen, 
+		          inet_ntoa (nexthop->rgate.ipv4),
+		          nexthop->rifindex);
+		  }
+
 		  if (nexthop->rtype == NEXTHOP_TYPE_IPV4 
 		      || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
 		    addattr_l (&req.n, sizeof req, RTA_GATEWAY,
@@ -1351,6 +1362,15 @@
 		}
 	      else
 		{
+		  if (IS_ZEBRA_DEBUG_KERNEL) {
+            zlog_info ("netlink_route_multipath(): %s %s/%d via %s if %u",
+		                lookup (nlmsg_str, cmd),
+		                inet_ntoa (p->u.prefix4),
+		                p->prefixlen,
+		                inet_ntoa (nexthop->gate.ipv4), 
+		                nexthop->ifindex);
+		  }
+
 		  if (nexthop->type == NEXTHOP_TYPE_IPV4 
 		      || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
 		    addattr_l (&req.n, sizeof req, RTA_GATEWAY,
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 2209364..09d2da5 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1146,6 +1146,13 @@
   /* Apply mask. */
   apply_mask_ipv4 (p);
 
+  if (IS_ZEBRA_DEBUG_KERNEL && gate)
+    zlog_info ("rib_delete_ipv4(): route delete %s/%d via %s ifindex %d",
+		       inet_ntop (AF_INET, &p->prefix, buf1, BUFSIZ),
+		       p->prefixlen, 
+		       inet_ntoa (*gate), 
+		       ifindex);
+
   /* Lookup route node. */
   rn = route_node_lookup (table, (struct prefix *) p);
   if (! rn)
@@ -1192,6 +1199,20 @@
 	      break;
 	    }
 	}
+      else if (gate) 
+        {
+          nexthop = rib->nexthop;
+
+	  /* Make sure that the route found has the same gateway. */
+	  if (rib->type == type
+	      && nexthop &&
+	          (IPV4_ADDR_SAME (&nexthop->gate.ipv4, gate) || 
+		    IPV4_ADDR_SAME (&nexthop->rgate.ipv4, gate)) )
+	    {
+	      same = rib;
+	      break;
+	    }
+	}
       else
 	{
 	  if (rib->type == type)