[pim] Initial pim 0.155
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index effe233..d6ec914 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -496,6 +496,17 @@
 	    break;
 	}
 
+      if (IS_ZEBRA_DEBUG_RIB) {
+	char buf[INET6_ADDRSTRLEN];
+	inet_ntop(rn->p.family, &rn->p.u.prefix, buf, INET6_ADDRSTRLEN);
+        zlog_debug("%s: %s/%d: nexthop match %p: %s type=%d sel=%d int=%d",
+		   __func__, buf, rn->p.prefixlen, match,
+		   match ? zebra_route_string(match->type) : "<?>",
+		   match ? match->type : -1,
+		   match ? CHECK_FLAG(match->flags, ZEBRA_FLAG_SELECTED) : -1,
+		   match ? CHECK_FLAG(match->flags, ZEBRA_FLAG_INTERNAL) : -1);
+      }
+
       /* If there is no selected route or matched route is EGP, go up
          tree. */
       if (! match 
@@ -524,7 +535,8 @@
 	      
 	      return 1;
 	    }
-	  else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL))
+	  else if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_INTERNAL) ||
+		   match->type == ZEBRA_ROUTE_KERNEL)
 	    {
 	      resolved = 0;
 	      for (newhop = match->nexthop; newhop; newhop = newhop->next)
@@ -1042,6 +1054,43 @@
 }
 #endif /* HAVE_IPV6 */
 
+static void nexthop_dump(struct nexthop *nexthop,
+			 char *type_str_buf,
+			 int type_str_buf_size,
+			 char *addr_str_buf,
+			 int addr_str_buf_size,
+			 char *via_str_buf,
+			 int via_str_buf_size)
+{
+  switch (nexthop->type) {
+  case NEXTHOP_TYPE_IPV4:
+  case NEXTHOP_TYPE_IPV4_IFINDEX:
+    snprintf(type_str_buf, type_str_buf_size, "ipv4");
+    snprintf(addr_str_buf, addr_str_buf_size, "%s", inet_ntoa(nexthop->gate.ipv4));
+    snprintf(via_str_buf, via_str_buf_size, "%s", nexthop->ifindex ? ifindex2ifname(nexthop->ifindex) : "<?>");
+    break;
+  case NEXTHOP_TYPE_IFINDEX:
+    snprintf(type_str_buf, type_str_buf_size, "connected");
+    snprintf(addr_str_buf, addr_str_buf_size, "<connected>");
+    snprintf(via_str_buf, via_str_buf_size, "%s", ifindex2ifname(nexthop->ifindex));
+    break;
+  case NEXTHOP_TYPE_IFNAME:
+    snprintf(type_str_buf, type_str_buf_size, "connected");
+    snprintf(addr_str_buf, addr_str_buf_size, "<connected>");
+    snprintf(via_str_buf, via_str_buf_size, "%s", nexthop->ifname);
+    break;
+  case NEXTHOP_TYPE_BLACKHOLE:
+    snprintf(type_str_buf, type_str_buf_size, "blackhole");
+    snprintf(addr_str_buf, addr_str_buf_size, "<blackhole>");
+    snprintf(via_str_buf, via_str_buf_size, "Null0");
+    break;
+  default:
+    snprintf(type_str_buf, type_str_buf_size, "unknown");
+    snprintf(addr_str_buf, addr_str_buf_size, "<unknown>");
+    snprintf(via_str_buf, via_str_buf_size, "<?>");
+  }
+}
+
 #define RIB_SYSTEM_ROUTE(R) \
         ((R)->type == ZEBRA_ROUTE_KERNEL || (R)->type == ZEBRA_ROUTE_CONNECT)
 
@@ -1096,10 +1145,27 @@
     case NEXTHOP_TYPE_IPV4:
     case NEXTHOP_TYPE_IPV4_IFINDEX:
       family = AFI_IP;
-      if (nexthop_active_ipv4 (rib, nexthop, set, rn))
-	SET_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE);
-      else
-	UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE);
+      {
+	int nh_active = nexthop_active_ipv4 (rib, nexthop, set, rn);
+	if (IS_ZEBRA_DEBUG_RIB) {
+	  char type_str_buf[100];
+	  char addr_str_buf[100];
+	  char via_str_buf[100];
+	  nexthop_dump(nexthop,
+		       type_str_buf, sizeof(type_str_buf),
+		       addr_str_buf, sizeof(addr_str_buf),
+		       via_str_buf, sizeof(via_str_buf));
+	  zlog_debug("%s: rib %p nexthop %p type=%d %s %s via %s ifindex=%d nexthop_active_ipv4=%d",
+		     __func__, rib, nexthop,
+		     nexthop->type, type_str_buf,
+		     addr_str_buf, via_str_buf, nexthop->ifindex,
+		     nh_active);
+	}
+	if (nh_active)
+	  SET_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE);
+	else
+	  UNSET_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE);
+      }
       break;
 #ifdef HAVE_IPV6
     case NEXTHOP_TYPE_IPV6:
@@ -1190,8 +1256,23 @@
   {
     prev_active = CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE);
     prev_index = nexthop->ifindex;
-    if ((new_active = nexthop_active_check (rn, rib, nexthop, set)))
+    new_active = nexthop_active_check (rn, rib, nexthop, set);
+    if (new_active)
       rib->nexthop_active_num++;
+    if (IS_ZEBRA_DEBUG_RIB) {
+      char type_str_buf[100];
+      char addr_str_buf[100];
+      char via_str_buf[100];
+      nexthop_dump(nexthop,
+		   type_str_buf, sizeof(type_str_buf),
+		   addr_str_buf, sizeof(addr_str_buf),
+		   via_str_buf, sizeof(via_str_buf));
+      zlog_debug("%s: rib %p nexthop %p type=%d %s %s via %s ifindex=%d act=%d total_act=%d",
+		 __func__, rib, nexthop,
+		 nexthop->type, type_str_buf,
+		 addr_str_buf, via_str_buf, nexthop->ifindex,
+		 new_active, rib->nexthop_active_num);
+    }
     if (prev_active != new_active ||
 	prev_index != nexthop->ifindex)
       SET_FLAG (rib->flags, ZEBRA_FLAG_CHANGED);