Browse Source

Merge svn revision 981 from Zebra cvs.

hasso 16 years ago
parent
commit
4846ef64ba
9 changed files with 429 additions and 664 deletions
  1. 11 0
      ospf6d/ChangeLog
  2. 4 1
      ospf6d/ospf6_abr.c
  3. 0 440
      ospf6d/ospf6_area.c
  4. 1 1
      ospf6d/ospf6_neighbor.c
  5. 271 214
      ospf6d/ospf6_route.c
  6. 4 4
      ospf6d/ospf6_route.h
  7. 47 3
      ospf6d/ospf6_top.c
  8. 90 0
      ospf6d/ospf6d.c
  9. 1 1
      ospf6d/ospf6d.h

+ 11 - 0
ospf6d/ChangeLog

@@ -1,3 +1,14 @@
+2004-09-03  Yasuhiro Ohara  <yasu@sfc.wide.ad.jp>
+
+	* ospf6_area.c, ospf6_route.c, ospf6_top.c, ospf6d.c:
+	"show intra-route" function and "show SPF result" function is
+	changed.
+	* ospf6_neighbor.c: Changed to update stub intra-prefix origination
+	when it is not DR.
+	* ospf6_route.h: resolv conflict between best flag and
+	active-summary flag.
+	* ospf6d.h: version 0.9.7m
+
 2004-09-02  Yasuhiro Ohara  <yasu@sfc.wide.ad.jp>
 
 	* ospf6_asbr.c: E-bit check in examining AS-External-LSA

+ 4 - 1
ospf6d/ospf6_abr.c

@@ -87,7 +87,10 @@ ospf6_abr_enable_area (struct ospf6_area *area)
         {
           for (ro = ospf6_route_head (oa->range_table); ro;
                ro = ospf6_route_next (ro))
-            ospf6_abr_originate_summary_to_area (ro, area);
+            {
+              if (CHECK_FLAG (ro->flag, OSPF6_ROUTE_ACTIVE_SUMMARY))
+                ospf6_abr_originate_summary_to_area (ro, area);
+            }
         }
     }
 

+ 0 - 440
ospf6d/ospf6_area.c

@@ -428,211 +428,6 @@ ospf6_area_config_write (struct vty *vty)
     }
 }
 
-DEFUN (show_ipv6_ospf6_area_route_intra,
-       show_ipv6_ospf6_area_route_intra_cmd,
-       "show ipv6 ospf6 area A.B.C.D route intra-area",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       )
-{
-  struct ospf6_area *oa;
-  OSPF6_CMD_AREA_LOOKUP (argv[0], oa);
-  argc--;
-  argv++;
-  return ospf6_route_table_show (vty, argc, argv, oa->route_table);
-}
-
-ALIAS (show_ipv6_ospf6_area_route_intra,
-       show_ipv6_ospf6_area_route_intra_detail_cmd,
-       "show ipv6 ospf6 area A.B.C.D route intra-area (X::X|X::X/M|detail)",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       "Specify IPv6 address\n"
-       "Specify IPv6 prefix\n"
-       "Detailed information\n"
-       );
-
-DEFUN (show_ipv6_ospf6_area_route_intra_match,
-       show_ipv6_ospf6_area_route_intra_match_cmd,
-       "show ipv6 ospf6 area A.B.C.D route intra-area X::X/M match",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       "Specify IPv6 prefix\n"
-       "Display routes which match the specified route\n"
-       )
-{
-  char *sargv[CMD_ARGC_MAX];
-  int i, sargc;
-  struct ospf6_area *oa;
-
-  OSPF6_CMD_AREA_LOOKUP (argv[0], oa);
-  argc--;
-  argv++;
-
-  /* copy argv to sargv and then append "match" */
-  for (i = 0; i < argc; i++)
-    sargv[i] = argv[i];
-  sargc = argc;
-  sargv[sargc++] = "match";
-  sargv[sargc] = NULL;
-
-  return ospf6_route_table_show (vty, sargc, sargv, oa->route_table);
-}
-
-DEFUN (show_ipv6_ospf6_area_route_intra_match_detail,
-       show_ipv6_ospf6_area_route_intra_match_detail_cmd,
-       "show ipv6 ospf6 area A.B.C.D route intra-area X::X/M match detail",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       "Specify IPv6 prefix\n"
-       "Display routes which match the specified route\n"
-       "Detailed information\n"
-       )
-{
-  char *sargv[CMD_ARGC_MAX];
-  int i, sargc;
-  struct ospf6_area *oa;
-
-  OSPF6_CMD_AREA_LOOKUP (argv[0], oa);
-  argc--;
-  argv++;
-
-  /* copy argv to sargv and then append "match" and "detail" */
-  for (i = 0; i < argc; i++)
-    sargv[i] = argv[i];
-  sargc = argc;
-  sargv[sargc++] = "match";
-  sargv[sargc++] = "detail";
-  sargv[sargc] = NULL;
-
-  return ospf6_route_table_show (vty, sargc, sargv, oa->route_table);
-}
-
-DEFUN (show_ipv6_ospf6_route_intra,
-       show_ipv6_ospf6_route_intra_cmd,
-       "show ipv6 ospf6 route intra-area",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       )
-{
-  listnode node;
-  struct ospf6_area *oa;
-
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
-    {
-      oa = (struct ospf6_area *) getdata (node);
-      vty_out (vty, "Area %s%s", oa->name, VNL);
-      ospf6_route_table_show (vty, argc, argv, oa->route_table);
-    }
-
-  return CMD_SUCCESS;
-}
-
-ALIAS (show_ipv6_ospf6_route_intra,
-       show_ipv6_ospf6_route_intra_detail_cmd,
-       "show ipv6 ospf6 route intra-area (X::X|X::X/M|detail|summary)",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       "Specify IPv6 address\n"
-       "Specify IPv6 prefix\n"
-       "Detailed information\n"
-       "Summary of route table\n"
-       );
-
-DEFUN (show_ipv6_ospf6_route_intra_match,
-       show_ipv6_ospf6_route_intra_match_cmd,
-       "show ipv6 ospf6 route intra-area X::X/M match",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       "Specify IPv6 prefix\n"
-       "Display routes which match the specified route\n"
-       )
-{
-  char *sargv[CMD_ARGC_MAX];
-  int i, sargc;
-  listnode node;
-  struct ospf6_area *oa;
-
-  /* copy argv to sargv and then append "match" */
-  for (i = 0; i < argc; i++)
-    sargv[i] = argv[i];
-  sargc = argc;
-  sargv[sargc++] = "match";
-  sargv[sargc] = NULL;
-
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
-    {
-      oa = (struct ospf6_area *) getdata (node);
-      ospf6_route_table_show (vty, sargc, sargv, oa->route_table);
-    }
-
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ipv6_ospf6_route_intra_match_detail,
-       show_ipv6_ospf6_route_intra_match_detail_cmd,
-       "show ipv6 ospf6 route intra-area X::X/M match detail",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       ROUTE_STR
-       "Display Intra-Area routes\n"
-       "Specify IPv6 prefix\n"
-       "Display routes which match the specified route\n"
-       "Detailed information\n"
-       )
-{
-  char *sargv[CMD_ARGC_MAX];
-  int i, sargc;
-  listnode node;
-  struct ospf6_area *oa;
-
-  /* copy argv to sargv and then append "match" and "detail" */
-  for (i = 0; i < argc; i++)
-    sargv[i] = argv[i];
-  sargc = argc;
-  sargv[sargc++] = "match";
-  sargv[sargc++] = "detail";
-  sargv[sargc] = NULL;
-
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
-    {
-      oa = (struct ospf6_area *) getdata (node);
-      ospf6_route_table_show (vty, sargc, sargv, oa->route_table);
-    }
-
-  return CMD_SUCCESS;
-}
-
 DEFUN (show_ipv6_ospf6_spf_tree,
        show_ipv6_ospf6_spf_tree_cmd,
        "show ipv6 ospf6 spf tree",
@@ -710,205 +505,6 @@ DEFUN (show_ipv6_ospf6_area_spf_tree,
   return CMD_SUCCESS;
 }
 
-DEFUN (show_ipv6_ospf6_area_spf_table,
-       show_ipv6_ospf6_area_spf_table_cmd,
-       "show ipv6 ospf6 area A.B.C.D spf table",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       )
-{
-  u_int32_t area_id;
-  struct ospf6_area *oa;
-
-  if (inet_pton (AF_INET, argv[0], &area_id) != 1)
-    {
-      vty_out (vty, "Malformed Area-ID: %s%s", argv[0], VNL);
-      return CMD_SUCCESS;
-    }
-  oa = ospf6_area_lookup (area_id, ospf6);
-  if (oa == NULL)
-    {
-      vty_out (vty, "No such Area: %s%s", argv[0], VNL);
-      return CMD_SUCCESS;
-    }
-
-  argc--;
-  argv++;
-
-  ospf6_lsentry_table_show (vty, argc, argv, oa->spf_table);
-  return CMD_SUCCESS;
-}
-
-ALIAS (show_ipv6_ospf6_area_spf_table,
-       show_ipv6_ospf6_area_spf_table_1_cmd,
-       "show ipv6 ospf6 area A.B.C.D spf table (A.B.C.D|A.B.C.D/M|detail)",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       "Specify Router-ID\n"
-       "Display multiple entry by specifying match-prefix of Router-ID\n"
-       "Display Detail\n"
-       );
-
-ALIAS (show_ipv6_ospf6_area_spf_table,
-       show_ipv6_ospf6_area_spf_table_2_cmd,
-       "show ipv6 ospf6 area A.B.C.D spf table (A.B.C.D|*) (A.B.C.D|A.B.C.D/M|detail)",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       "Specify Router-ID\n"
-       "Wildcard Router-ID\n"
-       "Specify Link State ID\n"
-       "Display multiple entry by specifying match-prefix of Link State ID\n"
-       "Display Detail\n"
-       );
-
-DEFUN (show_ipv6_ospf6_area_spf_table_3,
-       show_ipv6_ospf6_area_spf_table_3_cmd,
-       "show ipv6 ospf6 area A.B.C.D spf table (A.B.C.D|*) A.B.C.D/M detail",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       OSPF6_AREA_STR
-       OSPF6_AREA_ID_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       "Specify Router-ID\n"
-       "Wildcard Router-ID\n"
-       "Display multiple entry by specifying match-prefix of Link State ID\n"
-       "Display Detail\n"
-       )
-{
-  u_int32_t area_id;
-  struct ospf6_area *oa;
-  char *sargv[CMD_ARGC_MAX];
-  int i, sargc;
-
-  if (inet_pton (AF_INET, argv[0], &area_id) != 1)
-    {
-      vty_out (vty, "Malformed Area-ID: %s%s", argv[0], VNL);
-      return CMD_SUCCESS;
-    }
-  oa = ospf6_area_lookup (area_id, ospf6);
-  if (oa == NULL)
-    {
-      vty_out (vty, "No such Area: %s%s", argv[0], VNL);
-      return CMD_SUCCESS;
-    }
-
-  argc--;
-  argv++;
-
-  /* copy argv to sargv and then append "detail" */
-  for (i = 0; i < argc; i++)
-    sargv[i] = argv[i];
-  sargc = argc;
-  sargv[sargc++] = "detail";
-  sargv[sargc] = NULL;
-
-  ospf6_lsentry_table_show (vty, sargc, sargv, oa->spf_table);
-  return CMD_SUCCESS;
-}
-
-DEFUN (show_ipv6_ospf6_spf_table,
-       show_ipv6_ospf6_spf_table_cmd,
-       "show ipv6 ospf6 spf table",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       )
-{
-  listnode node;
-  struct ospf6_area *oa;
-
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
-    {
-      oa = (struct ospf6_area *) getdata (node);
-      ospf6_lsentry_table_show (vty, argc, argv, oa->spf_table);
-    }
-
-  return CMD_SUCCESS;
-}
-
-ALIAS (show_ipv6_ospf6_spf_table,
-       show_ipv6_ospf6_spf_table_1_cmd,
-       "show ipv6 ospf6 spf table (A.B.C.D|A.B.C.D/M|detail)",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       "Specify Router-ID\n"
-       "Display multiple entry by specifying match-prefix of Router-ID\n"
-       "Display Detail\n"
-       );
-
-ALIAS (show_ipv6_ospf6_spf_table,
-       show_ipv6_ospf6_spf_table_2_cmd,
-       "show ipv6 ospf6 spf table (A.B.C.D|A.B.C.D/M|*) (A.B.C.D|A.B.C.D/M|detail)",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       "Specify Router-ID\n"
-       "Display multiple entry by specifying match-prefix of Router-ID\n"
-       "Wildcard Router-ID\n"
-       "Specify Link State ID\n"
-       "Display multiple entry by specifying match-prefix of Link State ID\n"
-       "Display Detail\n"
-       );
-
-DEFUN (show_ipv6_ospf6_spf_table_3,
-       show_ipv6_ospf6_spf_table_3_cmd,
-       "show ipv6 ospf6 spf table (A.B.C.D|*) A.B.C.D/M detail",
-       SHOW_STR
-       IP6_STR
-       OSPF6_STR
-       "Shortest Path First caculation\n"
-       "Show table contains SPF result\n"
-       "Specify Router-ID\n"
-       "Wildcard Router-ID\n"
-       "Display multiple entry by specifying match-prefix of Link State ID\n"
-       "Display Detail\n"
-       )
-{
-  listnode node;
-  struct ospf6_area *oa;
-  char *sargv[CMD_ARGC_MAX];
-  int i, sargc;
-
-  /* copy argv to sargv and then append "detail" */
-  for (i = 0; i < argc; i++)
-    sargv[i] = argv[i];
-  sargc = argc;
-  sargv[sargc++] = "detail";
-  sargv[sargc] = NULL;
-
-  for (node = listhead (ospf6->area_list); node; nextnode (node))
-    {
-      oa = (struct ospf6_area *) getdata (node);
-      ospf6_lsentry_table_show (vty, sargc, sargv, oa->spf_table);
-    }
-
-  return CMD_SUCCESS;
-}
-
 DEFUN (show_ipv6_ospf6_simulate_spf_tree_root,
        show_ipv6_ospf6_simulate_spf_tree_root_cmd,
        "show ipv6 ospf6 simulate spf-tree A.B.C.D area A.B.C.D",
@@ -971,47 +567,11 @@ void
 ospf6_area_init ()
 {
   install_element (VIEW_NODE, &show_ipv6_ospf6_spf_tree_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_spf_table_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_spf_table_1_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_spf_table_2_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_spf_table_3_cmd);
   install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_table_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_table_1_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_table_2_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_table_3_cmd);
-
-  install_element (VIEW_NODE, &show_ipv6_ospf6_route_intra_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_route_intra_detail_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_route_intra_match_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_route_intra_match_detail_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_route_intra_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_route_intra_detail_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_route_intra_match_cmd);
-  install_element (VIEW_NODE, &show_ipv6_ospf6_area_route_intra_match_detail_cmd);
-
   install_element (VIEW_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
 
   install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_tree_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_table_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_table_1_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_table_2_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_table_3_cmd);
   install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_table_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_table_1_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_table_2_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_table_3_cmd);
-
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_route_intra_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_route_intra_detail_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_route_intra_match_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_route_intra_match_detail_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_route_intra_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_route_intra_detail_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_route_intra_match_cmd);
-  install_element (ENABLE_NODE, &show_ipv6_ospf6_area_route_intra_match_detail_cmd);
-
   install_element (ENABLE_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
 
   install_element (OSPF6_NODE, &area_range_cmd);

+ 1 - 1
ospf6d/ospf6_neighbor.c

@@ -173,8 +173,8 @@ ospf6_neighbor_state_change (u_char next_state, struct ospf6_neighbor *on)
         {
           OSPF6_NETWORK_LSA_SCHEDULE (on->ospf6_if);
           OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (on->ospf6_if);
-          OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (on->ospf6_if->area);
         }
+      OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (on->ospf6_if->area);
     }
 
 #ifdef XXX

+ 271 - 214
ospf6d/ospf6_route.c

@@ -51,25 +51,29 @@ void
 ospf6_linkstate_prefix2str (struct prefix *prefix, char *buf, int size)
 {
   u_int32_t adv_router, id;
-  char adv_router_str[16];
+  char adv_router_str[16], id_str[16];
   memcpy (&adv_router, &prefix->u.prefix6.s6_addr[0], 4);
   memcpy (&id, &prefix->u.prefix6.s6_addr[4], 4);
   inet_ntop (AF_INET, &adv_router, adv_router_str, sizeof (adv_router_str));
-  snprintf (buf, size, "%s(%lu)", adv_router_str, (u_long) ntohl (id));
+  inet_ntop (AF_INET, &id, id_str, sizeof (id_str));
+  if (ntohl (id))
+    snprintf (buf, size, "%s Net-ID: %s", adv_router_str, id_str);
+  else
+    snprintf (buf, size, "%s", adv_router_str);
 }
 
 /* Global strings for logging */
 char *ospf6_dest_type_str[OSPF6_DEST_TYPE_MAX] =
-{ "Unknown", "Router", "Network", "Discard", "Linkstate", };
+{ "Unknown", "Router", "Network", "Discard", "Linkstate", "AddressRange", };
 
 char *ospf6_dest_type_substr[OSPF6_DEST_TYPE_MAX] =
-{ "?", "R", "N", "D", "L", };
+{ "?", "R", "N", "D", "L", "A", };
 
 char *ospf6_path_type_str[OSPF6_PATH_TYPE_MAX] =
 { "Unknown", "Intra-Area", "Inter-Area", "External-1", "External-2", };
 
 char *ospf6_path_type_substr[OSPF6_PATH_TYPE_MAX] =
-{ "??", "Ia", "Ie", "E1", "E2", };
+{ "??", "IA", "IE", "E1", "E2", };
 
 
 struct ospf6_route *
@@ -763,8 +767,7 @@ ospf6_route_show_table_summary (struct vty *vty,
   int i, pathtype[OSPF6_PATH_TYPE_MAX];
   int number = 0;
   int nhinval = 0, ecmp = 0;
-  int multipath = 0, destination = 0;
-  int desttype = 0, desttype_mismatch = 0;
+  int alternative = 0, destination = 0;
 
   for (i = 0; i < OSPF6_PATH_TYPE_MAX; i++)
     pathtype[i] = 0;
@@ -772,48 +775,131 @@ ospf6_route_show_table_summary (struct vty *vty,
   for (route = ospf6_route_head (table); route;
        route = ospf6_route_next (route))
     {
-      if (desttype == 0)
-        desttype = route->type;
-      else if (desttype != route->type)
-        desttype_mismatch++;
-
       if (prev == NULL || ! ospf6_route_is_same (prev, route))
         destination++;
       else
-        multipath++;
-
+        alternative++;
       if (! ospf6_nexthop_is_set (&route->nexthop[0]))
         nhinval++;
       else if (ospf6_nexthop_is_set (&route->nexthop[1]))
         ecmp++;
-
-      if (prev == NULL || ! ospf6_route_is_same (prev, route))
-        pathtype[route->path.type]++;
-
+      pathtype[route->path.type]++;
       number++;
+
       prev = route;
     }
 
   assert (number == table->count);
-  vty_out (vty, "Number of Destination: %d (%d routes)%s",
-           destination, number, VNL);
-  if (multipath)
-    vty_out (vty, "  Number of Multi-path: %d%s", multipath, VNL);
-  if (desttype_mismatch)
-    vty_out (vty, "  Number of Different Dest-type: %d%s",
-             desttype_mismatch, VNL);
-  if (ecmp)
-    vty_out (vty, "  Number of Equal Cost Multi Path: %d%s",
-             ecmp, VNL);
-  if (ecmp)
-    vty_out (vty, "  Number of Invalid Nexthop: %d%s",
-             nhinval, VNL);
 
-  for (i = 0; i < OSPF6_PATH_TYPE_MAX; i++)
+  vty_out (vty, "Number of OSPFv3 routes: %d%s", number, VNL);
+  vty_out (vty, "Number of Destination: %d%s", destination, VNL);
+  vty_out (vty, "Number of Alternative routes: %d%s", alternative, VNL);
+  vty_out (vty, "Number of Equal Cost Multi Path: %d%s", ecmp, VNL);
+  for (i = OSPF6_PATH_TYPE_INTRA; i <= OSPF6_PATH_TYPE_EXTERNAL2; i++)
+    {
+      vty_out (vty, "Number of %s routes: %d%s",
+               OSPF6_PATH_TYPE_NAME (i), pathtype[i], VNL);
+    }
+}
+
+void
+ospf6_route_show_table_prefix (struct vty *vty,
+                               struct prefix *prefix,
+                               struct ospf6_route_table *table)
+{
+  struct ospf6_route *route;
+
+  route = ospf6_route_lookup (prefix, table);
+  if (route == NULL)
+    return;
+
+  ospf6_route_lock (route);
+  while (route && ospf6_route_is_prefix (prefix, route))
+    {
+      /* Specifying a prefix will always display details */
+      ospf6_route_show_detail (vty, route);
+      route = ospf6_route_next (route);
+    }
+  if (route)
+    ospf6_route_unlock (route);
+}
+
+void
+ospf6_route_show_table_address (struct vty *vty,
+                                struct prefix *prefix,
+                                struct ospf6_route_table *table)
+{
+  struct ospf6_route *route;
+
+  route = ospf6_route_lookup_bestmatch (prefix, table);
+  if (route == NULL)
+    return;
+
+  prefix = &route->prefix;
+  ospf6_route_lock (route);
+  while (route && ospf6_route_is_prefix (prefix, route))
+    {
+      /* Specifying a prefix will always display details */
+      ospf6_route_show_detail (vty, route);
+      route = ospf6_route_next (route);
+    }
+  if (route)
+    ospf6_route_unlock (route);
+}
+
+void
+ospf6_route_show_table_match (struct vty *vty, int detail,
+                              struct prefix *prefix,
+                              struct ospf6_route_table *table)
+{
+  struct ospf6_route *route;
+  assert (prefix->family);
+
+  route = ospf6_route_match_head (prefix, table);
+  while (route)
+    {
+      if (detail)
+        ospf6_route_show_detail (vty, route);
+      else
+        ospf6_route_show (vty, route);
+      route = ospf6_route_match_next (prefix, route);
+    }
+}
+
+void
+ospf6_route_show_table_type (struct vty *vty, int detail, u_char type,
+                             struct ospf6_route_table *table)
+{
+  struct ospf6_route *route;
+
+  route = ospf6_route_head (table);
+  while (route)
+    {
+      if (route->path.type == type)
+        {
+          if (detail)
+            ospf6_route_show_detail (vty, route);
+          else
+            ospf6_route_show (vty, route);
+        }
+      route = ospf6_route_next (route);
+    }
+}
+
+void
+ospf6_route_show_table (struct vty *vty, int detail,
+                        struct ospf6_route_table *table)
+{
+  struct ospf6_route *route;
+
+  route = ospf6_route_head (table);
+  while (route)
     {
-      if (pathtype[i])
-        vty_out (vty, "  Number of %s routes: %d%s",
-                 OSPF6_PATH_TYPE_NAME (i), pathtype[i], VNL);
+      if (detail)
+        ospf6_route_show_detail (vty, route);
+      else
+        ospf6_route_show (vty, route);
+      route = ospf6_route_next (route);
     }
 }
 
@@ -821,269 +907,240 @@ int
 ospf6_route_table_show (struct vty *vty, int argc, char **argv,
                         struct ospf6_route_table *table)
 {
-  unsigned char flag = 0;
-#define MATCH      0x01
-#define DETAIL     0x02
-#define PREFIX     0x04
-#define SUMMARY    0x08
+  int summary = 0;
+  int match = 0;
+  int detail = 0;
+  int slash = 0;
+  int isprefix = 0;
   int i, ret;
-  struct prefix prefix, *p;
-  struct ospf6_route *route;
+  struct prefix prefix;
+  u_char type = 0;
 
   memset (&prefix, 0, sizeof (struct prefix));
 
   for (i = 0; i < argc; i++)
     {
-      /* set "detail" */
       if (! strcmp (argv[i], "summary"))
         {
-          SET_FLAG (flag, SUMMARY);
+          summary++;
           continue;
         }
 
-      /* set "detail" */
-      if (! strcmp (argv[i], "detail"))
+      if (! strcmp (argv[i], "intra-area"))
         {
-          SET_FLAG (flag, DETAIL);
+          type = OSPF6_PATH_TYPE_INTRA;
           continue;
         }
 
-      /* set "match" */
-      if (! strcmp (argv[i], "match"))
+      if (! strcmp (argv[i], "inter-area"))
         {
-          SET_FLAG (flag, MATCH);
+          type = OSPF6_PATH_TYPE_INTER;
           continue;
         }
 
-      if (prefix.family)
+      if (! strcmp (argv[i], "external-1"))
         {
-          vty_out (vty, "Invalid argument: %s%s", argv[i], VNL);
-          return CMD_SUCCESS;
+          type = OSPF6_PATH_TYPE_EXTERNAL1;
+          continue;
+        }
+
+      if (! strcmp (argv[i], "external-2"))
+        {
+          type = OSPF6_PATH_TYPE_EXTERNAL2;
+          continue;
+        }
+
+      if (! strcmp (argv[i], "detail"))
+        {
+          detail++;
+          continue;
+        }
+
+      if (! strcmp (argv[i], "match"))
+        {
+          match++;
+          continue;
         }
 
       ret = str2prefix (argv[i], &prefix);
-      if (ret != 1 || prefix.family != AF_INET6)
+      if (ret == 1 && prefix.family == AF_INET6)
         {
-          vty_out (vty, "Malformed argument: %s%s", argv[i], VNL);
-          return CMD_SUCCESS;
+          isprefix++;
+          if (strchr (argv[i], '/'))
+            slash++;
+          continue;
         }
 
-      if (strchr (argv[i], '/'))
-        SET_FLAG (flag, PREFIX);
+      vty_out (vty, "Malformed argument: %s%s", argv[i], VNL);
+      return CMD_SUCCESS;
     }
 
   /* Give summary of this route table */
-  if (CHECK_FLAG (flag, SUMMARY))
+  if (summary)
     {
       ospf6_route_show_table_summary (vty, table);
       return CMD_SUCCESS;
     }
 
   /* Give exact prefix-match route */
-  if (prefix.family && ! CHECK_FLAG (flag, MATCH))
+  if (isprefix && ! match)
     {
       /* If exact address, give best matching route */
-      if (! CHECK_FLAG (flag, PREFIX))
-        route = ospf6_route_lookup_bestmatch (&prefix, table);
+      if (! slash)
+        ospf6_route_show_table_address (vty, &prefix, table);
       else
-        route = ospf6_route_lookup (&prefix, table);
+        ospf6_route_show_table_prefix (vty, &prefix, table);
 
-      if (route)
-        {
-          ospf6_route_lock (route);
-          p = &route->prefix;
-        }
+      return CMD_SUCCESS;
+    }
 
-      while (route && ospf6_route_is_prefix (p, route))
-        {
-          /* Seaching an entry will always display details */
-          if (route)
-            ospf6_route_show_detail (vty, route);
+  if (match)
+    ospf6_route_show_table_match (vty, detail, &prefix, table);
+  else if (type)
+    ospf6_route_show_table_type (vty, detail, type, table);
+  else
+    ospf6_route_show_table (vty, detail, table);
 
-          route = ospf6_route_next (route);
-        }
+  return CMD_SUCCESS;
+}
 
-      return CMD_SUCCESS;
-    }
+void
+ospf6_linkstate_show_header (struct vty *vty)
+{
+  vty_out (vty, "%-7s %-15s %-15s %-8s %-14s %s%s",
+           "Type", "Router-ID", "Net-ID", "Rtr-Bits", "Options", "Cost", VNL);
+}
+
+void
+ospf6_linkstate_show (struct vty *vty, struct ospf6_route *route)
+{
+  u_int32_t router, id;
+  char routername[16], idname[16], rbits[16], options[16];
+
+  router = ospf6_linkstate_prefix_adv_router (&route->prefix);
+  inet_ntop (AF_INET, &router, routername, sizeof (routername));
+  id = ospf6_linkstate_prefix_id (&route->prefix);
+  inet_ntop (AF_INET, &id, idname, sizeof (idname));
+
+  ospf6_capability_printbuf (route->path.router_bits, rbits, sizeof (rbits));
+  ospf6_options_printbuf (route->path.options, options, sizeof (options));
 
-  if (prefix.family == 0)
-    route = ospf6_route_head (table);
+  if (ntohl (id))
+    vty_out (vty, "%-7s %-15s %-15s %-8s %-14s %lu%s",
+             "Network", routername, idname, rbits, options,
+             (unsigned long) route->path.cost, VNL);
   else
-    route = ospf6_route_match_head (&prefix, table);
+    vty_out (vty, "%-7s %-15s %-15s %-8s %-14s %lu%s",
+             "Router", routername, idname, rbits, options,
+             (unsigned long) route->path.cost, VNL);
+}
+
+
+void
+ospf6_linkstate_show_table_exact (struct vty *vty,
+                                  struct prefix *prefix,
+                                  struct ospf6_route_table *table)
+{
+  struct ospf6_route *route;
+
+  route = ospf6_route_lookup (prefix, table);
+  if (route == NULL)
+    return;
+
+  ospf6_route_lock (route);
+  while (route && ospf6_route_is_prefix (prefix, route))
+    {
+      /* Specifying a prefix will always display details */
+      ospf6_route_show_detail (vty, route);
+      route = ospf6_route_next (route);
+    }
+  if (route)
+    ospf6_route_unlock (route);
+}
+
+void
+ospf6_linkstate_show_table (struct vty *vty, int detail,
+                            struct ospf6_route_table *table)
+{
+  struct ospf6_route *route;
+
+  if (! detail)
+    ospf6_linkstate_show_header (vty);
 
+  route = ospf6_route_head (table);
   while (route)
     {
-      if (CHECK_FLAG (flag, DETAIL))
+      if (detail)
         ospf6_route_show_detail (vty, route);
       else
-        ospf6_route_show (vty, route);
-
-      if (prefix.family == 0)
-        route = ospf6_route_next (route);
-      else
-        route = ospf6_route_match_next (&prefix, route);
+        ospf6_linkstate_show (vty, route);
+      route = ospf6_route_next (route);
     }
-
-  return CMD_SUCCESS;
 }
 
-
 int
-ospf6_lsentry_table_show (struct vty *vty, int argc, char **argv,
-                          struct ospf6_route_table *table)
+ospf6_linkstate_table_show (struct vty *vty, int argc, char **argv,
+                            struct ospf6_route_table *table)
 {
-  unsigned char flag = 0;
-#define MATCH      0x01
-#define DETAIL     0x02
+  int detail = 0;
+  int is_id = 0;
+  int is_router = 0;
   int i, ret;
-  struct prefix adv_router, id, prefix;
-  struct ospf6_route *route;
+  struct prefix router, id, prefix;
 
-  memset (&adv_router, 0, sizeof (struct prefix));
+  memset (&router, 0, sizeof (struct prefix));
   memset (&id, 0, sizeof (struct prefix));
+  memset (&prefix, 0, sizeof (struct prefix));
 
   for (i = 0; i < argc; i++)
     {
-      /* set "detail" */
       if (! strcmp (argv[i], "detail"))
         {
-          SET_FLAG (flag, DETAIL);
+          detail++;
           continue;
         }
 
-      /* set "match" */
-      if (! strcmp (argv[i], "match"))
+      if (! is_router)
         {
-          SET_FLAG (flag, MATCH);
-          continue;
-        }
-
-      if (adv_router.family && id.family)
-        {
-          vty_out (vty, "Invalid argument: %s%s", argv[i], VNL);
-          return CMD_SUCCESS;
-        }
-
-      if (adv_router.family == 0)
-        {
-          ret = str2prefix (argv[i], &adv_router);
-          if (ret != 1)
-            {
-              if (! strcmp (argv[i], "*"))
-                {
-                  adv_router.family = AF_INET;
-                  adv_router.prefixlen = 0;
-                  ret = 1;
-                }
-            }
-          if (ret != 1)
+          ret = str2prefix (argv[i], &router);
+          if (ret == 1 && router.family == AF_INET)
             {
-              vty_out (vty, "Invalid Router-ID: %s%s", argv[i], VNL);
-              return CMD_SUCCESS;
+              is_router++;
+              continue;
             }
+          vty_out (vty, "Malformed argument: %s%s", argv[i], VNL);
+          return CMD_SUCCESS;
         }
-      else if (id.family == 0)
-        {
-          unsigned long val;
-          char *endptr;
 
+      if (! is_id)
+        {
           ret = str2prefix (argv[i], &id);
-          if (ret != 1)
-            {
-              val = strtoul (argv[i], &endptr, 0);
-              if (val != ULONG_MAX && *endptr == '\0')
-                {
-                  id.u.prefix4.s_addr = val;
-                  ret = 1;
-                }
-            }
-
-          if (ret != 1)
+          if (ret == 1 && id.family == AF_INET)
             {
-              vty_out (vty, "Invalid Link state ID: %s%s", argv[i],
-                       VNL);
-              return CMD_WARNING;
+              is_id++;
+              continue;
             }
-        }
-    }
-
-  /* Encode to linkstate prefix */
-  if (adv_router.family)
-    {
-      if (adv_router.prefixlen == 0 &&
-          id.family && id.prefixlen != IPV4_MAX_BITLEN)
-        {
-          vty_out (vty, "Specifying Link State ID by prefix is not allowed%s"
-                   "when specifying Router-ID as wildcard%s",
-                   VNL, VNL);
-          return CMD_SUCCESS;
-        }
-      else if (adv_router.prefixlen != 0 &&
-               adv_router.prefixlen != IPV4_MAX_BITLEN && id.family)
-        {
-          vty_out (vty, "Specifying Link State ID is not allowed%s"
-                   "when specifying Router-ID by prefix%s",
-                   VNL, VNL);
+          vty_out (vty, "Malformed argument: %s%s", argv[i], VNL);
           return CMD_SUCCESS;
         }
 
-      if (adv_router.prefixlen == 0)
-        ospf6_linkstate_prefix (0, id.u.prefix4.s_addr, &prefix);
-      else if (adv_router.prefixlen != IPV4_MAX_BITLEN)
-        {
-          ospf6_linkstate_prefix (adv_router.u.prefix4.s_addr, 0, &prefix);
-          prefix.prefixlen = adv_router.prefixlen;
-          SET_FLAG (flag, MATCH);
-        }
-      else
-        {
-          ospf6_linkstate_prefix (adv_router.u.prefix4.s_addr,
-                                  id.u.prefix4.s_addr, &prefix);
-          prefix.prefixlen = adv_router.prefixlen + id.prefixlen;
-          if (prefix.prefixlen != 64)
-            SET_FLAG (flag, MATCH);
-        }
-    }
-
-  /* give exact match entry */
-  if (adv_router.family && adv_router.prefixlen == IPV4_MAX_BITLEN &&
-      id.family && id.prefixlen == IPV4_MAX_BITLEN)
-    {
-      route = ospf6_route_lookup (&prefix, table);
-      if (route)
-        ospf6_route_show_detail (vty, route);
+      vty_out (vty, "Malformed argument: %s%s", argv[i], VNL);
       return CMD_SUCCESS;
     }
 
-  if (CHECK_FLAG (flag, MATCH))
-    route = ospf6_route_match_head (&prefix, table);
-  else
-    route = ospf6_route_head (table);
+  if (is_router)
+    ospf6_linkstate_prefix (router.u.prefix4.s_addr,
+                            id.u.prefix4.s_addr, &prefix);
 
-  while (route)
-    {
-      if (! adv_router.family ||
-          (CHECK_FLAG (flag, MATCH) &&
-           prefix_match (&prefix, &route->prefix)) ||
-          (adv_router.prefixlen == 0 && id.family &&
-           ospf6_linkstate_prefix_id (&prefix) ==
-           ospf6_linkstate_prefix_id (&route->prefix)))
-        {
-          if (CHECK_FLAG (flag, DETAIL))
-            ospf6_route_show_detail (vty, route);
-          else
-            ospf6_route_show (vty, route);
-        }
-
-      if (CHECK_FLAG (flag, MATCH))
-        route = ospf6_route_match_next (&prefix, route);
-      else
-        route = ospf6_route_next (route);
-    }
+  if (prefix.family)
+    ospf6_linkstate_show_table_exact (vty, &prefix, table);
+  else
+    ospf6_linkstate_show_table (vty, detail, table);
 
   return CMD_SUCCESS;
 }
 
+
 void
 ospf6_brouter_show_header (struct vty *vty)
 {

+ 4 - 4
ospf6d/ospf6_route.h

@@ -156,8 +156,8 @@ struct ospf6_route
 #define OSPF6_ROUTE_ADD              0x02
 #define OSPF6_ROUTE_REMOVE           0x04
 #define OSPF6_ROUTE_BEST             0x08
-#define OSPF6_ROUTE_ACTIVE_SUMMARY   0x08
-#define OSPF6_ROUTE_DO_NOT_ADVERTISE 0x10
+#define OSPF6_ROUTE_ACTIVE_SUMMARY   0x10
+#define OSPF6_ROUTE_DO_NOT_ADVERTISE 0x20
 
 struct ospf6_route_table
 {
@@ -267,8 +267,8 @@ void ospf6_route_show_detail (struct vty *vty, struct ospf6_route *route);
 
 int ospf6_route_table_show (struct vty *, int, char **,
                             struct ospf6_route_table *);
-int ospf6_lsentry_table_show (struct vty *, int, char **,
-                              struct ospf6_route_table *);
+int ospf6_linkstate_table_show (struct vty *vty, int argc, char **argv,
+                            struct ospf6_route_table *table);
 
 void ospf6_brouter_show_header (struct vty *vty);
 void ospf6_brouter_show (struct vty *vty, struct ospf6_route *route);

+ 47 - 3
ospf6d/ospf6_top.c

@@ -499,7 +499,7 @@ DEFUN (show_ipv6_ospf6_route,
 
 ALIAS (show_ipv6_ospf6_route,
        show_ipv6_ospf6_route_detail_cmd,
-       "show ipv6 ospf6 route (X::X|X::X/M|detail|summary)",
+       "show ipv6 ospf6 route (X:X::X:X|X:X::X:X/M|detail|summary)",
        SHOW_STR
        IP6_STR
        OSPF6_STR
@@ -512,7 +512,7 @@ ALIAS (show_ipv6_ospf6_route,
 
 DEFUN (show_ipv6_ospf6_route_match,
        show_ipv6_ospf6_route_match_cmd,
-       "show ipv6 ospf6 route X::X/M match",
+       "show ipv6 ospf6 route X:X::X:X/M match",
        SHOW_STR
        IP6_STR
        OSPF6_STR
@@ -537,7 +537,7 @@ DEFUN (show_ipv6_ospf6_route_match,
 
 DEFUN (show_ipv6_ospf6_route_match_detail,
        show_ipv6_ospf6_route_match_detail_cmd,
-       "show ipv6 ospf6 route X::X/M match detail",
+       "show ipv6 ospf6 route X:X::X:X/M match detail",
        SHOW_STR
        IP6_STR
        OSPF6_STR
@@ -562,6 +562,46 @@ DEFUN (show_ipv6_ospf6_route_match_detail,
   return CMD_SUCCESS;
 }
 
+ALIAS (show_ipv6_ospf6_route,
+       show_ipv6_ospf6_route_type_cmd,
+       "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2)",
+       SHOW_STR
+       IP6_STR
+       OSPF6_STR
+       ROUTE_STR
+       "Dispaly Intra-Area routes\n"
+       "Dispaly Inter-Area routes\n"
+       "Dispaly Type-1 External routes\n"
+       "Dispaly Type-2 External routes\n"
+       );
+
+DEFUN (show_ipv6_ospf6_route_type_detail,
+       show_ipv6_ospf6_route_type_detail_cmd,
+       "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2) detail",
+       SHOW_STR
+       IP6_STR
+       OSPF6_STR
+       ROUTE_STR
+       "Dispaly Intra-Area routes\n"
+       "Dispaly Inter-Area routes\n"
+       "Dispaly Type-1 External routes\n"
+       "Dispaly Type-2 External routes\n"
+       "Detailed information\n"
+       )
+{
+  char *sargv[CMD_ARGC_MAX];
+  int i, sargc;
+
+  /* copy argv to sargv and then append "detail" */
+  for (i = 0; i < argc; i++)
+    sargv[i] = argv[i];
+  sargc = argc;
+  sargv[sargc++] = "detail";
+  sargv[sargc] = NULL;
+
+  ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
+  return CMD_SUCCESS;
+}
 
 /* OSPF configuration write function. */
 int
@@ -622,10 +662,14 @@ ospf6_top_init ()
   install_element (VIEW_NODE, &show_ipv6_ospf6_route_detail_cmd);
   install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_cmd);
   install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
+  install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_cmd);
+  install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_cmd);
   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_detail_cmd);
   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_cmd);
   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
+  install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_cmd);
+  install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
 
   install_default (OSPF6_NODE);
   install_element (OSPF6_NODE, &ospf6_router_id_cmd);

+ 90 - 0
ospf6d/ospf6d.c

@@ -1714,6 +1714,87 @@ ALIAS (show_ipv6_ospf6_border_routers,
        "Display Detail\n"
       );
 
+DEFUN (show_ipv6_ospf6_linkstate,
+       show_ipv6_ospf6_linkstate_cmd,
+       "show ipv6 ospf6 linkstate",
+       SHOW_STR
+       IP6_STR
+       OSPF6_STR
+       "Display linkstate routing table\n"
+      )
+{
+  listnode node;
+  struct ospf6_area *oa;
+
+  for (node = listhead (ospf6->area_list); node; nextnode (node))
+    {
+      oa = OSPF6_AREA (getdata (node));
+
+      vty_out (vty, "%s        SPF Result in Area %s%s%s",
+               VNL, oa->name, VNL, VNL);
+      ospf6_linkstate_table_show (vty, argc, argv, oa->spf_table);
+    }
+
+  vty_out (vty, "%s", VNL);
+  return CMD_SUCCESS;
+}
+
+ALIAS (show_ipv6_ospf6_linkstate,
+       show_ipv6_ospf6_linkstate_router_cmd,
+       "show ipv6 ospf6 linkstate router A.B.C.D",
+       SHOW_STR
+       IP6_STR
+       OSPF6_STR
+       "Display linkstate routing table\n"
+       "Display Router Entry\n"
+       "Specify Router ID as IPv4 address notation\n"
+      );
+
+ALIAS (show_ipv6_ospf6_linkstate,
+       show_ipv6_ospf6_linkstate_network_cmd,
+       "show ipv6 ospf6 linkstate network A.B.C.D A.B.C.D",
+       SHOW_STR
+       IP6_STR
+       OSPF6_STR
+       "Display linkstate routing table\n"
+       "Display Network Entry\n"
+       "Specify Router ID as IPv4 address notation\n"
+       "Specify Link state ID as IPv4 address notation\n"
+      );
+
+DEFUN (show_ipv6_ospf6_linkstate_detail,
+       show_ipv6_ospf6_linkstate_detail_cmd,
+       "show ipv6 ospf6 linkstate detail",
+       SHOW_STR
+       IP6_STR
+       OSPF6_STR
+       "Display linkstate routing table\n"
+      )
+{
+  char *sargv[CMD_ARGC_MAX];
+  int i, sargc;
+  listnode node;
+  struct ospf6_area *oa;
+
+  /* copy argv to sargv and then append "detail" */
+  for (i = 0; i < argc; i++)
+    sargv[i] = argv[i];
+  sargc = argc;
+  sargv[sargc++] = "detail";
+  sargv[sargc] = NULL;
+
+  for (node = listhead (ospf6->area_list); node; nextnode (node))
+    {
+      oa = OSPF6_AREA (getdata (node));
+
+      vty_out (vty, "%s        SPF Result in Area %s%s%s",
+               VNL, oa->name, VNL, VNL);
+      ospf6_linkstate_table_show (vty, sargc, sargv, oa->spf_table);
+    }
+
+  vty_out (vty, "%s", VNL);
+  return CMD_SUCCESS;
+}
 
 /* Install ospf related commands. */
 void
@@ -1752,6 +1833,15 @@ ospf6_init ()
   install_element (ENABLE_NODE, &show_ipv6_ospf6_border_routers_cmd);
   install_element (ENABLE_NODE, &show_ipv6_ospf6_border_routers_detail_cmd);
 
+  install_element (VIEW_NODE, &show_ipv6_ospf6_linkstate_cmd);
+  install_element (VIEW_NODE, &show_ipv6_ospf6_linkstate_router_cmd);
+  install_element (VIEW_NODE, &show_ipv6_ospf6_linkstate_network_cmd);
+  install_element (VIEW_NODE, &show_ipv6_ospf6_linkstate_detail_cmd);
+  install_element (ENABLE_NODE, &show_ipv6_ospf6_linkstate_cmd);
+  install_element (ENABLE_NODE, &show_ipv6_ospf6_linkstate_router_cmd);
+  install_element (ENABLE_NODE, &show_ipv6_ospf6_linkstate_network_cmd);
+  install_element (ENABLE_NODE, &show_ipv6_ospf6_linkstate_detail_cmd);
+
 #define INSTALL(n,c) \
   install_element (n ## _NODE, &show_ipv6_ospf6_ ## c);
 

+ 1 - 1
ospf6d/ospf6d.h

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