Annotation of embedaddon/quagga/ospf6d/ospf6_top.c, revision 1.1.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>