Annotation of embedaddon/quagga/ospf6d/ospf6_top.c, revision 1.1.1.2

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"
1.1.1.2 ! misho      49: #include "ospf6_spf.h"
1.1       misho      50: #include "ospf6d.h"
                     51: 
                     52: /* global ospf6d variable */
                     53: struct ospf6 *ospf6;
                     54: 
                     55: static void ospf6_disable (struct ospf6 *o);
                     56: 
                     57: static void
                     58: ospf6_top_lsdb_hook_add (struct ospf6_lsa *lsa)
                     59: {
                     60:   switch (ntohs (lsa->header->type))
                     61:     {
                     62:       case OSPF6_LSTYPE_AS_EXTERNAL:
                     63:         ospf6_asbr_lsa_add (lsa);
                     64:         break;
                     65: 
                     66:       default:
                     67:         break;
                     68:     }
                     69: }
                     70: 
                     71: static void
                     72: ospf6_top_lsdb_hook_remove (struct ospf6_lsa *lsa)
                     73: {
                     74:   switch (ntohs (lsa->header->type))
                     75:     {
                     76:       case OSPF6_LSTYPE_AS_EXTERNAL:
                     77:         ospf6_asbr_lsa_remove (lsa);
                     78:         break;
                     79: 
                     80:       default:
                     81:         break;
                     82:     }
                     83: }
                     84: 
                     85: static void
                     86: ospf6_top_route_hook_add (struct ospf6_route *route)
                     87: {
                     88:   ospf6_abr_originate_summary (route);
                     89:   ospf6_zebra_route_update_add (route);
                     90: }
                     91: 
                     92: static void
                     93: ospf6_top_route_hook_remove (struct ospf6_route *route)
                     94: {
                     95:   ospf6_abr_originate_summary (route);
                     96:   ospf6_zebra_route_update_remove (route);
                     97: }
                     98: 
                     99: static void
                    100: ospf6_top_brouter_hook_add (struct ospf6_route *route)
                    101: {
                    102:   ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
                    103:   ospf6_asbr_lsentry_add (route);
                    104:   ospf6_abr_originate_summary (route);
                    105: }
                    106: 
                    107: static void
                    108: ospf6_top_brouter_hook_remove (struct ospf6_route *route)
                    109: {
                    110:   ospf6_abr_examin_brouter (ADV_ROUTER_IN_PREFIX (&route->prefix));
                    111:   ospf6_asbr_lsentry_remove (route);
                    112:   ospf6_abr_originate_summary (route);
                    113: }
                    114: 
                    115: static struct ospf6 *
                    116: ospf6_create (void)
                    117: {
                    118:   struct ospf6 *o;
                    119: 
                    120:   o = XCALLOC (MTYPE_OSPF6_TOP, sizeof (struct ospf6));
                    121: 
                    122:   /* initialize */
                    123:   quagga_gettime (QUAGGA_CLK_MONOTONIC, &o->starttime);
                    124:   o->area_list = list_new ();
                    125:   o->area_list->cmp = ospf6_area_cmp;
                    126:   o->lsdb = ospf6_lsdb_create (o);
                    127:   o->lsdb_self = ospf6_lsdb_create (o);
                    128:   o->lsdb->hook_add = ospf6_top_lsdb_hook_add;
                    129:   o->lsdb->hook_remove = ospf6_top_lsdb_hook_remove;
                    130: 
1.1.1.2 ! misho     131:   o->spf_delay = OSPF_SPF_DELAY_DEFAULT;
        !           132:   o->spf_holdtime = OSPF_SPF_HOLDTIME_DEFAULT;
        !           133:   o->spf_max_holdtime = OSPF_SPF_MAX_HOLDTIME_DEFAULT;
        !           134:   o->spf_hold_multiplier = 1;
        !           135: 
1.1       misho     136:   o->route_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, ROUTES);
                    137:   o->route_table->scope = o;
                    138:   o->route_table->hook_add = ospf6_top_route_hook_add;
                    139:   o->route_table->hook_remove = ospf6_top_route_hook_remove;
                    140: 
                    141:   o->brouter_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, BORDER_ROUTERS);
                    142:   o->brouter_table->scope = o;
                    143:   o->brouter_table->hook_add = ospf6_top_brouter_hook_add;
                    144:   o->brouter_table->hook_remove = ospf6_top_brouter_hook_remove;
                    145: 
                    146:   o->external_table = OSPF6_ROUTE_TABLE_CREATE (GLOBAL, EXTERNAL_ROUTES);
                    147:   o->external_table->scope = o;
                    148: 
                    149:   o->external_id_table = route_table_init ();
                    150: 
1.1.1.2 ! misho     151:   o->ref_bandwidth = OSPF6_REFERENCE_BANDWIDTH;
        !           152: 
1.1       misho     153:   return o;
                    154: }
                    155: 
                    156: void
                    157: ospf6_delete (struct ospf6 *o)
                    158: {
                    159:   struct listnode *node, *nnode;
                    160:   struct ospf6_area *oa;
                    161: 
                    162:   ospf6_disable (ospf6);
                    163: 
                    164:   for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
                    165:     ospf6_area_delete (oa);
1.1.1.2 ! misho     166: 
        !           167: 
1.1       misho     168:   list_delete (o->area_list);
                    169: 
                    170:   ospf6_lsdb_delete (o->lsdb);
                    171:   ospf6_lsdb_delete (o->lsdb_self);
                    172: 
                    173:   ospf6_route_table_delete (o->route_table);
                    174:   ospf6_route_table_delete (o->brouter_table);
                    175: 
                    176:   ospf6_route_table_delete (o->external_table);
                    177:   route_table_finish (o->external_id_table);
                    178: 
                    179:   XFREE (MTYPE_OSPF6_TOP, o);
                    180: }
                    181: 
                    182: static void
1.1.1.2 ! misho     183: __attribute__((unused))
1.1       misho     184: ospf6_enable (struct ospf6 *o)
                    185: {
                    186:   struct listnode *node, *nnode;
                    187:   struct ospf6_area *oa;
                    188: 
                    189:   if (CHECK_FLAG (o->flag, OSPF6_DISABLED))
                    190:     {
                    191:       UNSET_FLAG (o->flag, OSPF6_DISABLED);
                    192:       for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
                    193:         ospf6_area_enable (oa);
                    194:     }
                    195: }
                    196: 
                    197: static void
                    198: ospf6_disable (struct ospf6 *o)
                    199: {
                    200:   struct listnode *node, *nnode;
                    201:   struct ospf6_area *oa;
                    202: 
                    203:   if (! CHECK_FLAG (o->flag, OSPF6_DISABLED))
                    204:     {
                    205:       SET_FLAG (o->flag, OSPF6_DISABLED);
                    206:       
                    207:       for (ALL_LIST_ELEMENTS (o->area_list, node, nnode, oa))
                    208:         ospf6_area_disable (oa);
                    209: 
1.1.1.2 ! misho     210:       /* XXX: This also changes persistent settings */
        !           211:       ospf6_asbr_redistribute_reset();
        !           212: 
1.1       misho     213:       ospf6_lsdb_remove_all (o->lsdb);
                    214:       ospf6_route_remove_all (o->route_table);
                    215:       ospf6_route_remove_all (o->brouter_table);
1.1.1.2 ! misho     216: 
        !           217:       THREAD_OFF(o->maxage_remover);
        !           218:       THREAD_OFF(o->t_spf_calc);
        !           219:       THREAD_OFF(o->t_ase_calc);
1.1       misho     220:     }
                    221: }
                    222: 
                    223: static int
                    224: ospf6_maxage_remover (struct thread *thread)
                    225: {
                    226:   struct ospf6 *o = (struct ospf6 *) THREAD_ARG (thread);
                    227:   struct ospf6_area *oa;
                    228:   struct ospf6_interface *oi;
                    229:   struct ospf6_neighbor *on;
                    230:   struct listnode *i, *j, *k;
1.1.1.2 ! misho     231:   int reschedule = 0;
1.1       misho     232: 
                    233:   o->maxage_remover = (struct thread *) NULL;
                    234: 
                    235:   for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
                    236:     {
                    237:       for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
                    238:         {
                    239:           for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, k, on))
                    240:             {
                    241:               if (on->state != OSPF6_NEIGHBOR_EXCHANGE &&
                    242:                   on->state != OSPF6_NEIGHBOR_LOADING)
1.1.1.2 ! misho     243:                  continue;
1.1       misho     244: 
1.1.1.2 ! misho     245:              ospf6_maxage_remove (o);
1.1       misho     246:               return 0;
                    247:             }
                    248:         }
                    249:     }
                    250: 
                    251:   for (ALL_LIST_ELEMENTS_RO (o->area_list, i, oa))
                    252:     {
                    253:       for (ALL_LIST_ELEMENTS_RO (oa->if_list, j, oi))
1.1.1.2 ! misho     254:        {
        !           255:          if (ospf6_lsdb_maxage_remover (oi->lsdb))
        !           256:            {
        !           257:              reschedule = 1;
        !           258:            }
        !           259:        }
1.1       misho     260:       
1.1.1.2 ! misho     261:       if (ospf6_lsdb_maxage_remover (oa->lsdb))
        !           262:        {
        !           263:            reschedule = 1;
        !           264:        }
        !           265:     }
        !           266: 
        !           267:   if (ospf6_lsdb_maxage_remover (o->lsdb))
        !           268:     {
        !           269:       reschedule = 1;
        !           270:     }
        !           271: 
        !           272:   if (reschedule)
        !           273:     {
        !           274:       ospf6_maxage_remove (o);
1.1       misho     275:     }
                    276: 
                    277:   return 0;
                    278: }
                    279: 
                    280: void
                    281: ospf6_maxage_remove (struct ospf6 *o)
                    282: {
                    283:   if (o && ! o->maxage_remover)
1.1.1.2 ! misho     284:     o->maxage_remover = thread_add_timer (master, ospf6_maxage_remover, o,
        !           285:                                          OSPF_LSA_MAXAGE_REMOVE_DELAY_DEFAULT);
1.1       misho     286: }
                    287: 
                    288: /* start ospf6 */
                    289: DEFUN (router_ospf6,
                    290:        router_ospf6_cmd,
                    291:        "router ospf6",
                    292:        ROUTER_STR
                    293:        OSPF6_STR)
                    294: {
                    295:   if (ospf6 == NULL)
                    296:     ospf6 = ospf6_create ();
                    297: 
                    298:   /* set current ospf point. */
                    299:   vty->node = OSPF6_NODE;
                    300:   vty->index = ospf6;
                    301: 
                    302:   return CMD_SUCCESS;
                    303: }
                    304: 
                    305: /* stop ospf6 */
                    306: DEFUN (no_router_ospf6,
                    307:        no_router_ospf6_cmd,
                    308:        "no router ospf6",
                    309:        NO_STR
                    310:        OSPF6_ROUTER_STR)
                    311: {
1.1.1.2 ! misho     312:   if (ospf6 == NULL)
        !           313:     vty_out (vty, "OSPFv3 is not configured%s", VNL);
1.1       misho     314:   else
1.1.1.2 ! misho     315:     {
        !           316:       ospf6_delete (ospf6);
        !           317:       ospf6 = NULL;
        !           318:     }
1.1       misho     319: 
                    320:   /* return to config node . */
                    321:   vty->node = CONFIG_NODE;
                    322:   vty->index = NULL;
                    323: 
                    324:   return CMD_SUCCESS;
                    325: }
                    326: 
                    327: /* change Router_ID commands. */
                    328: DEFUN (ospf6_router_id,
                    329:        ospf6_router_id_cmd,
                    330:        "router-id A.B.C.D",
                    331:        "Configure OSPF Router-ID\n"
                    332:        V4NOTATION_STR)
                    333: {
                    334:   int ret;
                    335:   u_int32_t router_id;
                    336:   struct ospf6 *o;
                    337: 
                    338:   o = (struct ospf6 *) vty->index;
                    339: 
                    340:   ret = inet_pton (AF_INET, argv[0], &router_id);
                    341:   if (ret == 0)
                    342:     {
                    343:       vty_out (vty, "malformed OSPF Router-ID: %s%s", argv[0], VNL);
                    344:       return CMD_SUCCESS;
                    345:     }
                    346: 
                    347:   o->router_id_static = router_id;
                    348:   if (o->router_id  == 0)
                    349:     o->router_id  = router_id;
                    350: 
                    351:   return CMD_SUCCESS;
                    352: }
                    353: 
1.1.1.2 ! misho     354: DEFUN (ospf6_log_adjacency_changes,
        !           355:        ospf6_log_adjacency_changes_cmd,
        !           356:        "log-adjacency-changes",
        !           357:        "Log changes in adjacency state\n")
        !           358: {
        !           359:   struct ospf6 *ospf6 = vty->index;
        !           360: 
        !           361:   SET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
        !           362:   return CMD_SUCCESS;
        !           363: }
        !           364: 
        !           365: DEFUN (ospf6_log_adjacency_changes_detail,
        !           366:        ospf6_log_adjacency_changes_detail_cmd,
        !           367:        "log-adjacency-changes detail",
        !           368:               "Log changes in adjacency state\n"
        !           369:        "Log all state changes\n")
        !           370: {
        !           371:   struct ospf6 *ospf6 = vty->index;
        !           372: 
        !           373:   SET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
        !           374:   SET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL);
        !           375:   return CMD_SUCCESS;
        !           376: }
        !           377: 
        !           378: DEFUN (no_ospf6_log_adjacency_changes,
        !           379:        no_ospf6_log_adjacency_changes_cmd,
        !           380:        "no log-adjacency-changes",
        !           381:               NO_STR
        !           382:        "Log changes in adjacency state\n")
        !           383: {
        !           384:   struct ospf6 *ospf6 = vty->index;
        !           385: 
        !           386:   UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL);
        !           387:   UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES);
        !           388:   return CMD_SUCCESS;
        !           389: }
        !           390: 
        !           391: DEFUN (no_ospf6_log_adjacency_changes_detail,
        !           392:        no_ospf6_log_adjacency_changes_detail_cmd,
        !           393:        "no log-adjacency-changes detail",
        !           394:               NO_STR
        !           395:               "Log changes in adjacency state\n"
        !           396:        "Log all state changes\n")
        !           397: {
        !           398:   struct ospf6 *ospf6 = vty->index;
        !           399: 
        !           400:   UNSET_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL);
        !           401:   return CMD_SUCCESS;
        !           402: }
        !           403: 
1.1       misho     404: DEFUN (ospf6_interface_area,
                    405:        ospf6_interface_area_cmd,
                    406:        "interface IFNAME area A.B.C.D",
                    407:        "Enable routing on an IPv6 interface\n"
                    408:        IFNAME_STR
                    409:        "Specify the OSPF6 area ID\n"
                    410:        "OSPF6 area ID in IPv4 address notation\n"
                    411:       )
                    412: {
                    413:   struct ospf6 *o;
                    414:   struct ospf6_area *oa;
                    415:   struct ospf6_interface *oi;
                    416:   struct interface *ifp;
                    417:   u_int32_t area_id;
                    418: 
                    419:   o = (struct ospf6 *) vty->index;
                    420: 
                    421:   /* find/create ospf6 interface */
                    422:   ifp = if_get_by_name (argv[0]);
                    423:   oi = (struct ospf6_interface *) ifp->info;
                    424:   if (oi == NULL)
                    425:     oi = ospf6_interface_create (ifp);
                    426:   if (oi->area)
                    427:     {
                    428:       vty_out (vty, "%s already attached to Area %s%s",
                    429:                oi->interface->name, oi->area->name, VNL);
                    430:       return CMD_SUCCESS;
                    431:     }
                    432: 
                    433:   /* parse Area-ID */
                    434:   if (inet_pton (AF_INET, argv[1], &area_id) != 1)
                    435:     {
                    436:       vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
                    437:       return CMD_SUCCESS;
                    438:     }
                    439: 
                    440:   /* find/create ospf6 area */
                    441:   oa = ospf6_area_lookup (area_id, o);
                    442:   if (oa == NULL)
                    443:     oa = ospf6_area_create (area_id, o);
                    444: 
                    445:   /* attach interface to area */
                    446:   listnode_add (oa->if_list, oi); /* sort ?? */
                    447:   oi->area = oa;
                    448: 
                    449:   SET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
                    450: 
1.1.1.2 ! misho     451:   /* ospf6 process is currently disabled, not much more to do */
        !           452:   if (CHECK_FLAG (o->flag, OSPF6_DISABLED))
        !           453:     return CMD_SUCCESS;
        !           454: 
1.1       misho     455:   /* start up */
1.1.1.2 ! misho     456:   ospf6_interface_enable (oi);
1.1       misho     457: 
                    458:   /* If the router is ABR, originate summary routes */
                    459:   if (ospf6_is_router_abr (o))
                    460:     ospf6_abr_enable_area (oa);
                    461: 
                    462:   return CMD_SUCCESS;
                    463: }
                    464: 
                    465: DEFUN (no_ospf6_interface_area,
                    466:        no_ospf6_interface_area_cmd,
                    467:        "no interface IFNAME area A.B.C.D",
                    468:        NO_STR
                    469:        "Disable routing on an IPv6 interface\n"
                    470:        IFNAME_STR
                    471:        "Specify the OSPF6 area ID\n"
                    472:        "OSPF6 area ID in IPv4 address notation\n"
                    473:        )
                    474: {
                    475:   struct ospf6_interface *oi;
                    476:   struct ospf6_area *oa;
                    477:   struct interface *ifp;
                    478:   u_int32_t area_id;
                    479: 
                    480:   ifp = if_lookup_by_name (argv[0]);
                    481:   if (ifp == NULL)
                    482:     {
                    483:       vty_out (vty, "No such interface %s%s", argv[0], VNL);
                    484:       return CMD_SUCCESS;
                    485:     }
                    486: 
                    487:   oi = (struct ospf6_interface *) ifp->info;
                    488:   if (oi == NULL)
                    489:     {
                    490:       vty_out (vty, "Interface %s not enabled%s", ifp->name, VNL);
                    491:       return CMD_SUCCESS;
                    492:     }
                    493: 
                    494:   /* parse Area-ID */
                    495:   if (inet_pton (AF_INET, argv[1], &area_id) != 1)
                    496:     {
                    497:       vty_out (vty, "Invalid Area-ID: %s%s", argv[1], VNL);
                    498:       return CMD_SUCCESS;
                    499:     }
                    500: 
                    501:   /* Verify Area */
                    502:   if (oi->area == NULL)
                    503:     {
                    504:       vty_out (vty, "No such Area-ID: %s%s", argv[1], VNL);
                    505:       return CMD_SUCCESS;
                    506:     }
                    507: 
                    508:   if (oi->area->area_id != area_id)
                    509:     {
                    510:       vty_out (vty, "Wrong Area-ID: %s is attached to area %s%s",
                    511:                oi->interface->name, oi->area->name, VNL);
                    512:       return CMD_SUCCESS;
                    513:     }
                    514: 
                    515:   thread_execute (master, interface_down, oi, 0);
                    516: 
                    517:   oa = oi->area;
                    518:   listnode_delete (oi->area->if_list, oi);
                    519:   oi->area = (struct ospf6_area *) NULL;
                    520: 
                    521:   /* Withdraw inter-area routes from this area, if necessary */
                    522:   if (oa->if_list->count == 0)
                    523:     {
                    524:       UNSET_FLAG (oa->flag, OSPF6_AREA_ENABLE);
                    525:       ospf6_abr_disable_area (oa);
                    526:     }
                    527: 
                    528:   return CMD_SUCCESS;
                    529: }
                    530: 
1.1.1.2 ! misho     531: DEFUN (ospf6_stub_router_admin,
        !           532:        ospf6_stub_router_admin_cmd,
        !           533:        "stub-router administrative",
        !           534:        "Make router a stub router\n"
        !           535:        "Advertise inability to be a transit router\n"
        !           536:        "Administratively applied, for an indefinite period\n")
        !           537: {
        !           538:   struct listnode *node;
        !           539:   struct ospf6_area *oa;
        !           540: 
        !           541:   if (!CHECK_FLAG (ospf6->flag, OSPF6_STUB_ROUTER))
        !           542:     {
        !           543:       for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
        !           544:        {
        !           545:           OSPF6_OPT_CLEAR (oa->options, OSPF6_OPT_V6);
        !           546:           OSPF6_OPT_CLEAR (oa->options, OSPF6_OPT_R);
        !           547:           OSPF6_ROUTER_LSA_SCHEDULE (oa);
        !           548:        }
        !           549:       SET_FLAG (ospf6->flag, OSPF6_STUB_ROUTER);
        !           550:     }
        !           551: 
        !           552:   return CMD_SUCCESS;
        !           553: }
        !           554: 
        !           555: DEFUN (no_ospf6_stub_router_admin,
        !           556:        no_ospf6_stub_router_admin_cmd,
        !           557:        "no stub-router administrative",
        !           558:        NO_STR
        !           559:        "Make router a stub router\n"
        !           560:        "Advertise ability to be a transit router\n"
        !           561:        "Administratively applied, for an indefinite period\n")
        !           562: {
        !           563:   struct listnode *node;
        !           564:   struct ospf6_area *oa;
        !           565: 
        !           566:   if (CHECK_FLAG (ospf6->flag, OSPF6_STUB_ROUTER))
        !           567:     {
        !           568:       for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, node, oa))
        !           569:        {
        !           570:           OSPF6_OPT_SET (oa->options, OSPF6_OPT_V6);
        !           571:           OSPF6_OPT_SET (oa->options, OSPF6_OPT_R);
        !           572:           OSPF6_ROUTER_LSA_SCHEDULE (oa);
        !           573:        }
        !           574:       UNSET_FLAG (ospf6->flag, OSPF6_STUB_ROUTER);
        !           575:     }
        !           576: 
        !           577:   return CMD_SUCCESS;
        !           578: }
        !           579: 
        !           580: DEFUN (ospf6_stub_router_startup,
        !           581:        ospf6_stub_router_startup_cmd,
        !           582:        "stub-router on-startup <5-86400>",
        !           583:        "Make router a stub router\n"
        !           584:        "Advertise inability to be a transit router\n"
        !           585:        "Automatically advertise as stub-router on startup of OSPF6\n"
        !           586:        "Time (seconds) to advertise self as stub-router\n")
        !           587: {
        !           588:   return CMD_SUCCESS;
        !           589: }
        !           590: 
        !           591: DEFUN (no_ospf6_stub_router_startup,
        !           592:        no_ospf6_stub_router_startup_cmd,
        !           593:        "no stub-router on-startup",
        !           594:        NO_STR
        !           595:        "Make router a stub router\n"
        !           596:        "Advertise inability to be a transit router\n"
        !           597:        "Automatically advertise as stub-router on startup of OSPF6\n"
        !           598:        "Time (seconds) to advertise self as stub-router\n")
        !           599: {
        !           600:   return CMD_SUCCESS;
        !           601: }
        !           602: 
        !           603: DEFUN (ospf6_stub_router_shutdown,
        !           604:        ospf6_stub_router_shutdown_cmd,
        !           605:        "stub-router on-shutdown <5-86400>",
        !           606:        "Make router a stub router\n"
        !           607:        "Advertise inability to be a transit router\n"
        !           608:        "Automatically advertise as stub-router before shutdown\n"
        !           609:        "Time (seconds) to advertise self as stub-router\n")
        !           610: {
        !           611:   return CMD_SUCCESS;
        !           612: }
        !           613: 
        !           614: DEFUN (no_ospf6_stub_router_shutdown,
        !           615:        no_ospf6_stub_router_shutdown_cmd,
        !           616:        "no stub-router on-shutdown",
        !           617:        NO_STR
        !           618:        "Make router a stub router\n"
        !           619:        "Advertise inability to be a transit router\n"
        !           620:        "Automatically advertise as stub-router before shutdown\n"
        !           621:        "Time (seconds) to advertise self as stub-router\n")
        !           622: {
        !           623:   return CMD_SUCCESS;
        !           624: }
        !           625: 
1.1       misho     626: static void
                    627: ospf6_show (struct vty *vty, struct ospf6 *o)
                    628: {
                    629:   struct listnode *n;
                    630:   struct ospf6_area *oa;
                    631:   char router_id[16], duration[32];
1.1.1.2 ! misho     632:   struct timeval now, running, result;
        !           633:   char buf[32], rbuf[32];
1.1       misho     634: 
                    635:   /* process id, router id */
                    636:   inet_ntop (AF_INET, &o->router_id, router_id, sizeof (router_id));
                    637:   vty_out (vty, " OSPFv3 Routing Process (0) with Router-ID %s%s",
                    638:            router_id, VNL);
                    639: 
                    640:   /* running time */
                    641:   quagga_gettime (QUAGGA_CLK_MONOTONIC, &now);
                    642:   timersub (&now, &o->starttime, &running);
                    643:   timerstring (&running, duration, sizeof (duration));
                    644:   vty_out (vty, " Running %s%s", duration, VNL);
                    645: 
                    646:   /* Redistribute configuration */
                    647:   /* XXX */
                    648: 
1.1.1.2 ! misho     649:   /* Show SPF parameters */
        !           650:   vty_out(vty, " Initial SPF scheduling delay %d millisec(s)%s"
        !           651:          " Minimum hold time between consecutive SPFs %d millsecond(s)%s"
        !           652:          " Maximum hold time between consecutive SPFs %d millsecond(s)%s"
        !           653:          " Hold time multiplier is currently %d%s",
        !           654:          o->spf_delay, VNL,
        !           655:          o->spf_holdtime, VNL,
        !           656:          o->spf_max_holdtime, VNL,
        !           657:          o->spf_hold_multiplier, VNL);
        !           658: 
        !           659:   vty_out(vty, " SPF algorithm ");
        !           660:   if (o->ts_spf.tv_sec || o->ts_spf.tv_usec)
        !           661:     {
        !           662:       timersub(&now, &o->ts_spf, &result);
        !           663:       timerstring(&result, buf, sizeof(buf));
        !           664:       ospf6_spf_reason_string(o->last_spf_reason, rbuf, sizeof(rbuf));
        !           665:       vty_out(vty, "last executed %s ago, reason %s%s", buf, rbuf, VNL);
        !           666:       vty_out (vty, " Last SPF duration %lld sec %lld usec%s",
        !           667:                (long long)o->ts_spf_duration.tv_sec,
        !           668:                (long long)o->ts_spf_duration.tv_usec, VNL);
        !           669:     }
        !           670:   else
        !           671:     vty_out(vty, "has not been run$%s", VNL);
        !           672:   threadtimer_string(now, o->t_spf_calc, buf, sizeof(buf));
        !           673:   vty_out (vty, " SPF timer %s%s%s",
        !           674:           (o->t_spf_calc ? "due in " : "is "), buf, VNL);
        !           675: 
        !           676:   if (CHECK_FLAG (o->flag, OSPF6_STUB_ROUTER))
        !           677:     vty_out (vty, " Router Is Stub Router%s", VNL);
        !           678: 
1.1       misho     679:   /* LSAs */
                    680:   vty_out (vty, " Number of AS scoped LSAs is %u%s",
                    681:            o->lsdb->count, VNL);
                    682: 
                    683:   /* Areas */
                    684:   vty_out (vty, " Number of areas in this router is %u%s",
                    685:            listcount (o->area_list), VNL);
                    686: 
1.1.1.2 ! misho     687:   if (CHECK_FLAG(o->config_flags, OSPF6_LOG_ADJACENCY_CHANGES))
        !           688:     {
        !           689:       if (CHECK_FLAG(o->config_flags, OSPF6_LOG_ADJACENCY_DETAIL))
        !           690:        vty_out(vty, " All adjacency changes are logged%s",VTY_NEWLINE);
        !           691:       else
        !           692:        vty_out(vty, " Adjacency changes are logged%s",VTY_NEWLINE);
        !           693:     }
        !           694: 
        !           695:   vty_out (vty, "%s",VTY_NEWLINE);
        !           696: 
1.1       misho     697:   for (ALL_LIST_ELEMENTS_RO (o->area_list, n, oa))
                    698:     ospf6_area_show (vty, oa);
                    699: }
                    700: 
                    701: /* show top level structures */
                    702: DEFUN (show_ipv6_ospf6,
                    703:        show_ipv6_ospf6_cmd,
                    704:        "show ipv6 ospf6",
                    705:        SHOW_STR
                    706:        IP6_STR
                    707:        OSPF6_STR)
                    708: {
                    709:   OSPF6_CMD_CHECK_RUNNING ();
                    710: 
                    711:   ospf6_show (vty, ospf6);
                    712:   return CMD_SUCCESS;
                    713: }
                    714: 
                    715: DEFUN (show_ipv6_ospf6_route,
                    716:        show_ipv6_ospf6_route_cmd,
                    717:        "show ipv6 ospf6 route",
                    718:        SHOW_STR
                    719:        IP6_STR
                    720:        OSPF6_STR
                    721:        ROUTE_STR
                    722:        )
                    723: {
                    724:   ospf6_route_table_show (vty, argc, argv, ospf6->route_table);
                    725:   return CMD_SUCCESS;
                    726: }
                    727: 
                    728: ALIAS (show_ipv6_ospf6_route,
                    729:        show_ipv6_ospf6_route_detail_cmd,
                    730:        "show ipv6 ospf6 route (X:X::X:X|X:X::X:X/M|detail|summary)",
                    731:        SHOW_STR
                    732:        IP6_STR
                    733:        OSPF6_STR
                    734:        ROUTE_STR
                    735:        "Specify IPv6 address\n"
                    736:        "Specify IPv6 prefix\n"
                    737:        "Detailed information\n"
                    738:        "Summary of route table\n"
                    739:        )
                    740: 
                    741: DEFUN (show_ipv6_ospf6_route_match,
                    742:        show_ipv6_ospf6_route_match_cmd,
                    743:        "show ipv6 ospf6 route X:X::X:X/M match",
                    744:        SHOW_STR
                    745:        IP6_STR
                    746:        OSPF6_STR
                    747:        ROUTE_STR
                    748:        "Specify IPv6 prefix\n"
                    749:        "Display routes which match the specified route\n"
                    750:        )
                    751: {
                    752:   const char *sargv[CMD_ARGC_MAX];
                    753:   int i, sargc;
                    754: 
                    755:   /* copy argv to sargv and then append "match" */
                    756:   for (i = 0; i < argc; i++)
                    757:     sargv[i] = argv[i];
                    758:   sargc = argc;
                    759:   sargv[sargc++] = "match";
                    760:   sargv[sargc] = NULL;
                    761: 
                    762:   ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
                    763:   return CMD_SUCCESS;
                    764: }
                    765: 
                    766: DEFUN (show_ipv6_ospf6_route_match_detail,
                    767:        show_ipv6_ospf6_route_match_detail_cmd,
                    768:        "show ipv6 ospf6 route X:X::X:X/M match detail",
                    769:        SHOW_STR
                    770:        IP6_STR
                    771:        OSPF6_STR
                    772:        ROUTE_STR
                    773:        "Specify IPv6 prefix\n"
                    774:        "Display routes which match the specified route\n"
                    775:        "Detailed information\n"
                    776:        )
                    777: {
                    778:   const char *sargv[CMD_ARGC_MAX];
                    779:   int i, sargc;
                    780: 
                    781:   /* copy argv to sargv and then append "match" and "detail" */
                    782:   for (i = 0; i < argc; i++)
                    783:     sargv[i] = argv[i];
                    784:   sargc = argc;
                    785:   sargv[sargc++] = "match";
                    786:   sargv[sargc++] = "detail";
                    787:   sargv[sargc] = NULL;
                    788: 
                    789:   ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
                    790:   return CMD_SUCCESS;
                    791: }
                    792: 
                    793: ALIAS (show_ipv6_ospf6_route_match,
                    794:        show_ipv6_ospf6_route_longer_cmd,
                    795:        "show ipv6 ospf6 route X:X::X:X/M longer",
                    796:        SHOW_STR
                    797:        IP6_STR
                    798:        OSPF6_STR
                    799:        ROUTE_STR
                    800:        "Specify IPv6 prefix\n"
                    801:        "Display routes longer than the specified route\n"
                    802:        )
                    803: 
                    804: DEFUN (show_ipv6_ospf6_route_match_detail,
                    805:        show_ipv6_ospf6_route_longer_detail_cmd,
                    806:        "show ipv6 ospf6 route X:X::X:X/M longer detail",
                    807:        SHOW_STR
                    808:        IP6_STR
                    809:        OSPF6_STR
                    810:        ROUTE_STR
                    811:        "Specify IPv6 prefix\n"
                    812:        "Display routes longer than the specified route\n"
                    813:        "Detailed information\n"
                    814:        );
                    815: 
                    816: ALIAS (show_ipv6_ospf6_route,
                    817:        show_ipv6_ospf6_route_type_cmd,
                    818:        "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2)",
                    819:        SHOW_STR
                    820:        IP6_STR
                    821:        OSPF6_STR
                    822:        ROUTE_STR
                    823:        "Display Intra-Area routes\n"
                    824:        "Display Inter-Area routes\n"
                    825:        "Display Type-1 External routes\n"
                    826:        "Display Type-2 External routes\n"
                    827:        )
                    828: 
                    829: DEFUN (show_ipv6_ospf6_route_type_detail,
                    830:        show_ipv6_ospf6_route_type_detail_cmd,
                    831:        "show ipv6 ospf6 route (intra-area|inter-area|external-1|external-2) detail",
                    832:        SHOW_STR
                    833:        IP6_STR
                    834:        OSPF6_STR
                    835:        ROUTE_STR
                    836:        "Display Intra-Area routes\n"
                    837:        "Display Inter-Area routes\n"
                    838:        "Display Type-1 External routes\n"
                    839:        "Display Type-2 External routes\n"
                    840:        "Detailed information\n"
                    841:        )
                    842: {
                    843:   const char *sargv[CMD_ARGC_MAX];
                    844:   int i, sargc;
                    845: 
                    846:   /* copy argv to sargv and then append "detail" */
                    847:   for (i = 0; i < argc; i++)
                    848:     sargv[i] = argv[i];
                    849:   sargc = argc;
                    850:   sargv[sargc++] = "detail";
                    851:   sargv[sargc] = NULL;
                    852: 
                    853:   ospf6_route_table_show (vty, sargc, sargv, ospf6->route_table);
                    854:   return CMD_SUCCESS;
                    855: }
                    856: 
1.1.1.2 ! misho     857: static void
        !           858: ospf6_stub_router_config_write (struct vty *vty)
        !           859: {
        !           860:   if (CHECK_FLAG (ospf6->flag, OSPF6_STUB_ROUTER))
        !           861:     {
        !           862:       vty_out (vty, " stub-router administrative%s", VNL);
        !           863:     }
        !           864:     return;
        !           865: }
        !           866: 
1.1       misho     867: /* OSPF configuration write function. */
                    868: static int
                    869: config_write_ospf6 (struct vty *vty)
                    870: {
                    871:   char router_id[16];
                    872:   struct listnode *j, *k;
                    873:   struct ospf6_area *oa;
                    874:   struct ospf6_interface *oi;
                    875: 
                    876:   /* OSPFv6 configuration. */
                    877:   if (ospf6 == NULL)
                    878:     return CMD_SUCCESS;
                    879: 
                    880:   inet_ntop (AF_INET, &ospf6->router_id_static, router_id, sizeof (router_id));
                    881:   vty_out (vty, "router ospf6%s", VNL);
                    882:   if (ospf6->router_id_static != 0)
                    883:     vty_out (vty, " router-id %s%s", router_id, VNL);
                    884: 
1.1.1.2 ! misho     885:   /* log-adjacency-changes flag print. */
        !           886:   if (CHECK_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_CHANGES))
        !           887:     {
        !           888:       vty_out(vty, " log-adjacency-changes");
        !           889:       if (CHECK_FLAG(ospf6->config_flags, OSPF6_LOG_ADJACENCY_DETAIL))
        !           890:        vty_out(vty, " detail");
        !           891:       vty_out(vty, "%s", VTY_NEWLINE);
        !           892:     }
        !           893: 
        !           894:   if (ospf6->ref_bandwidth != OSPF6_REFERENCE_BANDWIDTH)
        !           895:     vty_out (vty, " auto-cost reference-bandwidth %d%s", ospf6->ref_bandwidth / 1000,
        !           896:              VNL);
        !           897: 
        !           898:   ospf6_stub_router_config_write (vty);
1.1       misho     899:   ospf6_redistribute_config_write (vty);
                    900:   ospf6_area_config_write (vty);
1.1.1.2 ! misho     901:   ospf6_spf_config_write (vty);
1.1       misho     902: 
                    903:   for (ALL_LIST_ELEMENTS_RO (ospf6->area_list, j, oa))
                    904:     {
                    905:       for (ALL_LIST_ELEMENTS_RO (oa->if_list, k, oi))
                    906:         vty_out (vty, " interface %s area %s%s",
                    907:                  oi->interface->name, oa->name, VNL);
                    908:     }
                    909:   vty_out (vty, "!%s", VNL);
                    910:   return 0;
                    911: }
                    912: 
                    913: /* OSPF6 node structure. */
                    914: static struct cmd_node ospf6_node =
                    915: {
                    916:   OSPF6_NODE,
                    917:   "%s(config-ospf6)# ",
                    918:   1 /* VTYSH */
                    919: };
                    920: 
                    921: /* Install ospf related commands. */
                    922: void
                    923: ospf6_top_init (void)
                    924: {
                    925:   /* Install ospf6 top node. */
                    926:   install_node (&ospf6_node, config_write_ospf6);
                    927: 
                    928:   install_element (VIEW_NODE, &show_ipv6_ospf6_cmd);
                    929:   install_element (ENABLE_NODE, &show_ipv6_ospf6_cmd);
                    930:   install_element (CONFIG_NODE, &router_ospf6_cmd);
                    931:   install_element (CONFIG_NODE, &no_router_ospf6_cmd);
                    932: 
                    933:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_cmd);
                    934:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_detail_cmd);
                    935:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_cmd);
                    936:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
                    937:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_longer_cmd);
                    938:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_longer_detail_cmd);
                    939:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_cmd);
                    940:   install_element (VIEW_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
                    941:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_cmd);
                    942:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_detail_cmd);
                    943:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_cmd);
                    944:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_match_detail_cmd);
                    945:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_longer_cmd);
                    946:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_longer_detail_cmd);
                    947:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_cmd);
                    948:   install_element (ENABLE_NODE, &show_ipv6_ospf6_route_type_detail_cmd);
                    949: 
                    950:   install_default (OSPF6_NODE);
                    951:   install_element (OSPF6_NODE, &ospf6_router_id_cmd);
1.1.1.2 ! misho     952:   install_element (OSPF6_NODE, &ospf6_log_adjacency_changes_cmd);
        !           953:   install_element (OSPF6_NODE, &ospf6_log_adjacency_changes_detail_cmd);
        !           954:   install_element (OSPF6_NODE, &no_ospf6_log_adjacency_changes_cmd);
        !           955:   install_element (OSPF6_NODE, &no_ospf6_log_adjacency_changes_detail_cmd);
1.1       misho     956:   install_element (OSPF6_NODE, &ospf6_interface_area_cmd);
                    957:   install_element (OSPF6_NODE, &no_ospf6_interface_area_cmd);
1.1.1.2 ! misho     958:   install_element (OSPF6_NODE, &ospf6_stub_router_admin_cmd);
        !           959:   install_element (OSPF6_NODE, &no_ospf6_stub_router_admin_cmd);
        !           960:   /* For a later time
        !           961:   install_element (OSPF6_NODE, &ospf6_stub_router_startup_cmd);
        !           962:   install_element (OSPF6_NODE, &no_ospf6_stub_router_startup_cmd);
        !           963:   install_element (OSPF6_NODE, &ospf6_stub_router_shutdown_cmd);
        !           964:   install_element (OSPF6_NODE, &no_ospf6_stub_router_shutdown_cmd);
        !           965:   */
1.1       misho     966: }
                    967: 
                    968: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>