Merge svn revision 975 from Zebra repository.
diff --git a/ospf6d/ospf6_flood.c b/ospf6d/ospf6_flood.c
index ec5c1c6..e9ba52b 100644
--- a/ospf6d/ospf6_flood.c
+++ b/ospf6d/ospf6_flood.c
@@ -25,6 +25,7 @@
 #include "thread.h"
 #include "linklist.h"
 #include "vty.h"
+#include "command.h"
 
 #include "ospf6d.h"
 #include "ospf6_proto.h"
@@ -41,6 +42,8 @@
 
 #include "ospf6_flood.h"
 
+unsigned char conf_debug_ospf6_flooding;
+
 struct ospf6_lsdb *
 ospf6_get_scoped_lsdb (struct ospf6_lsa *lsa)
 {
@@ -99,7 +102,7 @@
      suppress this update of the LSA */
   if (old && ! OSPF6_LSA_IS_DIFFER (lsa, old))
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE_TYPE (lsa->header->type))
         zlog_info ("Suppress updating LSA: %s", lsa->name);
       ospf6_lsa_delete (lsa);
       return;
@@ -112,7 +115,8 @@
   lsa->refresh = thread_add_timer (master, ospf6_lsa_refresh, lsa,
                                    LS_REFRESH_TIME);
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type) ||
+      IS_OSPF6_DEBUG_ORIGINATE_TYPE (lsa->header->type))
     {
       zlog_info ("LSA Originate:");
       ospf6_lsa_header_print (lsa);
@@ -185,14 +189,14 @@
 
   /* The LSA must be on the retrans-list of a neighbor. It means
      the "lsa" is a copied one, and we have to decrement the
-     retransmission count of the original one (instead of "lsa"'s).
+     retransmission count of the original one (instead of this "lsa"'s).
      In order to find the original LSA, first we have to find
      appropriate LSDB that have the original LSA. */
   lsdb = ospf6_get_scoped_lsdb (lsa);
 
   /* Find the original LSA of which the retrans_count should be decremented */
   orig = ospf6_lsdb_lookup (lsa->header->type, lsa->header->id,
-                           lsa->header->adv_router, lsdb);
+                            lsa->header->adv_router, lsdb);
   if (orig)
     {
       orig->retrans_count--;
@@ -207,7 +211,8 @@
   struct ospf6_lsa *old;
   struct timeval now;
 
-  if (IS_OSPF6_DEBUG_LSA (RECV) || IS_OSPF6_DEBUG_LSA (DATABASE))
+  if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type) ||
+      IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
     zlog_info ("Install LSA: %s", lsa->name);
 
   /* Remove the old instance from all neighbors' Link state
@@ -244,22 +249,27 @@
   struct ospf6_neighbor *on;
   struct ospf6_lsa *req;
   int retrans_added = 0;
+  int is_debug = 0;
 
-  if (IS_OSPF6_DEBUG_LSA (SEND))
-    zlog_info ("Flooding on %s: %s", oi->interface->name, lsa->name);
+  if (IS_OSPF6_DEBUG_FLOODING ||
+      IS_OSPF6_DEBUG_FLOOD_TYPE (lsa->header->type))
+    {
+      is_debug++;
+      zlog_info ("Flooding on %s: %s", oi->interface->name, lsa->name);
+    }
 
   /* (1) For each neighbor */
   for (node = listhead (oi->neighbor_list); node; nextnode (node))
     {
       on = (struct ospf6_neighbor *) getdata (node);
 
-      if (IS_OSPF6_DEBUG_LSA (SEND))
+      if (is_debug)
         zlog_info ("To neighbor %s", on->name);
 
       /* (a) if neighbor state < Exchange, examin next */
       if (on->state < OSPF6_NEIGHBOR_EXCHANGE)
         {
-          if (IS_OSPF6_DEBUG_LSA (SEND))
+          if (is_debug)
             zlog_info ("Neighbor state less than ExChange, next neighbor");
           continue;
         }
@@ -267,14 +277,14 @@
       /* (b) if neighbor not yet Full, check request-list */
       if (on->state != OSPF6_NEIGHBOR_FULL)
         {
-          if (IS_OSPF6_DEBUG_LSA (SEND))
+          if (is_debug)
             zlog_info ("Neighbor not yet Full");
 
           req = ospf6_lsdb_lookup (lsa->header->type, lsa->header->id,
                                    lsa->header->adv_router, on->request_list);
           if (req == NULL)
             {
-              if (IS_OSPF6_DEBUG_LSA (SEND))
+              if (is_debug)
                 zlog_info ("Not on request-list for this neighbor");
               /* fall through */
             }
@@ -283,7 +293,7 @@
               /* If new LSA less recent, examin next neighbor */
               if (ospf6_lsa_compare (lsa, req) > 0)
                 {
-                  if (IS_OSPF6_DEBUG_LSA (SEND))
+                  if (is_debug)
                     zlog_info ("Requesting is newer, next neighbor");
                   continue;
                 }
@@ -292,7 +302,7 @@
                  examin next neighbor */
               if (ospf6_lsa_compare (lsa, req) == 0)
                 {
-                  if (IS_OSPF6_DEBUG_LSA (SEND))
+                  if (is_debug)
                     zlog_info ("Requesting the same, remove it, next neighbor");
                   ospf6_lsdb_remove (req, on->request_list);
                   continue;
@@ -301,7 +311,7 @@
               /* If the new LSA is more recent, delete from request-list */
               if (ospf6_lsa_compare (lsa, req) < 0)
                 {
-                  if (IS_OSPF6_DEBUG_LSA (SEND))
+                  if (is_debug)
                     zlog_info ("Received is newer, remove requesting");
                   ospf6_lsdb_remove (req, on->request_list);
                   /* fall through */
@@ -313,13 +323,13 @@
          examin next neighbor */
       if (from == on)
         {
-          if (IS_OSPF6_DEBUG_LSA (SEND))
+          if (is_debug)
             zlog_info ("Received is from the neighbor, next neighbor");
           continue;
         }
 
       /* (d) add retrans-list, schedule retransmission */
-      if (IS_OSPF6_DEBUG_LSA (SEND))
+      if (is_debug)
         zlog_info ("Add retrans-list of this neighbor");
       ospf6_increment_retrans_count (lsa);
       ospf6_lsdb_add (ospf6_lsa_copy (lsa), on->retrans_list);
@@ -333,7 +343,7 @@
   /* (2) examin next interface if not added to retrans-list */
   if (retrans_added == 0)
     {
-      if (IS_OSPF6_DEBUG_LSA (SEND))
+      if (is_debug)
         zlog_info ("No retransmission scheduled, next interface");
       return;
     }
@@ -343,7 +353,7 @@
   if (from && from->ospf6_if == oi &&
       (from->router_id == oi->drouter || from->router_id == oi->bdrouter))
     {
-      if (IS_OSPF6_DEBUG_LSA (SEND))
+      if (is_debug)
         zlog_info ("Received is from the I/F's DR or BDR, next interface");
       return;
     }
@@ -352,13 +362,13 @@
      and the interface state is BDR, examin next interface */
   if (from && from->ospf6_if == oi && oi->state == OSPF6_INTERFACE_BDR)
     {
-      if (IS_OSPF6_DEBUG_LSA (SEND))
+      if (is_debug)
         zlog_info ("Received is from the I/F, itself BDR, next interface");
       return;
     }
 
   /* (5) flood the LSA out the interface. */
-  if (IS_OSPF6_DEBUG_LSA (SEND))
+  if (is_debug)
     zlog_info ("Schedule flooding for the interface");
   if (if_is_broadcast (oi->interface))
     {
@@ -451,7 +461,8 @@
                                lsa->header->adv_router, on->retrans_list);
       if (rem && ! ospf6_lsa_compare (rem, lsa))
         {
-          if (IS_OSPF6_DEBUG_LSA (DATABASE))
+          if (IS_OSPF6_DEBUG_FLOODING ||
+              IS_OSPF6_DEBUG_FLOOD_TYPE (lsa->header->type))
             zlog_info ("Remove %s from retrans_list of %s",
                        rem->name, on->name);
           ospf6_decrement_retrans_count (rem);
@@ -522,6 +533,11 @@
                                 struct ospf6_neighbor *from)
 {
   struct ospf6_interface *oi;
+  int is_debug = 0;
+
+  if (IS_OSPF6_DEBUG_FLOODING ||
+      IS_OSPF6_DEBUG_FLOOD_TYPE (lsa->header->type))
+    is_debug++;
 
   assert (from && from->ospf6_if);
   oi = from->ospf6_if;
@@ -530,7 +546,7 @@
      No acknowledgement sent. */
   if (CHECK_FLAG (lsa->flag, OSPF6_LSA_FLOODBACK))
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("No acknowledgement (BDR & FloodBack)");
       return;
     }
@@ -543,7 +559,7 @@
     {
       if (oi->drouter == from->router_id)
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             zlog_info ("Delayed acknowledgement (BDR & MoreRecent & from DR)");
           /* Delayed acknowledgement */
           ospf6_lsdb_add (ospf6_lsa_copy (lsa), oi->lsack_list);
@@ -553,7 +569,7 @@
         }
       else
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             zlog_info ("No acknowledgement (BDR & MoreRecent & ! from DR)");
         }
       return;
@@ -567,7 +583,7 @@
     {
       if (oi->drouter == from->router_id)
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             zlog_info ("Delayed acknowledgement (BDR & Duplicate & ImpliedAck & from DR)");
           /* Delayed acknowledgement */
           ospf6_lsdb_add (ospf6_lsa_copy (lsa), oi->lsack_list);
@@ -577,7 +593,7 @@
         }
       else
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             zlog_info ("No acknowledgement (BDR & Duplicate & ImpliedAck & ! from DR)");
         }
       return;
@@ -588,7 +604,7 @@
   if (CHECK_FLAG (lsa->flag, OSPF6_LSA_DUPLICATE) &&
       ! CHECK_FLAG (lsa->flag, OSPF6_LSA_IMPLIEDACK))
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("Direct acknowledgement (BDR & Duplicate)");
       ospf6_lsdb_add (ospf6_lsa_copy (lsa), from->lsack_list);
       if (from->thread_send_lsack == NULL)
@@ -609,6 +625,11 @@
                                 struct ospf6_neighbor *from)
 {
   struct ospf6_interface *oi;
+  int is_debug = 0;
+
+  if (IS_OSPF6_DEBUG_FLOODING ||
+      IS_OSPF6_DEBUG_FLOOD_TYPE (lsa->header->type))
+    is_debug++;
 
   assert (from && from->ospf6_if);
   oi = from->ospf6_if;
@@ -617,7 +638,7 @@
      No acknowledgement sent. */
   if (CHECK_FLAG (lsa->flag, OSPF6_LSA_FLOODBACK))
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("No acknowledgement (AllOther & FloodBack)");
       return;
     }
@@ -626,7 +647,7 @@
      back out receiving interface. Delayed acknowledgement sent. */
   if (ismore_recent < 0)
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("Delayed acknowledgement (AllOther & MoreRecent)");
       /* Delayed acknowledgement */
       ospf6_lsdb_add (ospf6_lsa_copy (lsa), oi->lsack_list);
@@ -641,7 +662,7 @@
   if (CHECK_FLAG (lsa->flag, OSPF6_LSA_DUPLICATE) &&
       CHECK_FLAG (lsa->flag, OSPF6_LSA_IMPLIEDACK))
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("No acknowledgement (AllOther & Duplicate & ImpliedAck)");
       return;
     }
@@ -651,7 +672,7 @@
   if (CHECK_FLAG (lsa->flag, OSPF6_LSA_DUPLICATE) &&
       ! CHECK_FLAG (lsa->flag, OSPF6_LSA_IMPLIEDACK))
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("Direct acknowledgement (AllOther & Duplicate)");
       ospf6_lsdb_add (ospf6_lsa_copy (lsa), from->lsack_list);
       if (from->thread_send_lsack == NULL)
@@ -733,6 +754,7 @@
   struct ospf6_lsa *new = NULL, *old = NULL, *rem = NULL;
   int ismore_recent;
   unsigned short cksum;
+  int is_debug = 0;
 
   ismore_recent = 1;
   assert (from);
@@ -740,8 +762,10 @@
   /* make lsa structure for received lsa */
   new = ospf6_lsa_create (lsa_header);
 
-  if (IS_OSPF6_DEBUG_LSA (RECV))
+  if (IS_OSPF6_DEBUG_FLOODING ||
+      IS_OSPF6_DEBUG_FLOOD_TYPE (new->header->type))
     {
+      is_debug++;
       zlog_info ("LSA Receive from %s", from->name);
       ospf6_lsa_header_print (new);
     }
@@ -750,7 +774,7 @@
   cksum = ntohs (new->header->checksum);
   if (ntohs (ospf6_lsa_checksum (new->header)) != cksum)
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("Wrong LSA Checksum, discard");
       ospf6_lsa_delete (new);
       return;
@@ -761,7 +785,7 @@
   if (IS_AREA_STUB (from->ospf6_if->area) &&
       OSPF6_LSA_SCOPE (new->header->type) == OSPF6_SCOPE_AS)
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("AS-External-LSA (or AS-scope LSA) in stub area, discard");
       ospf6_lsa_delete (new);
       return;
@@ -783,7 +807,7 @@
       new->lsdb = from->ospf6_if->area->ospf6->lsdb;
       break;
     default:
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("LSA has reserved scope, discard");
       ospf6_lsa_delete (new);
       return;
@@ -794,7 +818,7 @@
   if (ospf6_is_maxage_lsa_drop (new, from))
     {
       /* log */
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("Drop MaxAge LSA with direct acknowledgement.");
 
       /* a) Acknowledge back to neighbor (Direct acknowledgement, 13.5) */
@@ -817,7 +841,7 @@
       ismore_recent = ospf6_lsa_compare (new, old);
       if (ntohl (new->header->seqnum) == ntohl (old->header->seqnum))
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             zlog_info ("Received is duplicated LSA");
           SET_FLAG (new->flag, OSPF6_LSA_DUPLICATE);
         }
@@ -837,7 +861,7 @@
           timersub (&now, &old->installed, &res);
           if (res.tv_sec < MIN_LS_ARRIVAL)
             {
-              if (IS_OSPF6_DEBUG_LSA (RECV) || IS_OSPF6_DEBUG_LSA (TIMER))
+              if (is_debug)
                 zlog_info ("LSA can't be updated within MinLSArrival, discard");
               ospf6_lsa_delete (new);
               return;   /* examin next lsa */
@@ -846,7 +870,7 @@
 
       gettimeofday (&new->received, (struct timezone *) NULL);
 
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("Flood, Install, Possibly acknowledge the received LSA");
 
       /* (b) immediately flood and (c) remove from all retrans-list */
@@ -873,7 +897,7 @@
           /* Self-originated LSA (newer than ours) is received from
              another router. We have to make a new instance of the LSA
              or have to flush this LSA. */
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             {
               zlog_info ("Newer instance of the self-originated LSA");
               zlog_info ("Schedule reorigination");
@@ -891,7 +915,7 @@
       /* if no database copy, should go above state (5) */
       assert (old);
 
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         {
           zlog_info ("Received is not newer, on the neighbor's request-list");
           zlog_info ("BadLSReq, discard the received LSA");
@@ -907,7 +931,7 @@
   /* (7) if neither one is more recent */
   if (ismore_recent == 0)
     {
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("The same instance as database copy (neither recent)");
 
       /* (a) if on retrans-list, Treat this LSA as an Ack: Implied Ack */
@@ -915,7 +939,7 @@
                                new->header->adv_router, from->retrans_list);
       if (rem)
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             {
               zlog_info ("It is on the neighbor's retrans-list.");
               zlog_info ("Treat as an Implied acknowledgement");
@@ -925,7 +949,7 @@
           ospf6_lsdb_remove (rem, from->retrans_list);
         }
 
-      if (IS_OSPF6_DEBUG_LSA (RECV))
+      if (is_debug)
         zlog_info ("Possibly acknowledge and then discard");
 
       /* (b) possibly acknowledge */
@@ -944,7 +968,7 @@
       if (OSPF6_LSA_IS_MAXAGE (old) &&
           old->header->seqnum == htonl (MAX_SEQUENCE_NUMBER))
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             {
               zlog_info ("The LSA is in Seqnumber Wrapping");
               zlog_info ("MaxAge & MaxSeqNum, discard");
@@ -955,7 +979,7 @@
 
       /* Otherwise, Send database copy of this LSA to this neighbor */
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             {
               zlog_info ("Database copy is more recent.");
               zlog_info ("Send back directly and then discard");
@@ -975,4 +999,49 @@
 }
 
 
+DEFUN (debug_ospf6_flooding,
+       debug_ospf6_flooding_cmd,
+       "debug ospf6 flooding",
+       DEBUG_STR
+       OSPF6_STR
+       "Debug OSPFv3 flooding function\n"
+      )
+{
+  OSPF6_DEBUG_FLOODING_ON ();
+  return CMD_SUCCESS;
+}
+
+DEFUN (no_debug_ospf6_flooding,
+       no_debug_ospf6_flooding_cmd,
+       "no debug ospf6 flooding",
+       NO_STR
+       DEBUG_STR
+       OSPF6_STR
+       "Debug OSPFv3 flooding function\n"
+      )
+{
+  OSPF6_DEBUG_FLOODING_OFF ();
+  return CMD_SUCCESS;
+}
+
+int
+config_write_ospf6_debug_flood (struct vty *vty)
+{
+  if (IS_OSPF6_DEBUG_FLOODING)
+    vty_out (vty, "debug ospf6 flooding%s", VNL);
+  return 0;
+}
+
+void
+install_element_ospf6_debug_flood ()
+{
+  install_element (ENABLE_NODE, &debug_ospf6_flooding_cmd);
+  install_element (ENABLE_NODE, &no_debug_ospf6_flooding_cmd);
+  install_element (CONFIG_NODE, &debug_ospf6_flooding_cmd);
+  install_element (CONFIG_NODE, &no_debug_ospf6_flooding_cmd);
+}
+
+
+
+