Browse Source

Merge svn revision 975 from Zebra repository.

hasso 15 years ago
parent
commit
1e05838a4d

+ 7 - 0
ospf6d/ChangeLog

@@ -1,3 +1,10 @@
+2004-09-02  Yasuhiro Ohara  <yasu@sfc.wide.ad.jp>
+
+	* *.[ch]: Logging LSAs of particular type is added.
+	lsa_handler is now using vector in order to adjust
+	existing LSA modules.
+	* ospf6d.h: version 0.9.7l
+
 2004-08-28  Hasso Tepper  <hasso at quagga.net>
 
 	* ospf6_main.c: Modify for sigevents.

+ 43 - 39
ospf6d/ospf6_abr.c

@@ -158,29 +158,33 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
   struct ospf6_inter_router_lsa *router_lsa;
   struct ospf6_route_table *summary_table = NULL;
   u_int16_t type;
+  char buf[64];
+  int is_debug = 0;
 
-  if (IS_OSPF6_DEBUG_ABR)
+  if (route->type == OSPF6_DEST_TYPE_ROUTER)
     {
-      char buf[64];
-      if (route->type == OSPF6_DEST_TYPE_ROUTER)
+      if (IS_OSPF6_DEBUG_ABR || IS_OSPF6_DEBUG_ORIGINATE (INTER_ROUTER))
         {
+          is_debug++;
           inet_ntop (AF_INET, &(ADV_ROUTER_IN_PREFIX (&route->prefix)),
                      buf, sizeof (buf));
           zlog_info ("Originating summary in area %s for ASBR %s",
                      area->name, buf);
         }
-      else
+      summary_table = area->summary_router;
+    }
+  else
+    {
+      if (IS_OSPF6_DEBUG_ABR || IS_OSPF6_DEBUG_ORIGINATE (INTER_PREFIX))
         {
+          is_debug++;
           prefix2str (&route->prefix, buf, sizeof (buf));
           zlog_info ("Originating summary in area %s for %s",
                      area->name, buf);
         }
+      summary_table = area->summary_prefix;
     }
 
-  if (route->type == OSPF6_DEST_TYPE_ROUTER)
-    summary_table = area->summary_router;
-  else
-    summary_table = area->summary_prefix;
   summary = ospf6_route_lookup (&route->prefix, summary_table);
   if (summary)
     old = ospf6_lsdb_lookup (summary->path.origin.type,
@@ -190,7 +194,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
   /* if this route has just removed, remove corresponding LSA */
   if (CHECK_FLAG (route->flag, OSPF6_ROUTE_REMOVE))
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("The route has just removed, purge previous LSA");
       if (summary)
         ospf6_route_remove (summary, summary_table);
@@ -205,7 +209,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
       (route->type != OSPF6_DEST_TYPE_ROUTER ||
        ! CHECK_FLAG (route->path.router_bits, OSPF6_ROUTER_BIT_E)))
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("Route type is none of network, range nor ASBR, withdraw");
       if (summary)
         ospf6_route_remove (summary, summary_table);
@@ -218,7 +222,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
   if (route->path.type == OSPF6_PATH_TYPE_EXTERNAL1 ||
       route->path.type == OSPF6_PATH_TYPE_EXTERNAL2)
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("Path type is external, withdraw");
       if (summary)
         ospf6_route_remove (summary, summary_table);
@@ -230,7 +234,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
   /* do not generate if the path's area is the same as target area */
   if (route->path.area_id == area->area_id)
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("The route is in the area itself, ignore");
       if (summary)
         ospf6_route_remove (summary, summary_table);
@@ -243,7 +247,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
   oi = ospf6_interface_lookup_by_ifindex (route->nexthop[0].ifindex);
   if (oi && oi->area && oi->area == area)
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("The route's nexthop is in the same area, ignore");
       if (summary)
         ospf6_route_remove (summary, summary_table);
@@ -255,7 +259,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
   /* do not generate if the route cost is greater or equal to LSInfinity */
   if (route->path.cost >= LS_INFINITY)
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("The cost exceeds LSInfinity, withdraw");
       if (summary)
         ospf6_route_remove (summary, summary_table);
@@ -270,7 +274,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
       /* Only the prefered best path is considered */
       if (! CHECK_FLAG (route->flag, OSPF6_ROUTE_BEST))
         {
-          if (IS_OSPF6_DEBUG_ABR)
+          if (is_debug)
             zlog_info ("This is the secondary path to the ASBR, ignore");
           if (summary)
             ospf6_route_remove (summary, summary_table);
@@ -299,9 +303,8 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
           (route->path.area_id != BACKBONE_AREA_ID ||
            ! IS_AREA_TRANSIT (area)))
         {
-          if (IS_OSPF6_DEBUG_ABR)
+          if (is_debug)
             {
-              char buf[64];
               prefix2str (&range->prefix, buf, sizeof (buf));
               zlog_info ("Suppressed by range %s of area %s",
                          buf, route_area->name);
@@ -321,7 +324,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
       /* If DoNotAdvertise is set */
       if (CHECK_FLAG (route->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE))
         {
-          if (IS_OSPF6_DEBUG_ABR)
+          if (is_debug)
             zlog_info ("This is the range with DoNotAdvertise set. ignore");
           if (summary)
             ospf6_route_remove (summary, summary_table);
@@ -333,7 +336,7 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
       /* Whether the route have active longer prefix */
       if (! CHECK_FLAG (route->flag, OSPF6_ROUTE_ACTIVE_SUMMARY))
         {
-          if (IS_OSPF6_DEBUG_ABR)
+          if (is_debug)
             zlog_info ("The range is not active. withdraw");
           if (summary)
             ospf6_route_remove (summary, summary_table);
@@ -427,9 +430,6 @@ ospf6_abr_originate_summary_to_area (struct ospf6_route *route,
   /* create LSA */
   lsa = ospf6_lsa_create (lsa_header);
 
-  if (IS_OSPF6_DEBUG_ABR)
-    zlog_info ("Originate as %s", lsa->name);
-
   /* Originate */
   ospf6_lsa_originate_area (lsa, area);
 }
@@ -500,13 +500,18 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
   u_int32_t cost = 0;
   int i;
   char buf[64];
-
-  if (IS_OSPF6_DEBUG_ABR)
-    zlog_info ("Examin %s in area %s", lsa->name, oa->name);
+  int is_debug = 0;
 
   if (lsa->header->type == htons (OSPF6_LSTYPE_INTER_PREFIX))
     {
       struct ospf6_inter_prefix_lsa *prefix_lsa;
+
+      if (IS_OSPF6_DEBUG_EXAMIN (INTER_PREFIX))
+        {
+          is_debug++;
+          zlog_info ("Examin %s in area %s", lsa->name, oa->name);
+        }
+
       prefix_lsa = (struct ospf6_inter_prefix_lsa *)
         OSPF6_LSA_HEADER_END (lsa->header);
       prefix.family = AF_INET6;
@@ -521,6 +526,13 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
   else if (lsa->header->type == htons (OSPF6_LSTYPE_INTER_ROUTER))
     {
       struct ospf6_inter_router_lsa *router_lsa;
+
+      if (IS_OSPF6_DEBUG_EXAMIN (INTER_ROUTER))
+        {
+          is_debug++;
+          zlog_info ("Examin %s in area %s", lsa->name, oa->name);
+        }
+
       router_lsa = (struct ospf6_inter_router_lsa *)
         OSPF6_LSA_HEADER_END (lsa->header);
       ospf6_linkstate_prefix (router_lsa->router_id, htonl (0), &prefix);
@@ -552,7 +564,7 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
   /* (1) if cost == LSInfinity or if the LSA is MaxAge */
   if (cost == LS_INFINITY)
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("cost is LS_INFINITY, ignore");
       if (old)
         ospf6_route_remove (old, oa->ospf6->route_table);
@@ -560,7 +572,7 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
     }
   if (OSPF6_LSA_IS_MAXAGE (lsa))
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("LSA is MaxAge, ignore");
       if (old)
         ospf6_route_remove (old, oa->ospf6->route_table);
@@ -570,7 +582,7 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
   /* (2) if the LSA is self-originated, ignore */
   if (lsa->header->adv_router == oa->ospf6->router_id)
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("LSA is self-originated, ignore");
       if (old)
         ospf6_route_remove (old, oa->ospf6->route_table);
@@ -583,7 +595,7 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
       range = ospf6_route_lookup (&prefix, oa->range_table);
       if (range)
         {
-          if (IS_OSPF6_DEBUG_ABR)
+          if (is_debug)
             zlog_info ("Prefix is equal to address range, ignore");
           if (old)
             ospf6_route_remove (old, oa->ospf6->route_table);
@@ -598,7 +610,7 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
       CHECK_FLAG (abr_entry->flag, OSPF6_ROUTE_REMOVE) ||
       ! CHECK_FLAG (abr_entry->path.router_bits, OSPF6_ROUTER_BIT_B))
     {
-      if (IS_OSPF6_DEBUG_ABR)
+      if (is_debug)
         zlog_info ("ABR router entry does not exist, ignore");
       if (old)
         ospf6_route_remove (old, oa->ospf6->route_table);
@@ -628,7 +640,7 @@ ospf6_abr_examin_summary (struct ospf6_lsa *lsa, struct ospf6_area *oa)
   for (i = 0; i < OSPF6_MULTI_PATH_LIMIT; i++)
     route->nexthop[i] = abr_entry->nexthop[i];
 
-  if (IS_OSPF6_DEBUG_ABR)
+  if (is_debug)
     zlog_info ("Install route: %s", buf);
   ospf6_route_add (route, table);
 }
@@ -641,14 +653,6 @@ ospf6_abr_examin_brouter (u_int32_t router_id)
   listnode node;
   u_int16_t type;
 
-  if (IS_OSPF6_DEBUG_ABR)
-    {
-      char buf[16];
-      inet_ntop (AF_INET, &router_id, buf, sizeof (buf));
-      zlog_info ("Router entry of %s changed", buf);
-      zlog_info ("Examin summary LSAs originated by the router");
-    }
-
   type = htons (OSPF6_LSTYPE_INTER_ROUTER);
   for (node = listhead (ospf6->area_list); node; nextnode (node))
     {

+ 12 - 6
ospf6d/ospf6_area.c

@@ -59,6 +59,12 @@ ospf6_area_lsdb_hook_add (struct ospf6_lsa *lsa)
     {
     case OSPF6_LSTYPE_ROUTER:
     case OSPF6_LSTYPE_NETWORK:
+      if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
+        {
+          zlog_info ("Examin %s", lsa->name);
+          zlog_info ("Schedule SPF Calculation for %s",
+                     OSPF6_AREA (lsa->lsdb->data)->name);
+        }
       ospf6_spf_schedule (OSPF6_AREA (lsa->lsdb->data));
       break;
 
@@ -72,9 +78,6 @@ ospf6_area_lsdb_hook_add (struct ospf6_lsa *lsa)
       break;
 
     default:
-      if (IS_OSPF6_DEBUG_LSA (RECV))
-	zlog_info ("Unknown LSA in Area %s's lsdb",
-                   OSPF6_AREA (lsa->lsdb->data)->name);
       break;
     }
 }
@@ -86,6 +89,12 @@ ospf6_area_lsdb_hook_remove (struct ospf6_lsa *lsa)
     {
     case OSPF6_LSTYPE_ROUTER:
     case OSPF6_LSTYPE_NETWORK:
+      if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
+        {
+          zlog_info ("LSA disappearing: %s", lsa->name);
+          zlog_info ("Schedule SPF Calculation for %s",
+                     OSPF6_AREA (lsa->lsdb->data)->name);
+        }
       ospf6_spf_schedule (OSPF6_AREA (lsa->lsdb->data));
       break;
 
@@ -99,9 +108,6 @@ ospf6_area_lsdb_hook_remove (struct ospf6_lsa *lsa)
       break;
 
     default:
-      if (IS_OSPF6_DEBUG_LSA (RECV))
-	zlog_info ("Unknown LSA in Area %s's lsdb",
-                   OSPF6_AREA (lsa->lsdb->data)->name);
       break;
     }
 }

+ 14 - 14
ospf6d/ospf6_asbr.c

@@ -81,7 +81,7 @@ ospf6_as_external_lsa_originate (struct ospf6_route *route)
                            route->path.origin.id, ospf6->router_id,
                            ospf6->lsdb);
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_ASBR || IS_OSPF6_DEBUG_ORIGINATE (AS_EXTERNAL))
     {
       prefix2str (&route->prefix, buf, sizeof (buf));
       zlog_info ("Originate AS-External-LSA for %s", buf);
@@ -175,19 +175,19 @@ ospf6_asbr_lsa_add (struct ospf6_lsa *lsa)
   external = (struct ospf6_as_external_lsa *)
     OSPF6_LSA_HEADER_END (lsa->header);
 
-  if (IS_OSPF6_DEBUG_ASBR)
+  if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
     zlog_info ("Calculate AS-External route for %s", lsa->name);
 
   if (lsa->header->adv_router == ospf6->router_id)
     {
-      if (IS_OSPF6_DEBUG_ASBR)
+      if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
         zlog_info ("Ignore self-originated AS-External-LSA");
       return;
     }
 
   if (OSPF6_ASBR_METRIC (external) == LS_INFINITY)
     {
-      if (IS_OSPF6_DEBUG_ASBR)
+      if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
         zlog_info ("Ignore LSA with LSInfinity Metric");
       return;
     }
@@ -196,7 +196,7 @@ ospf6_asbr_lsa_add (struct ospf6_lsa *lsa)
   asbr_entry = ospf6_route_lookup (&asbr_id, ospf6->brouter_table);
   if (asbr_entry == NULL)
     {
-      if (IS_OSPF6_DEBUG_ASBR)
+      if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
         {
           prefix2str (&asbr_id, buf, sizeof (buf));
           zlog_info ("ASBR entry not found: %s", buf);
@@ -234,7 +234,7 @@ ospf6_asbr_lsa_add (struct ospf6_lsa *lsa)
   for (i = 0; i < OSPF6_MULTI_PATH_LIMIT; i++)
     ospf6_nexthop_copy (&route->nexthop[i], &asbr_entry->nexthop[i]);
 
-  if (IS_OSPF6_DEBUG_ASBR)
+  if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
     {
       prefix2str (&route->prefix, buf, sizeof (buf));
       zlog_info ("AS-External route add: %s", buf);
@@ -254,12 +254,12 @@ ospf6_asbr_lsa_remove (struct ospf6_lsa *lsa)
   external = (struct ospf6_as_external_lsa *)
     OSPF6_LSA_HEADER_END (lsa->header);
 
-  if (IS_OSPF6_DEBUG_ASBR)
+  if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
     zlog_info ("Withdraw AS-External route for %s", lsa->name);
 
   if (lsa->header->adv_router == ospf6->router_id)
     {
-      if (IS_OSPF6_DEBUG_ASBR)
+      if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
         zlog_info ("Ignore self-originated AS-External-LSA");
       return;
     }
@@ -272,7 +272,7 @@ ospf6_asbr_lsa_remove (struct ospf6_lsa *lsa)
   route = ospf6_route_lookup (&prefix, ospf6->route_table);
   if (route == NULL)
     {
-      if (IS_OSPF6_DEBUG_ASBR)
+      if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
         {
           prefix2str (&prefix, buf, sizeof (buf));
           zlog_info ("AS-External route %s not found", buf);
@@ -293,7 +293,7 @@ ospf6_asbr_lsa_remove (struct ospf6_lsa *lsa)
       if (route->path.origin.adv_router != lsa->header->adv_router)
         continue;
 
-      if (IS_OSPF6_DEBUG_ASBR)
+      if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
         {
           prefix2str (&route->prefix, buf, sizeof (buf));
           zlog_info ("AS-External route remove: %s", buf);
@@ -310,7 +310,7 @@ ospf6_asbr_lsentry_add (struct ospf6_route *asbr_entry)
   u_int16_t type;
   u_int32_t router;
 
-  if (IS_OSPF6_DEBUG_ASBR)
+  if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
     {
       ospf6_linkstate_prefix2str (&asbr_entry->prefix, buf, sizeof (buf));
       zlog_info ("New ASBR %s found", buf);
@@ -325,7 +325,7 @@ ospf6_asbr_lsentry_add (struct ospf6_route *asbr_entry)
         ospf6_asbr_lsa_add (lsa);
     }
 
-  if (IS_OSPF6_DEBUG_ASBR)
+  if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
     {
       ospf6_linkstate_prefix2str (&asbr_entry->prefix, buf, sizeof (buf));
       zlog_info ("Calculation for new ASBR %s done", buf);
@@ -340,7 +340,7 @@ ospf6_asbr_lsentry_remove (struct ospf6_route *asbr_entry)
   u_int16_t type;
   u_int32_t router;
 
-  if (IS_OSPF6_DEBUG_ASBR)
+  if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
     {
       ospf6_linkstate_prefix2str (&asbr_entry->prefix, buf, sizeof (buf));
       zlog_info ("ASBR %s disappeared", buf);
@@ -352,7 +352,7 @@ ospf6_asbr_lsentry_remove (struct ospf6_route *asbr_entry)
        lsa; lsa = ospf6_lsdb_type_router_next (type, router, lsa))
     ospf6_asbr_lsa_remove (lsa);
 
-  if (IS_OSPF6_DEBUG_ASBR)
+  if (IS_OSPF6_DEBUG_EXAMIN (AS_EXTERNAL))
     {
       ospf6_linkstate_prefix2str (&asbr_entry->prefix, buf, sizeof (buf));
       zlog_info ("Calculation for old ASBR %s done", buf);

+ 115 - 46
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 @@ ospf6_lsa_originate (struct ospf6_lsa *lsa)
      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 @@ ospf6_lsa_originate (struct ospf6_lsa *lsa)
   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 @@ ospf6_decrement_retrans_count (struct ospf6_lsa *lsa)
 
   /* 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 @@ ospf6_install_lsa (struct ospf6_lsa *lsa)
   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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
   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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
       /* (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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
               /* 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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
                  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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
               /* 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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
          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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
   /* (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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
   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 @@ ospf6_flood_interface (struct ospf6_neighbor *from,
      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 @@ ospf6_flood_clear_interface (struct ospf6_lsa *lsa, struct ospf6_interface *oi)
                                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 @@ ospf6_acknowledge_lsa_bdrouter (struct ospf6_lsa *lsa, int ismore_recent,
                                 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 @@ ospf6_acknowledge_lsa_bdrouter (struct ospf6_lsa *lsa, int ismore_recent,
      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 @@ ospf6_acknowledge_lsa_bdrouter (struct ospf6_lsa *lsa, int ismore_recent,
     {
       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 @@ ospf6_acknowledge_lsa_bdrouter (struct ospf6_lsa *lsa, int ismore_recent,
         }
       else
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             zlog_info ("No acknowledgement (BDR & MoreRecent & ! from DR)");
         }
       return;
@@ -567,7 +583,7 @@ ospf6_acknowledge_lsa_bdrouter (struct ospf6_lsa *lsa, int ismore_recent,
     {
       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 @@ ospf6_acknowledge_lsa_bdrouter (struct ospf6_lsa *lsa, int ismore_recent,
         }
       else
         {
-          if (IS_OSPF6_DEBUG_LSA (RECV))
+          if (is_debug)
             zlog_info ("No acknowledgement (BDR & Duplicate & ImpliedAck & ! from DR)");
         }
       return;
@@ -588,7 +604,7 @@ ospf6_acknowledge_lsa_bdrouter (struct ospf6_lsa *lsa, int ismore_recent,
   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 @@ ospf6_acknowledge_lsa_allother (struct ospf6_lsa *lsa, int ismore_recent,
                                 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 @@ ospf6_acknowledge_lsa_allother (struct ospf6_lsa *lsa, int ismore_recent,
      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 @@ ospf6_acknowledge_lsa_allother (struct ospf6_lsa *lsa, int ismore_recent,
      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 @@ ospf6_acknowledge_lsa_allother (struct ospf6_lsa *lsa, int ismore_recent,
   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 @@ ospf6_acknowledge_lsa_allother (struct ospf6_lsa *lsa, int ismore_recent,
   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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
   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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
   /* 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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
   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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
   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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
       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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
   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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
       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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
           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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
 
       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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
           /* 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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
       /* 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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
   /* (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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
                                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_receive_lsa (struct ospf6_neighbor *from,
           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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
       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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
 
       /* 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 @@ ospf6_receive_lsa (struct ospf6_neighbor *from,
 }
 
 
+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);
+}
+
+
+
+
 

+ 12 - 0
ospf6d/ospf6_flood.h

@@ -22,6 +22,15 @@
 #ifndef OSPF6_FLOOD_H
 #define OSPF6_FLOOD_H
 
+/* Debug option */
+extern unsigned char conf_debug_ospf6_flooding;
+#define OSPF6_DEBUG_FLOODING_ON() \
+  (conf_debug_ospf6_flooding = 1)
+#define OSPF6_DEBUG_FLOODING_OFF() \
+  (conf_debug_ospf6_flooding = 0)
+#define IS_OSPF6_DEBUG_FLOODING \
+  (conf_debug_ospf6_flooding)
+
 /* Function Prototypes */
 struct ospf6_lsdb *ospf6_get_scoped_lsdb (struct ospf6_lsa *lsa);
 struct ospf6_lsdb *ospf6_get_scoped_lsdb_self (struct ospf6_lsa *lsa);
@@ -49,6 +58,9 @@ void ospf6_receive_lsa (struct ospf6_neighbor *from,
                         struct ospf6_lsa_header *header);
 void ospf6_install_lsa (struct ospf6_lsa *lsa);
 
+int config_write_ospf6_debug_flood (struct vty *vty);
+void install_element_ospf6_debug_flood ();
+
 #endif /* OSPF6_FLOOD_H */
 
 

+ 14 - 14
ospf6d/ospf6_interface.c

@@ -98,9 +98,6 @@ ospf6_interface_lsdb_hook (struct ospf6_lsa *lsa)
         break;
 
       default:
-        if (IS_OSPF6_DEBUG_LSA (RECV))
-          zlog_info ("Unknown LSA in Interface %s's lsdb",
-                     OSPF6_INTERFACE (lsa->lsdb->data)->interface->name);
         break;
     }
 }
@@ -143,8 +140,9 @@ ospf6_interface_create (struct interface *ifp)
   iobuflen = ospf6_iobuf_size (ifp->mtu6);
   if (oi->ifmtu > iobuflen)
     {
-      zlog_info ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
-                 ifp->name, iobuflen);
+      if (IS_OSPF6_DEBUG_INTERFACE)
+        zlog_info ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
+                   ifp->name, iobuflen);
       oi->ifmtu = iobuflen;
     }
 
@@ -275,8 +273,9 @@ ospf6_interface_if_add (struct interface *ifp)
   iobuflen = ospf6_iobuf_size (ifp->mtu6);
   if (oi->ifmtu > iobuflen)
     {
-      zlog_info ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
-                 ifp->name, iobuflen);
+      if (IS_OSPF6_DEBUG_INTERFACE)
+        zlog_info ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
+                   ifp->name, iobuflen);
       oi->ifmtu = iobuflen;
     }
 
@@ -355,11 +354,11 @@ ospf6_interface_connected_route_update (struct interface *ifp)
       if (c->address->family != AF_INET6)
         continue;
 
-      CONTINUE_IF_ADDRESS_LINKLOCAL (c->address);
-      CONTINUE_IF_ADDRESS_UNSPECIFIED (c->address);
-      CONTINUE_IF_ADDRESS_LOOPBACK (c->address);
-      CONTINUE_IF_ADDRESS_V4COMPAT (c->address);
-      CONTINUE_IF_ADDRESS_V4MAPPED (c->address);
+      CONTINUE_IF_ADDRESS_LINKLOCAL (IS_OSPF6_DEBUG_INTERFACE, c->address);
+      CONTINUE_IF_ADDRESS_UNSPECIFIED (IS_OSPF6_DEBUG_INTERFACE, c->address);
+      CONTINUE_IF_ADDRESS_LOOPBACK (IS_OSPF6_DEBUG_INTERFACE, c->address);
+      CONTINUE_IF_ADDRESS_V4COMPAT (IS_OSPF6_DEBUG_INTERFACE, c->address);
+      CONTINUE_IF_ADDRESS_V4MAPPED (IS_OSPF6_DEBUG_INTERFACE, c->address);
 
       /* apply filter */
       if (oi->plist_name)
@@ -373,8 +372,9 @@ ospf6_interface_connected_route_update (struct interface *ifp)
           ret = prefix_list_apply (plist, (void *) c->address);
           if (ret == PREFIX_DENY)
             {
-              zlog_info ("%s on %s filtered by prefix-list %s ",
-                         buf, oi->interface->name, oi->plist_name);
+              if (IS_OSPF6_DEBUG_INTERFACE)
+                zlog_info ("%s on %s filtered by prefix-list %s ",
+                           buf, oi->interface->name, oi->plist_name);
               continue;
             }
         }

+ 34 - 36
ospf6d/ospf6_intra.c

@@ -121,7 +121,7 @@ ospf6_router_lsa_originate (struct thread *thread)
   oa = (struct ospf6_area *) THREAD_ARG (thread);
   oa->thread_router_lsa = NULL;
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_ORIGINATE (ROUTER))
     zlog_info ("Originate Router-LSA for Area %s", oa->name);
 
   memset (buffer, 0, sizeof (buffer));
@@ -179,7 +179,7 @@ ospf6_router_lsa_originate (struct thread *thread)
           if ((caddr_t) lsdesc == (caddr_t) router_lsa +
                                   sizeof (struct ospf6_router_lsa))
             {
-              if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+              if (IS_OSPF6_DEBUG_ORIGINATE (ROUTER))
                 zlog_info ("Size limit setting for Router-LSA too short");
               return 0;
             }
@@ -292,7 +292,7 @@ ospf6_router_lsa_originate (struct thread *thread)
     }
   else
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (ROUTER))
         zlog_info ("Nothing to describe in Router-LSA, suppress");
     }
 
@@ -377,7 +377,7 @@ ospf6_network_lsa_originate (struct thread *thread)
       return 0;
     }
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_ORIGINATE (NETWORK))
     zlog_info ("Originate Network-LSA for Interface %s", oi->interface->name);
 
   /* If none of neighbor is adjacent to us */
@@ -390,7 +390,7 @@ ospf6_network_lsa_originate (struct thread *thread)
     }
   if (count == 0)
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (NETWORK))
         zlog_info ("Interface stub, ignore");
       if (old)
         ospf6_lsa_purge (old);
@@ -547,13 +547,13 @@ ospf6_link_lsa_originate (struct thread *thread)
       return 0;
     }
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_ORIGINATE (LINK))
     zlog_info ("Originate Link-LSA for Interface %s", oi->interface->name);
 
   /* can't make Link-LSA if linklocal address not set */
   if (oi->linklocal_addr == NULL)
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (LINK))
         zlog_info ("No Linklocal address on %s, defer originating",
                    oi->interface->name);
       if (old)
@@ -639,7 +639,7 @@ ospf6_intra_prefix_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
   inet_ntop (AF_INET, &intra_prefix_lsa->ref_adv_router,
              adv_router, sizeof (adv_router));
   vty_out (vty, "     Reference: %s Id: %s Adv: %s%s",
-           OSPF6_LSTYPE_NAME (intra_prefix_lsa->ref_type), id, adv_router,
+           ospf6_lstype_name (intra_prefix_lsa->ref_type), id, adv_router,
            VNL);
 
   start = (char *) intra_prefix_lsa + sizeof (struct ospf6_intra_prefix_lsa);
@@ -707,7 +707,7 @@ ospf6_intra_prefix_lsa_originate_stub (struct thread *thread)
       return 0;
     }
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
     zlog_info ("Originate Intra-Area-Prefix-LSA for area %s's stub prefix",
                oa->name);
 
@@ -730,7 +730,7 @@ ospf6_intra_prefix_lsa_originate_stub (struct thread *thread)
 
       if (oi->state == OSPF6_INTERFACE_DOWN)
         {
-          if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+          if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
             zlog_info ("  Interface %s is down, ignore", oi->interface->name);
           continue;
         }
@@ -746,20 +746,20 @@ ospf6_intra_prefix_lsa_originate_stub (struct thread *thread)
           oi->state != OSPF6_INTERFACE_POINTTOPOINT &&
           full_count != 0)
         {
-          if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+          if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
             zlog_info ("  Interface %s is not stub, ignore",
                        oi->interface->name);
           continue;
         }
 
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
         zlog_info ("  Interface %s:", oi->interface->name);
 
       /* connected prefix to advertise */
       for (route = ospf6_route_head (oi->route_connected); route;
            route = ospf6_route_best_next (route))
         {
-          if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+          if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
             {
               prefix2str (&route->prefix, buf, sizeof (buf));
               zlog_info ("    include %s", buf);
@@ -796,7 +796,7 @@ ospf6_intra_prefix_lsa_originate_stub (struct thread *thread)
 
   if (prefix_num == 0)
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
         zlog_info ("Quit to Advertise Intra-Prefix: no route to advertise");
       return 0;
     }
@@ -865,7 +865,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
       return 0;
     }
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
     zlog_info ("Originate Intra-Area-Prefix-LSA for interface %s's prefix",
                oi->interface->name);
 
@@ -882,7 +882,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
 
   if (oi->state != OSPF6_INTERFACE_DR)
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
         zlog_info ("  Interface is not DR");
       if (old)
         ospf6_lsa_purge (old);
@@ -898,7 +898,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
     }
   if (full_count == 0)
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
         zlog_info ("  Interface is stub");
       if (old)
         ospf6_lsa_purge (old);
@@ -915,7 +915,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
       if (OSPF6_LSA_IS_MAXAGE (lsa))
         continue;
 
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
         zlog_info ("  include prefix from %s", lsa->name);
 
       if (lsa->header->adv_router != oi->area->ospf6->router_id)
@@ -923,7 +923,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
           on = ospf6_neighbor_lookup (lsa->header->adv_router, oi);
           if (on == NULL || on->state != OSPF6_NEIGHBOR_FULL)
             {
-              if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+              if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
                 zlog_info ("    Neighbor not found or not Full, ignore");
               continue;
             }
@@ -962,7 +962,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
           route->path.area_id = oi->area->area_id;
           route->path.type = OSPF6_PATH_TYPE_INTRA;
 
-          if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+          if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
             {
               prefix2str (&route->prefix, buf, sizeof (buf));
               zlog_info ("    include %s", buf);
@@ -971,7 +971,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
           ospf6_route_add (route, route_advertise);
           prefix_num--;
         }
-      if (current != end && IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (current != end && IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
         zlog_info ("Trailing garbage in %s", lsa->name);
     }
 
@@ -995,7 +995,7 @@ ospf6_intra_prefix_lsa_originate_transit (struct thread *thread)
 
   if (prefix_num == 0)
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_ORIGINATE (INTRA_PREFIX))
         zlog_info ("Quit to Advertise Intra-Prefix: no route to advertise");
       return 0;
     }
@@ -1039,7 +1039,7 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
   if (OSPF6_LSA_IS_MAXAGE (lsa))
     return;
 
-  if (IS_OSPF6_DEBUG_ROUTE (INTRA))
+  if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
     zlog_info ("%s found", lsa->name);
 
   oa = OSPF6_AREA (lsa->lsdb->data);
@@ -1054,7 +1054,7 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
                             intra_prefix_lsa->ref_id, &ls_prefix);
   else
     {
-      if (IS_OSPF6_DEBUG_ROUTE (INTRA))
+      if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
         zlog_info ("Unknown reference LS-type: %#hx",
                    ntohs (intra_prefix_lsa->ref_type));
       return;
@@ -1063,7 +1063,7 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
   ls_entry = ospf6_route_lookup (&ls_prefix, oa->spf_table);
   if (ls_entry == NULL)
     {
-      if (IS_OSPF6_DEBUG_ROUTE (INTRA))
+      if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
         {
           ospf6_linkstate_prefix2str (&ls_prefix, buf, sizeof (buf));
           zlog_info ("LS entry does not exist: %s", buf);
@@ -1105,7 +1105,7 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
            i < OSPF6_MULTI_PATH_LIMIT; i++)
         ospf6_nexthop_copy (&route->nexthop[i], &ls_entry->nexthop[i]);
 
-      if (IS_OSPF6_DEBUG_ROUTE (INTRA))
+      if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
         {
           prefix2str (&route->prefix, buf, sizeof (buf));
           zlog_info ("  add %s", buf);
@@ -1115,7 +1115,7 @@ ospf6_intra_prefix_lsa_add (struct ospf6_lsa *lsa)
       prefix_num--;
     }
 
-  if (current != end && IS_OSPF6_DEBUG_ROUTE (INTRA))
+  if (current != end && IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
     zlog_info ("Trailing garbage ignored");
 }
 
@@ -1131,7 +1131,7 @@ ospf6_intra_prefix_lsa_remove (struct ospf6_lsa *lsa)
   char *start, *current, *end;
   char buf[64];
 
-  if (IS_OSPF6_DEBUG_ROUTE (INTRA))
+  if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
     zlog_info ("%s disappearing", lsa->name);
 
   oa = OSPF6_AREA (lsa->lsdb->data);
@@ -1176,7 +1176,7 @@ ospf6_intra_prefix_lsa_remove (struct ospf6_lsa *lsa)
               route->path.origin.adv_router != lsa->header->adv_router)
             continue;
 
-          if (IS_OSPF6_DEBUG_ROUTE (INTRA))
+          if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
             {
               prefix2str (&route->prefix, buf, sizeof (buf));
               zlog_info ("remove %s", buf);
@@ -1185,7 +1185,7 @@ ospf6_intra_prefix_lsa_remove (struct ospf6_lsa *lsa)
         }
     }
 
-  if (current != end && IS_OSPF6_DEBUG_ROUTE (INTRA))
+  if (current != end && IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
     zlog_info ("Trailing garbage ignored");
 }
 
@@ -1198,9 +1198,8 @@ ospf6_intra_route_calculation (struct ospf6_area *oa)
   void (*hook_add) (struct ospf6_route *) = NULL;
   void (*hook_remove) (struct ospf6_route *) = NULL;
 
-  if (IS_OSPF6_DEBUG_ROUTE (INTRA))
-    zlog_info ("Intra-area routing table calculation for area %s",
-               oa->name);
+  if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
+    zlog_info ("Re-examin intra-routes for area %s", oa->name);
 
   hook_add = oa->route_table->hook_add;
   hook_remove = oa->route_table->hook_remove;
@@ -1241,9 +1240,8 @@ ospf6_intra_route_calculation (struct ospf6_area *oa)
       route->flag = 0;
     }
 
-  if (IS_OSPF6_DEBUG_ROUTE (INTRA))
-    zlog_info ("Intra-area routing table calculation for area %s: Done",
-               oa->name);
+  if (IS_OSPF6_DEBUG_EXAMIN (INTRA_PREFIX))
+    zlog_info ("Re-examin intra-routes for area %s: Done", oa->name);
 }
 
 void

+ 329 - 203
ospf6d/ospf6_lsa.c

@@ -24,6 +24,8 @@
 /* Include other stuffs */
 #include "log.h"
 #include "linklist.h"
+#include "vector.h"
+#include "vty.h"
 #include "command.h"
 #include "memory.h"
 #include "thread.h"
@@ -41,27 +43,85 @@
 #include "ospf6_flood.h"
 #include "ospf6d.h"
 
-unsigned char conf_debug_ospf6_lsa = 0;
+vector ospf6_lsa_handler_vector;
 
-struct ospf6_lsa_handler *ospf6_lsa_handler[OSPF6_LSTYPE_SIZE];
+int
+ospf6_unknown_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
+{
+  u_char *start, *end, *current;
+  char byte[4];
+
+  start = (char *) lsa->header + sizeof (struct ospf6_lsa_header);
+  end = (char *) lsa->header + ntohs (lsa->header->length);
+
+  vty_out (vty, "        Unknown contents:%s", VNL);
+  for (current = start; current < end; current ++)
+    {
+      if ((current - start) % 16 == 0)
+        vty_out (vty, "%s        ", VNL);
+      else if ((current - start) % 4 == 0)
+        vty_out (vty, " ");
 
-char *ospf6_lstype_str[OSPF6_LSTYPE_SIZE] =
-  {"Unknown", "Router", "Network", "Inter-Prefix", "Inter-Router",
-   "AS-External", "Group-Membership", "Type-7", "Link", "Intra-Prefix"};
+      snprintf (byte, sizeof (byte), "%02x", *current);
+      vty_out (vty, "%s", byte);
+    }
+
+  vty_out (vty, "%s%s", VNL, VNL);
+  return 0;
+}
+
+struct ospf6_lsa_handler unknown_handler =
+{
+  OSPF6_LSTYPE_UNKNOWN,
+  "Unknown",
+  ospf6_unknown_lsa_show,
+  OSPF6_LSA_DEBUG,
+};
+
+void
+ospf6_install_lsa_handler (struct ospf6_lsa_handler *handler)
+{
+  /* type in handler is host byte order */
+  int index = handler->type & OSPF6_LSTYPE_FCODE_MASK;
+  vector_set_index (ospf6_lsa_handler_vector, index, handler);
+}
+
+struct ospf6_lsa_handler *
+ospf6_get_lsa_handler (u_int16_t type)
+{
+  struct ospf6_lsa_handler *handler = NULL;
+  int index = ntohs (type) & OSPF6_LSTYPE_FCODE_MASK;
+
+  if (index >= vector_max (ospf6_lsa_handler_vector))
+    handler = &unknown_handler;
+  else
+    handler = vector_slot (ospf6_lsa_handler_vector, index);
+
+  return handler;
+}
 
 char *
 ospf6_lstype_name (u_int16_t type)
 {
   static char buf[8];
-  int index = OSPF6_LSTYPE_INDEX (type);
+  struct ospf6_lsa_handler *handler;
 
-  if (ospf6_lsa_handler[index])
-    return ospf6_lsa_handler[index]->name;
+  handler = ospf6_get_lsa_handler (type);
+  if (handler && handler != &unknown_handler)
+    return handler->name;
 
   snprintf (buf, sizeof (buf), "0x%04hx", ntohs (type));
   return buf;
 }
 
+u_char
+ospf6_lstype_debug (u_int16_t type)
+{
+  struct ospf6_lsa_handler *handler;
+  handler = ospf6_get_lsa_handler (type);
+  return handler->debug;
+}
+
 /* RFC2328: Section 13.2 */
 int
 ospf6_lsa_is_differ (struct ospf6_lsa *lsa1,
@@ -170,7 +230,7 @@ void
 ospf6_lsa_premature_aging (struct ospf6_lsa *lsa)
 {
   /* log */
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type))
     zlog_info ("LSA: Premature aging: %s", lsa->name);
 
   THREAD_OFF (lsa->expire);
@@ -241,7 +301,7 @@ ospf6_lsa_printbuf (struct ospf6_lsa *lsa, char *buf, int size)
   inet_ntop (AF_INET, &lsa->header->adv_router, adv_router,
              sizeof (adv_router));
   snprintf (buf, size, "[%s Id:%s Adv:%s]",
-            OSPF6_LSTYPE_NAME (lsa->header->type), id, adv_router);
+            ospf6_lstype_name (lsa->header->type), id, adv_router);
   return buf;
 }
 
@@ -253,7 +313,7 @@ ospf6_lsa_header_print_raw (struct ospf6_lsa_header *header)
   inet_ntop (AF_INET, &header->adv_router, adv_router,
              sizeof (adv_router));
   zlog_info ("    [%s Id:%s Adv:%s]",
-             OSPF6_LSTYPE_NAME (header->type), id, adv_router);
+             ospf6_lstype_name (header->type), id, adv_router);
   zlog_info ("    Age: %4hu SeqNum: %#08lx Cksum: %04hx Len: %d",
              ntohs (header->age), (u_long) ntohl (header->seqnum),
              ntohs (header->checksum), ntohs (header->length));
@@ -293,7 +353,7 @@ ospf6_lsa_show_summary (struct vty *vty, struct ospf6_lsa *lsa)
   timerstring (&res, duration, sizeof (duration));
 
   vty_out (vty, "%-12s %-15s %-15s %4hu %8lx %04hx %4hu %8s%s",
-           OSPF6_LSTYPE_NAME (lsa->header->type),
+           ospf6_lstype_name (lsa->header->type),
            id, adv_router, ospf6_lsa_age_current (lsa),
            (u_long) ntohl (lsa->header->seqnum),
            ntohs (lsa->header->checksum), ntohs (lsa->header->length),
@@ -340,7 +400,7 @@ ospf6_lsa_show_internal (struct vty *vty, struct ospf6_lsa *lsa)
 
   vty_out (vty, "%s", VNL);
   vty_out (vty, "Age: %4hu Type: %s%s", ospf6_lsa_age_current (lsa),
-           OSPF6_LSTYPE_NAME (lsa->header->type), VNL);
+           ospf6_lstype_name (lsa->header->type), VNL);
   vty_out (vty, "Link State ID: %s%s", id, VNL);
   vty_out (vty, "Advertising Router: %s%s", adv_router, VNL);
   vty_out (vty, "LS Sequence Number: %#010lx%s",
@@ -358,7 +418,7 @@ void
 ospf6_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
 {
   char adv_router[64], id[64];
-  int index;
+  struct ospf6_lsa_handler *handler;
 
   assert (lsa && lsa->header);
 
@@ -367,7 +427,7 @@ ospf6_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
              adv_router, sizeof (adv_router));
 
   vty_out (vty, "Age: %4hu Type: %s%s", ospf6_lsa_age_current (lsa),
-           OSPF6_LSTYPE_NAME (lsa->header->type), VNL);
+           ospf6_lstype_name (lsa->header->type), VNL);
   vty_out (vty, "Link State ID: %s%s", id, VNL);
   vty_out (vty, "Advertising Router: %s%s", adv_router, VNL);
   vty_out (vty, "LS Sequence Number: %#010lx%s",
@@ -376,14 +436,10 @@ ospf6_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
            ntohs (lsa->header->checksum),
            ntohs (lsa->header->length), VNL);
 
-  index = OSPF6_LSTYPE_INDEX (lsa->header->type);
-  if (ospf6_lsa_handler[index]->show)
-    (*ospf6_lsa_handler[index]->show) (vty, lsa);
-  else
-    {
-      ospf6_lsa_show_dump (vty, lsa);
-      vty_out (vty, "%sUnknown LSA type ...%s", VNL, VNL);
-    }
+  handler = ospf6_get_lsa_handler (lsa->header->type);
+  if (handler->show == NULL)
+    handler = &unknown_handler;
+  (*handler->show) (vty, lsa);
 
   vty_out (vty, "%s", VNL);
 }
@@ -420,10 +476,6 @@ ospf6_lsa_create (struct ospf6_lsa_header *header)
   /* calculate birth of this lsa */
   ospf6_lsa_age_set (lsa);
 
-  if (IS_OSPF6_DEBUG_LSA (MEMORY))
-    zlog_info ("Create LSA Memory: %s (%p/%p)",
-               lsa->name, lsa, lsa->header);
-
   return lsa;
 }
 
@@ -455,10 +507,6 @@ ospf6_lsa_create_headeronly (struct ospf6_lsa_header *header)
   /* calculate birth of this lsa */
   ospf6_lsa_age_set (lsa);
 
-  if (IS_OSPF6_DEBUG_LSA (MEMORY))
-    zlog_info ("Create LSA (Header-only) Memory: %s (%p/%p)",
-               lsa->name, lsa, lsa->header);
-
   return lsa;
 }
 
@@ -471,11 +519,6 @@ ospf6_lsa_delete (struct ospf6_lsa *lsa)
   THREAD_OFF (lsa->expire);
   THREAD_OFF (lsa->refresh);
 
-  if (IS_OSPF6_DEBUG_LSA (MEMORY))
-    zlog_info ("Delete LSA %s Memory: %s (%p/%p)",
-               (CHECK_FLAG (lsa->flag, OSPF6_LSA_HEADERONLY) ?
-                "(Header-only) " : ""), lsa->name, lsa, lsa->header);
-
   /* do free */
   XFREE (MTYPE_OSPF6_LSA, lsa->header);
   XFREE (MTYPE_OSPF6_LSA, lsa);
@@ -486,9 +529,6 @@ ospf6_lsa_copy (struct ospf6_lsa *lsa)
 {
   struct ospf6_lsa *copy = NULL;
 
-  if (IS_OSPF6_DEBUG_LSA (MEMORY))
-    zlog_info ("Create LSA Copy from %s", lsa->name);
-
   ospf6_lsa_age_current (lsa);
   if (CHECK_FLAG (lsa->flag, OSPF6_LSA_HEADERONLY))
     copy = ospf6_lsa_create_headeronly (lsa->header);
@@ -542,7 +582,7 @@ ospf6_lsa_expire (struct thread *thread)
 
   lsa->expire = (struct thread *) NULL;
 
-  if (IS_OSPF6_DEBUG_LSA (TIMER))
+  if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type))
     {
       zlog_info ("LSA Expire:");
       ospf6_lsa_header_print (lsa);
@@ -555,8 +595,6 @@ ospf6_lsa_expire (struct thread *thread)
   ospf6_flood (NULL, lsa);
 
   /* reinstall lsa */
-  if (IS_OSPF6_DEBUG_LSA (DATABASE))
-    zlog_info ("Reinstall MaxAge %s", lsa->name);
   ospf6_install_lsa (lsa);
 
   /* schedule maxage remover */
@@ -582,7 +620,7 @@ ospf6_lsa_refresh (struct thread *thread)
                             old->header->adv_router, lsdb_self);
   if (self == NULL)
     {
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+      if (IS_OSPF6_DEBUG_LSA_TYPE (old->header->type))
         zlog_info ("Refresh: could not find self LSA, flush %s", old->name);
       ospf6_lsa_premature_aging (old);
       return 0;
@@ -603,7 +641,7 @@ ospf6_lsa_refresh (struct thread *thread)
   /* store it in the LSDB for self-originated LSAs */
   ospf6_lsdb_add (ospf6_lsa_copy (new), lsdb_self);
 
-  if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
+  if (IS_OSPF6_DEBUG_LSA_TYPE (new->header->type))
     {
       zlog_info ("LSA Refresh:");
       ospf6_lsa_header_print (new);
@@ -661,211 +699,299 @@ ospf6_lsa_checksum (struct ospf6_lsa_header *lsa_header)
   return (lsa_header->checksum);
 }
 
-int
-ospf6_unknown_lsa_show (struct vty *vty, struct ospf6_lsa *lsa)
-{
-  u_char *start, *end, *current;
-  char byte[4];
-
-  start = (char *) lsa->header + sizeof (struct ospf6_lsa_header);
-  end = (char *) lsa->header + ntohs (lsa->header->length);
-
-  vty_out (vty, "        Unknown contents:%s", VNL);
-  for (current = start; current < end; current ++)
-    {
-      if ((current - start) % 16 == 0)
-        vty_out (vty, "%s        ", VNL);
-      else if ((current - start) % 4 == 0)
-        vty_out (vty, " ");
-
-      snprintf (byte, sizeof (byte), "%02x", *current);
-      vty_out (vty, "%s", byte);
-    }
-
-  vty_out (vty, "%s%s", VNL, VNL);
-  return 0;
-}
-
-void
-ospf6_install_lsa_handler (struct ospf6_lsa_handler *handler)
-{
-  /* might need to adjust dynamic array length ... */
-  int index = OSPF6_LSTYPE_INDEX (htons (handler->type));
-  ospf6_lsa_handler[index] = handler;
-}
-
-struct ospf6_lsa_handler unknown_handler =
-{
-  OSPF6_LSTYPE_UNKNOWN,
-  "Unknown",
-  ospf6_unknown_lsa_show
-};
-
 void
 ospf6_lsa_init ()
 {
-  memset (ospf6_lsa_handler, 0, sizeof (ospf6_lsa_handler));
+  ospf6_lsa_handler_vector = vector_init (0);
   ospf6_install_lsa_handler (&unknown_handler);
 }
 
 
+char *
+ospf6_lsa_handler_name (struct ospf6_lsa_handler *h)
+{
+  static char buf[64];
+  int i, size = strlen (h->name);
+
+  if (h->name == "Unknown" &&
+      h->type != OSPF6_LSTYPE_UNKNOWN)
+    {
+      snprintf (buf, sizeof (buf), "%#04hx", h->type);
+      return buf;
+    }
+
+  for (i = 0; i < MIN (size, sizeof (buf)); i++)
+    {
+      if (! islower (h->name[i]))
+        buf[i] = tolower (h->name[i]);
+      else
+        buf[i] = h->name[i];
+    }
+  buf[size] = '\0';
+  return buf;
+}
 
-DEFUN (debug_ospf6_lsa_sendrecv,
-       debug_ospf6_lsa_sendrecv_cmd,
-       "debug ospf6 lsa (send|recv|originate|timer|database|memory|all)",
+DEFUN (debug_ospf6_lsa_type,
+       debug_ospf6_lsa_hex_cmd,
+       "debug ospf6 lsa XXXX/0xXXXX",
        DEBUG_STR
        OSPF6_STR
        "Debug Link State Advertisements (LSAs)\n"
-       "Debug Sending LSAs\n"
-       "Debug Receiving LSAs\n"
-       "Debug Originating LSAs\n"
-       "Debug Timer Event of LSAs\n"
-       "Debug LSA Database\n"
-       "Debug Memory of LSAs\n"
-       "Debug LSAs all\n"
+       "Specify LS type as Hexadecimal\n"
       )
 {
-  unsigned char level = 0;
+  int i;
+  struct ospf6_lsa_handler *handler = NULL;
+  unsigned long val;
+  char *endptr = NULL;
+  u_int16_t type = 0;
+
+  assert (argc);
 
-  if (argc)
+  if ((strlen (argv[0]) == 6 && ! strncmp (argv[0], "0x", 2)) ||
+      (strlen (argv[0]) == 4))
     {
-      if (! strncmp (argv[0], "s", 1))
-        level = OSPF6_DEBUG_LSA_SEND;
-      else if (! strncmp (argv[0], "r", 1))
-        level = OSPF6_DEBUG_LSA_RECV;
-      else if (! strncmp (argv[0], "o", 1))
-        level = OSPF6_DEBUG_LSA_ORIGINATE;
-      else if (! strncmp (argv[0], "t", 1))
-        level = OSPF6_DEBUG_LSA_TIMER;
-      else if (! strncmp (argv[0], "d", 1))
-        level = OSPF6_DEBUG_LSA_DATABASE;
-      else if (! strncmp (argv[0], "m", 1))
-        level = OSPF6_DEBUG_LSA_MEMORY;
-      else if (! strncmp (argv[0], "a", 1))
-        {
-          level = OSPF6_DEBUG_LSA_SEND | OSPF6_DEBUG_LSA_RECV |
-                  OSPF6_DEBUG_LSA_ORIGINATE | OSPF6_DEBUG_LSA_TIMER |
-                  OSPF6_DEBUG_LSA_DATABASE | OSPF6_DEBUG_LSA_MEMORY;
-        }
+      val = strtoul (argv[0], &endptr, 16);
+      if (*endptr == '\0')
+        type = val;
     }
-  else
+
+  for (i = 0; i < vector_max (ospf6_lsa_handler_vector); i++)
     {
-      level = OSPF6_DEBUG_LSA_SEND | OSPF6_DEBUG_LSA_RECV |
-              OSPF6_DEBUG_LSA_ORIGINATE | OSPF6_DEBUG_LSA_TIMER;
+      handler = vector_slot (ospf6_lsa_handler_vector, i);
+      if (handler == NULL)
+        continue;
+      if (type && handler->type == type)
+        break;
+      if (! strcasecmp (argv[0], handler->name))
+        break;
+      handler = NULL;
     }
 
-  OSPF6_DEBUG_LSA_ON (level);
+  if (type && handler == NULL)
+    {
+      handler = (struct ospf6_lsa_handler *)
+        malloc (sizeof (struct ospf6_lsa_handler));
+      memset (handler, 0, sizeof (struct ospf6_lsa_handler));
+      handler->type = type;
+      handler->name = "Unknown";
+      handler->show = ospf6_unknown_lsa_show;
+      vector_set_index (ospf6_lsa_handler_vector,
+                        handler->type & OSPF6_LSTYPE_FCODE_MASK, handler);
+    }
+
+  if (handler == NULL)
+    handler = &unknown_handler;
+
+  if (argc >= 2)
+    {
+      if (! strcmp (argv[1], "originate"))
+        SET_FLAG (handler->debug, OSPF6_LSA_DEBUG_ORIGINATE);
+      if (! strcmp (argv[1], "examin"))
+        SET_FLAG (handler->debug, OSPF6_LSA_DEBUG_EXAMIN);
+      if (! strcmp (argv[1], "flooding"))
+        SET_FLAG (handler->debug, OSPF6_LSA_DEBUG_FLOOD);
+    }
+  else
+    SET_FLAG (handler->debug, OSPF6_LSA_DEBUG);
+
   return CMD_SUCCESS;
 }
 
-ALIAS (debug_ospf6_lsa_sendrecv,
-       debug_ospf6_lsa_cmd,
-       "debug ospf6 lsa",
-       NO_STR
-       DEBUG_STR
-       OSPF6_STR
-       "Debug Link State Advertisements (LSAs)\n"
-      );
-
-DEFUN (no_debug_ospf6_lsa_sendrecv,
-       no_debug_ospf6_lsa_sendrecv_cmd,
-       "no debug ospf6 lsa (send|recv|originate|timer|database|memory|all)",
+DEFUN (no_debug_ospf6_lsa_type,
+       no_debug_ospf6_lsa_hex_cmd,
+       "no debug ospf6 lsa XXXX/0xXXXX",
        NO_STR
        DEBUG_STR
        OSPF6_STR
        "Debug Link State Advertisements (LSAs)\n"
-       "Debug Sending LSAs\n"
-       "Debug Receiving LSAs\n"
-       "Debug Originating LSAs\n"
-       "Debug Timer Event of LSAs\n"
-       "Debug LSA Database\n"
-       "Debug Memory of LSAs\n"
-       "Debug LSAs all\n"
+       "Specify LS type as Hexadecimal\n"
       )
 {
-  unsigned char level = 0;
+  int i;
+  struct ospf6_lsa_handler *handler = NULL;
+  unsigned long val;
+  char *endptr = NULL;
+  u_int16_t type = 0;
 
-  if (argc)
+  assert (argc);
+
+  if ((strlen (argv[0]) == 6 && ! strncmp (argv[0], "0x", 2)) ||
+      (strlen (argv[0]) == 4))
     {
-      if (! strncmp (argv[0], "s", 1))
-        level = OSPF6_DEBUG_LSA_SEND;
-      else if (! strncmp (argv[0], "r", 1))
-        level = OSPF6_DEBUG_LSA_RECV;
-      else if (! strncmp (argv[0], "o", 1))
-        level = OSPF6_DEBUG_LSA_ORIGINATE;
-      else if (! strncmp (argv[0], "t", 1))
-        level = OSPF6_DEBUG_LSA_TIMER;
-      else if (! strncmp (argv[0], "d", 1))
-        level = OSPF6_DEBUG_LSA_DATABASE;
-      else if (! strncmp (argv[0], "m", 1))
-        level = OSPF6_DEBUG_LSA_MEMORY;
-      else if (! strncmp (argv[0], "a", 1))
-        {
-          level = OSPF6_DEBUG_LSA_SEND | OSPF6_DEBUG_LSA_RECV |
-                  OSPF6_DEBUG_LSA_ORIGINATE | OSPF6_DEBUG_LSA_TIMER |
-                  OSPF6_DEBUG_LSA_DATABASE | OSPF6_DEBUG_LSA_MEMORY;
-        }
+      val = strtoul (argv[0], &endptr, 16);
+      if (*endptr == '\0')
+        type = val;
+    }
+
+  for (i = 0; i < vector_max (ospf6_lsa_handler_vector); i++)
+    {
+      handler = vector_slot (ospf6_lsa_handler_vector, i);
+      if (handler == NULL)
+        continue;
+      if (type && handler->type == type)
+        break;
+      if (! strcasecmp (argv[0], handler->name))
+        break;
+    }
+
+  if (handler == NULL)
+    return CMD_SUCCESS;
+
+  if (argc >= 2)
+    {
+      if (! strcmp (argv[1], "originate"))
+        UNSET_FLAG (handler->debug, OSPF6_LSA_DEBUG_ORIGINATE);
+      if (! strcmp (argv[1], "examin"))
+        UNSET_FLAG (handler->debug, OSPF6_LSA_DEBUG_EXAMIN);
+      if (! strcmp (argv[1], "flooding"))
+        UNSET_FLAG (handler->debug, OSPF6_LSA_DEBUG_FLOOD);
     }
   else
+    UNSET_FLAG (handler->debug, OSPF6_LSA_DEBUG);
+
+  if (handler->debug == 0 &&
+      handler->name == "Unknown" && type != OSPF6_LSTYPE_UNKNOWN)
     {
-      level = OSPF6_DEBUG_LSA_SEND | OSPF6_DEBUG_LSA_RECV |
-              OSPF6_DEBUG_LSA_ORIGINATE | OSPF6_DEBUG_LSA_TIMER;
+      free (handler);
+      vector_slot (ospf6_lsa_handler_vector, i) = NULL;
     }
 
-  OSPF6_DEBUG_LSA_OFF (level);
   return CMD_SUCCESS;
 }
 
-ALIAS (no_debug_ospf6_lsa_sendrecv,
-       no_debug_ospf6_lsa_cmd,
-       "no debug ospf6 lsa",
-       NO_STR
-       DEBUG_STR
-       OSPF6_STR
-       "Debug Link State Advertisements (LSAs)\n"
-      );
+struct cmd_element debug_ospf6_lsa_type_cmd;
+struct cmd_element debug_ospf6_lsa_type_detail_cmd;
+struct cmd_element no_debug_ospf6_lsa_type_cmd;
+struct cmd_element no_debug_ospf6_lsa_type_detail_cmd;
 
-int
-config_write_ospf6_debug_lsa (struct vty *vty)
+void
+install_element_ospf6_debug_lsa ()
 {
-  if (conf_debug_ospf6_lsa == OSPF6_DEBUG_LSA_ALL)
-    vty_out (vty, "debug ospf6 lsa all%s", VNL);
-  else
+  int i;
+  struct ospf6_lsa_handler *handler;
+#define STRSIZE  256
+#define DOCSIZE  1024
+  static char strbuf[STRSIZE];
+  static char docbuf[DOCSIZE];
+  static char detail_strbuf[STRSIZE];
+  static char detail_docbuf[DOCSIZE];
+  char *str, *no_str;
+  char *doc, *no_doc;
+
+  strbuf[0] = '\0';
+  no_str = &strbuf[strlen (strbuf)];
+  strncat (strbuf, "no ", STRSIZE - strlen (strbuf));
+  str = &strbuf[strlen (strbuf)];
+
+  strncat (strbuf, "debug ospf6 lsa (", STRSIZE - strlen (strbuf));
+  for (i = 0; i < vector_max (ospf6_lsa_handler_vector); i++)
     {
-      if (conf_debug_ospf6_lsa == OSPF6_DEBUG_LSA_DEFAULT)
-        vty_out (vty, "debug ospf6 lsa%s", VNL);
-      else
-        {
-          if (IS_OSPF6_DEBUG_LSA (SEND))
-            vty_out (vty, "debug ospf6 lsa send%s", VNL);
-          if (IS_OSPF6_DEBUG_LSA (RECV))
-            vty_out (vty, "debug ospf6 lsa recv%s", VNL);
-          if (IS_OSPF6_DEBUG_LSA (ORIGINATE))
-            vty_out (vty, "debug ospf6 lsa originate%s", VNL);
-          if (IS_OSPF6_DEBUG_LSA (TIMER))
-            vty_out (vty, "debug ospf6 lsa timer%s", VNL);
-        }
-
-      if (IS_OSPF6_DEBUG_LSA (DATABASE))
-        vty_out (vty, "debug ospf6 lsa database%s", VNL);
-      if (IS_OSPF6_DEBUG_LSA (MEMORY))
-        vty_out (vty, "debug ospf6 lsa memory%s", VNL);
+      handler = vector_slot (ospf6_lsa_handler_vector, i);
+      if (handler == NULL)
+        continue;
+      strncat (strbuf, ospf6_lsa_handler_name (handler),
+               STRSIZE - strlen (strbuf));
+      strncat (strbuf, "|", STRSIZE - strlen (strbuf));
     }
+  strbuf[strlen (strbuf) - 1] = ')';
+  strbuf[strlen (strbuf)] = '\0';
 
-  return 0;
+  docbuf[0] = '\0';
+  no_doc = &docbuf[strlen (docbuf)];
+  strncat (docbuf, NO_STR, DOCSIZE - strlen (docbuf));
+  doc = &docbuf[strlen (docbuf)];
+
+  strncat (docbuf, DEBUG_STR, DOCSIZE - strlen (docbuf));
+  strncat (docbuf, OSPF6_STR, DOCSIZE - strlen (docbuf));
+  strncat (docbuf, "Debug Link State Advertisements (LSAs)\n",
+           DOCSIZE - strlen (docbuf));
+
+  for (i = 0; i < vector_max (ospf6_lsa_handler_vector); i++)
+    {
+      handler = vector_slot (ospf6_lsa_handler_vector, i);
+      if (handler == NULL)
+        continue;
+      strncat (docbuf, "Debug ", DOCSIZE - strlen (docbuf));
+      strncat (docbuf, handler->name, DOCSIZE - strlen (docbuf));
+      strncat (docbuf, "-LSA\n", DOCSIZE - strlen (docbuf));
+    }
+  docbuf[strlen (docbuf)] = '\0';
+
+  debug_ospf6_lsa_type_cmd.string = str;
+  debug_ospf6_lsa_type_cmd.func = debug_ospf6_lsa_type;
+  debug_ospf6_lsa_type_cmd.doc = doc;
+
+  no_debug_ospf6_lsa_type_cmd.string = no_str;
+  no_debug_ospf6_lsa_type_cmd.func = no_debug_ospf6_lsa_type;
+  no_debug_ospf6_lsa_type_cmd.doc = no_doc;
+
+  strncpy (detail_strbuf, strbuf, STRSIZE);
+  strncat (detail_strbuf, " (originate|examin|flooding)",
+           STRSIZE - strlen (detail_strbuf));
+  detail_strbuf[strlen (detail_strbuf)] = '\0';
+  no_str = &detail_strbuf[0];
+  str = &detail_strbuf[strlen ("no ")];
+
+  strncpy (detail_docbuf, docbuf, DOCSIZE);
+  strncat (detail_docbuf, "Debug Originating LSA\n",
+           DOCSIZE - strlen (detail_docbuf));
+  strncat (detail_docbuf, "Debug Examining LSA\n",
+           DOCSIZE - strlen (detail_docbuf));
+  strncat (detail_docbuf, "Debug Flooding LSA\n",
+           DOCSIZE - strlen (detail_docbuf));
+  detail_docbuf[strlen (detail_docbuf)] = '\0';
+  no_doc = &detail_docbuf[0];
+  doc = &detail_docbuf[strlen (NO_STR)];
+
+  debug_ospf6_lsa_type_detail_cmd.string = str;
+  debug_ospf6_lsa_type_detail_cmd.func = debug_ospf6_lsa_type;
+  debug_ospf6_lsa_type_detail_cmd.doc = doc;
+
+  no_debug_ospf6_lsa_type_detail_cmd.string = no_str;
+  no_debug_ospf6_lsa_type_detail_cmd.func = no_debug_ospf6_lsa_type;
+  no_debug_ospf6_lsa_type_detail_cmd.doc = no_doc;
+
+  install_element (ENABLE_NODE, &debug_ospf6_lsa_hex_cmd);
+  install_element (ENABLE_NODE, &debug_ospf6_lsa_type_cmd);
+  install_element (ENABLE_NODE, &debug_ospf6_lsa_type_detail_cmd);
+  install_element (ENABLE_NODE, &no_debug_ospf6_lsa_hex_cmd);
+  install_element (ENABLE_NODE, &no_debug_ospf6_lsa_type_cmd);
+  install_element (ENABLE_NODE, &no_debug_ospf6_lsa_type_detail_cmd);
+  install_element (CONFIG_NODE, &debug_ospf6_lsa_hex_cmd);
+  install_element (CONFIG_NODE, &debug_ospf6_lsa_type_cmd);
+  install_element (CONFIG_NODE, &debug_ospf6_lsa_type_detail_cmd);
+  install_element (CONFIG_NODE, &no_debug_ospf6_lsa_hex_cmd);
+  install_element (CONFIG_NODE, &no_debug_ospf6_lsa_type_cmd);
+  install_element (CONFIG_NODE, &no_debug_ospf6_lsa_type_detail_cmd);
 }
 
-void
-install_element_ospf6_debug_lsa ()
+int
+config_write_ospf6_debug_lsa (struct vty *vty)
 {
-  install_element (ENABLE_NODE, &debug_ospf6_lsa_cmd);
-  install_element (ENABLE_NODE, &debug_ospf6_lsa_sendrecv_cmd);
-  install_element (ENABLE_NODE, &no_debug_ospf6_lsa_cmd);
-  install_element (ENABLE_NODE, &no_debug_ospf6_lsa_sendrecv_cmd);
-  install_element (CONFIG_NODE, &debug_ospf6_lsa_cmd);
-  install_element (CONFIG_NODE, &debug_ospf6_lsa_sendrecv_cmd);
-  install_element (CONFIG_NODE, &no_debug_ospf6_lsa_cmd);
-  install_element (CONFIG_NODE, &no_debug_ospf6_lsa_sendrecv_cmd);
+  int i;
+  struct ospf6_lsa_handler *handler;
+
+  for (i = 0; i < vector_max (ospf6_lsa_handler_vector); i++)
+    {
+      handler = vector_slot (ospf6_lsa_handler_vector, i);
+      if (handler == NULL)
+        continue;
+      if (CHECK_FLAG (handler->debug, OSPF6_LSA_DEBUG))
+        vty_out (vty, "debug ospf6 lsa %s%s",
+                 ospf6_lsa_handler_name (handler), VNL);
+      if (CHECK_FLAG (handler->debug, OSPF6_LSA_DEBUG_ORIGINATE))
+        vty_out (vty, "debug ospf6 lsa %s originate%s",
+                 ospf6_lsa_handler_name (handler), VNL);
+      if (CHECK_FLAG (handler->debug, OSPF6_LSA_DEBUG_EXAMIN))
+        vty_out (vty, "debug ospf6 lsa %s examin%s",
+                 ospf6_lsa_handler_name (handler), VNL);
+      if (CHECK_FLAG (handler->debug, OSPF6_LSA_DEBUG_FLOOD))
+        vty_out (vty, "debug ospf6 lsa %s flooding%s",
+                 ospf6_lsa_handler_name (handler), VNL);
+    }
+
+  return 0;
 }
 
 

+ 37 - 33
ospf6d/ospf6_lsa.h

@@ -23,21 +23,28 @@
 #define OSPF6_LSA_H
 
 /* Debug option */
-extern unsigned char conf_debug_ospf6_lsa;
-#define OSPF6_DEBUG_LSA_SEND      0x01
-#define OSPF6_DEBUG_LSA_RECV      0x02
-#define OSPF6_DEBUG_LSA_ORIGINATE 0x04
-#define OSPF6_DEBUG_LSA_TIMER     0x08
-#define OSPF6_DEBUG_LSA_DATABASE  0x10
-#define OSPF6_DEBUG_LSA_MEMORY    0x80
-#define OSPF6_DEBUG_LSA_ALL       0x9f
-#define OSPF6_DEBUG_LSA_DEFAULT   0x0f
-#define OSPF6_DEBUG_LSA_ON(level) \
-  (conf_debug_ospf6_lsa |= (level))
-#define OSPF6_DEBUG_LSA_OFF(level) \
-  (conf_debug_ospf6_lsa &= ~(level))
-#define IS_OSPF6_DEBUG_LSA(e) \
-  (conf_debug_ospf6_lsa & OSPF6_DEBUG_LSA_ ## e)
+#define OSPF6_LSA_DEBUG           0x01
+#define OSPF6_LSA_DEBUG_ORIGINATE 0x02
+#define OSPF6_LSA_DEBUG_EXAMIN    0x04
+#define OSPF6_LSA_DEBUG_FLOOD     0x08
+
+#define IS_OSPF6_DEBUG_LSA(name)                        \
+  (ospf6_lstype_debug (htons (OSPF6_LSTYPE_ ## name)) & \
+   OSPF6_LSA_DEBUG)
+#define IS_OSPF6_DEBUG_ORIGINATE(name)                  \
+  (ospf6_lstype_debug (htons (OSPF6_LSTYPE_ ## name)) & \
+   OSPF6_LSA_DEBUG_ORIGINATE)
+#define IS_OSPF6_DEBUG_EXAMIN(name)                     \
+  (ospf6_lstype_debug (htons (OSPF6_LSTYPE_ ## name)) & \
+   OSPF6_LSA_DEBUG_EXAMIN)
+#define IS_OSPF6_DEBUG_LSA_TYPE(type) \
+  (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG)
+#define IS_OSPF6_DEBUG_ORIGINATE_TYPE(type) \
+  (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG_ORIGINATE)
+#define IS_OSPF6_DEBUG_EXAMIN_TYPE(type) \
+  (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG_EXAMIN)
+#define IS_OSPF6_DEBUG_FLOOD_TYPE(type) \
+  (ospf6_lstype_debug (type) & OSPF6_LSA_DEBUG_FLOOD)
 
 /* LSA definition */
 
@@ -135,65 +142,60 @@ struct ospf6_lsa
 
 struct ospf6_lsa_handler
 {
-  u_int16_t type; /* network byte order */
+  u_int16_t type; /* host byte order */
   char *name;
   int (*show) (struct vty *, struct ospf6_lsa *);
+  u_char debug;
 };
 
-#define OSPF6_LSTYPE_INDEX(type) \
-  ((ntohs (type) & OSPF6_LSTYPE_FCODE_MASK) < OSPF6_LSTYPE_SIZE ? \
-   (ntohs (type) & OSPF6_LSTYPE_FCODE_MASK) : OSPF6_LSTYPE_UNKNOWN)
-#define OSPF6_LSTYPE_NAME(type) (ospf6_lstype_name (type))
-
 /* Macro for LSA Origination */
-/* void (CONTINUE_IF_...) (struct prefix *addr); */
-
-#define CONTINUE_IF_ADDRESS_LINKLOCAL(addr)\
+/* addr is (struct prefix *) */
+#define CONTINUE_IF_ADDRESS_LINKLOCAL(debug,addr)      \
   if (IN6_IS_ADDR_LINKLOCAL (&(addr)->u.prefix6))      \
     {                                                  \
       char buf[64];                                    \
       prefix2str (addr, buf, sizeof (buf));            \
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))              \
+      if (debug)                                       \
         zlog_info ("Filter out Linklocal: %s", buf);   \
       continue;                                        \
     }
 
-#define CONTINUE_IF_ADDRESS_UNSPECIFIED(addr)          \
+#define CONTINUE_IF_ADDRESS_UNSPECIFIED(debug,addr)    \
   if (IN6_IS_ADDR_UNSPECIFIED (&(addr)->u.prefix6))    \
     {                                                  \
       char buf[64];                                    \
       prefix2str (addr, buf, sizeof (buf));            \
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))              \
+      if (debug)                                       \
         zlog_info ("Filter out Unspecified: %s", buf); \
       continue;                                        \
     }
 
-#define CONTINUE_IF_ADDRESS_LOOPBACK(addr)             \
+#define CONTINUE_IF_ADDRESS_LOOPBACK(debug,addr)       \
   if (IN6_IS_ADDR_LOOPBACK (&(addr)->u.prefix6))       \
     {                                                  \
       char buf[64];                                    \
       prefix2str (addr, buf, sizeof (buf));            \
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))              \
+      if (debug)                                       \
         zlog_info ("Filter out Loopback: %s", buf);    \
       continue;                                        \
     }
 
-#define CONTINUE_IF_ADDRESS_V4COMPAT(addr)             \
+#define CONTINUE_IF_ADDRESS_V4COMPAT(debug,addr)       \
   if (IN6_IS_ADDR_V4COMPAT (&(addr)->u.prefix6))       \
     {                                                  \
       char buf[64];                                    \
       prefix2str (addr, buf, sizeof (buf));            \
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))              \
+      if (debug)                                       \
         zlog_info ("Filter out V4Compat: %s", buf);    \
       continue;                                        \
     }
 
-#define CONTINUE_IF_ADDRESS_V4MAPPED(addr)             \
+#define CONTINUE_IF_ADDRESS_V4MAPPED(debug,addr)       \
   if (IN6_IS_ADDR_V4MAPPED (&(addr)->u.prefix6))       \
     {                                                  \
       char buf[64];                                    \
       prefix2str (addr, buf, sizeof (buf));            \
-      if (IS_OSPF6_DEBUG_LSA (ORIGINATE))              \
+      if (debug)                                       \
         zlog_info ("Filter out V4Mapped: %s", buf);    \
       continue;                                        \
     }
@@ -201,6 +203,7 @@ struct ospf6_lsa_handler
 
 /* Function Prototypes */
 char *ospf6_lstype_name (u_int16_t type);
+u_char ospf6_lstype_debug (u_int16_t type);
 int ospf6_lsa_is_differ (struct ospf6_lsa *lsa1, struct ospf6_lsa *lsa2);
 int ospf6_lsa_is_changed (struct ospf6_lsa *lsa1, struct ospf6_lsa *lsa2);
 u_int16_t ospf6_lsa_age_current (struct ospf6_lsa *);
@@ -234,6 +237,7 @@ int ospf6_lsa_prohibited_duration (u_int16_t type, u_int32_t id,
 
 void ospf6_install_lsa_handler (struct ospf6_lsa_handler *handler);
 void ospf6_lsa_init ();
+void ospf6_lsa_cmd_init ();
 
 int config_write_ospf6_debug_lsa (struct vty *vty);
 void install_element_ospf6_debug_lsa ();

+ 3 - 3
ospf6d/ospf6_lsdb.h

@@ -41,10 +41,10 @@ struct ospf6_lsdb
       {                                                                  \
         if (! OSPF6_LSA_IS_MAXAGE (lsa))                                 \
           continue;                                                      \
-        if (lsa->retrans_count != 0)                                         \
+        if (lsa->retrans_count != 0)                                     \
           continue;                                                      \
-        if (IS_OSPF6_DEBUG_LSA (TIMER))                                  \
-          zlog_info (" remove maxage %s", lsa->name);                    \
+        if (IS_OSPF6_DEBUG_LSA_TYPE (lsa->header->type))                 \
+          zlog_info ("Remove MaxAge %s", lsa->name);                     \
         ospf6_lsdb_remove (lsa, lsdb);                                   \
       }                                                                  \
   } while (0)

+ 2 - 8
ospf6d/ospf6_message.c

@@ -147,7 +147,7 @@ ospf6_lsreq_print (struct ospf6_header *oh)
       inet_ntop (AF_INET, &e->adv_router, adv_router, sizeof (adv_router));
       inet_ntop (AF_INET, &e->id, id, sizeof (id));
       zlog_info ("    [%s Id:%s Adv:%s]",
-                 OSPF6_LSTYPE_NAME (e->type), id, adv_router);
+                 ospf6_lstype_name (e->type), id, adv_router);
     }
 
   if (p != OSPF6_MESSAGE_END (oh))
@@ -937,7 +937,7 @@ ospf6_lsreq_recv (struct in6_addr *src, struct in6_addr *dst,
               inet_ntop (AF_INET, &e->adv_router, adv_router,
                      sizeof (adv_router));
               zlog_info ("Can't find requested [%s Id:%s Adv:%s]",
-                         OSPF6_LSTYPE_NAME (e->type), id, adv_router);
+                         ospf6_lstype_name (e->type), id, adv_router);
             }
           thread_add_event (master, bad_lsreq, on, 0);
           return;
@@ -1752,9 +1752,6 @@ ospf6_lsupdate_send_interface (struct thread *thread)
   if (oi->lsupdate_list->count == 0)
     return 0;
 
-  if (IS_OSPF6_DEBUG_LSA (SEND))
-    zlog_info ("LSA Send to %s", oi->interface->name);
-
   memset (sendbuf, 0, iobuflen);
   oh = (struct ospf6_header *) sendbuf;
   lsupdate = (struct ospf6_lsupdate *)((caddr_t) oh +
@@ -1773,9 +1770,6 @@ ospf6_lsupdate_send_interface (struct thread *thread)
           break;
         }
 
-      if (IS_OSPF6_DEBUG_LSA (SEND))
-        ospf6_lsa_header_print (lsa);
-
       ospf6_lsa_age_update_to_send (lsa, oi->transdelay);
       memcpy (p, lsa->header, OSPF6_LSA_SIZE (lsa->header));
       p += OSPF6_LSA_SIZE (lsa->header);

+ 0 - 12
ospf6d/ospf6_neighbor.c

@@ -294,10 +294,6 @@ negotiation_done (struct thread *thread)
   for (lsa = ospf6_lsdb_head (on->ospf6_if->lsdb); lsa;
        lsa = ospf6_lsdb_next (lsa))
     {
-      if (IS_OSPF6_DEBUG_LSA (DATABASE))
-        zlog_info ("Add copy of %s to %s of %s", lsa->name,
-                   (OSPF6_LSA_IS_MAXAGE (lsa) ? "retrans_list" :
-                    "summary_list"), on->name);
       if (OSPF6_LSA_IS_MAXAGE (lsa))
         {
           ospf6_increment_retrans_count (lsa);
@@ -311,10 +307,6 @@ negotiation_done (struct thread *thread)
   for (lsa = ospf6_lsdb_head (on->ospf6_if->area->lsdb); lsa;
        lsa = ospf6_lsdb_next (lsa))
     {
-      if (IS_OSPF6_DEBUG_LSA (DATABASE))
-        zlog_info ("Add copy of %s to %s of %s", lsa->name,
-                   (OSPF6_LSA_IS_MAXAGE (lsa) ? "retrans_list" :
-                    "summary_list"), on->name);
       if (OSPF6_LSA_IS_MAXAGE (lsa))
         {
           ospf6_increment_retrans_count (lsa);
@@ -328,10 +320,6 @@ negotiation_done (struct thread *thread)
   for (lsa = ospf6_lsdb_head (on->ospf6_if->area->ospf6->lsdb); lsa;
        lsa = ospf6_lsdb_next (lsa))
     {
-      if (IS_OSPF6_DEBUG_LSA (DATABASE))
-        zlog_info ("Add copy of %s to %s of %s", lsa->name,
-                   (OSPF6_LSA_IS_MAXAGE (lsa) ? "retrans_list" :
-                    "summary_list"), on->name);
       if (OSPF6_LSA_IS_MAXAGE (lsa))
         {
           ospf6_increment_retrans_count (lsa);

+ 1 - 1
ospf6d/ospf6_route.c

@@ -720,7 +720,7 @@ ospf6_route_show_detail (struct vty *vty, struct ospf6_route *route)
   inet_ntop (AF_INET, &route->path.origin.adv_router, adv_router,
              sizeof (adv_router));
   vty_out (vty, "LS Origin: %s Id: %s Adv: %s%s",
-           OSPF6_LSTYPE_NAME (route->path.origin.type),
+           ospf6_lstype_name (route->path.origin.type),
            id, adv_router, VNL);
 
   /* Options */

+ 1 - 1
ospf6d/ospf6_spf.c

@@ -160,7 +160,7 @@ ospf6_lsdesc_lsa (caddr_t lsdesc, struct ospf6_vertex *v)
         zlog_info ("  Link to: %s", lsa->name);
       else
         zlog_info ("  Link to: [%s Id:%s Adv:%s] No LSA",
-                   OSPF6_LSTYPE_NAME (type), ibuf, abuf);
+                   ospf6_lstype_name (type), ibuf, abuf);
     }
 
   return lsa;

+ 0 - 12
ospf6d/ospf6_top.c

@@ -61,8 +61,6 @@ ospf6_top_lsdb_hook_add (struct ospf6_lsa *lsa)
         break;
 
       default:
-        if (IS_OSPF6_DEBUG_LSA (RECV))
-          zlog_info ("Unknown LSA in AS-scoped lsdb");
         break;
     }
 }
@@ -77,8 +75,6 @@ ospf6_top_lsdb_hook_remove (struct ospf6_lsa *lsa)
         break;
 
       default:
-        if (IS_OSPF6_DEBUG_LSA (RECV))
-          zlog_info ("Unknown LSA in AS-scoped lsdb");
         break;
     }
 }
@@ -216,8 +212,6 @@ ospf6_maxage_remover (struct thread *thread)
   listnode i, j, k;
 
   o->maxage_remover = (struct thread *) NULL;
-  if (IS_OSPF6_DEBUG_LSA (TIMER))
-    zlog_info ("Maxage Remover");
 
   for (i = listhead (o->area_list); i; nextnode (i))
     {
@@ -232,9 +226,6 @@ ospf6_maxage_remover (struct thread *thread)
                   on->state != OSPF6_NEIGHBOR_LOADING)
                 continue;
 
-              if (IS_OSPF6_DEBUG_LSA (TIMER))
-                zlog_info ("Maxage Remover End: %s exchange or loading",
-                           on->name);
               return 0;
             }
         }
@@ -252,9 +243,6 @@ ospf6_maxage_remover (struct thread *thread)
     }
   OSPF6_LSDB_MAXAGE_REMOVER (o->lsdb);
 
-  if (IS_OSPF6_DEBUG_LSA (TIMER))
-    zlog_info ("Maxage Remover End");
-
   return 0;
 }
 

+ 15 - 12
ospf6d/ospf6d.c

@@ -41,6 +41,7 @@
 #include "ospf6_intra.h"
 #include "ospf6_asbr.h"
 #include "ospf6_abr.h"
+#include "ospf6_flood.h"
 #include "ospf6d.h"
 
 char ospf6_daemon_version[] = OSPF6_DAEMON_VERSION;
@@ -111,6 +112,7 @@ config_write_ospf6_debug (struct vty *vty)
   config_write_ospf6_debug_route (vty);
   config_write_ospf6_debug_asbr (vty);
   config_write_ospf6_debug_abr (vty);
+  config_write_ospf6_debug_flood (vty);
   vty_out (vty, "!%s", VNL);
   return 0;
 }
@@ -1717,6 +1719,18 @@ ALIAS (show_ipv6_ospf6_border_routers,
 void
 ospf6_init ()
 {
+  ospf6_top_init ();
+  ospf6_area_init ();
+  ospf6_interface_init ();
+  ospf6_neighbor_init ();
+  ospf6_zebra_init ();
+
+  ospf6_lsa_init ();
+  ospf6_spf_init ();
+  ospf6_intra_init ();
+  ospf6_asbr_init ();
+  ospf6_abr_init ();
+
   install_node (&debug_node, config_write_ospf6_debug);
 
   install_element_ospf6_debug_message ();
@@ -1728,6 +1742,7 @@ ospf6_init ()
   install_element_ospf6_debug_route ();
   install_element_ospf6_debug_asbr ();
   install_element_ospf6_debug_abr ();
+  install_element_ospf6_debug_flood ();
 
   install_element (VIEW_NODE, &show_version_ospf6_cmd);
   install_element (ENABLE_NODE, &show_version_ospf6_cmd);
@@ -1818,18 +1833,6 @@ ospf6_init ()
   INSTALL (ENABLE, database_type_id_self_originated_cmd);
   INSTALL (ENABLE, database_type_id_self_originated_detail_cmd);
 
-  ospf6_top_init ();
-  ospf6_area_init ();
-  ospf6_interface_init ();
-  ospf6_neighbor_init ();
-  ospf6_zebra_init ();
-
-  ospf6_lsa_init ();
-  ospf6_spf_init ();
-  ospf6_intra_init ();
-  ospf6_asbr_init ();
-  ospf6_abr_init ();
-
   /* Make ospf protocol socket. */
   ospf6_serv_sock ();
   thread_add_read (master, ospf6_receive, NULL, ospf6_sock);

+ 1 - 1
ospf6d/ospf6d.h

@@ -22,7 +22,7 @@
 #ifndef OSPF6D_H
 #define OSPF6D_H
 
-#define OSPF6_DAEMON_VERSION    "0.9.7k"
+#define OSPF6_DAEMON_VERSION    "0.9.7l"
 
 /* global variables */
 extern int errno;