blob: 362d67942844a491c14976c703dfd5c08fc6585b [file] [log] [blame]
/*
* Copyright (C) 2003 Yasuhiro Ohara
*
* This file is part of GNU Zebra.
*
* GNU Zebra is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* GNU Zebra is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Zebra; see the file COPYING. If not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <zebra.h>
#include "thread.h"
#include "linklist.h"
#include "vty.h"
#include "command.h"
#include "ospf6d.h"
#include "ospf6_proto.h"
#include "ospf6_network.h"
#include "ospf6_lsa.h"
#include "ospf6_lsdb.h"
#include "ospf6_message.h"
#include "ospf6_route.h"
#include "ospf6_zebra.h"
#include "ospf6_spf.h"
#include "ospf6_top.h"
#include "ospf6_area.h"
#include "ospf6_interface.h"
#include "ospf6_neighbor.h"
#include "ospf6_intra.h"
#include "ospf6_asbr.h"
char ospf6_daemon_version[] = OSPF6_DAEMON_VERSION;
void
ospf6_debug ()
{
}
static struct route_node *
_route_next_until (struct route_node *node, struct route_node *limit)
{
struct route_node *next;
struct route_node *start;
/* Node may be deleted from route_unlock_node so we have to preserve
next node's pointer. */
if (node->l_left)
{
next = node->l_left;
if (next == limit)
{
route_unlock_node (node);
return NULL;
}
route_lock_node (next);
route_unlock_node (node);
return next;
}
if (node->l_right)
{
next = node->l_right;
if (next == limit)
{
route_unlock_node (node);
return NULL;
}
route_lock_node (next);
route_unlock_node (node);
return next;
}
start = node;
while (node->parent)
{
if (node->parent->l_left == node && node->parent->l_right)
{
next = node->parent->l_right;
if (next == limit)
{
route_unlock_node (start);
return NULL;
}
route_lock_node (next);
route_unlock_node (start);
return next;
}
node = node->parent;
}
route_unlock_node (start);
return NULL;
}
struct route_node *
route_prev (struct route_node *node)
{
struct route_node *end;
struct route_node *prev = NULL;
if (node->parent == NULL)
{
route_unlock_node (node);
return NULL;
}
if (node->parent->l_left == node)
{
prev = node->parent;
route_lock_node (prev);
route_unlock_node (node);
return prev;
}
end = node;
node = node->parent;
route_lock_node (node);
while (node)
{
prev = node;
node = _route_next_until (node, end);
}
route_unlock_node (end);
route_lock_node (prev);
return prev;
}
DEFUN (show_version_ospf6,
show_version_ospf6_cmd,
"show version ospf6",
SHOW_STR
"Displays ospf6d version\n"
)
{
vty_out (vty, "Zebra OSPF6d Version: %s%s",
ospf6_daemon_version, VTY_NEWLINE);
return CMD_SUCCESS;
}
struct cmd_node debug_node =
{
DEBUG_NODE,
""
};
int
config_write_ospf6_debug (struct vty *vty)
{
config_write_ospf6_debug_message (vty);
config_write_ospf6_debug_lsa (vty);
config_write_ospf6_debug_zebra (vty);
config_write_ospf6_debug_interface (vty);
config_write_ospf6_debug_neighbor (vty);
config_write_ospf6_debug_spf (vty);
config_write_ospf6_debug_route (vty);
config_write_ospf6_debug_asbr (vty);
vty_out (vty, "!%s", VTY_NEWLINE);
return 0;
}
DEFUN (show_ipv6_ospf6_database,
show_ipv6_ospf6_database_cmd,
"show ipv6 ospf6 database",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
OSPF6_CMD_CHECK_RUNNING ();
if (argc)
{
if (! strncmp (argv[0], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[0], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[0], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
LSDB_FOREACH_LSA (vty, showfunc, o->lsdb);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA (vty, showfunc, oa->lsdb);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA (vty, showfunc, oi->lsdb);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database,
show_ipv6_ospf6_database_detail_cmd,
"show ipv6 ospf6 database (detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_type,
show_ipv6_ospf6_database_type_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int16_t type = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 1)
{
if (! strncmp (argv[1], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[1], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[1], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if (! strcmp (argv[0], "router"))
type = htons (OSPF6_LSTYPE_ROUTER);
else if (! strcmp (argv[0], "network"))
type = htons (OSPF6_LSTYPE_NETWORK);
else if (! strcmp (argv[0], "as-external"))
type = htons (OSPF6_LSTYPE_AS_EXTERNAL);
else if (! strcmp (argv[0], "intra-prefix"))
type = htons (OSPF6_LSTYPE_INTRA_PREFIX);
else if (! strcmp (argv[0], "inter-router"))
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
else if (! strcmp (argv[0], "inter-prefix"))
type = htons (OSPF6_LSTYPE_INTER_PREFIX);
else if (! strcmp (argv[0], "link"))
type = htons (OSPF6_LSTYPE_LINK);
LSDB_FOREACH_LSA_T (vty, showfunc, o->lsdb, type);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_T (vty, showfunc, oa->lsdb, type);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_T (vty, showfunc, oi->lsdb, type);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_type,
show_ipv6_ospf6_database_type_detail_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_id,
show_ipv6_ospf6_database_id_cmd,
"show ipv6 ospf6 database * A.B.C.D",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Any Link state Type\n"
"Specify Link state ID as IPv4 address notation\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int32_t id = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 1)
{
if (! strncmp (argv[1], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[1], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[1], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if ((inet_pton (AF_INET, argv[0], &id)) != 1)
{
vty_out (vty, "Link State ID is not parsable: %s%s",
argv[0], VTY_NEWLINE);
return CMD_SUCCESS;
}
LSDB_FOREACH_LSA_I (vty, showfunc, o->lsdb, id);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_I (vty, showfunc, oa->lsdb, id);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_I (vty, showfunc, oi->lsdb, id);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_id,
show_ipv6_ospf6_database_id_detail_cmd,
"show ipv6 ospf6 database * A.B.C.D "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Any Link state Type\n"
"Any Link state ID\n"
"Specify Link state ID as IPv4 address notation\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_router,
show_ipv6_ospf6_database_router_cmd,
"show ipv6 ospf6 database * * A.B.C.D",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Any Link state Type\n"
"Any Link state ID\n"
"Specify Advertising Router as IPv4 address notation\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int32_t router = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 1)
{
if (! strncmp (argv[1], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[1], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[1], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if ((inet_pton (AF_INET, argv[0], &router)) != 1)
{
vty_out (vty, "Advertising Router is not parsable: %s%s",
argv[0], VTY_NEWLINE);
return CMD_SUCCESS;
}
LSDB_FOREACH_LSA_R (vty, showfunc, o->lsdb, router);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_R (vty, showfunc, oa->lsdb, router);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_R (vty, showfunc, oi->lsdb, router);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_router,
show_ipv6_ospf6_database_router_detail_cmd,
"show ipv6 ospf6 database * * A.B.C.D "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Any Link state Type\n"
"Any Link state ID\n"
"Specify Advertising Router as IPv4 address notation\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_type_id,
show_ipv6_ospf6_database_type_id_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) A.B.C.D",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Specify Link state ID as IPv4 address notation\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int16_t type = 0;
u_int32_t id = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 2)
{
if (! strncmp (argv[2], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[2], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[2], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if (! strcmp (argv[0], "router"))
type = htons (OSPF6_LSTYPE_ROUTER);
else if (! strcmp (argv[0], "network"))
type = htons (OSPF6_LSTYPE_NETWORK);
else if (! strcmp (argv[0], "as-external"))
type = htons (OSPF6_LSTYPE_AS_EXTERNAL);
else if (! strcmp (argv[0], "intra-prefix"))
type = htons (OSPF6_LSTYPE_INTRA_PREFIX);
else if (! strcmp (argv[0], "inter-router"))
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
else if (! strcmp (argv[0], "inter-prefix"))
type = htons (OSPF6_LSTYPE_INTER_PREFIX);
else if (! strcmp (argv[0], "link"))
type = htons (OSPF6_LSTYPE_LINK);
if ((inet_pton (AF_INET, argv[1], &id)) != 1)
{
vty_out (vty, "Link state ID is not parsable: %s%s",
argv[1], VTY_NEWLINE);
return CMD_SUCCESS;
}
LSDB_FOREACH_LSA_TI (vty, showfunc, o->lsdb, type, id);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_TI (vty, showfunc, oa->lsdb, type, id);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_TI (vty, showfunc, oi->lsdb, type, id);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_type_id,
show_ipv6_ospf6_database_type_id_detail_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) A.B.C.D "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Specify Link state ID as IPv4 address notation\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_type_router,
show_ipv6_ospf6_database_type_router_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) * A.B.C.D",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Any Link state ID\n"
"Specify Advertising Router as IPv4 address notation\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int16_t type = 0;
u_int32_t router = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 2)
{
if (! strncmp (argv[2], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[2], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[2], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if (! strcmp (argv[0], "router"))
type = htons (OSPF6_LSTYPE_ROUTER);
else if (! strcmp (argv[0], "network"))
type = htons (OSPF6_LSTYPE_NETWORK);
else if (! strcmp (argv[0], "as-external"))
type = htons (OSPF6_LSTYPE_AS_EXTERNAL);
else if (! strcmp (argv[0], "intra-prefix"))
type = htons (OSPF6_LSTYPE_INTRA_PREFIX);
else if (! strcmp (argv[0], "inter-router"))
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
else if (! strcmp (argv[0], "inter-prefix"))
type = htons (OSPF6_LSTYPE_INTER_PREFIX);
else if (! strcmp (argv[0], "link"))
type = htons (OSPF6_LSTYPE_LINK);
if ((inet_pton (AF_INET, argv[1], &router)) != 1)
{
vty_out (vty, "Advertising Router is not parsable: %s%s",
argv[1], VTY_NEWLINE);
return CMD_SUCCESS;
}
LSDB_FOREACH_LSA_TR (vty, showfunc, o->lsdb, type, router);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_TR (vty, showfunc, oa->lsdb, type, router);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_TR (vty, showfunc, oi->lsdb, type, router);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_type_router,
show_ipv6_ospf6_database_type_router_detail_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) * A.B.C.D "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Any Link state ID\n"
"Specify Advertising Router as IPv4 address notation\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_id_router,
show_ipv6_ospf6_database_id_router_cmd,
"show ipv6 ospf6 database * A.B.C.D A.B.C.D",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Any Link state Type\n"
"Specify Link state ID as IPv4 address notation\n"
"Specify Advertising Router as IPv4 address notation\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int32_t id = 0;
u_int32_t router = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 2)
{
if (! strncmp (argv[2], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[2], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[2], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if ((inet_pton (AF_INET, argv[0], &id)) != 1)
{
vty_out (vty, "Link state ID is not parsable: %s%s",
argv[1], VTY_NEWLINE);
return CMD_SUCCESS;
}
if ((inet_pton (AF_INET, argv[1], &router)) != 1)
{
vty_out (vty, "Advertising Router is not parsable: %s%s",
argv[1], VTY_NEWLINE);
return CMD_SUCCESS;
}
LSDB_FOREACH_LSA_IR (vty, showfunc, o->lsdb, id, router);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_IR (vty, showfunc, oa->lsdb, id, router);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_IR (vty, showfunc, oi->lsdb, id, router);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_id_router,
show_ipv6_ospf6_database_id_router_detail_cmd,
"show ipv6 ospf6 database * A.B.C.D A.B.C.D "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Any Link state Type\n"
"Specify Link state ID as IPv4 address notation\n"
"Specify Advertising Router as IPv4 address notation\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_type_id_router,
show_ipv6_ospf6_database_type_id_router_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) A.B.C.D A.B.C.D",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Specify Link state ID as IPv4 address notation\n"
"Specify Advertising Router as IPv4 address notation\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int16_t type = 0;
u_int32_t id = 0;
u_int32_t router = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 3)
{
if (! strncmp (argv[3], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[3], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if (! strcmp (argv[0], "router"))
type = htons (OSPF6_LSTYPE_ROUTER);
else if (! strcmp (argv[0], "network"))
type = htons (OSPF6_LSTYPE_NETWORK);
else if (! strcmp (argv[0], "as-external"))
type = htons (OSPF6_LSTYPE_AS_EXTERNAL);
else if (! strcmp (argv[0], "intra-prefix"))
type = htons (OSPF6_LSTYPE_INTRA_PREFIX);
else if (! strcmp (argv[0], "inter-router"))
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
else if (! strcmp (argv[0], "inter-prefix"))
type = htons (OSPF6_LSTYPE_INTER_PREFIX);
else if (! strcmp (argv[0], "link"))
type = htons (OSPF6_LSTYPE_LINK);
if ((inet_pton (AF_INET, argv[1], &id)) != 1)
{
vty_out (vty, "Link state ID is not parsable: %s%s",
argv[1], VTY_NEWLINE);
return CMD_SUCCESS;
}
if ((inet_pton (AF_INET, argv[2], &router)) != 1)
{
vty_out (vty, "Advertising Router is not parsable: %s%s",
argv[2], VTY_NEWLINE);
return CMD_SUCCESS;
}
LSDB_FOREACH_LSA_TIR (vty, showfunc, o->lsdb, type, id, router);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_TIR (vty, showfunc, oa->lsdb, type, id, router);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_TIR (vty, showfunc, oi->lsdb, type, id, router);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_type_id_router,
show_ipv6_ospf6_database_type_id_router_detail_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) A.B.C.D A.B.C.D "
"(dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Specify Link state ID as IPv4 address notation\n"
"Specify Advertising Router as IPv4 address notation\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_self_originated,
show_ipv6_ospf6_database_self_originated_cmd,
"show ipv6 ospf6 database self-originated",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Self-originated LSAs\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 0)
{
if (! strncmp (argv[0], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[0], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[0], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
LSDB_FOREACH_LSA_R (vty, showfunc, o->lsdb, o->router_id);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_R (vty, showfunc, oa->lsdb, o->router_id);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_R (vty, showfunc, oi->lsdb, o->router_id);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_self_originated,
show_ipv6_ospf6_database_self_originated_detail_cmd,
"show ipv6 ospf6 database self-originated "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Self-originated LSAs\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_type_self_originated,
show_ipv6_ospf6_database_type_self_originated_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) self-originated",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Display Self-originated LSAs\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int16_t type = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 1)
{
if (! strncmp (argv[1], "de", 2))
showfunc = ospf6_lsa_show;
else if (! strncmp (argv[1], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[1], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show_summary;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if (! strcmp (argv[0], "router"))
type = htons (OSPF6_LSTYPE_ROUTER);
else if (! strcmp (argv[0], "network"))
type = htons (OSPF6_LSTYPE_NETWORK);
else if (! strcmp (argv[0], "as-external"))
type = htons (OSPF6_LSTYPE_AS_EXTERNAL);
else if (! strcmp (argv[0], "intra-prefix"))
type = htons (OSPF6_LSTYPE_INTRA_PREFIX);
else if (! strcmp (argv[0], "inter-router"))
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
else if (! strcmp (argv[0], "inter-prefix"))
type = htons (OSPF6_LSTYPE_INTER_PREFIX);
else if (! strcmp (argv[0], "link"))
type = htons (OSPF6_LSTYPE_LINK);
LSDB_FOREACH_LSA_TR (vty, showfunc, o->lsdb, type, o->router_id);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_TR (vty, showfunc, oa->lsdb, type, o->router_id);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_TR (vty, showfunc, oi->lsdb, type, o->router_id);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_type_self_originated,
show_ipv6_ospf6_database_type_self_originated_detail_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) self-originated "
"(detail|dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Display Self-originated LSAs\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
DEFUN (show_ipv6_ospf6_database_type_id_self_originated,
show_ipv6_ospf6_database_type_id_self_originated_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) A.B.C.D self-originated",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Specify Link state ID as IPv4 address notation\n"
"Display Self-originated LSAs\n"
)
{
listnode i, j;
struct ospf6 *o = ospf6;
void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL;
u_int16_t type = 0;
u_int32_t id = 0;
OSPF6_CMD_CHECK_RUNNING ();
if (argc > 2)
{
if (! strncmp (argv[2], "du", 2))
showfunc = ospf6_lsa_show_dump;
else if (! strncmp (argv[2], "in", 2))
showfunc = ospf6_lsa_show_internal;
}
else
showfunc = ospf6_lsa_show;
if (showfunc == ospf6_lsa_show_summary)
ospf6_lsa_show_summary_header (vty);
if (! strcmp (argv[0], "router"))
type = htons (OSPF6_LSTYPE_ROUTER);
else if (! strcmp (argv[0], "network"))
type = htons (OSPF6_LSTYPE_NETWORK);
else if (! strcmp (argv[0], "as-external"))
type = htons (OSPF6_LSTYPE_AS_EXTERNAL);
else if (! strcmp (argv[0], "intra-prefix"))
type = htons (OSPF6_LSTYPE_INTRA_PREFIX);
else if (! strcmp (argv[0], "inter-router"))
type = htons (OSPF6_LSTYPE_INTER_ROUTER);
else if (! strcmp (argv[0], "inter-prefix"))
type = htons (OSPF6_LSTYPE_INTER_PREFIX);
else if (! strcmp (argv[0], "link"))
type = htons (OSPF6_LSTYPE_LINK);
if ((inet_pton (AF_INET, argv[1], &id)) != 1)
{
vty_out (vty, "Link State ID is not parsable: %s%s",
argv[0], VTY_NEWLINE);
return CMD_SUCCESS;
}
LSDB_FOREACH_LSA_TIR (vty, showfunc, o->lsdb, type, id, o->router_id);
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
LSDB_FOREACH_LSA_TIR (vty, showfunc, oa->lsdb, type, id, o->router_id);
}
for (i = listhead (o->area_list); i; nextnode (i))
{
struct ospf6_area *oa = (struct ospf6_area *) getdata (i);
for (j = listhead (oa->if_list); j; nextnode (j))
{
struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j);
LSDB_FOREACH_LSA_TIR (vty, showfunc, oi->lsdb, type, id, o->router_id);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_ospf6_database_type_id_self_originated,
show_ipv6_ospf6_database_type_id_self_originated_detail_cmd,
"show ipv6 ospf6 database "
"(router|network|inter-prefix|inter-router|as-external|"
"group-membership|type-7|link|intra-prefix) A.B.C.D self-originated "
"(dump|internal)",
SHOW_STR
IPV6_STR
OSPF6_STR
"Display Link state database\n"
"Display Router LSAs\n"
"Display Network LSAs\n"
"Display Inter-Area-Prefix LSAs\n"
"Display Inter-Area-Router LSAs\n"
"Display As-External LSAs\n"
"Display Group-Membership LSAs\n"
"Display Type-7 LSAs\n"
"Display Link LSAs\n"
"Display Intra-Area-Prefix LSAs\n"
"Specify Link state ID as IPv4 address notation\n"
"Display Self-originated LSAs\n"
"Display details of LSAs\n"
"Dump LSAs\n"
"Display LSA's internal information\n"
);
/* Install ospf related commands. */
void
ospf6_init ()
{
install_node (&debug_node, config_write_ospf6_debug);
install_element_ospf6_debug_message ();
install_element_ospf6_debug_lsa ();
install_element_ospf6_debug_interface ();
install_element_ospf6_debug_neighbor ();
install_element_ospf6_debug_zebra ();
install_element_ospf6_debug_spf ();
install_element_ospf6_debug_route ();
install_element_ospf6_debug_asbr ();
install_element (VIEW_NODE, &show_version_ospf6_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_id_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_id_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_router_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_router_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_router_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_router_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_id_router_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_id_router_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_router_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_router_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_self_originated_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_self_originated_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_self_originated_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_self_originated_detail_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_self_originated_cmd);
install_element (VIEW_NODE, &show_ipv6_ospf6_database_type_id_self_originated_detail_cmd);
install_element (ENABLE_NODE, &show_version_ospf6_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_id_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_id_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_router_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_router_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_router_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_router_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_id_router_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_id_router_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_router_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_router_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_self_originated_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_self_originated_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_self_originated_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_self_originated_detail_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_database_type_id_self_originated_cmd);
install_element (ENABLE_NODE, &show_ipv6_ospf6_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 ();
/* Make ospf protocol socket. */
ospf6_serv_sock ();
thread_add_read (master, ospf6_receive, NULL, ospf6_sock);
}