* rt_netlink.c (netlink_parse_info): Fix warning. It's safe to cast
	  status to unsigned here, because we already checked that it isn't
	  negative or 0.
	* rt_netlink.c (netlink_interface_addr): Prefix length belongs to the
	  address, not to the interface.
	* rt_netlink.c (netlink_route_multipath): Fix debug. No useless info
	  is printed out now and IPv6 info is handeled.
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 55e290c..8c6f348 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,3 +1,13 @@
+2005-04-09 Hasso Tepper <hasso at quagga.net>
+
+	* rt_netlink.c (netlink_parse_info): Fix warning. It's safe to cast
+	  status to unsigned here, because we already checked that it isn't
+	  negative or 0.
+	* rt_netlink.c (netlink_interface_addr): Prefix length belongs to the
+	  address, not to the interface.
+	* rt_netlink.c (netlink_route_multipath): Fix debug. No useless info
+	  is printed out now and IPv6 info is handeled.
+
 2005-04-05 Paul Jakma <paul@dishone.st>
 
 	* zserv.c: print more helpful errors when we fail to successfully
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c
index b3b2aab..830eb43 100644
--- a/zebra/rt_netlink.c
+++ b/zebra/rt_netlink.c
@@ -374,7 +374,7 @@
           continue;
         }
 
-      for (h = (struct nlmsghdr *) buf; NLMSG_OK (h, status);
+      for (h = (struct nlmsghdr *) buf; NLMSG_OK (h, (unsigned int) status);
            h = NLMSG_NEXT (h, status))
         {
           /* Finish of reading. */
@@ -611,23 +611,20 @@
   if (IS_ZEBRA_DEBUG_KERNEL)    /* remove this line to see initial ifcfg */
     {
       char buf[BUFSIZ];
-      zlog_debug ("netlink_interface_addr %s %s/%d:",
-                 lookup (nlmsg_str, h->nlmsg_type),
-                 ifp->name, ifa->ifa_prefixlen);
+      zlog_debug ("netlink_interface_addr %s %s:",
+                 lookup (nlmsg_str, h->nlmsg_type), ifp->name);
       if (tb[IFA_LOCAL])
-        zlog_debug ("  IFA_LOCAL     %s", inet_ntop (ifa->ifa_family,
-                                                    RTA_DATA (tb[IFA_LOCAL]),
-                                                    buf, BUFSIZ));
+        zlog_debug ("  IFA_LOCAL     %s/%d",
+		    inet_ntop (ifa->ifa_family, RTA_DATA (tb[IFA_LOCAL]),
+			       buf, BUFSIZ), ifa->ifa_prefixlen);
       if (tb[IFA_ADDRESS])
-        zlog_debug ("  IFA_ADDRESS   %s", inet_ntop (ifa->ifa_family,
-                                                    RTA_DATA (tb
-                                                              [IFA_ADDRESS]),
-                                                    buf, BUFSIZ));
+        zlog_debug ("  IFA_ADDRESS   %s/%d",
+		    inet_ntop (ifa->ifa_family, RTA_DATA (tb[IFA_ADDRESS]),
+                               buf, BUFSIZ), ifa->ifa_prefixlen);
       if (tb[IFA_BROADCAST])
-        zlog_debug ("  IFA_BROADCAST %s", inet_ntop (ifa->ifa_family,
-                                                    RTA_DATA (tb
-                                                              [IFA_BROADCAST]),
-                                                    buf, BUFSIZ));
+        zlog_debug ("  IFA_BROADCAST %s/%d",
+		    inet_ntop (ifa->ifa_family, RTA_DATA (tb[IFA_BROADCAST]),
+			       buf, BUFSIZ), ifa->ifa_prefixlen);
       if (tb[IFA_LABEL] && strcmp (ifp->name, RTA_DATA (tb[IFA_LABEL])))
         zlog_debug ("  IFA_LABEL     %s", (char *)RTA_DATA (tb[IFA_LABEL]));
     }
@@ -1472,62 +1469,105 @@
                     {
                       zlog_debug
                         ("netlink_route_multipath() (recursive, 1 hop): "
-                         "%s %s/%d via %s if %u, type %s",
-                         lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
-                         p->prefixlen, inet_ntoa (nexthop->rgate.ipv4),
-                         nexthop->rifindex,
+                         "%s %s/%d, type %s", lookup (nlmsg_str, cmd),
+			 (family == AF_INET) ? inet_ntoa (p->u.prefix4) :
+			 inet6_ntoa (p->u.prefix6), p->prefixlen,
                          nexthop_types_desc[nexthop->rtype]);
                     }
 
                   if (nexthop->rtype == NEXTHOP_TYPE_IPV4
                       || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
-                    addattr_l (&req.n, sizeof req, RTA_GATEWAY,
-                               &nexthop->rgate.ipv4, bytelen);
+		    {
+		      addattr_l (&req.n, sizeof req, RTA_GATEWAY,
+				 &nexthop->rgate.ipv4, bytelen);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (recursive, "
+				   "1 hop): nexthop via %s if %u",
+				   inet_ntoa (nexthop->rgate.ipv4),
+				   nexthop->rifindex);
+		    }
 #ifdef HAVE_IPV6
                   if (nexthop->rtype == NEXTHOP_TYPE_IPV6
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
-                    addattr_l (&req.n, sizeof req, RTA_GATEWAY,
-                               &nexthop->rgate.ipv6, bytelen);
+		    {
+		      addattr_l (&req.n, sizeof req, RTA_GATEWAY,
+				 &nexthop->rgate.ipv6, bytelen);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (recursive, "
+				   "1 hop): nexthop via %s if %u",
+				   inet6_ntoa (nexthop->rgate.ipv6),
+				   nexthop->rifindex);
+		    }
 #endif /* HAVE_IPV6 */
                   if (nexthop->rtype == NEXTHOP_TYPE_IFINDEX
                       || nexthop->rtype == NEXTHOP_TYPE_IFNAME
                       || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
-                    addattr32 (&req.n, sizeof req, RTA_OIF,
-                               nexthop->rifindex);
+		    {
+		      addattr32 (&req.n, sizeof req, RTA_OIF,
+				 nexthop->rifindex);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (recursive, "
+				   "1 hop): nexthop via if %u",
+				   nexthop->rifindex);
+		    }
                 }
               else
                 {
                   if (IS_ZEBRA_DEBUG_KERNEL)
                     {
                       zlog_debug
-                        ("netlink_route_multipath(): (single hop)"
-                         "%s %s/%d via %s if %u, type %s",
-                         lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
-                         p->prefixlen, inet_ntoa (nexthop->gate.ipv4),
-                         nexthop->ifindex,
-                         nexthop_types_desc[nexthop->type]);
+                        ("netlink_route_multipath() (single hop): "
+                         "%s %s/%d, type %s", lookup (nlmsg_str, cmd),
+			 (family == AF_INET) ? inet_ntoa (p->u.prefix4) :
+			 inet6_ntoa (p->u.prefix6), p->prefixlen,
+			 nexthop_types_desc[nexthop->type]);
                     }
 
                   if (nexthop->type == NEXTHOP_TYPE_IPV4
                       || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
-                    addattr_l (&req.n, sizeof req, RTA_GATEWAY,
-                               &nexthop->gate.ipv4, bytelen);
+		    {
+		      addattr_l (&req.n, sizeof req, RTA_GATEWAY,
+				 &nexthop->gate.ipv4, bytelen);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (single hop): "
+				   "nexthop via %s if %u",
+				   inet_ntoa (nexthop->gate.ipv4),
+				   nexthop->ifindex);
+		    }
 #ifdef HAVE_IPV6
                   if (nexthop->type == NEXTHOP_TYPE_IPV6
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
-                    addattr_l (&req.n, sizeof req, RTA_GATEWAY,
-                               &nexthop->gate.ipv6, bytelen);
+		    {
+		      addattr_l (&req.n, sizeof req, RTA_GATEWAY,
+				 &nexthop->gate.ipv6, bytelen);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (single hop): "
+				   "nexthop via %s if %u",
+				   inet6_ntoa (nexthop->gate.ipv6),
+				   nexthop->ifindex);
+		    }
 #endif /* HAVE_IPV6 */
                   if (nexthop->type == NEXTHOP_TYPE_IFINDEX
                       || nexthop->type == NEXTHOP_TYPE_IFNAME
                       || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
-                    addattr32 (&req.n, sizeof req, RTA_OIF, nexthop->ifindex);
+		    {
+		      addattr32 (&req.n, sizeof req, RTA_OIF, nexthop->ifindex);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (single hop): "
+				   "nexthop via if %u", nexthop->ifindex);
+		    }
                 }
 
               if (cmd == RTM_NEWROUTE)
@@ -1570,12 +1610,10 @@
                   if (IS_ZEBRA_DEBUG_KERNEL)
                     {
                       zlog_debug ("netlink_route_multipath() "
-                         "(recursive, multihop): "
-                         "%s %s/%d via %s if %u, type %s",
-                         lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
-                         p->prefixlen, inet_ntoa (nexthop->rgate.ipv4),
-                         nexthop->rifindex, 
-                         nexthop_types_desc[nexthop->type]);
+                         "(recursive, multihop): %s %s/%d type %s",
+                         lookup (nlmsg_str, cmd), (family == AF_INET) ? 
+			 inet_ntoa (p->u.prefix4) : inet6_ntoa (p->u.prefix6),
+                         p->prefixlen, nexthop_types_desc[nexthop->rtype]);
                     }
                   if (nexthop->rtype == NEXTHOP_TYPE_IPV4
                       || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX)
@@ -1583,13 +1621,27 @@
                       rta_addattr_l (rta, 4096, RTA_GATEWAY,
                                      &nexthop->rgate.ipv4, bytelen);
                       rtnh->rtnh_len += sizeof (struct rtattr) + 4;
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (recursive, "
+				   "multihop): nexthop via %s if %u",
+				   inet_ntoa (nexthop->rgate.ipv4),
+				   nexthop->rifindex);
                     }
 #ifdef HAVE_IPV6
                   if (nexthop->rtype == NEXTHOP_TYPE_IPV6
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX)
-                    rta_addattr_l (rta, 4096, RTA_GATEWAY,
-                                   &nexthop->rgate.ipv6, bytelen);
+		    {
+		      rta_addattr_l (rta, 4096, RTA_GATEWAY,
+				     &nexthop->rgate.ipv6, bytelen);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (recursive, "
+				   "multihop): nexthop via %s if %u",
+				   inet6_ntoa (nexthop->rgate.ipv6),
+				   nexthop->rifindex);
+		    }
 #endif /* HAVE_IPV6 */
                   /* ifindex */
                   if (nexthop->rtype == NEXTHOP_TYPE_IFINDEX
@@ -1597,35 +1649,56 @@
                       || nexthop->rtype == NEXTHOP_TYPE_IPV4_IFINDEX
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFINDEX
                       || nexthop->rtype == NEXTHOP_TYPE_IPV6_IFNAME)
-                    rtnh->rtnh_ifindex = nexthop->rifindex;
+		    {
+		      rtnh->rtnh_ifindex = nexthop->rifindex;
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (recursive, "
+				   "multihop): nexthop via if %u",
+				   nexthop->rifindex);
+		    }
                   else
-                    rtnh->rtnh_ifindex = 0;
+		    {
+		      rtnh->rtnh_ifindex = 0;
+		    }
                 }
               else
                 {
                   if (IS_ZEBRA_DEBUG_KERNEL)
                     {
-                      zlog_debug ("netlink_route_multipath() "
-                         "(multihop): "
-                         "%s %s/%d via %s if %u, type %s",
-                         lookup (nlmsg_str, cmd), inet_ntoa (p->u.prefix4),
-                         p->prefixlen, inet_ntoa (nexthop->rgate.ipv4),
-                         nexthop->rifindex, 
+                      zlog_debug ("netlink_route_multipath() (multihop): "
+                         "%s %s/%d, type %s", lookup (nlmsg_str, cmd),
+			 (family == AF_INET) ? inet_ntoa (p->u.prefix4) :
+			 inet6_ntoa (p->u.prefix6), p->prefixlen,
                          nexthop_types_desc[nexthop->type]);
                     }
                   if (nexthop->type == NEXTHOP_TYPE_IPV4
                       || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX)
                     {
-                      rta_addattr_l (rta, 4096, RTA_GATEWAY,
-                                     &nexthop->gate.ipv4, bytelen);
-                      rtnh->rtnh_len += sizeof (struct rtattr) + 4;
+		      rta_addattr_l (rta, 4096, RTA_GATEWAY,
+				     &nexthop->gate.ipv4, bytelen);
+		      rtnh->rtnh_len += sizeof (struct rtattr) + 4;
+
+                      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (multihop): "
+				   "nexthop via %s if %u",
+				   inet_ntoa (nexthop->gate.ipv4),
+				   nexthop->ifindex);
                     }
 #ifdef HAVE_IPV6
                   if (nexthop->type == NEXTHOP_TYPE_IPV6
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
-                    rta_addattr_l (rta, 4096, RTA_GATEWAY,
-                                   &nexthop->gate.ipv6, bytelen);
+		    { 
+		      rta_addattr_l (rta, 4096, RTA_GATEWAY,
+				     &nexthop->gate.ipv6, bytelen);
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (multihop): "
+				   "nexthop via %s if %u",
+				   inet6_ntoa (nexthop->gate.ipv6),
+				   nexthop->ifindex);
+		    }
 #endif /* HAVE_IPV6 */
                   /* ifindex */
                   if (nexthop->type == NEXTHOP_TYPE_IFINDEX
@@ -1633,9 +1706,17 @@
                       || nexthop->type == NEXTHOP_TYPE_IPV4_IFINDEX
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME
                       || nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)
-                    rtnh->rtnh_ifindex = nexthop->ifindex;
+		    {
+		      rtnh->rtnh_ifindex = nexthop->ifindex;
+
+		      if (IS_ZEBRA_DEBUG_KERNEL)
+			zlog_debug("netlink_route_multipath() (multihop): "
+				   "nexthop via if %u", nexthop->ifindex);
+		    }
                   else
-                    rtnh->rtnh_ifindex = 0;
+		    {
+		      rtnh->rtnh_ifindex = 0;
+		    }
                 }
               rtnh = RTNH_NEXT (rtnh);