Merge paul/ospfd/201012-review ospfd and lib/ fixes and performance improvements
diff --git a/bgpd/bgp_debug.c b/bgpd/bgp_debug.c
index c2077a5..26b35df 100644
--- a/bgpd/bgp_debug.c
+++ b/bgpd/bgp_debug.c
@@ -331,7 +331,6 @@
        undebug_bgp_as4_cmd,
        "undebug bgp as4",
        UNDEBUG_STR
-       DEBUG_STR
        BGP_STR
        "BGP AS4 actions\n")
 
@@ -340,6 +339,7 @@
        "debug bgp as4 segment",
        DEBUG_STR
        BGP_STR
+       "BGP AS4 actions\n"
        "BGP AS4 aspath segment handling\n")
 {
   if (vty->node == CONFIG_NODE)
@@ -358,6 +358,7 @@
        NO_STR
        DEBUG_STR
        BGP_STR
+       "BGP AS4 actions\n"
        "BGP AS4 aspath segment handling\n")
 {
   if (vty->node == CONFIG_NODE)
@@ -374,8 +375,8 @@
        undebug_bgp_as4_segment_cmd,
        "undebug bgp as4 segment",
        UNDEBUG_STR
-       DEBUG_STR
        BGP_STR
+       "BGP AS4 actions\n"
        "BGP AS4 aspath segment handling\n")
 
 DEFUN (debug_bgp_fsm,
@@ -417,7 +418,6 @@
        undebug_bgp_fsm_cmd,
        "undebug bgp fsm",
        UNDEBUG_STR
-       DEBUG_STR
        BGP_STR
        "Finite State Machine\n")
 
@@ -715,7 +715,6 @@
        undebug_bgp_zebra_cmd,
        "undebug bgp zebra",
        UNDEBUG_STR
-       DEBUG_STR
        BGP_STR
        "BGP Zebra messages\n")
 
diff --git a/bgpd/bgp_dump.c b/bgpd/bgp_dump.c
index 8087a40..edb725a 100644
--- a/bgpd/bgp_dump.c
+++ b/bgpd/bgp_dump.c
@@ -356,7 +356,11 @@
           stream_putw(obuf, info->peer->table_dump_index);
 
           /* Originated */
+#ifdef HAVE_CLOCK_MONOTONIC
+          stream_putl (obuf, time(NULL) - (bgp_clock() - info->uptime));
+#else
           stream_putl (obuf, info->uptime);
+#endif /* HAVE_CLOCK_MONOTONIC */
 
           /* Dump attribute. */
           /* Skip prefix & AFI/SAFI for MP_NLRI */
diff --git a/bgpd/bgp_packet.c b/bgpd/bgp_packet.c
index a5f9552..9102add 100644
--- a/bgpd/bgp_packet.c
+++ b/bgpd/bgp_packet.c
@@ -1885,12 +1885,6 @@
       bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_PARAM )
     UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
 
-  /* Also apply to Unsupported Capability until remote router support
-     capability. */
-  if (bgp_notify.code == BGP_NOTIFY_OPEN_ERR &&
-      bgp_notify.subcode == BGP_NOTIFY_OPEN_UNSUP_CAPBL)
-    UNSET_FLAG (peer->sflags, PEER_STATUS_CAPABILITY_OPEN);
-
   BGP_EVENT_ADD (peer, Receive_NOTIFICATION_message);
 }
 
diff --git a/bgpd/bgp_route.c b/bgpd/bgp_route.c
index df23dda..60e9610 100644
--- a/bgpd/bgp_route.c
+++ b/bgpd/bgp_route.c
@@ -5978,6 +5978,9 @@
   char buf1[BUFSIZ];
   struct attr *attr;
   int sockunion_vty_out (struct vty *, union sockunion *);
+#ifdef HAVE_CLOCK_MONOTONIC
+  time_t tbuf;
+#endif
 	
   attr = binfo->attr;
 
@@ -6144,8 +6147,12 @@
 	bgp_damp_info_vty (vty, binfo);
 
       /* Line 7 display Uptime */
-      time_t tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
+#ifdef HAVE_CLOCK_MONOTONIC
+      tbuf = time(NULL) - (bgp_clock() - binfo->uptime);
       vty_out (vty, "      Last update: %s", ctime(&tbuf));
+#else
+      vty_out (vty, "      Last update: %s", ctime(&binfo->uptime));
+#endif /* HAVE_CLOCK_MONOTONIC */
     }
   vty_out (vty, "%s", VTY_NEWLINE);
 }  
diff --git a/bgpd/bgp_vty.c b/bgpd/bgp_vty.c
index 88be52e..ec0106a 100644
--- a/bgpd/bgp_vty.c
+++ b/bgpd/bgp_vty.c
@@ -9952,7 +9952,7 @@
   switch (ret)
     {
     case COMMUNITY_LIST_ERR_CANT_FIND_LIST:
-      vty_out (vty, "%% Can't find communit-list%s", VTY_NEWLINE);
+      vty_out (vty, "%% Can't find community-list%s", VTY_NEWLINE);
       break;
     case COMMUNITY_LIST_ERR_MALFORMED_VAL:
       vty_out (vty, "%% Malformed community-list value%s", VTY_NEWLINE);
@@ -10313,7 +10313,7 @@
   list = community_list_lookup (bgp_clist, argv[0], COMMUNITY_LIST_MASTER);
   if (! list)
     {
-      vty_out (vty, "%% Can't find communit-list%s", VTY_NEWLINE);
+      vty_out (vty, "%% Can't find community-list%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
@@ -10663,7 +10663,7 @@
   list = community_list_lookup (bgp_clist, argv[0], EXTCOMMUNITY_LIST_MASTER);
   if (! list)
     {
-      vty_out (vty, "%% Can't find extcommunit-list%s", VTY_NEWLINE);
+      vty_out (vty, "%% Can't find extcommunity-list%s", VTY_NEWLINE);
       return CMD_WARNING;
     }
 
diff --git a/doc/main.texi b/doc/main.texi
index 9966b35..a575913 100644
--- a/doc/main.texi
+++ b/doc/main.texi
@@ -49,9 +49,9 @@
 @end deffn
 
 @deffn {Interface Command} {ip address @var{address/prefix}} {}
-@deffnx {Interface Command} {ip6 address @var{address/prefix}} {}
+@deffnx {Interface Command} {ipv6 address @var{address/prefix}} {}
 @deffnx {Interface Command} {no ip address @var{address/prefix}} {}
-@deffnx {Interface Command} {no ip6 address @var{address/prefix}} {}
+@deffnx {Interface Command} {no ipv6 address @var{address/prefix}} {}
 Set the IPv4 or IPv6 address/prefix for the interface.
 @end deffn
 
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c
index bfb6df2..04367f0 100644
--- a/ospf6d/ospf6_spf.c
+++ b/ospf6d/ospf6_spf.c
@@ -50,7 +50,9 @@
   struct ospf6_vertex *vb = (struct ospf6_vertex *) b;
 
   /* ascending order */
-  return (va->cost - vb->cost);
+  if (va->cost != vb->cost)
+    return (va->cost - vb->cost);
+  return (va->hops - vb->hops);
 }
 
 static int
@@ -320,22 +322,8 @@
         }
 
       prev = (struct ospf6_vertex *) route->route_option;
-      if (prev->hops > v->hops)
-        {
-          for (ALL_LIST_ELEMENTS (prev->child_list, node, nnode, w))
-            {
-              assert (w->parent == prev);
-              w->parent = v;
-              listnode_add_sort (v->child_list, w);
-            }
-          listnode_delete (prev->parent->child_list, prev);
-          listnode_add_sort (v->parent->child_list, v);
-
-          ospf6_vertex_delete (prev);
-          route->route_option = v;
-        }
-      else
-        ospf6_vertex_delete (v);
+      assert (prev->hops <= v->hops);
+      ospf6_vertex_delete (v);
 
       return -1;
     }
diff --git a/ripd/rip_debug.c b/ripd/rip_debug.c
index 64dc27c..662e584 100644
--- a/ripd/rip_debug.c
+++ b/ripd/rip_debug.c
@@ -44,19 +44,16 @@
     {
       if (IS_RIP_DEBUG_SEND && IS_RIP_DEBUG_RECV)
 	{
-	  vty_out (vty, "  RIP packet%s debugging is on%s",
-		   IS_RIP_DEBUG_DETAIL ? " detail" : "",
+	  vty_out (vty, "  RIP packet debugging is on%s",
 		   VTY_NEWLINE);
 	}
       else
 	{
 	  if (IS_RIP_DEBUG_SEND)
-	    vty_out (vty, "  RIP packet send%s debugging is on%s",
-		     IS_RIP_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "  RIP packet send debugging is on%s",
 		     VTY_NEWLINE);
 	  else
-	    vty_out (vty, "  RIP packet receive%s debugging is on%s",
-		     IS_RIP_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "  RIP packet receive debugging is on%s",
 		     VTY_NEWLINE);
 	}
     }
@@ -105,11 +102,12 @@
     rip_debug_packet |= RIP_DEBUG_SEND;
   if (strncmp ("recv", argv[0], strlen (argv[0])) == 0)
     rip_debug_packet |= RIP_DEBUG_RECV;
-  rip_debug_packet &= ~RIP_DEBUG_DETAIL;
   return CMD_SUCCESS;
 }
 
-DEFUN (debug_rip_packet_detail,
+/* N.B. the "detail" modifier is a no-op.  we leave this command
+   for legacy compatibility. */
+DEFUN_DEPRECATED (debug_rip_packet_detail,
        debug_rip_packet_detail_cmd,
        "debug rip packet (recv|send) detail",
        DEBUG_STR
@@ -124,7 +122,6 @@
     rip_debug_packet |= RIP_DEBUG_SEND;
   if (strncmp ("recv", argv[0], strlen (argv[0])) == 0)
     rip_debug_packet |= RIP_DEBUG_RECV;
-  rip_debug_packet |= RIP_DEBUG_DETAIL;
   return CMD_SUCCESS;
 }
 
@@ -224,20 +221,17 @@
     {
       if (IS_RIP_DEBUG_SEND && IS_RIP_DEBUG_RECV)
 	{
-	  vty_out (vty, "debug rip packet%s%s",
-		   IS_RIP_DEBUG_DETAIL ? " detail" : "",
+	  vty_out (vty, "debug rip packet%s",
 		   VTY_NEWLINE);
 	  write++;
 	}
       else
 	{
 	  if (IS_RIP_DEBUG_SEND)
-	    vty_out (vty, "debug rip packet send%s%s",
-		     IS_RIP_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "debug rip packet send%s",
 		     VTY_NEWLINE);
 	  else
-	    vty_out (vty, "debug rip packet recv%s%s",
-		     IS_RIP_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "debug rip packet recv%s",
 		     VTY_NEWLINE);
 	  write++;
 	}
diff --git a/ripd/rip_debug.h b/ripd/rip_debug.h
index f3a07ee..990ec90 100644
--- a/ripd/rip_debug.h
+++ b/ripd/rip_debug.h
@@ -40,7 +40,6 @@
 #define IS_RIP_DEBUG_PACKET (rip_debug_packet & RIP_DEBUG_PACKET)
 #define IS_RIP_DEBUG_SEND   (rip_debug_packet & RIP_DEBUG_SEND)
 #define IS_RIP_DEBUG_RECV   (rip_debug_packet & RIP_DEBUG_RECV)
-#define IS_RIP_DEBUG_DETAIL (rip_debug_packet & RIP_DEBUG_DETAIL)
 
 #define IS_RIP_DEBUG_ZEBRA  (rip_debug_zebra & RIP_DEBUG_ZEBRA)
 
diff --git a/ripngd/ripng_debug.c b/ripngd/ripng_debug.c
index 78f13a7..33a7cf6 100644
--- a/ripngd/ripng_debug.c
+++ b/ripngd/ripng_debug.c
@@ -45,19 +45,16 @@
     {
       if (IS_RIPNG_DEBUG_SEND && IS_RIPNG_DEBUG_RECV)
 	{
-	  vty_out (vty, "  RIPng packet%s debugging is on%s",
-		   IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
+	  vty_out (vty, "  RIPng packet debugging is on%s",
 		   VTY_NEWLINE);
 	}
       else
 	{
 	  if (IS_RIPNG_DEBUG_SEND)
-	    vty_out (vty, "  RIPng packet send%s debugging is on%s",
-		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "  RIPng packet send debugging is on%s",
 		     VTY_NEWLINE);
 	  else
-	    vty_out (vty, "  RIPng packet receive%s debugging is on%s",
-		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "  RIPng packet receive debugging is on%s",
 		     VTY_NEWLINE);
 	}
     }
@@ -106,11 +103,13 @@
     ripng_debug_packet |= RIPNG_DEBUG_SEND;
   if (strncmp ("recv", argv[0], strlen (argv[0])) == 0)
     ripng_debug_packet |= RIPNG_DEBUG_RECV;
-  ripng_debug_packet &= ~RIPNG_DEBUG_DETAIL;
+
   return CMD_SUCCESS;
 }
 
-DEFUN (debug_ripng_packet_detail,
+/* N.B. the "detail" modifier is a no-op.  we leave this command
+   for legacy compatibility. */
+DEFUN_DEPRECATED (debug_ripng_packet_detail,
        debug_ripng_packet_detail_cmd,
        "debug ripng packet (recv|send) detail",
        DEBUG_STR
@@ -125,7 +124,7 @@
     ripng_debug_packet |= RIPNG_DEBUG_SEND;
   if (strncmp ("recv", argv[0], strlen (argv[0])) == 0)
     ripng_debug_packet |= RIPNG_DEBUG_RECV;
-  ripng_debug_packet |= RIPNG_DEBUG_DETAIL;
+
   return CMD_SUCCESS;
 }
 
@@ -225,20 +224,17 @@
     {
       if (IS_RIPNG_DEBUG_SEND && IS_RIPNG_DEBUG_RECV)
 	{
-	  vty_out (vty, "debug ripng packet%s%s",
-		   IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
+	  vty_out (vty, "debug ripng packet%s",
 		   VTY_NEWLINE);
 	  write++;
 	}
       else
 	{
 	  if (IS_RIPNG_DEBUG_SEND)
-	    vty_out (vty, "debug ripng packet send%s%s",
-		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "debug ripng packet send%s",
 		     VTY_NEWLINE);
 	  else
-	    vty_out (vty, "debug ripng packet recv%s%s",
-		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
+	    vty_out (vty, "debug ripng packet recv%s",
 		     VTY_NEWLINE);
 	  write++;
 	}
diff --git a/ripngd/ripng_debug.h b/ripngd/ripng_debug.h
index f5ed6ea..674345c 100644
--- a/ripngd/ripng_debug.h
+++ b/ripngd/ripng_debug.h
@@ -29,7 +29,6 @@
 #define RIPNG_DEBUG_PACKET  0x01
 #define RIPNG_DEBUG_SEND    0x20
 #define RIPNG_DEBUG_RECV    0x40
-#define RIPNG_DEBUG_DETAIL  0x80
 
 #define RIPNG_DEBUG_ZEBRA   0x01
 
@@ -39,7 +38,6 @@
 #define IS_RIPNG_DEBUG_PACKET (ripng_debug_packet & RIPNG_DEBUG_PACKET)
 #define IS_RIPNG_DEBUG_SEND   (ripng_debug_packet & RIPNG_DEBUG_SEND)
 #define IS_RIPNG_DEBUG_RECV   (ripng_debug_packet & RIPNG_DEBUG_RECV)
-#define IS_RIPNG_DEBUG_DETAIL (ripng_debug_packet & RIPNG_DEBUG_DETAIL)
 
 #define IS_RIPNG_DEBUG_ZEBRA  (ripng_debug_zebra & RIPNG_DEBUG_ZEBRA)