usbmodeswitch: Updated to v.1.2.6 from shibby's branch.
[tomato.git] / release / src / router / zebra / ospf6d / ospf6_area.c
blobf4cb039ef0e50f2b43c8efe5b1b48c74673f6cd9
1 /*
2 * Copyright (C) 2003 Yasuhiro Ohara
4 * This file is part of GNU Zebra.
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.
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.
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.
22 #include <zebra.h>
24 #include "log.h"
25 #include "memory.h"
26 #include "linklist.h"
27 #include "thread.h"
28 #include "vty.h"
29 #include "command.h"
30 #include "if.h"
31 #include "prefix.h"
32 #include "table.h"
33 #include "plist.h"
34 #include "filter.h"
36 #include "ospf6_proto.h"
37 #include "ospf6_lsa.h"
38 #include "ospf6_lsdb.h"
39 #include "ospf6_route.h"
40 #include "ospf6_spf.h"
41 #include "ospf6_top.h"
42 #include "ospf6_area.h"
43 #include "ospf6_interface.h"
44 #include "ospf6_intra.h"
45 #include "ospf6_abr.h"
46 #include "ospf6d.h"
48 int
49 ospf6_area_cmp (void *va, void *vb)
51 struct ospf6_area *oa = (struct ospf6_area *) va;
52 struct ospf6_area *ob = (struct ospf6_area *) vb;
53 return (ntohl (oa->area_id) < ntohl (ob->area_id) ? -1 : 1);
56 /* schedule routing table recalculation */
57 void
58 ospf6_area_lsdb_hook_add (struct ospf6_lsa *lsa)
60 switch (ntohs (lsa->header->type))
62 case OSPF6_LSTYPE_ROUTER:
63 case OSPF6_LSTYPE_NETWORK:
64 if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
66 zlog_info ("Examin %s", lsa->name);
67 zlog_info ("Schedule SPF Calculation for %s",
68 OSPF6_AREA (lsa->lsdb->data)->name);
70 ospf6_spf_schedule (OSPF6_AREA (lsa->lsdb->data));
71 break;
73 case OSPF6_LSTYPE_INTRA_PREFIX:
74 ospf6_intra_prefix_lsa_add (lsa);
75 break;
77 case OSPF6_LSTYPE_INTER_PREFIX:
78 case OSPF6_LSTYPE_INTER_ROUTER:
79 ospf6_abr_examin_summary (lsa, (struct ospf6_area *) lsa->lsdb->data);
80 break;
82 default:
83 break;
87 void
88 ospf6_area_lsdb_hook_remove (struct ospf6_lsa *lsa)
90 switch (ntohs (lsa->header->type))
92 case OSPF6_LSTYPE_ROUTER:
93 case OSPF6_LSTYPE_NETWORK:
94 if (IS_OSPF6_DEBUG_EXAMIN_TYPE (lsa->header->type))
96 zlog_info ("LSA disappearing: %s", lsa->name);
97 zlog_info ("Schedule SPF Calculation for %s",
98 OSPF6_AREA (lsa->lsdb->data)->name);
100 ospf6_spf_schedule (OSPF6_AREA (lsa->lsdb->data));
101 break;
103 case OSPF6_LSTYPE_INTRA_PREFIX:
104 ospf6_intra_prefix_lsa_remove (lsa);
105 break;
107 case OSPF6_LSTYPE_INTER_PREFIX:
108 case OSPF6_LSTYPE_INTER_ROUTER:
109 ospf6_abr_examin_summary (lsa, (struct ospf6_area *) lsa->lsdb->data);
110 break;
112 default:
113 break;
117 void
118 ospf6_area_route_hook_add (struct ospf6_route *route)
120 struct ospf6_route *copy = ospf6_route_copy (route);
121 ospf6_route_add (copy, ospf6->route_table);
124 void
125 ospf6_area_route_hook_remove (struct ospf6_route *route)
127 struct ospf6_route *copy;
129 copy = ospf6_route_lookup_identical (route, ospf6->route_table);
130 if (copy)
131 ospf6_route_remove (copy, ospf6->route_table);
134 /* Make new area structure */
135 struct ospf6_area *
136 ospf6_area_create (u_int32_t area_id, struct ospf6 *o)
138 struct ospf6_area *oa;
139 struct ospf6_route *route;
141 oa = XCALLOC (MTYPE_OSPF6_AREA, sizeof (struct ospf6_area));
143 inet_ntop (AF_INET, &area_id, oa->name, sizeof (oa->name));
144 oa->area_id = area_id;
145 oa->if_list = list_new ();
147 oa->lsdb = ospf6_lsdb_create (oa);
148 oa->lsdb->hook_add = ospf6_area_lsdb_hook_add;
149 oa->lsdb->hook_remove = ospf6_area_lsdb_hook_remove;
150 oa->lsdb_self = ospf6_lsdb_create (oa);
152 oa->spf_table = ospf6_route_table_create ();
153 oa->route_table = ospf6_route_table_create ();
154 oa->route_table->hook_add = ospf6_area_route_hook_add;
155 oa->route_table->hook_remove = ospf6_area_route_hook_remove;
157 oa->range_table = ospf6_route_table_create ();
158 oa->summary_prefix = ospf6_route_table_create ();
159 oa->summary_router = ospf6_route_table_create ();
161 /* set default options */
162 OSPF6_OPT_SET (oa->options, OSPF6_OPT_V6);
163 OSPF6_OPT_SET (oa->options, OSPF6_OPT_E);
164 OSPF6_OPT_SET (oa->options, OSPF6_OPT_R);
166 oa->ospf6 = o;
167 listnode_add_sort (o->area_list, oa);
169 /* import athoer area's routes as inter-area routes */
170 for (route = ospf6_route_head (o->route_table); route;
171 route = ospf6_route_next (route))
172 ospf6_abr_originate_summary_to_area (route, oa);
174 return oa;
177 void
178 ospf6_area_delete (struct ospf6_area *oa)
180 listnode n;
181 struct ospf6_interface *oi;
183 ospf6_route_table_delete (oa->range_table);
184 ospf6_route_table_delete (oa->summary_prefix);
185 ospf6_route_table_delete (oa->summary_router);
187 /* ospf6 interface list */
188 for (n = listhead (oa->if_list); n; nextnode (n))
190 oi = (struct ospf6_interface *) getdata (n);
191 ospf6_interface_delete (oi);
193 list_delete (oa->if_list);
195 ospf6_lsdb_delete (oa->lsdb);
196 ospf6_lsdb_delete (oa->lsdb_self);
198 ospf6_route_table_delete (oa->spf_table);
199 ospf6_route_table_delete (oa->route_table);
201 #if 0
202 ospf6_spftree_delete (oa->spf_tree);
203 ospf6_route_table_delete (oa->topology_table);
204 #endif /*0*/
206 THREAD_OFF (oa->thread_spf_calculation);
207 THREAD_OFF (oa->thread_route_calculation);
209 listnode_delete (oa->ospf6->area_list, oa);
210 oa->ospf6 = NULL;
212 /* free area */
213 XFREE (MTYPE_OSPF6_AREA, oa);
216 struct ospf6_area *
217 ospf6_area_lookup (u_int32_t area_id, struct ospf6 *ospf6)
219 struct ospf6_area *oa;
220 listnode n;
222 for (n = listhead (ospf6->area_list); n; nextnode (n))
224 oa = (struct ospf6_area *) getdata (n);
225 if (oa->area_id == area_id)
226 return oa;
229 return (struct ospf6_area *) NULL;
232 struct ospf6_area *
233 ospf6_area_get (u_int32_t area_id, struct ospf6 *o)
235 struct ospf6_area *oa;
236 oa = ospf6_area_lookup (area_id, o);
237 if (oa == NULL)
238 oa = ospf6_area_create (area_id, o);
239 return oa;
242 void
243 ospf6_area_enable (struct ospf6_area *oa)
245 listnode i;
246 struct ospf6_interface *oi;
248 SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
250 for (i = listhead (oa->if_list); i; nextnode (i))
252 oi = (struct ospf6_interface *) getdata (i);
253 ospf6_interface_enable (oi);
257 void
258 ospf6_area_disable (struct ospf6_area *oa)
260 listnode i;
261 struct ospf6_interface *oi;
263 UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
265 for (i = listhead (oa->if_list); i; nextnode (i))
267 oi = (struct ospf6_interface *) getdata (i);
268 ospf6_interface_disable (oi);
273 void
274 ospf6_area_show (struct vty *vty, struct ospf6_area *oa)
276 listnode i;
277 struct ospf6_interface *oi;
279 vty_out (vty, " Area %s%s", oa->name, VNL);
280 vty_out (vty, " Number of Area scoped LSAs is %u%s",
281 oa->lsdb->count, VNL);
283 vty_out (vty, " Interface attached to this area:");
284 for (i = listhead (oa->if_list); i; nextnode (i))
286 oi = (struct ospf6_interface *) getdata (i);
287 vty_out (vty, " %s", oi->interface->name);
289 vty_out (vty, "%s", VNL);
293 #define OSPF6_CMD_AREA_LOOKUP(str, oa) \
295 u_int32_t area_id = 0; \
296 if (inet_pton (AF_INET, str, &area_id) != 1) \
298 vty_out (vty, "Malformed Area-ID: %s%s", str, VNL); \
299 return CMD_SUCCESS; \
301 oa = ospf6_area_lookup (area_id, ospf6); \
302 if (oa == NULL) \
304 vty_out (vty, "No such Area: %s%s", str, VNL); \
305 return CMD_SUCCESS; \
309 #define OSPF6_CMD_AREA_GET(str, oa) \
311 u_int32_t area_id = 0; \
312 if (inet_pton (AF_INET, str, &area_id) != 1) \
314 vty_out (vty, "Malformed Area-ID: %s%s", str, VNL); \
315 return CMD_SUCCESS; \
317 oa = ospf6_area_get (area_id, ospf6); \
320 DEFUN (area_range,
321 area_range_cmd,
322 "area A.B.C.D range X:X::X:X/M",
323 "OSPF area parameters\n"
324 OSPF6_AREA_ID_STR
325 "Configured address range\n"
326 "Specify IPv6 prefix\n"
329 int ret;
330 struct ospf6_area *oa;
331 struct prefix prefix;
332 struct ospf6_route *range;
334 OSPF6_CMD_AREA_GET (argv[0], oa);
335 argc--;
336 argv++;
338 ret = str2prefix (argv[0], &prefix);
339 if (ret != 1 || prefix.family != AF_INET6)
341 vty_out (vty, "Malformed argument: %s%s", argv[0], VNL);
342 return CMD_SUCCESS;
344 argc--;
345 argv++;
347 range = ospf6_route_lookup (&prefix, oa->range_table);
348 if (range == NULL)
350 range = ospf6_route_create ();
351 range->type = OSPF6_DEST_TYPE_RANGE;
352 range->prefix = prefix;
355 if (argc)
357 if (! strcmp (argv[0], "not-advertise"))
358 SET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
359 else if (! strcmp (argv[0], "advertise"))
360 UNSET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
363 ospf6_route_add (range, oa->range_table);
364 return CMD_SUCCESS;
367 ALIAS (area_range,
368 area_range_advertise_cmd,
369 "area A.B.C.D range X:X::X:X/M (advertise|not-advertise)",
370 "OSPF area parameters\n"
371 OSPF6_AREA_ID_STR
372 "Configured address range\n"
373 "Specify IPv6 prefix\n"
376 DEFUN (no_area_range,
377 no_area_range_cmd,
378 "no area A.B.C.D range X:X::X:X/M",
379 "OSPF area parameters\n"
380 OSPF6_AREA_ID_STR
381 "Configured address range\n"
382 "Specify IPv6 prefix\n"
385 int ret;
386 struct ospf6_area *oa;
387 struct prefix prefix;
388 struct ospf6_route *range;
390 OSPF6_CMD_AREA_GET (argv[0], oa);
391 argc--;
392 argv++;
394 ret = str2prefix (argv[0], &prefix);
395 if (ret != 1 || prefix.family != AF_INET6)
397 vty_out (vty, "Malformed argument: %s%s", argv[0], VNL);
398 return CMD_SUCCESS;
401 range = ospf6_route_lookup (&prefix, oa->range_table);
402 if (range == NULL)
404 vty_out (vty, "Range %s does not exists.%s", argv[0], VNL);
405 return CMD_SUCCESS;
408 ospf6_route_remove (range, oa->range_table);
409 return CMD_SUCCESS;
412 void
413 ospf6_area_config_write (struct vty *vty)
415 listnode node;
416 struct ospf6_area *oa;
417 struct ospf6_route *range;
418 char buf[128];
420 for (node = listhead (ospf6->area_list); node; nextnode (node))
422 oa = OSPF6_AREA (getdata (node));
424 for (range = ospf6_route_head (oa->range_table); range;
425 range = ospf6_route_next (range))
427 prefix2str (&range->prefix, buf, sizeof (buf));
428 vty_out (vty, " area %s range %s%s", oa->name, buf, VNL);
433 DEFUN (area_filter_list,
434 area_filter_list_cmd,
435 "area A.B.C.D filter-list prefix WORD (in|out)",
436 "OSPFv6 area parameters\n"
437 "OSPFv6 area ID in IP address format\n"
438 "Filter networks between OSPFv6 areas\n"
439 "Filter prefixes between OSPFv6 areas\n"
440 "Name of an IPv6 prefix-list\n"
441 "Filter networks sent to this area\n"
442 "Filter networks sent from this area\n")
444 struct ospf6_area *area;
445 struct prefix_list *plist;
447 OSPF6_CMD_AREA_GET (argv[0], area);
448 argc--;
449 argv++;
451 plist = prefix_list_lookup (AFI_IP6, argv[1]);
452 if (strncmp (argv[2], "in", 2) == 0)
454 PREFIX_LIST_IN (area) = plist;
455 if (PREFIX_NAME_IN (area))
456 free (PREFIX_NAME_IN (area));
458 PREFIX_NAME_IN (area) = strdup (argv[1]);
459 ospf6_abr_reimport (area);
461 else
463 PREFIX_LIST_OUT (area) = plist;
464 if (PREFIX_NAME_OUT (area))
465 free (PREFIX_NAME_OUT (area));
467 PREFIX_NAME_OUT (area) = strdup (argv[1]);
468 ospf6_abr_enable_area (area);
471 return CMD_SUCCESS;
474 DEFUN (no_area_filter_list,
475 no_area_filter_list_cmd,
476 "no area A.B.C.D filter-list prefix WORD (in|out)",
477 NO_STR
478 "OSPFv6 area parameters\n"
479 "OSPFv6 area ID in IP address format\n"
480 "Filter networks between OSPFv6 areas\n"
481 "Filter prefixes between OSPFv6 areas\n"
482 "Name of an IPv6 prefix-list\n"
483 "Filter networks sent to this area\n"
484 "Filter networks sent from this area\n")
486 struct ospf6_area *area;
487 struct prefix_list *plist;
489 OSPF6_CMD_AREA_GET (argv[0], area);
490 argc--;
491 argv++;
493 plist = prefix_list_lookup (AFI_IP6, argv[1]);
494 if (strncmp (argv[2], "in", 2) == 0)
496 if (PREFIX_NAME_IN (area))
497 if (strcmp (PREFIX_NAME_IN (area), argv[1]) != 0)
498 return CMD_SUCCESS;
500 PREFIX_LIST_IN (area) = NULL;
501 if (PREFIX_NAME_IN (area))
502 free (PREFIX_NAME_IN (area));
504 PREFIX_NAME_IN (area) = NULL;
505 ospf6_abr_reimport (area);
507 else
509 if (PREFIX_NAME_OUT (area))
510 if (strcmp (PREFIX_NAME_OUT (area), argv[1]) != 0)
511 return CMD_SUCCESS;
513 PREFIX_LIST_OUT (area) = NULL;
514 if (PREFIX_NAME_OUT (area))
515 free (PREFIX_NAME_OUT (area));
517 PREFIX_NAME_OUT (area) = NULL;
518 ospf6_abr_enable_area (area);
521 return CMD_SUCCESS;
524 DEFUN (area_import_list,
525 area_import_list_cmd,
526 "area A.B.C.D import-list NAME",
527 "OSPFv6 area parameters\n"
528 "OSPFv6 area ID in IP address format\n"
529 "Set the filter for networks from other areas announced to the specified one\n"
530 "Name of the acess-list\n")
532 struct ospf6_area *area;
533 struct access_list *list;
535 OSPF6_CMD_AREA_GET(argv[0], area);
537 list = access_list_lookup (AFI_IP6, argv[1]);
539 IMPORT_LIST (area) = list;
541 if (IMPORT_NAME (area))
542 free (IMPORT_NAME (area));
544 IMPORT_NAME (area) = strdup (argv[1]);
545 ospf6_abr_reimport (area);
547 return CMD_SUCCESS;
550 DEFUN (no_area_import_list,
551 no_area_import_list_cmd,
552 "no area A.B.C.D import-list NAME",
553 "OSPFv6 area parameters\n"
554 "OSPFv6 area ID in IP address format\n"
555 "Unset the filter for networks announced to other areas\n"
556 "NAme of the access-list\n")
558 struct ospf6_area *area;
560 OSPF6_CMD_AREA_GET(argv[0], area);
562 IMPORT_LIST (area) = 0;
564 if (IMPORT_NAME (area))
565 free (IMPORT_NAME (area));
567 IMPORT_NAME (area) = NULL;
568 ospf6_abr_reimport (area);
570 return CMD_SUCCESS;
573 DEFUN (area_export_list,
574 area_export_list_cmd,
575 "area A.B.C.D export-list NAME",
576 "OSPFv6 area parameters\n"
577 "OSPFv6 area ID in IP address format\n"
578 "Set the filter for networks announced to other areas\n"
579 "Name of the acess-list\n")
581 struct ospf6_area *area;
582 struct access_list *list;
584 OSPF6_CMD_AREA_GET(argv[0], area);
586 list = access_list_lookup (AFI_IP6, argv[1]);
588 EXPORT_LIST (area) = list;
590 if (EXPORT_NAME (area))
591 free (EXPORT_NAME (area));
593 EXPORT_NAME (area) = strdup (argv[1]);
594 ospf6_abr_enable_area (area);
596 return CMD_SUCCESS;
599 DEFUN (no_area_export_list,
600 no_area_export_list_cmd,
601 "no area A.B.C.D export-list NAME",
602 "OSPFv6 area parameters\n"
603 "OSPFv6 area ID in IP address format\n"
604 "Unset the filter for networks announced to other areas\n"
605 "Name of the access-list\n")
607 struct ospf6_area *area;
609 OSPF6_CMD_AREA_GET(argv[0], area);
611 EXPORT_LIST (area) = 0;
613 if (EXPORT_NAME (area))
614 free (EXPORT_NAME (area));
616 EXPORT_NAME (area) = NULL;
617 ospf6_abr_enable_area (area);
619 return CMD_SUCCESS;
622 DEFUN (show_ipv6_ospf6_spf_tree,
623 show_ipv6_ospf6_spf_tree_cmd,
624 "show ipv6 ospf6 spf tree",
625 SHOW_STR
626 IP6_STR
627 OSPF6_STR
628 "Shortest Path First caculation\n"
629 "Show SPF tree\n")
631 listnode node;
632 struct ospf6_area *oa;
633 struct ospf6_vertex *root;
634 struct ospf6_route *route;
635 struct prefix prefix;
637 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
638 for (node = listhead (ospf6->area_list); node; nextnode (node))
640 oa = (struct ospf6_area *) getdata (node);
641 route = ospf6_route_lookup (&prefix, oa->spf_table);
642 if (route == NULL)
644 vty_out (vty, "LS entry for root not found in area %s%s",
645 oa->name, VNL);
646 continue;
648 root = (struct ospf6_vertex *) route->route_option;
649 ospf6_spf_display_subtree (vty, "", 0, root);
652 return CMD_SUCCESS;
655 DEFUN (show_ipv6_ospf6_area_spf_tree,
656 show_ipv6_ospf6_area_spf_tree_cmd,
657 "show ipv6 ospf6 area A.B.C.D spf tree",
658 SHOW_STR
659 IP6_STR
660 OSPF6_STR
661 OSPF6_AREA_STR
662 OSPF6_AREA_ID_STR
663 "Shortest Path First caculation\n"
664 "Show SPF tree\n")
666 u_int32_t area_id;
667 struct ospf6_area *oa;
668 struct ospf6_vertex *root;
669 struct ospf6_route *route;
670 struct prefix prefix;
672 ospf6_linkstate_prefix (ospf6->router_id, htonl (0), &prefix);
674 if (inet_pton (AF_INET, argv[0], &area_id) != 1)
676 vty_out (vty, "Malformed Area-ID: %s%s", argv[0], VNL);
677 return CMD_SUCCESS;
679 oa = ospf6_area_lookup (area_id, ospf6);
680 if (oa == NULL)
682 vty_out (vty, "No such Area: %s%s", argv[0], VNL);
683 return CMD_SUCCESS;
686 route = ospf6_route_lookup (&prefix, oa->spf_table);
687 if (route == NULL)
689 vty_out (vty, "LS entry for root not found in area %s%s",
690 oa->name, VNL);
691 return CMD_SUCCESS;
693 root = (struct ospf6_vertex *) route->route_option;
694 ospf6_spf_display_subtree (vty, "", 0, root);
696 return CMD_SUCCESS;
699 DEFUN (show_ipv6_ospf6_simulate_spf_tree_root,
700 show_ipv6_ospf6_simulate_spf_tree_root_cmd,
701 "show ipv6 ospf6 simulate spf-tree A.B.C.D area A.B.C.D",
702 SHOW_STR
703 IP6_STR
704 OSPF6_STR
705 "Shortest Path First caculation\n"
706 "Show SPF tree\n"
707 "Specify root's router-id to calculate another router's SPF tree\n")
709 u_int32_t area_id;
710 struct ospf6_area *oa;
711 struct ospf6_vertex *root;
712 struct ospf6_route *route;
713 struct prefix prefix;
714 u_int32_t router_id;
715 struct ospf6_route_table *spf_table;
716 unsigned char tmp_debug_ospf6_spf = 0;
718 inet_pton (AF_INET, argv[0], &router_id);
719 ospf6_linkstate_prefix (router_id, htonl (0), &prefix);
721 if (inet_pton (AF_INET, argv[1], &area_id) != 1)
723 vty_out (vty, "Malformed Area-ID: %s%s", argv[1], VNL);
724 return CMD_SUCCESS;
726 oa = ospf6_area_lookup (area_id, ospf6);
727 if (oa == NULL)
729 vty_out (vty, "No such Area: %s%s", argv[1], VNL);
730 return CMD_SUCCESS;
733 tmp_debug_ospf6_spf = conf_debug_ospf6_spf;
734 conf_debug_ospf6_spf = 0;
736 spf_table = ospf6_route_table_create ();
737 ospf6_spf_calculation (router_id, spf_table, oa);
739 conf_debug_ospf6_spf = tmp_debug_ospf6_spf;
741 route = ospf6_route_lookup (&prefix, spf_table);
742 if (route == NULL)
744 ospf6_spf_table_finish (spf_table);
745 ospf6_route_table_delete (spf_table);
746 return CMD_SUCCESS;
748 root = (struct ospf6_vertex *) route->route_option;
749 ospf6_spf_display_subtree (vty, "", 0, root);
751 ospf6_spf_table_finish (spf_table);
752 ospf6_route_table_delete (spf_table);
754 return CMD_SUCCESS;
757 void
758 ospf6_area_init ()
760 install_element (VIEW_NODE, &show_ipv6_ospf6_spf_tree_cmd);
761 install_element (VIEW_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
762 install_element (VIEW_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
764 install_element (ENABLE_NODE, &show_ipv6_ospf6_spf_tree_cmd);
765 install_element (ENABLE_NODE, &show_ipv6_ospf6_area_spf_tree_cmd);
766 install_element (ENABLE_NODE, &show_ipv6_ospf6_simulate_spf_tree_root_cmd);
768 install_element (OSPF6_NODE, &area_range_cmd);
769 install_element (OSPF6_NODE, &area_range_advertise_cmd);
770 install_element (OSPF6_NODE, &no_area_range_cmd);
772 install_element (OSPF6_NODE, &area_import_list_cmd);
773 install_element (OSPF6_NODE, &no_area_import_list_cmd);
774 install_element (OSPF6_NODE, &area_export_list_cmd);
775 install_element (OSPF6_NODE, &no_area_export_list_cmd);
777 install_element (OSPF6_NODE, &area_filter_list_cmd);
778 install_element (OSPF6_NODE, &no_area_filter_list_cmd);