ospf6_top.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:17k
源码类别:

网络

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2003 Yasuhiro Ohara
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2, or (at your option) any
  9.  * later version.
  10.  *
  11.  * GNU Zebra is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14.  * General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with GNU Zebra; see the file COPYING.  If not, write to the 
  18.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
  19.  * Boston, MA 02111-1307, USA.  
  20.  */
  21. #include <zebra.h>
  22. #include "log.h"
  23. #include "memory.h"
  24. #include "vty.h"
  25. #include "linklist.h"
  26. #include "prefix.h"
  27. #include "table.h"
  28. #include "thread.h"
  29. #include "command.h"
  30. #include "ospf6_proto.h"
  31. #include "ospf6_message.h"
  32. #include "ospf6_lsa.h"
  33. #include "ospf6_lsdb.h"
  34. #include "ospf6_route.h"
  35. #include "ospf6_zebra.h"
  36. #include "ospf6_top.h"
  37. #include "ospf6_area.h"
  38. #include "ospf6_interface.h"
  39. #include "ospf6_neighbor.h"
  40. #include "ospf6_flood.h"
  41. #include "ospf6_asbr.h"
  42. #include "ospf6_abr.h"
  43. #include "ospf6_intra.h"
  44. #include "ospf6d.h"
  45. /* global ospf6d variable */
  46. struct ospf6 *ospf6;
  47. void
  48. ospf6_top_lsdb_hook_add (struct ospf6_lsa *lsa)
  49. {
  50.   switch (ntohs (lsa->header->type))
  51.     {
  52.       case OSPF6_LSTYPE_AS_EXTERNAL:
  53.         ospf6_asbr_lsa_add (lsa);
  54.         break;
  55.       default:
  56.         break;
  57.     }
  58. }
  59. void
  60. ospf6_top_lsdb_hook_remove (struct ospf6_lsa *lsa)
  61. {
  62.   switch (ntohs (lsa->header->type))
  63.     {
  64.       case OSPF6_LSTYPE_AS_EXTERNAL:
  65.         ospf6_asbr_lsa_remove (lsa);
  66.         break;
  67.       default:
  68.         break;
  69.     }
  70. }
  71. void
  72. ospf6_top_route_hook_add (struct ospf6_route *route)
  73. {
  74.   ospf6_abr_originate_summary (route);
  75.   ospf6_zebra_route_update_add (route);
  76. }
  77. void
  78. ospf6_top_route_hook_remove (struct ospf6_route *route)
  79. {
  80.   ospf6_abr_originate_summary (route);
  81.   ospf6_zebra_route_update_remove (route);
  82. }
  83. void
  84. ospf6_top_brouter_hook_add (struct ospf6_route *route)
  85. {
  86.   ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
  87.   ospf6_asbr_lsentry_add (route);
  88.   ospf6_abr_originate_summary (route);
  89. }
  90. void
  91. ospf6_top_brouter_hook_remove (struct ospf6_route *route)
  92. {
  93.   ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
  94.   ospf6_asbr_lsentry_remove (route);
  95.   ospf6_abr_originate_summary (route);
  96. }
  97. struct ospf6 *
  98. ospf6_create ()
  99. {
  100.   struct ospf6 *o;
  101.   o = XMALLOC (MTYPE_OSPF6_TOP, sizeof (struct ospf6));
  102.   memset (o, 0, sizeof (struct ospf6));
  103.   /* initialize */
  104.   gettimeofday (&o->starttime, (struct timezone *) NULL);
  105.   o->area_list = list_new ();
  106.   o->area_list->cmp = ospf6_area_cmp;
  107.   o->lsdb = ospf6_lsdb_create (o);
  108.   o->lsdb_self = ospf6_lsdb_create (o);
  109.   o->lsdb->hook_add = ospf6_top_lsdb_hook_add;
  110.   o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove;
  111.   o->route_table = ospf6_route_table_create ();
  112.   o->route_table->hook_add = ospf6_top_route_hook_add;
  113.   o->route_table->hook_remove = ospf6_top_route_hook_remove;
  114.   o->brouter_table = ospf6_route_table_create ();
  115.   o->brouter_table->hook_add = ospf6_top_brouter_hook_add;
  116.   o->brouter_table->hook_remove = ospf6_top_brouter_hook_remove;
  117.   o->external_table = ospf6_route_table_create ();
  118.   o->external_id_table = route_table_init ();
  119.   return o;
  120. }
  121. void
  122. ospf6_delete (struct ospf6 *o)
  123. {
  124.   listnode i;
  125.   struct ospf6_area *oa;
  126.   for (i = listhead (o->area_list); i; nextnode (i))
  127.     {
  128.       oa = (struct ospf6_area *) getdata (i);
  129.       ospf6_area_delete (oa);
  130.     }
  131.   ospf6_lsdb_delete (o->lsdb);
  132.   ospf6_lsdb_delete (o->lsdb_self);
  133.   ospf6_route_table_delete (o->route_table);
  134.   ospf6_route_table_delete (o->brouter_table);
  135.   ospf6_route_table_delete (o->external_table);
  136.   route_table_finish (o->external_id_table);
  137.   XFREE (MTYPE_OSPF6_TOP, o);
  138. }
  139. void
  140. ospf6_enable (struct ospf6 *o)
  141. {
  142.   listnode i;
  143.   struct ospf6_area *oa;
  144.   if (CHECK_FLAG (o->flag, OSPF6_DISABLED))
  145.     {
  146.       UNSET_FLAG (o->flag, OSPF6_DISABLED);
  147.       for (i = listhead (o->area_list); i; nextnode (i))
  148.         {
  149.           oa = (struct ospf6_area *) getdata (i);
  150.           ospf6_area_enable (oa);
  151.         }
  152.     }
  153. }
  154. void
  155. ospf6_disable (struct ospf6 *o)
  156. {
  157.   listnode i;
  158.   struct ospf6_area *oa;
  159.   if (! CHECK_FLAG (o->flag, OSPF6_DISABLED))
  160.     {
  161.       SET_FLAG (o->flag, OSPF6_DISABLED);
  162.       for (i = listhead (o->area_list); i; nextnode (i))
  163.         {
  164.           oa = (struct ospf6_area *) getdata (i);
  165.           ospf6_area_disable (oa);
  166.         }
  167.       ospf6_lsdb_remove_all (o->lsdb);
  168.       ospf6_route_remove_all (o->route_table);
  169.       ospf6_route_remove_all (o->brouter_table);
  170.     }
  171. }
  172. int
  173. ospf6_maxage_remover (struct thread *thread)
  174. {
  175.   struct ospf6 *o = (struct ospf6 *) THREAD_ARG (thread);
  176.   struct ospf6_area *oa;
  177.   struct ospf6_interface *oi;
  178.   struct ospf6_neighbor *on;
  179.   listnode i, j, k;
  180.   o->maxage_remover = (struct thread *) NULL;
  181.   for (i = listhead (o->area_list); i; nextnode (i))
  182.     {
  183.       oa = (struct ospf6_area *) getdata (i);
  184.       for (j = listhead (oa->if_list); j; nextnode (j))
  185.         {
  186.           oi = (struct ospf6_interface *) getdata (j);
  187.           for (k = listhead (oi->neighbor_list); k; nextnode (k))
  188.             {
  189.               on = (struct ospf6_neighbor *) getdata (k);
  190.               if (on->state != OSPF6_NEIGHBOR_EXCHANGE &&
  191.                   on->state != OSPF6_NEIGHBOR_LOADING)
  192.                 continue;
  193.               return 0;
  194.             }
  195.         }
  196.     }
  197.   for (i = listhead (o->area_list); i; nextnode (i))
  198.     {
  199.       oa = (struct ospf6_area *) getdata (i);
  200.       for (j = listhead (oa->if_list); j; nextnode (j))
  201.         {
  202.           oi = (struct ospf6_interface *) getdata (j);
  203.           OSPF6_LSDB_MAXAGE_REMOVER (oi->lsdb);
  204.         }
  205.       OSPF6_LSDB_MAXAGE_REMOVER (oa->lsdb);
  206.     }
  207.   OSPF6_LSDB_MAXAGE_REMOVER (o->lsdb);
  208.   return 0;
  209. }
  210. void
  211. ospf6_maxage_remove (struct ospf6 *o)
  212. {
  213.   if (o && ! o->maxage_remover)
  214.     o->maxage_remover = thread_add_event (master, ospf6_maxage_remover, o, 0);
  215. }
  216. /* start ospf6 */
  217. DEFUN (router_ospf6,
  218.        router_ospf6_cmd,
  219.        "router ospf6",
  220.        ROUTER_STR
  221.        OSPF6_STR)
  222. {
  223.   if (ospf6 == NULL)
  224.     ospf6 = ospf6_create ();
  225.   if (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
  226.     ospf6_enable (ospf6);
  227.   /* set current ospf point. */
  228.   vty->node = OSPF6_NODE;
  229.   vty->index = ospf6;
  230.   return CMD_SUCCESS;
  231. }
  232. /* stop ospf6 */
  233. DEFUN (no_router_ospf6,
  234.        no_router_ospf6_cmd,
  235.        "no router ospf6",
  236.        NO_STR
  237.        OSPF6_ROUTER_STR)
  238. {
  239.   if (ospf6 == NULL || CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
  240.     vty_out (vty, "OSPFv3 is not running%s", VNL);
  241.   else
  242.     ospf6_disable (ospf6);
  243.   /* return to config node . */
  244.   vty->node = CONFIG_NODE;
  245.   vty->index = NULL;
  246.   return CMD_SUCCESS;
  247. }
  248. /* change Router_ID commands. */
  249. DEFUN (ospf6_router_id,
  250.        ospf6_router_id_cmd,
  251.        "router-id A.B.C.D",
  252.        "Configure OSPF Router-IDn"
  253.        V4NOTATION_STR)
  254. {
  255.   int ret;
  256.   u_int32_t router_id;
  257.   struct ospf6 *o;
  258.   o = (struct ospf6 *) vty->index;
  259.   ret = inet_pton (AF_INET, argv[0], &router_id);
  260.   if (ret == 0)
  261.     {
  262.       vty_out (vty, "malformed OSPF Router-ID: %s%s", argv[0], VNL);
  263.       return CMD_SUCCESS;
  264.     }
  265.   o->router_id = router_id;
  266.   return CMD_SUCCESS;
  267. }
  268. DEFUN (ospf6_interface_area,
  269.        ospf6_interface_area_cmd,
  270.        "interface IFNAME area A.B.C.D",
  271.        "Enable routing on an IPv6 interfacen"
  272.        IFNAME_STR
  273.        "Specify the OSPF6 area IDn"
  274.        "OSPF6 area ID in IPv4 address notationn"
  275.       )
  276. {
  277.   struct ospf6 *o;
  278.   struct ospf6_area *oa;
  279.   struct ospf6_interface *oi;
  280.   struct interface *ifp;
  281.   u_int32_t area_id;
  282.   o = (struct ospf6 *) vty->index;
  283.   /* find/create ospf6 interface */
  284.   ifp = if_get_by_name (argv[0]);
  285.   oi = (struct ospf6_interface *) ifp->info;
  286.   if (oi == NULL)
  287.     oi = ospf6_interface_create (ifp);
  288.   if (oi->area)
  289.     {
  290.       vty_out (vty, "%s already attached to Area %s%s",
  291.                oi->interface->name, oi->area->name, VNL);
  292.       return CMD_SUCCESS;
  293.     }
  294.   /* parse Area-ID */
  295.   if (inet_pton (AF_INET, argv[1], &area_id) != 1)
  296.     {
  297.       vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
  298.       return CMD_SUCCESS;
  299.     }
  300.   /* find/create ospf6 area */
  301.   oa = ospf6_area_lookup (area_id, o);
  302.   if (oa == NULL)
  303.     oa = ospf6_area_create (area_id, o);
  304.   /* attach interface to area */
  305.   listnode_add (oa->if_list, oi); /* sort ?? */
  306.   oi->area = oa;
  307.   SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
  308.   /* start up */
  309.   thread_add_event (master, interface_up, oi, 0);
  310.   /* If the router is ABR, originate summary routes */
  311.   if (ospf6_is_router_abr (o))
  312.     ospf6_abr_enable_area (oa);
  313.   return CMD_SUCCESS;
  314. }
  315. DEFUN (no_ospf6_interface_area,
  316.        no_ospf6_interface_area_cmd,
  317.        "no interface IFNAME area A.B.C.D",
  318.        NO_STR
  319.        "Disable routing on an IPv6 interfacen"
  320.        IFNAME_STR
  321.        "Specify the OSPF6 area IDn"
  322.        "OSPF6 area ID in IPv4 address notationn"
  323.        )
  324. {
  325.   struct ospf6 *o;
  326.   struct ospf6_interface *oi;
  327.   struct ospf6_area *oa;
  328.   struct interface *ifp;
  329.   u_int32_t area_id;
  330.   o = (struct ospf6 *) vty->index;
  331.   ifp = if_lookup_by_name (argv[0]);
  332.   if (ifp == NULL)
  333.     {
  334.       vty_out (vty, "No such interface %s%s", argv[0], VNL);
  335.       return CMD_SUCCESS;
  336.     }
  337.   oi = (struct ospf6_interface *) ifp->info;
  338.   if (oi == NULL)
  339.     {
  340.       vty_out (vty, "Interface %s not enabled%s", ifp->name, VNL);
  341.       return CMD_SUCCESS;
  342.     }
  343.   /* parse Area-ID */
  344.   if (inet_pton (AF_INET, argv[1], &area_id) != 1)
  345.     {
  346.       vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
  347.       return CMD_SUCCESS;
  348.     }
  349.   if (oi->area->area_id != area_id)
  350.     {
  351.       vty_out (vty, "Wrong Area-ID: %s is attached to area %s%s",
  352.                oi->interface->name, oi->area->name, VNL);
  353.       return CMD_SUCCESS;
  354.     }
  355.   thread_execute (master, interface_down, oi, 0);
  356.   oa = oi->area;
  357.   listnode_delete (oi->area->if_list, oi);
  358.   oi->area = (struct ospf6_area *) NULL;
  359.   /* Withdraw inter-area routes from this area, if necessary */
  360.   if (oa->if_list->count == 0)
  361.     {
  362.       UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
  363.       ospf6_abr_disable_area (oa);
  364.     }
  365.   return CMD_SUCCESS;
  366. }
  367. void
  368. ospf6_show (struct vty *vty, struct ospf6 *o)
  369. {
  370.   listnode n;
  371.   struct ospf6_area *oa;
  372.   char router_id[16], duration[32];
  373.   struct timeval now, running;
  374.   /* process id, router id */
  375.   inet_ntop (AF_INET, &o->router_id, router_id, sizeof (router_id));
  376.   vty_out (vty, " OSPFv3 Routing Process (0) with Router-ID %s%s",
  377.            router_id, VNL);
  378.   /* running time */
  379.   gettimeofday (&now, (struct timezone *)NULL);
  380.   timersub (&now, &o->starttime, &running);
  381.   timerstring (&running, duration, sizeof (duration));
  382.   vty_out (vty, " Running %s%s", duration, VNL);
  383.   /* Redistribute configuration */
  384.   /* XXX */
  385.   /* LSAs */
  386.   vty_out (vty, " Number of AS scoped LSAs is %u%s",
  387.            o->lsdb->count, VNL);
  388.   /* Areas */
  389.   vty_out (vty, " Number of areas in this router is %u%s",
  390.            listcount (o->area_list), VNL);
  391.   for (n = listhead (o->area_list); n; nextnode (n))
  392.     {
  393.       oa = (struct ospf6_area *) getdata (n);
  394.       ospf6_area_show (vty, oa);
  395.     }
  396. }
  397. /* show top level structures */
  398. DEFUN (show_ipv6_ospf6,
  399.        show_ipv6_ospf6_cmd,
  400.        "show ipv6 ospf6",
  401.        SHOW_STR
  402.        IP6_STR
  403.        OSPF6_STR)
  404. {
  405.   OSPF6_CMD_CHECK_RUNNING ();
  406.   ospf6_show (vty, ospf6);
  407.   return CMD_SUCCESS;
  408. }
  409. DEFUN (show_ipv6_ospf6_route,
  410.        show_ipv6_ospf6_route_cmd,
  411.        "show ipv6 ospf6 route",
  412.        SHOW_STR
  413.        IP6_STR
  414.        OSPF6_STR
  415.        ROUTE_STR
  416.        )
  417. {
  418.   ospf6_route_table_show (vty, argc, argv, ospf6->route_table);
  419.   return CMD_SUCCESS;
  420. }
  421. ALIAS (show_ipv6_ospf6_route,
  422.        show_ipv6_ospf6_route_detail_cmd,
  423.        "show ipv6 ospf6 route (X:X::X:X|X:X::X:X/M|detail|summary)",
  424.        SHOW_STR
  425.        IP6_STR
  426.        OSPF6_STR
  427.        ROUTE_STR
  428.        "Specify IPv6 addressn"
  429.        "Specify IPv6 prefixn"
  430.        "Detailed informationn"
  431.        "Summary of route tablen"
  432.        );
  433. DEFUN (show_ipv6_ospf6_route_match,
  434.        show_ipv6_ospf6_route_match_cmd,
  435.        "show ipv6 ospf6 route X:X::X:X/M match",
  436.        SHOW_STR
  437.        IP6_STR
  438.        OSPF6_STR
  439.        ROUTE_STR
  440.        "Specify IPv6 prefixn"
  441.        "Display routes which match the specified routen"
  442.        )
  443. {
  444.   char *sargv[CMD_ARGC_MAX];
  445.   int i, sargc;
  446.   /* copy argv to sargv and then append "match" */
  447.   for (i = 0; i < argc; i++)
  448.     sargv[i] = argv[i];
  449.   sargc = argc;
  450.   sargv[sargc++] = "match";
  451.   sargv[sargc] = NULL;
  452.   ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
  453.   return CMD_SUCCESS;
  454. }
  455. DEFUN (show_ipv6_ospf6_route_match_detail,
  456.        show_ipv6_ospf6_route_match_detail_cmd,
  457.        "show ipv6 ospf6 route X:X::X:X/M match detail",
  458.        SHOW_STR
  459.        IP6_STR
  460.        OSPF6_STR
  461.        ROUTE_STR
  462.        "Specify IPv6 prefixn"
  463.        "Display routes which match the specified routen"
  464.        "Detailed informationn"
  465.        )
  466. {
  467.   char *sargv[CMD_ARGC_MAX];
  468.   int i, sargc;
  469.   /* copy argv to sargv and then append "match" and "detail" */
  470.   for (i = 0; i < argc; i++)
  471.     sargv[i] = argv[i];
  472.   sargc = argc;
  473.   sargv[sargc++] = "match";
  474.   sargv[sargc++] = "detail";
  475.   sargv[sargc] = NULL;
  476.   ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
  477.   return CMD_SUCCESS;
  478. }
  479. ALIAS (show_ipv6_ospf6_route,
  480.        show_ipv6_ospf6_route_type_cmd,
  481.        "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2)",
  482.        SHOW_STR
  483.        IP6_STR
  484.        OSPF6_STR
  485.        ROUTE_STR
  486.        "Dispaly Intra-Area routesn"
  487.        "Dispaly Inter-Area routesn"
  488.        "Dispaly Type-1 External routesn"
  489.        "Dispaly Type-2 External routesn"
  490.        );
  491. DEFUN (show_ipv6_ospf6_route_type_detail,
  492.        show_ipv6_ospf6_route_type_detail_cmd,
  493.        "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2) detail",
  494.        SHOW_STR
  495.        IP6_STR
  496.        OSPF6_STR
  497.        ROUTE_STR
  498.        "Dispaly Intra-Area routesn"
  499.        "Dispaly Inter-Area routesn"
  500.        "Dispaly Type-1 External routesn"
  501.        "Dispaly Type-2 External routesn"
  502.        "Detailed informationn"
  503.        )
  504. {
  505.   char *sargv[CMD_ARGC_MAX];
  506.   int i, sargc;
  507.   /* copy argv to sargv and then append "detail" */
  508.   for (i = 0; i < argc; i++)
  509.     sargv[i] = argv[i];
  510.   sargc = argc;
  511.   sargv[sargc++] = "detail";
  512.   sargv[sargc] = NULL;
  513.   ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
  514.   return CMD_SUCCESS;
  515. }
  516. /* OSPF configuration write function. */
  517. int
  518. config_write_ospf6 (struct vty *vty)
  519. {
  520.   char router_id[16];
  521.   listnode j, k;
  522.   struct ospf6_area *oa;
  523.   struct ospf6_interface *oi;
  524.   /* OSPFv6 configuration. */
  525.   if (ospf6 == NULL)
  526.     return CMD_SUCCESS;
  527.   if (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
  528.     return CMD_SUCCESS;
  529.   inet_ntop (AF_INET, &ospf6->router_id, router_id, sizeof (router_id));
  530.   vty_out (vty, "router ospf6%s", VNL);
  531.   vty_out (vty, " router-id %s%s", router_id, VNL);
  532.   ospf6_redistribute_config_write (vty);
  533.   ospf6_area_config_write (vty);
  534.   for (j = listhead (ospf6->area_list); j; nextnode (j))
  535.     {
  536.       oa = (struct ospf6_area *) getdata (j);
  537.       for (k = listhead (oa->if_list); k; nextnode (k))
  538.         {
  539.           oi = (struct ospf6_interface *) getdata (k);
  540.           vty_out (vty, " interface %s area %s%s",
  541.                    oi->interface->name, oa->name, VNL);
  542.         }
  543.     }
  544.   vty_out (vty, "!%s", VNL);
  545.   return 0;
  546. }
  547. /* OSPF6 node structure. */
  548. struct cmd_node ospf6_node =
  549. {
  550.   OSPF6_NODE,
  551.   "%s(config-ospf6)# ",
  552.   1 /* VTYSH */
  553. };
  554. /* Install ospf related commands. */
  555. void
  556. ospf6_top_init ()
  557. {
  558.   /* Install ospf6 top node. */
  559.   install_node (&ospf6_node, config_write_ospf6);
  560.   install_element (VIEW_NODE, &show_ipv6_ospf6_cmd);
  561.   install_element (ENABLE_NODE, &show_ipv6_ospf6_cmd);
  562.   install_element (CONFIG_NODE, &router_ospf6_cmd);
  563.   install_element (VIEW_NODE, &show_ipv6_ospf6_route_cmd);
  564.   install_element (VIEW_NODE, &show_ipv6_ospf6_route_detail_cmd);
  565.   install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_cmd);
  566.   install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
  567.   install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_cmd);
  568.   install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
  569.   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_cmd);
  570.   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_detail_cmd);
  571.   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_cmd);
  572.   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
  573.   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_cmd);
  574.   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
  575.   install_default (OSPF6_NODE);
  576.   install_element (OSPF6_NODE, &ospf6_router_id_cmd);
  577.   install_element (OSPF6_NODE, &ospf6_interface_area_cmd);
  578.   install_element (OSPF6_NODE, &no_ospf6_interface_area_cmd);
  579.   install_element (OSPF6_NODE, &no_router_ospf6_cmd);
  580. }