File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / ospf6d / ospf6_top.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:12 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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>