diff options
Diffstat (limited to 'ospf6d/ospf6d.c')
-rw-r--r-- | ospf6d/ospf6d.c | 1671 |
1 files changed, 1056 insertions, 615 deletions
diff --git a/ospf6d/ospf6d.c b/ospf6d/ospf6d.c index e83e1eab..362d6794 100644 --- a/ospf6d/ospf6d.c +++ b/ospf6d/ospf6d.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1999 Yasuhiro Ohara + * Copyright (C) 2003 Yasuhiro Ohara * * This file is part of GNU Zebra. * @@ -19,173 +19,132 @@ * Boston, MA 02111-1307, USA. */ -#include "ospf6d.h" +#include <zebra.h> -#include "ospf6_damp.h" +#include "thread.h" +#include "linklist.h" +#include "vty.h" +#include "command.h" -/* global ospf6d variable */ -int ospf6_sock; -list iflist; -list nexthoplist = NULL; -struct sockaddr_in6 allspfrouters6; -struct sockaddr_in6 alldrouters6; -char *recent_reason; /* set by ospf6_lsa_check_recent () */ -int proctitle_mode = 0; +#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; - -#define TIMER_SEC_MICRO 1000000 - void -ospf6_timeval_sub (const struct timeval *t1, const struct timeval *t2, - struct timeval *result) +ospf6_debug () +{ +} + +static struct route_node * +_route_next_until (struct route_node *node, struct route_node *limit) { - long usec, movedown = 0; + 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 (t1->tv_sec < t2->tv_sec || - (t1->tv_sec == t2->tv_sec && t1->tv_usec < t2->tv_usec)) + if (node->l_left) { - result->tv_sec = 0; - result->tv_usec = 0; - return; + next = node->l_left; + if (next == limit) + { + route_unlock_node (node); + return NULL; + } + route_lock_node (next); + route_unlock_node (node); + return next; } - - if (t1->tv_usec < t2->tv_usec) + if (node->l_right) { - usec = t1->tv_usec + TIMER_SEC_MICRO; - movedown++; + next = node->l_right; + if (next == limit) + { + route_unlock_node (node); + return NULL; + } + route_lock_node (next); + route_unlock_node (node); + return next; } - else - usec = t1->tv_usec; - result->tv_usec = usec - t2->tv_usec; - - result->tv_sec = t1->tv_sec - t2->tv_sec - movedown; -} -void -ospf6_timeval_div (const struct timeval *t1, u_int by, - struct timeval *result) -{ - long movedown; - - if (by == 0) + start = node; + while (node->parent) { - result->tv_sec = 0; - result->tv_usec = 0; - return; + 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; } - movedown = t1->tv_sec % by; - result->tv_sec = t1->tv_sec / by; - result->tv_usec = (t1->tv_usec + movedown * TIMER_SEC_MICRO) / by; + route_unlock_node (start); + return NULL; } -void -ospf6_timeval_decode (const struct timeval *t, long *dayp, long *hourp, - long *minp, long *secp, long *msecp, long *usecp) +struct route_node * +route_prev (struct route_node *node) { - long day, hour, min, sec, msec, usec, left; - - left = t->tv_sec; - day = left / 86400; left -= day * 86400; - hour = left / 3600; left -= hour * 3600; - min = left / 60; left -= min * 60; - sec = left; - left = t->tv_usec; - msec = left / 1000; left -= msec * 1000; - usec = left; - - if (dayp) *dayp = day; - if (hourp) *hourp = hour; - if (minp) *minp = min; - if (secp) *secp = sec; - if (msecp) *msecp = msec; - if (usecp) *usecp = usec; -} - -void -ospf6_timeval_string (struct timeval *tv, char *buf, int size) -{ - char days[16], hours[16], mins[16], secs[16], msecs[16], usecs[16]; - long day, hour, min, sec, msec, usec; - - ospf6_timeval_decode (tv, &day, &hour, &min, &sec, &msec, &usec); - snprintf (days, sizeof (days), "%ld days ", day); - snprintf (hours, sizeof (hours), "%ld hours ", hour); - snprintf (mins, sizeof (mins), "%ld mins ", min); - snprintf (secs, sizeof (secs), "%ld secs ", sec); - snprintf (msecs, sizeof (msecs), "%ld msecs ", msec); - snprintf (usecs, sizeof (usecs), "%ld usecs ", usec); - - snprintf (buf, size, "%s%s%s%s%s%s", - (day ? days : ""), (hour ? hours : ""), - (min ? mins : ""), (sec ? secs : ""), - (msec ? msecs : ""), (usec ? usecs : "")); -} + struct route_node *end; + struct route_node *prev = NULL; -void -ospf6_timeval_string_summary (struct timeval *tv, char *buf, int size) -{ - char days[16], hours[16], mins[16], secs[16], msecs[16], usecs[16]; - long day, hour, min, sec, msec, usec; - - ospf6_timeval_decode (tv, &day, &hour, &min, &sec, &msec, &usec); - snprintf (days, sizeof (days), "%02ldd", day); - snprintf (hours, sizeof (hours), "%ldh", hour); - snprintf (mins, sizeof (mins), "%ldm", min); - snprintf (secs, sizeof (secs), "%lds", sec); - snprintf (msecs, sizeof (msecs), "%ldms", msec); - snprintf (usecs, sizeof (usecs), "%ldus", usec); - - snprintf (buf, size, "%s%02ld:%02ld:%02ld", - (day ? days : ""), hour, min, sec); -} + if (node->parent == NULL) + { + route_unlock_node (node); + return NULL; + } -/* foreach function */ -void -ospf6_count_state (void *arg, int val, void *obj) -{ - int *count = (int *) arg; - u_char state = val; - struct ospf6_neighbor *nei = (struct ospf6_neighbor *) obj; + if (node->parent->l_left == node) + { + prev = node->parent; + route_lock_node (prev); + route_unlock_node (node); + return prev; + } - if (nei->state == state) - (*count)++; -} - -/* VTY commands. */ -DEFUN (reload, - reload_cmd, - "reload", - "Reloads\n") -{ - extern void _reload (); - _reload (); - return CMD_SUCCESS; -} + 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); -DEFUN (garbage_collection, - garbage_collection_cmd, - "ipv6 ospf6 garbage collect", - IPV6_STR - OSPF6_STR - "garbage collection by hand\n" - "Remove Maxages if possible and recalculate routes\n") -{ - ospf6_maxage_remover (); -#if 0 - ospf6_route_calculation_schedule (); -#endif - return CMD_SUCCESS; + return prev; } -/* Show version. */ DEFUN (show_version_ospf6, show_version_ospf6_cmd, "show version ospf6", SHOW_STR - "Displays ospf6d version\n") + "Displays ospf6d version\n" + ) { vty_out (vty, "Zebra OSPF6d Version: %s%s", ospf6_daemon_version, VTY_NEWLINE); @@ -193,582 +152,1103 @@ DEFUN (show_version_ospf6, return CMD_SUCCESS; } -/* start ospf6 */ -DEFUN (router_ospf6, - router_ospf6_cmd, - "router ospf6", - OSPF6_ROUTER_STR - OSPF6_STR) +struct cmd_node debug_node = { - if (ospf6 == NULL) - ospf6_start (); - - /* set current ospf point. */ - vty->node = OSPF6_NODE; - vty->index = ospf6; + DEBUG_NODE, + "" +}; - return CMD_SUCCESS; +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; } -/* stop ospf6 */ -DEFUN (no_router_ospf6, - no_router_ospf6_cmd, - "no router ospf6", - NO_STR - OSPF6_ROUTER_STR) +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" + ) { - if (!ospf6) - vty_out (vty, "OSPFv3 is not running%s", VTY_NEWLINE); + 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 - ospf6_stop (); + showfunc = ospf6_lsa_show_summary; + + if (showfunc == ospf6_lsa_show_summary) + ospf6_lsa_show_summary_header (vty); - /* return to config node . */ - vty->node = CONFIG_NODE; - vty->index = NULL; + 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; } -/* show top level structures */ -DEFUN (show_ipv6_ospf6, - show_ipv6_ospf6_cmd, - "show ipv6 ospf6", +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 - IP6_STR - OSPF6_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 (); - ospf6_show (vty); + 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; } -DEFUN (show_ipv6_ospf6_nexthoplist, - show_ipv6_ospf6_nexthoplist_cmd, - "show ipv6 ospf6 nexthop-list", +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 - IP6_STR + IPV6_STR OSPF6_STR - "List of nexthop\n") -{ -#if 0 - listnode i; - struct ospf6_nexthop *nh; - char buf[128]; - for (i = listhead (nexthoplist); i; nextnode (i)) - { - nh = (struct ospf6_nexthop *) getdata (i); - nexthop_str (nh, buf, sizeof (buf)); - vty_out (vty, "%s%s", buf, - VTY_NEWLINE); - } -#endif - return CMD_SUCCESS; -} - -DEFUN (show_ipv6_ospf6_statistics, - show_ipv6_ospf6_statistics_cmd, - "show ipv6 ospf6 statistics", + "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 - IP6_STR + IPV6_STR OSPF6_STR - "Statistics\n") + "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 (); - ospf6_statistics_show (vty, ospf6); - return CMD_SUCCESS; -} + 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; -/* change Router_ID commands. */ -DEFUN (ospf6_router_id, - ospf6_router_id_cmd, - "router-id ROUTER_ID", - "Configure ospf Router-ID.\n" - V4NOTATION_STR) -{ - int ret; - u_int32_t router_id; + if (showfunc == ospf6_lsa_show_summary) + ospf6_lsa_show_summary_header (vty); - ret = inet_pton (AF_INET, argv[0], &router_id); - if (!ret) + if ((inet_pton (AF_INET, argv[0], &id)) != 1) { - vty_out (vty, "malformed ospf router identifier%s", VTY_NEWLINE); - vty_out (vty, "%s", VTY_NEWLINE); - return CMD_WARNING; + vty_out (vty, "Link State ID is not parsable: %s%s", + argv[0], VTY_NEWLINE); + return CMD_SUCCESS; } - if (IS_OSPF6_DUMP_CONFIG) - zlog_info ("CONFIG: router-id %s", argv[0]); - ospf6->router_id = router_id; + 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; } -int -ospf6_interface_bind_area (struct vty *vty, - char *if_name, char *area_name, - char *plist_name, int passive) +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" + ) { - struct interface *ifp; - struct ospf6_interface *o6i; - struct ospf6_area *o6a; - u_int32_t area_id; + listnode i, j; + struct ospf6 *o = ospf6; + void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL; + u_int32_t router = 0; - /* find/create ospf6 interface */ - ifp = if_get_by_name (if_name); - o6i = (struct ospf6_interface *) ifp->info; - if (! o6i) - o6i = ospf6_interface_create (ifp); + OSPF6_CMD_CHECK_RUNNING (); - /* parse Area-ID */ - if (inet_pton (AF_INET, area_name, &area_id) != 1) + if (argc > 1) { - vty_out (vty, "Invalid Area-ID: %s%s", area_name, VTY_NEWLINE); - return CMD_ERR_AMBIGUOUS; + 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; - /* find/create ospf6 area */ - o6a = ospf6_area_lookup (area_id, ospf6); - if (!o6a) + if (showfunc == ospf6_lsa_show_summary) + ospf6_lsa_show_summary_header (vty); + + if ((inet_pton (AF_INET, argv[0], &router)) != 1) { - o6a = ospf6_area_create (area_id); - o6a->ospf6 = ospf6; - listnode_add (ospf6->area_list, o6a); + vty_out (vty, "Advertising Router is not parsable: %s%s", + argv[0], VTY_NEWLINE); + return CMD_SUCCESS; } - if (o6i->area) + LSDB_FOREACH_LSA_R (vty, showfunc, o->lsdb, router); + for (i = listhead (o->area_list); i; nextnode (i)) { - if (o6i->area != o6a) - { - vty_out (vty, "Aready attached to area %s%s", - o6i->area->str, VTY_NEWLINE); - return CMD_ERR_NOTHING_TODO; - } + struct ospf6_area *oa = (struct ospf6_area *) getdata (i); + LSDB_FOREACH_LSA_R (vty, showfunc, oa->lsdb, router); } - else + for (i = listhead (o->area_list); i; nextnode (i)) { - listnode_add (o6a->if_list, o6i); - o6i->area = o6a; + 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); + } } - /* prefix-list name */ - if (plist_name) + 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 (o6i->plist_name) - XFREE (MTYPE_PREFIX_LIST_STR, o6i->plist_name); - o6i->plist_name = XSTRDUP (MTYPE_PREFIX_LIST_STR, plist_name); + 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) { - if (o6i->plist_name) - XFREE (MTYPE_PREFIX_LIST_STR, o6i->plist_name); - o6i->plist_name = NULL; + vty_out (vty, "Link state ID is not parsable: %s%s", + argv[1], VTY_NEWLINE); + return CMD_SUCCESS; } - if (passive) + LSDB_FOREACH_LSA_TI (vty, showfunc, o->lsdb, type, id); + for (i = listhead (o->area_list); i; nextnode (i)) { - listnode node; - struct ospf6_neighbor *o6n; - - SET_FLAG (o6i->flag, OSPF6_INTERFACE_FLAG_PASSIVE); - if (o6i->thread_send_hello) - { - thread_cancel (o6i->thread_send_hello); - o6i->thread_send_hello = (struct thread *) NULL; - } - - for (node = listhead (o6i->neighbor_list); node; nextnode (node)) - { - o6n = getdata (node); - if (o6n->inactivity_timer) - thread_cancel (o6n->inactivity_timer); - thread_execute (master, inactivity_timer, o6n, 0); - } + struct ospf6_area *oa = (struct ospf6_area *) getdata (i); + LSDB_FOREACH_LSA_TI (vty, showfunc, oa->lsdb, type, id); } - else + for (i = listhead (o->area_list); i; nextnode (i)) { - UNSET_FLAG (o6i->flag, OSPF6_INTERFACE_FLAG_PASSIVE); - if (o6i->thread_send_hello == NULL) - thread_add_event (master, ospf6_send_hello, o6i, 0); + 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); + } } - /* enable I/F if it's not enabled still */ - if (! ospf6_interface_is_enabled (o6i->interface->ifindex)) - thread_add_event (master, interface_up, o6i, 0); - else - CALL_FOREACH_LSA_HOOK (hook_interface, hook_change, o6i); - - CALL_CHANGE_HOOK (&interface_hook, o6i); return CMD_SUCCESS; } -DEFUN (ospf6_interface_area_plist, - ospf6_interface_area_plist_cmd, - "interface IFNAME area A.B.C.D prefix-list WORD", - "Enable routing on an IPv6 interface\n" - IFNAME_STR - "Set the OSPF6 area ID\n" - "OSPF6 area ID in IPv4 address notation\n" - OSPF6_PREFIX_LIST_STR - "IPv6 prefix-list name\n" - ) -{ - if (IS_OSPF6_DUMP_CONFIG) - zlog_info ("CONFIG: interface %s area %s prefix-list %s", - argv[0], argv[1], argv[2]); - - return ospf6_interface_bind_area (vty, argv[0], argv[1], argv[2], 0); -} - -DEFUN (ospf6_interface_area_plist_passive, - ospf6_interface_area_plist_passive_cmd, - "interface IFNAME area A.B.C.D prefix-list WORD passive", - "Enable routing on an IPv6 interface\n" - IFNAME_STR - "Set the OSPF6 area ID\n" - "OSPF6 area ID in IPv4 address notation\n" - OSPF6_PREFIX_LIST_STR - "IPv6 prefix-list name\n" - "IPv6 prefix-list name\n" - OSPF6_PASSIVE_STR - ) -{ - if (IS_OSPF6_DUMP_CONFIG) - zlog_info ("CONFIG: interface %s area %s prefix-list %s passive", - argv[0], argv[1], argv[2]); - - return ospf6_interface_bind_area (vty, argv[0], argv[1], argv[2], 1); -} - -DEFUN (ospf6_interface_area, - ospf6_interface_area_cmd, - "interface IFNAME area A.B.C.D", - "Enable routing on an IPv6 interface\n" - IFNAME_STR - "Set the OSPF6 area ID\n" - "OSPF6 area ID in IPv4 address notation\n" +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" ) { - struct interface *ifp; - struct ospf6_interface *o6i; - int passive; - char *plist_name; + 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; - if (IS_OSPF6_DUMP_CONFIG) - zlog_info ("CONFIG: interface %s area %s", - argv[0], argv[1]); + OSPF6_CMD_CHECK_RUNNING (); - ifp = if_get_by_name (argv[0]); - o6i = (struct ospf6_interface *) ifp->info; - if (o6i) + if (argc > 2) { - passive = CHECK_FLAG (o6i->flag, OSPF6_INTERFACE_FLAG_PASSIVE); - plist_name = o6i->plist_name; + 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) { - passive = 0; - plist_name = NULL; + vty_out (vty, "Advertising Router is not parsable: %s%s", + argv[1], VTY_NEWLINE); + return CMD_SUCCESS; } - return ospf6_interface_bind_area (vty, argv[0], argv[1], - plist_name, passive); -} - -DEFUN (ospf6_interface_area_passive, - ospf6_interface_area_passive_cmd, - "interface IFNAME area A.B.C.D passive", - "Enable routing on an IPv6 interface\n" - IFNAME_STR - "Set the OSPF6 area ID\n" - "OSPF6 area ID in IPv4 address notation\n" - OSPF6_PASSIVE_STR - ) -{ - if (IS_OSPF6_DUMP_CONFIG) - zlog_info ("CONFIG: interface %s area %s passive", - argv[0], argv[1]); + 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 ospf6_interface_bind_area (vty, argv[0], argv[1], NULL, 1); + return CMD_SUCCESS; } -DEFUN (no_ospf6_interface_area, - no_ospf6_interface_area_cmd, - "no interface IFNAME area A.B.C.D", - NO_STR - "Disable routing on an IPv6 interface\n" - IFNAME_STR) +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" + ) { - struct interface *ifp; - struct ospf6_interface *o6i; - struct ospf6 *o6; - u_int32_t area_id; + 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; - o6 = (struct ospf6 *) vty->index; + OSPF6_CMD_CHECK_RUNNING (); - ifp = if_lookup_by_name (argv[0]); - if (!ifp) - return CMD_ERR_NO_MATCH; + 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; - o6i = (struct ospf6_interface *) ifp->info; - if (!o6i) - return CMD_SUCCESS; + if (showfunc == ospf6_lsa_show_summary) + ospf6_lsa_show_summary_header (vty); - /* parse Area-ID */ - if (inet_pton (AF_INET, argv[1], &area_id) != 1) + if ((inet_pton (AF_INET, argv[0], &id)) != 1) { - vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VTY_NEWLINE); - return CMD_ERR_AMBIGUOUS; + vty_out (vty, "Link state ID is not parsable: %s%s", + argv[1], VTY_NEWLINE); + return CMD_SUCCESS; } - if (o6i->area->area_id != area_id) + if ((inet_pton (AF_INET, argv[1], &router)) != 1) { - vty_out (vty, "Wrong Area-ID: %s aready attached to area %s%s", - o6i->interface->name, o6i->area->str, VTY_NEWLINE); - return CMD_ERR_NOTHING_TODO; + vty_out (vty, "Advertising Router is not parsable: %s%s", + argv[1], VTY_NEWLINE); + return CMD_SUCCESS; } - if (o6i->area) - thread_execute (master, interface_down, o6i, 0); - - listnode_delete (o6i->area->if_list, o6i); - o6i->area = (struct ospf6_area *) NULL; + 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; } -DEFUN (ospf6_area_range, - ospf6_area_range_cmd, - "area A.B.C.D range X:X::X:X/M", - "OSPFv3 area parameters\n" - "OSPFv3 area ID in IPv4 address format\n" - "Summarize routes matching address/mask (border routers only)\n" - "IPv6 address range\n") +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" + ) { - struct ospf6 *o6; - struct ospf6_area *o6a; - u_int32_t area_id; - int ret; + 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 (); - o6 = (struct ospf6 *) vty->index; - inet_pton (AF_INET, argv[0], &area_id); - o6a = ospf6_area_lookup (area_id, o6); - if (! o6a) + if (argc > 3) { - vty_out (vty, "No such area%s", VTY_NEWLINE); - return CMD_ERR_NO_MATCH; + 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; } - ret = str2prefix_ipv6 (argv[1], &o6a->area_range); - if (ret <= 0) + if ((inet_pton (AF_INET, argv[2], &router)) != 1) { - vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE); - return CMD_WARNING; + 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; } -DEFUN (ospf6_passive_interface, - ospf6_passive_interface_cmd, - "passive-interface IFNAME", - OSPF6_PASSIVE_STR - IFNAME_STR) +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" + ) { - struct interface *ifp; - struct ospf6_interface *o6i; + listnode i, j; + struct ospf6 *o = ospf6; + void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL; - ifp = if_get_by_name (argv[0]); - if (ifp->info) - o6i = (struct ospf6_interface *) ifp->info; + 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 - o6i = ospf6_interface_create (ifp); + showfunc = ospf6_lsa_show_summary; - SET_FLAG (o6i->flag, OSPF6_INTERFACE_FLAG_PASSIVE); + if (showfunc == ospf6_lsa_show_summary) + ospf6_lsa_show_summary_header (vty); - if (o6i->thread_send_hello) + 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)) { - thread_cancel (o6i->thread_send_hello); - o6i->thread_send_hello = (struct thread *) NULL; + 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; } -DEFUN (no_ospf6_passive_interface, - no_ospf6_passive_interface_cmd, - "no passive-interface IFNAME", - NO_STR - OSPF6_PASSIVE_STR - IFNAME_STR) +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" + ) { - struct interface *ifp; - struct ospf6_interface *o6i; + listnode i, j; + struct ospf6 *o = ospf6; + void (*showfunc) (struct vty *, struct ospf6_lsa *) = NULL; + u_int16_t type = 0; - ifp = if_lookup_by_name (argv[0]); - if (! ifp) - return CMD_ERR_NO_MATCH; - - o6i = (struct ospf6_interface *) ifp->info; - UNSET_FLAG (o6i->flag, OSPF6_INTERFACE_FLAG_PASSIVE); - if (o6i->thread_send_hello == NULL) - thread_add_event (master, ospf6_send_hello, o6i, 0); - - return CMD_SUCCESS; -} - -#ifdef HAVE_SETPROCTITLE -extern int _argc; -extern char **_argv; - -DEFUN (set_proctitle, - set_proctitle_cmd, - "set proctitle (version|normal|none)", - "Set command\n" - "Process title\n" - "Version information\n" - "Normal command-line options\n" - "Just program name\n") -{ - int i; - char buf[64], tmp[64]; + OSPF6_CMD_CHECK_RUNNING (); - if (strncmp (argv[0], "v", 1) == 0) + if (argc > 1) { - proctitle_mode = 1; - setproctitle ("%s Zebra: %s", OSPF6_DAEMON_VERSION, QUAGGA_VERSION); + 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 if (strncmp (argv[0], "nor", 3) == 0) + 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)) { - proctitle_mode = 0; - memset (tmp, 0, sizeof (tmp)); - memset (buf, 0, sizeof (buf)); - for (i = 0; i < _argc; i++) - { - snprintf (buf, sizeof (buf), "%s%s ", tmp, _argv[i]); - memcpy (&tmp, &buf, sizeof (tmp)); - } - setproctitle (buf); + struct ospf6_area *oa = (struct ospf6_area *) getdata (i); + LSDB_FOREACH_LSA_TR (vty, showfunc, oa->lsdb, type, o->router_id); } - else if (strncmp (argv[0], "non", 3) == 0) + for (i = listhead (o->area_list); i; nextnode (i)) { - proctitle_mode = -1; - setproctitle (NULL); + 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); + } } - else - return CMD_ERR_NO_MATCH; return CMD_SUCCESS; } -#endif /* HAVE_SETPROCTITLE */ -/* OSPF configuration write function. */ -int -ospf6_config_write (struct vty *vty) +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 j, k; - char buf[64]; - struct ospf6_area *area; - struct ospf6_interface *o6i; + 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; - if (proctitle_mode == 1) - vty_out (vty, "set proctitle version%s", VTY_NEWLINE); - else if (proctitle_mode == -1) - vty_out (vty, "set proctitle none%s", VTY_NEWLINE); - - vty_out (vty, "!%s", VTY_NEWLINE); - - if (! ospf6) - return 0; - - /* OSPFv6 configuration. */ - if (!ospf6) - return CMD_SUCCESS; - - inet_ntop (AF_INET, &ospf6->router_id, buf, sizeof (buf)); - vty_out (vty, "router ospf6%s", VTY_NEWLINE); - vty_out (vty, " router-id %s%s", buf, VTY_NEWLINE); + OSPF6_CMD_CHECK_RUNNING (); - ospf6_redistribute_config_write (vty); - ospf6_damp_config_write (vty); + 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; + } - for (j = listhead (ospf6->area_list); j; nextnode (j)) + LSDB_FOREACH_LSA_TIR (vty, showfunc, o->lsdb, type, id, o->router_id); + for (i = listhead (o->area_list); i; nextnode (i)) { - area = (struct ospf6_area *)getdata (j); - for (k = listhead (area->if_list); k; nextnode (k)) + 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)) { - o6i = (struct ospf6_interface *) getdata (k); - vty_out (vty, " interface %s area %s%s", - o6i->interface->name, area->str, VTY_NEWLINE); + struct ospf6_interface *oi = (struct ospf6_interface *) getdata (j); + LSDB_FOREACH_LSA_TIR (vty, showfunc, oi->lsdb, type, id, o->router_id); } } - vty_out (vty, "!%s", VTY_NEWLINE); - return 0; + + return CMD_SUCCESS; } -/* OSPF6 node structure. */ -struct cmd_node ospf6_node = -{ - OSPF6_NODE, - "%s(config-ospf6)# ", - vtysh: 1 -}; +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 ospf6 top node. */ - install_node (&ospf6_node, ospf6_config_write); + 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_ipv6_ospf6_cmd); install_element (VIEW_NODE, &show_version_ospf6_cmd); - install_element (ENABLE_NODE, &show_ipv6_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, &reload_cmd); - install_element (CONFIG_NODE, &router_ospf6_cmd); - install_element (CONFIG_NODE, &interface_cmd); - install_element (CONFIG_NODE, &no_interface_cmd); -#ifdef OSPF6_STATISTICS - install_element (VIEW_NODE, &show_ipv6_ospf6_statistics_cmd); - install_element (ENABLE_NODE, &show_ipv6_ospf6_statistics_cmd); -#endif /* OSPF6_STATISTICS */ -#ifdef OSPF6_GARBAGE_COLLECT - install_element (ENABLE_NODE, &garbage_collection_cmd); -#endif /* OSPF6_GARBAGE_COLLECT */ -#ifdef HAVE_SETPROCTITLE - install_element (CONFIG_NODE, &set_proctitle_cmd); -#endif /* HAVE_SETPROCTITLE */ - - install_default (OSPF6_NODE); - install_element (OSPF6_NODE, &ospf6_router_id_cmd); - install_element (OSPF6_NODE, &ospf6_interface_area_cmd); - install_element (OSPF6_NODE, &ospf6_interface_area_passive_cmd); - install_element (OSPF6_NODE, &ospf6_interface_area_plist_cmd); - install_element (OSPF6_NODE, &ospf6_interface_area_plist_passive_cmd); - install_element (OSPF6_NODE, &no_ospf6_interface_area_cmd); - install_element (OSPF6_NODE, &ospf6_passive_interface_cmd); - install_element (OSPF6_NODE, &no_ospf6_passive_interface_cmd); - install_element (OSPF6_NODE, &ospf6_area_range_cmd); - - /* Make empty list of top list. */ - if_init (); - - /* Install access list */ - access_list_init (); - - /* Install prefix list */ - prefix_list_init (); - - ospf6_dump_init (); - -#ifdef HAVE_OSPF6_DAMP - ospf6_damp_init (); -#endif /*HAVE_OSPF6_DAMP*/ - - ospf6_hook_init (); - ospf6_lsa_init (); + 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 (); @@ -776,53 +1256,14 @@ ospf6_init () ospf6_neighbor_init (); ospf6_zebra_init (); - ospf6_routemap_init (); - ospf6_lsdb_init (); - + ospf6_lsa_init (); ospf6_spf_init (); - ospf6_intra_init (); - ospf6_abr_init (); ospf6_asbr_init (); -} - -void -ospf6_terminate () -{ - /* stop ospf6 */ - ospf6_stop (); - /* log */ - zlog (NULL, LOG_INFO, "OSPF6d terminated"); + /* Make ospf protocol socket. */ + ospf6_serv_sock (); + thread_add_read (master, ospf6_receive, NULL, ospf6_sock); } -void -ospf6_maxage_remover () -{ -#if 0 - if (IS_OSPF6_DUMP_LSDB) - zlog_info ("MaxAge Remover"); -#endif - - ospf6_top_schedule_maxage_remover (NULL, 0, ospf6); - (*ospf6->foreach_area) (ospf6, NULL, 0, - ospf6_area_schedule_maxage_remover); - (*ospf6->foreach_if) (ospf6, NULL, 0, - ospf6_interface_schedule_maxage_remover); -} - - - -void * -ospf6_lsa_get_scope (u_int16_t type, struct ospf6_interface *o6i) -{ - if (OSPF6_LSA_IS_SCOPE_LINKLOCAL (ntohs (type))) - return o6i; - else if (OSPF6_LSA_IS_SCOPE_AREA (ntohs (type))) - return o6i->area; - else if (OSPF6_LSA_IS_SCOPE_AS (ntohs (type))) - return o6i->area->ospf6; - else - return NULL; -} |