summaryrefslogtreecommitdiff
path: root/ospf6d
diff options
context:
space:
mode:
authorhasso <hasso>2004-09-01 21:36:14 +0000
committerhasso <hasso>2004-09-01 21:36:14 +0000
commit1e05838a4db178f25eef560d774cf63d7af6d3c4 (patch)
treef87bdb34ec1337e390b885d5344f1a40c7dbb383 /ospf6d
parent863076db0f6ef0f9090abdfd9e2388db0bf02770 (diff)
Merge svn revision 975 from Zebra repository.
Diffstat (limited to 'ospf6d')
-rw-r--r--ospf6d/ChangeLog7
-rw-r--r--ospf6d/ospf6_abr.c82
-rw-r--r--ospf6d/ospf6_area.c18
-rw-r--r--ospf6d/ospf6_asbr.c28
-rw-r--r--ospf6d/ospf6_flood.c161
-rw-r--r--ospf6d/ospf6_flood.h12
-rw-r--r--ospf6d/ospf6_interface.c28
-rw-r--r--ospf6d/ospf6_intra.c70
-rw-r--r--ospf6d/ospf6_lsa.c532
-rw-r--r--ospf6d/ospf6_lsa.h70
-rw-r--r--ospf6d/ospf6_lsdb.h6
-rw-r--r--ospf6d/ospf6_message.c10
-rw-r--r--ospf6d/ospf6_neighbor.c12
-rw-r--r--ospf6d/ospf6_route.c2
-rw-r--r--ospf6d/ospf6_spf.c2
-rw-r--r--ospf6d/ospf6_top.c12
-rw-r--r--ospf6d/ospf6d.c27
-rw-r--r--ospf6d/ospf6d.h2
18 files changed, 640 insertions, 441 deletions
diff --git a/ospf6d/ChangeLog b/ospf6d/ChangeLog
index b9181d0d..5dd2a66e 100644
--- a/ospf6d/ChangeLog
+++ b/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.
diff --git a/ospf6d/ospf6_abr.c b/ospf6d/ospf6_abr.c
index 2d4b10f9..29188abb 100644
--- a/ospf6d/ospf6_abr.c
+++ b/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))
{
diff --git a/ospf6d/ospf6_area.c b/ospf6d/ospf6_area.c
index 312d88fe..78d70a2b 100644
--- a/ospf6d/ospf6_area.c
+++ b/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;
}
}
diff --git a/ospf6d/ospf6_asbr.c b/ospf6d/ospf6_asbr.c
index 3352465c..3b161acc 100644
--- a/ospf6d/ospf6_asbr.c
+++ b/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);
diff --git a/ospf6d/ospf6_flood.c b/ospf6d/ospf6_flood.c
index ec5c1c68..e9ba52b0 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 @@ 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);
+}
+
+
+
+
diff --git a/ospf6d/ospf6_flood.h b/ospf6d/ospf6_flood.h
index e894e568..4851c141 100644
--- a/ospf6d/ospf6_flood.h
+++ b/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 */
diff --git a/ospf6d/ospf6_interface.c b/ospf6d/ospf6_interface.c
index 52986e0f..a8ea1d32 100644
--- a/ospf6d/ospf6_interface.c
+++ b/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;
}
}
diff --git a/ospf6d/ospf6_intra.c b/ospf6d/ospf6_intra.c
index 8383fd9d..d707ee72 100644
--- a/ospf6d/ospf6_intra.c
+++ b/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
diff --git a/ospf6d/ospf6_lsa.c b/ospf6d/ospf6_lsa.c
index 6c8341f7..6cc6f4de 100644
--- a/ospf6d/ospf6_lsa.c
+++ b/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;
}
diff --git a/ospf6d/ospf6_lsa.h b/ospf6d/ospf6_lsa.h
index be284498..0f81b6ad 100644
--- a/ospf6d/ospf6_lsa.h
+++ b/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 ();
diff --git a/ospf6d/ospf6_lsdb.h b/ospf6d/ospf6_lsdb.h
index a10f001c..d32f78da 100644
--- a/ospf6d/ospf6_lsdb.h
+++ b/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)
diff --git a/ospf6d/ospf6_message.c b/ospf6d/ospf6_message.c
index 276c847d..ae699b90 100644
--- a/ospf6d/ospf6_message.c
+++ b/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);
diff --git a/ospf6d/ospf6_neighbor.c b/ospf6d/ospf6_neighbor.c
index e7818abb..402ca622 100644
--- a/ospf6d/ospf6_neighbor.c
+++ b/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);
diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
index dae92226..3ca21a31 100644
--- a/ospf6d/ospf6_route.c
+++ b/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 */
diff --git a/ospf6d/ospf6_spf.c b/ospf6d/ospf6_spf.c
index 63bc10a3..6d4237a2 100644
--- a/ospf6d/ospf6_spf.c
+++ b/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;
diff --git a/ospf6d/ospf6_top.c b/ospf6d/ospf6_top.c
index 23ad09f0..5ab208b4 100644
--- a/ospf6d/ospf6_top.c
+++ b/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;
}
diff --git a/ospf6d/ospf6d.c b/ospf6d/ospf6d.c
index a67600a0..b954172d 100644
--- a/ospf6d/ospf6d.c
+++ b/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);
diff --git a/ospf6d/ospf6d.h b/ospf6d/ospf6d.h
index b08d07c9..3df9ea69 100644
--- a/ospf6d/ospf6d.h
+++ b/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;