Annotation of embedaddon/quagga/ospf6d/ospf6_top.c, revision 1.1
1.1 ! misho 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:
! 22: #include <zebra.h>
! 23:
! 24: #include "log.h"
! 25: #include "memory.h"
! 26: #include "vty.h"
! 27: #include "linklist.h"
! 28: #include "prefix.h"
! 29: #include "table.h"
! 30: #include "thread.h"
! 31: #include "command.h"
! 32:
! 33: #include "ospf6_proto.h"
! 34: #include "ospf6_message.h"
! 35: #include "ospf6_lsa.h"
! 36: #include "ospf6_lsdb.h"
! 37: #include "ospf6_route.h"
! 38: #include "ospf6_zebra.h"
! 39:
! 40: #include "ospf6_top.h"
! 41: #include "ospf6_area.h"
! 42: #include "ospf6_interface.h"
! 43: #include "ospf6_neighbor.h"
! 44:
! 45: #include "ospf6_flood.h"
! 46: #include "ospf6_asbr.h"
! 47: #include "ospf6_abr.h"
! 48: #include "ospf6_intra.h"
! 49: #include "ospf6d.h"
! 50:
! 51: /* global ospf6d variable */
! 52: struct ospf6 *ospf6;
! 53:
! 54: static void ospf6_disable (struct ospf6 *o);
! 55:
! 56: static void
! 57: ospf6_top_lsdb_hook_add (struct ospf6_lsa *lsa)
! 58: {
! 59: switch (ntohs (lsa->header->type))
! 60: {
! 61: case OSPF6_LSTYPE_AS_EXTERNAL:
! 62: ospf6_asbr_lsa_add (lsa);
! 63: break;
! 64:
! 65: default:
! 66: break;
! 67: }
! 68: }
! 69:
! 70: static void
! 71: ospf6_top_lsdb_hook_remove (struct ospf6_lsa *lsa)
! 72: {
! 73: switch (ntohs (lsa->header->type))
! 74: {
! 75: case OSPF6_LSTYPE_AS_EXTERNAL:
! 76: ospf6_asbr_lsa_remove (lsa);
! 77: break;
! 78:
! 79: default:
! 80: break;
! 81: }
! 82: }
! 83:
! 84: static void
! 85: ospf6_top_route_hook_add (struct ospf6_route *route)
! 86: {
! 87: ospf6_abr_originate_summary (route);
! 88: ospf6_zebra_route_update_add (route);
! 89: }
! 90:
! 91: static void
! 92: ospf6_top_route_hook_remove (struct ospf6_route *route)
! 93: {
! 94: ospf6_abr_originate_summary (route);
! 95: ospf6_zebra_route_update_remove (route);
! 96: }
! 97:
! 98: static void
! 99: ospf6_top_brouter_hook_add (struct ospf6_route *route)
! 100: {
! 101: ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
! 102: ospf6_asbr_lsentry_add (route);
! 103: ospf6_abr_originate_summary (route);
! 104: }
! 105:
! 106: static void
! 107: ospf6_top_brouter_hook_remove (struct ospf6_route *route)
! 108: {
! 109: ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
! 110: ospf6_asbr_lsentry_remove (route);
! 111: ospf6_abr_originate_summary (route);
! 112: }
! 113:
! 114: static struct ospf6 *
! 115: ospf6_create (void)
! 116: {
! 117: struct ospf6 *o;
! 118:
! 119: o = XCALLOC (MTYPE_OSPF6_TOP, sizeof (struct ospf6));
! 120:
! 121: /* initialize */
! 122: quagga_gettime (QUAGGA_CLK_MONOTONIC, &o->starttime);
! 123: o->area_list = list_new ();
! 124: o->area_list->cmp = ospf6_area_cmp;
! 125: o->lsdb = ospf6_lsdb_create (o);
! 126: o->lsdb_self = ospf6_lsdb_create (o);
! 127: o->lsdb->hook_add = ospf6_top_lsdb_hook_add;
! 128: o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove;
! 129:
! 130: o->route_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, ROUTES);
! 131: o->route_table->scope = o;
! 132: o->route_table->hook_add = ospf6_top_route_hook_add;
! 133: o->route_table->hook_remove = ospf6_top_route_hook_remove;
! 134:
! 135: o->brouter_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, BORDER_ROUTERS);
! 136: o->brouter_table->scope = o;
! 137: o->brouter_table->hook_add = ospf6_top_brouter_hook_add;
! 138: o->brouter_table->hook_remove = ospf6_top_brouter_hook_remove;
! 139:
! 140: o->external_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, EXTERNAL_ROUTES);
! 141: o->external_table->scope = o;
! 142:
! 143: o->external_id_table = route_table_init ();
! 144:
! 145: return o;
! 146: }
! 147:
! 148: void
! 149: ospf6_delete (struct ospf6 *o)
! 150: {
! 151: struct listnode *node, *nnode;
! 152: struct ospf6_area *oa;
! 153:
! 154: ospf6_disable (ospf6);
! 155:
! 156: for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
! 157: ospf6_area_delete (oa);
! 158: list_delete (o->area_list);
! 159:
! 160: ospf6_lsdb_delete (o->lsdb);
! 161: ospf6_lsdb_delete (o->lsdb_self);
! 162:
! 163: ospf6_route_table_delete (o->route_table);
! 164: ospf6_route_table_delete (o->brouter_table);
! 165:
! 166: ospf6_route_table_delete (o->external_table);
! 167: route_table_finish (o->external_id_table);
! 168:
! 169: XFREE (MTYPE_OSPF6_TOP, o);
! 170: }
! 171:
! 172: static void
! 173: ospf6_enable (struct ospf6 *o)
! 174: {
! 175: struct listnode *node, *nnode;
! 176: struct ospf6_area *oa;
! 177:
! 178: if (CHECK_FLAG (o->flag, OSPF6_DISABLED))
! 179: {
! 180: UNSET_FLAG (o->flag, OSPF6_DISABLED);
! 181: for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
! 182: ospf6_area_enable (oa);
! 183: }
! 184: }
! 185:
! 186: static void
! 187: ospf6_disable (struct ospf6 *o)
! 188: {
! 189: struct listnode *node, *nnode;
! 190: struct ospf6_area *oa;
! 191:
! 192: if (! CHECK_FLAG (o->flag, OSPF6_DISABLED))
! 193: {
! 194: SET_FLAG (o->flag, OSPF6_DISABLED);
! 195:
! 196: for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
! 197: ospf6_area_disable (oa);
! 198:
! 199: ospf6_lsdb_remove_all (o->lsdb);
! 200: ospf6_route_remove_all (o->route_table);
! 201: ospf6_route_remove_all (o->brouter_table);
! 202: }
! 203: }
! 204:
! 205: static int
! 206: ospf6_maxage_remover (struct thread *thread)
! 207: {
! 208: struct ospf6 *o = (struct ospf6 *) THREAD_ARG (thread);
! 209: struct ospf6_area *oa;
! 210: struct ospf6_interface *oi;
! 211: struct ospf6_neighbor *on;
! 212: struct listnode *i, *j, *k;
! 213:
! 214: o->maxage_remover = (struct thread *) NULL;
! 215:
! 216: for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
! 217: {
! 218: for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
! 219: {
! 220: for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, k, on))
! 221: {
! 222: if (on->state != OSPF6_NEIGHBOR_EXCHANGE &&
! 223: on->state != OSPF6_NEIGHBOR_LOADING)
! 224: continue;
! 225:
! 226: return 0;
! 227: }
! 228: }
! 229: }
! 230:
! 231: for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
! 232: {
! 233: for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
! 234: OSPF6_LSDB_MAXAGE_REMOVER (oi->lsdb);
! 235:
! 236: OSPF6_LSDB_MAXAGE_REMOVER (oa->lsdb);
! 237: }
! 238: OSPF6_LSDB_MAXAGE_REMOVER (o->lsdb);
! 239:
! 240: return 0;
! 241: }
! 242:
! 243: void
! 244: ospf6_maxage_remove (struct ospf6 *o)
! 245: {
! 246: if (o && ! o->maxage_remover)
! 247: o->maxage_remover = thread_add_event (master, ospf6_maxage_remover, o, 0);
! 248: }
! 249:
! 250: /* start ospf6 */
! 251: DEFUN (router_ospf6,
! 252: router_ospf6_cmd,
! 253: "router ospf6",
! 254: ROUTER_STR
! 255: OSPF6_STR)
! 256: {
! 257: if (ospf6 == NULL)
! 258: ospf6 = ospf6_create ();
! 259: if (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
! 260: ospf6_enable (ospf6);
! 261:
! 262: /* set current ospf point. */
! 263: vty->node = OSPF6_NODE;
! 264: vty->index = ospf6;
! 265:
! 266: return CMD_SUCCESS;
! 267: }
! 268:
! 269: /* stop ospf6 */
! 270: DEFUN (no_router_ospf6,
! 271: no_router_ospf6_cmd,
! 272: "no router ospf6",
! 273: NO_STR
! 274: OSPF6_ROUTER_STR)
! 275: {
! 276: if (ospf6 == NULL || CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
! 277: vty_out (vty, "OSPFv3 is not running%s", VNL);
! 278: else
! 279: ospf6_disable (ospf6);
! 280:
! 281: /* return to config node . */
! 282: vty->node = CONFIG_NODE;
! 283: vty->index = NULL;
! 284:
! 285: return CMD_SUCCESS;
! 286: }
! 287:
! 288: /* change Router_ID commands. */
! 289: DEFUN (ospf6_router_id,
! 290: ospf6_router_id_cmd,
! 291: "router-id A.B.C.D",
! 292: "Configure OSPF Router-ID\n"
! 293: V4NOTATION_STR)
! 294: {
! 295: int ret;
! 296: u_int32_t router_id;
! 297: struct ospf6 *o;
! 298:
! 299: o = (struct ospf6 *) vty->index;
! 300:
! 301: ret = inet_pton (AF_INET, argv[0], &router_id);
! 302: if (ret == 0)
! 303: {
! 304: vty_out (vty, "malformed OSPF Router-ID: %s%s", argv[0], VNL);
! 305: return CMD_SUCCESS;
! 306: }
! 307:
! 308: o->router_id_static = router_id;
! 309: if (o->router_id == 0)
! 310: o->router_id = router_id;
! 311:
! 312: return CMD_SUCCESS;
! 313: }
! 314:
! 315: DEFUN (ospf6_interface_area,
! 316: ospf6_interface_area_cmd,
! 317: "interface IFNAME area A.B.C.D",
! 318: "Enable routing on an IPv6 interface\n"
! 319: IFNAME_STR
! 320: "Specify the OSPF6 area ID\n"
! 321: "OSPF6 area ID in IPv4 address notation\n"
! 322: )
! 323: {
! 324: struct ospf6 *o;
! 325: struct ospf6_area *oa;
! 326: struct ospf6_interface *oi;
! 327: struct interface *ifp;
! 328: u_int32_t area_id;
! 329:
! 330: o = (struct ospf6 *) vty->index;
! 331:
! 332: /* find/create ospf6 interface */
! 333: ifp = if_get_by_name (argv[0]);
! 334: oi = (struct ospf6_interface *) ifp->info;
! 335: if (oi == NULL)
! 336: oi = ospf6_interface_create (ifp);
! 337: if (oi->area)
! 338: {
! 339: vty_out (vty, "%s already attached to Area %s%s",
! 340: oi->interface->name, oi->area->name, VNL);
! 341: return CMD_SUCCESS;
! 342: }
! 343:
! 344: /* parse Area-ID */
! 345: if (inet_pton (AF_INET, argv[1], &area_id) != 1)
! 346: {
! 347: vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
! 348: return CMD_SUCCESS;
! 349: }
! 350:
! 351: /* find/create ospf6 area */
! 352: oa = ospf6_area_lookup (area_id, o);
! 353: if (oa == NULL)
! 354: oa = ospf6_area_create (area_id, o);
! 355:
! 356: /* attach interface to area */
! 357: listnode_add (oa->if_list, oi); /* sort ?? */
! 358: oi->area = oa;
! 359:
! 360: SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
! 361:
! 362: /* start up */
! 363: thread_add_event (master, interface_up, oi, 0);
! 364:
! 365: /* If the router is ABR, originate summary routes */
! 366: if (ospf6_is_router_abr (o))
! 367: ospf6_abr_enable_area (oa);
! 368:
! 369: return CMD_SUCCESS;
! 370: }
! 371:
! 372: DEFUN (no_ospf6_interface_area,
! 373: no_ospf6_interface_area_cmd,
! 374: "no interface IFNAME area A.B.C.D",
! 375: NO_STR
! 376: "Disable routing on an IPv6 interface\n"
! 377: IFNAME_STR
! 378: "Specify the OSPF6 area ID\n"
! 379: "OSPF6 area ID in IPv4 address notation\n"
! 380: )
! 381: {
! 382: struct ospf6 *o;
! 383: struct ospf6_interface *oi;
! 384: struct ospf6_area *oa;
! 385: struct interface *ifp;
! 386: u_int32_t area_id;
! 387:
! 388: o = (struct ospf6 *) vty->index;
! 389:
! 390: ifp = if_lookup_by_name (argv[0]);
! 391: if (ifp == NULL)
! 392: {
! 393: vty_out (vty, "No such interface %s%s", argv[0], VNL);
! 394: return CMD_SUCCESS;
! 395: }
! 396:
! 397: oi = (struct ospf6_interface *) ifp->info;
! 398: if (oi == NULL)
! 399: {
! 400: vty_out (vty, "Interface %s not enabled%s", ifp->name, VNL);
! 401: return CMD_SUCCESS;
! 402: }
! 403:
! 404: /* parse Area-ID */
! 405: if (inet_pton (AF_INET, argv[1], &area_id) != 1)
! 406: {
! 407: vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
! 408: return CMD_SUCCESS;
! 409: }
! 410:
! 411: /* Verify Area */
! 412: if (oi->area == NULL)
! 413: {
! 414: vty_out (vty, "No such Area-ID: %s%s", argv[1], VNL);
! 415: return CMD_SUCCESS;
! 416: }
! 417:
! 418: if (oi->area->area_id != area_id)
! 419: {
! 420: vty_out (vty, "Wrong Area-ID: %s is attached to area %s%s",
! 421: oi->interface->name, oi->area->name, VNL);
! 422: return CMD_SUCCESS;
! 423: }
! 424:
! 425: thread_execute (master, interface_down, oi, 0);
! 426:
! 427: oa = oi->area;
! 428: listnode_delete (oi->area->if_list, oi);
! 429: oi->area = (struct ospf6_area *) NULL;
! 430:
! 431: /* Withdraw inter-area routes from this area, if necessary */
! 432: if (oa->if_list->count == 0)
! 433: {
! 434: UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
! 435: ospf6_abr_disable_area (oa);
! 436: }
! 437:
! 438: return CMD_SUCCESS;
! 439: }
! 440:
! 441: static void
! 442: ospf6_show (struct vty *vty, struct ospf6 *o)
! 443: {
! 444: struct listnode *n;
! 445: struct ospf6_area *oa;
! 446: char router_id[16], duration[32];
! 447: struct timeval now, running;
! 448:
! 449: /* process id, router id */
! 450: inet_ntop (AF_INET, &o->router_id, router_id, sizeof (router_id));
! 451: vty_out (vty, " OSPFv3 Routing Process (0) with Router-ID %s%s",
! 452: router_id, VNL);
! 453:
! 454: /* running time */
! 455: quagga_gettime (QUAGGA_CLK_MONOTONIC, &now);
! 456: timersub (&now, &o->starttime, &running);
! 457: timerstring (&running, duration, sizeof (duration));
! 458: vty_out (vty, " Running %s%s", duration, VNL);
! 459:
! 460: /* Redistribute configuration */
! 461: /* XXX */
! 462:
! 463: /* LSAs */
! 464: vty_out (vty, " Number of AS scoped LSAs is %u%s",
! 465: o->lsdb->count, VNL);
! 466:
! 467: /* Areas */
! 468: vty_out (vty, " Number of areas in this router is %u%s",
! 469: listcount (o->area_list), VNL);
! 470:
! 471: for (ALL_LIST_ELEMENTS_RO (o->area_list, n, oa))
! 472: ospf6_area_show (vty, oa);
! 473: }
! 474:
! 475: /* show top level structures */
! 476: DEFUN (show_ipv6_ospf6,
! 477: show_ipv6_ospf6_cmd,
! 478: "show ipv6 ospf6",
! 479: SHOW_STR
! 480: IP6_STR
! 481: OSPF6_STR)
! 482: {
! 483: OSPF6_CMD_CHECK_RUNNING ();
! 484:
! 485: ospf6_show (vty, ospf6);
! 486: return CMD_SUCCESS;
! 487: }
! 488:
! 489: DEFUN (show_ipv6_ospf6_route,
! 490: show_ipv6_ospf6_route_cmd,
! 491: "show ipv6 ospf6 route",
! 492: SHOW_STR
! 493: IP6_STR
! 494: OSPF6_STR
! 495: ROUTE_STR
! 496: )
! 497: {
! 498: ospf6_route_table_show (vty, argc, argv, ospf6->route_table);
! 499: return CMD_SUCCESS;
! 500: }
! 501:
! 502: ALIAS (show_ipv6_ospf6_route,
! 503: show_ipv6_ospf6_route_detail_cmd,
! 504: "show ipv6 ospf6 route (X:X::X:X|X:X::X:X/M|detail|summary)",
! 505: SHOW_STR
! 506: IP6_STR
! 507: OSPF6_STR
! 508: ROUTE_STR
! 509: "Specify IPv6 address\n"
! 510: "Specify IPv6 prefix\n"
! 511: "Detailed information\n"
! 512: "Summary of route table\n"
! 513: )
! 514:
! 515: DEFUN (show_ipv6_ospf6_route_match,
! 516: show_ipv6_ospf6_route_match_cmd,
! 517: "show ipv6 ospf6 route X:X::X:X/M match",
! 518: SHOW_STR
! 519: IP6_STR
! 520: OSPF6_STR
! 521: ROUTE_STR
! 522: "Specify IPv6 prefix\n"
! 523: "Display routes which match the specified route\n"
! 524: )
! 525: {
! 526: const char *sargv[CMD_ARGC_MAX];
! 527: int i, sargc;
! 528:
! 529: /* copy argv to sargv and then append "match" */
! 530: for (i = 0; i < argc; i++)
! 531: sargv[i] = argv[i];
! 532: sargc = argc;
! 533: sargv[sargc++] = "match";
! 534: sargv[sargc] = NULL;
! 535:
! 536: ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
! 537: return CMD_SUCCESS;
! 538: }
! 539:
! 540: DEFUN (show_ipv6_ospf6_route_match_detail,
! 541: show_ipv6_ospf6_route_match_detail_cmd,
! 542: "show ipv6 ospf6 route X:X::X:X/M match detail",
! 543: SHOW_STR
! 544: IP6_STR
! 545: OSPF6_STR
! 546: ROUTE_STR
! 547: "Specify IPv6 prefix\n"
! 548: "Display routes which match the specified route\n"
! 549: "Detailed information\n"
! 550: )
! 551: {
! 552: const char *sargv[CMD_ARGC_MAX];
! 553: int i, sargc;
! 554:
! 555: /* copy argv to sargv and then append "match" and "detail" */
! 556: for (i = 0; i < argc; i++)
! 557: sargv[i] = argv[i];
! 558: sargc = argc;
! 559: sargv[sargc++] = "match";
! 560: sargv[sargc++] = "detail";
! 561: sargv[sargc] = NULL;
! 562:
! 563: ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
! 564: return CMD_SUCCESS;
! 565: }
! 566:
! 567: ALIAS (show_ipv6_ospf6_route_match,
! 568: show_ipv6_ospf6_route_longer_cmd,
! 569: "show ipv6 ospf6 route X:X::X:X/M longer",
! 570: SHOW_STR
! 571: IP6_STR
! 572: OSPF6_STR
! 573: ROUTE_STR
! 574: "Specify IPv6 prefix\n"
! 575: "Display routes longer than the specified route\n"
! 576: )
! 577:
! 578: DEFUN (show_ipv6_ospf6_route_match_detail,
! 579: show_ipv6_ospf6_route_longer_detail_cmd,
! 580: "show ipv6 ospf6 route X:X::X:X/M longer detail",
! 581: SHOW_STR
! 582: IP6_STR
! 583: OSPF6_STR
! 584: ROUTE_STR
! 585: "Specify IPv6 prefix\n"
! 586: "Display routes longer than the specified route\n"
! 587: "Detailed information\n"
! 588: );
! 589:
! 590: ALIAS (show_ipv6_ospf6_route,
! 591: show_ipv6_ospf6_route_type_cmd,
! 592: "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2)",
! 593: SHOW_STR
! 594: IP6_STR
! 595: OSPF6_STR
! 596: ROUTE_STR
! 597: "Display Intra-Area routes\n"
! 598: "Display Inter-Area routes\n"
! 599: "Display Type-1 External routes\n"
! 600: "Display Type-2 External routes\n"
! 601: )
! 602:
! 603: DEFUN (show_ipv6_ospf6_route_type_detail,
! 604: show_ipv6_ospf6_route_type_detail_cmd,
! 605: "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2) detail",
! 606: SHOW_STR
! 607: IP6_STR
! 608: OSPF6_STR
! 609: ROUTE_STR
! 610: "Display Intra-Area routes\n"
! 611: "Display Inter-Area routes\n"
! 612: "Display Type-1 External routes\n"
! 613: "Display Type-2 External routes\n"
! 614: "Detailed information\n"
! 615: )
! 616: {
! 617: const char *sargv[CMD_ARGC_MAX];
! 618: int i, sargc;
! 619:
! 620: /* copy argv to sargv and then append "detail" */
! 621: for (i = 0; i < argc; i++)
! 622: sargv[i] = argv[i];
! 623: sargc = argc;
! 624: sargv[sargc++] = "detail";
! 625: sargv[sargc] = NULL;
! 626:
! 627: ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
! 628: return CMD_SUCCESS;
! 629: }
! 630:
! 631: /* OSPF configuration write function. */
! 632: static int
! 633: config_write_ospf6 (struct vty *vty)
! 634: {
! 635: char router_id[16];
! 636: struct listnode *j, *k;
! 637: struct ospf6_area *oa;
! 638: struct ospf6_interface *oi;
! 639:
! 640: /* OSPFv6 configuration. */
! 641: if (ospf6 == NULL)
! 642: return CMD_SUCCESS;
! 643: if (CHECK_FLAG (ospf6->flag, OSPF6_DISABLED))
! 644: return CMD_SUCCESS;
! 645:
! 646: inet_ntop (AF_INET, &ospf6->router_id_static, router_id, sizeof (router_id));
! 647: vty_out (vty, "router ospf6%s", VNL);
! 648: if (ospf6->router_id_static != 0)
! 649: vty_out (vty, " router-id %s%s", router_id, VNL);
! 650:
! 651: ospf6_redistribute_config_write (vty);
! 652: ospf6_area_config_write (vty);
! 653:
! 654: for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, j, oa))
! 655: {
! 656: for (ALL_LIST_ELEMENTS_RO (oa->if_list, k, oi))
! 657: vty_out (vty, " interface %s area %s%s",
! 658: oi->interface->name, oa->name, VNL);
! 659: }
! 660: vty_out (vty, "!%s", VNL);
! 661: return 0;
! 662: }
! 663:
! 664: /* OSPF6 node structure. */
! 665: static struct cmd_node ospf6_node =
! 666: {
! 667: OSPF6_NODE,
! 668: "%s(config-ospf6)# ",
! 669: 1 /* VTYSH */
! 670: };
! 671:
! 672: /* Install ospf related commands. */
! 673: void
! 674: ospf6_top_init (void)
! 675: {
! 676: /* Install ospf6 top node. */
! 677: install_node (&ospf6_node, config_write_ospf6);
! 678:
! 679: install_element (VIEW_NODE, &show_ipv6_ospf6_cmd);
! 680: install_element (ENABLE_NODE, &show_ipv6_ospf6_cmd);
! 681: install_element (CONFIG_NODE, &router_ospf6_cmd);
! 682: install_element (CONFIG_NODE, &no_router_ospf6_cmd);
! 683:
! 684: install_element (VIEW_NODE, &show_ipv6_ospf6_route_cmd);
! 685: install_element (VIEW_NODE, &show_ipv6_ospf6_route_detail_cmd);
! 686: install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_cmd);
! 687: install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
! 688: install_element (VIEW_NODE, &show_ipv6_ospf6_route_longer_cmd);
! 689: install_element (VIEW_NODE, &show_ipv6_ospf6_route_longer_detail_cmd);
! 690: install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_cmd);
! 691: install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
! 692: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_cmd);
! 693: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_detail_cmd);
! 694: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_cmd);
! 695: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
! 696: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_longer_cmd);
! 697: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_longer_detail_cmd);
! 698: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_cmd);
! 699: install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
! 700:
! 701: install_default (OSPF6_NODE);
! 702: install_element (OSPF6_NODE, &ospf6_router_id_cmd);
! 703: install_element (OSPF6_NODE, &ospf6_interface_area_cmd);
! 704: install_element (OSPF6_NODE, &no_ospf6_interface_area_cmd);
! 705: }
! 706:
! 707:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>