Annotation of embedaddon/quagga/ospf6d/ospf6_interface.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Copyright (C) 2003 Yasuhiro Ohara
        !             3:  *
        !             4:  * This file is part of GNU Zebra.
        !             5:  *
        !             6:  * GNU Zebra is free software; you can redistribute it and/or modify it
        !             7:  * under the terms of the GNU General Public License as published by the
        !             8:  * Free Software Foundation; either version 2, or (at your option) any
        !             9:  * later version.
        !            10:  *
        !            11:  * GNU Zebra is distributed in the hope that it will be useful, but
        !            12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            14:  * General Public License for more details.
        !            15:  *
        !            16:  * You should have received a copy of the GNU General Public License
        !            17:  * along with GNU Zebra; see the file COPYING.  If not, write to the 
        !            18:  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 
        !            19:  * Boston, MA 02111-1307, USA.  
        !            20:  */
        !            21: 
        !            22: #include <zebra.h>
        !            23: 
        !            24: #include "memory.h"
        !            25: #include "if.h"
        !            26: #include "log.h"
        !            27: #include "command.h"
        !            28: #include "thread.h"
        !            29: #include "prefix.h"
        !            30: #include "plist.h"
        !            31: 
        !            32: #include "ospf6_lsa.h"
        !            33: #include "ospf6_lsdb.h"
        !            34: #include "ospf6_network.h"
        !            35: #include "ospf6_message.h"
        !            36: #include "ospf6_route.h"
        !            37: #include "ospf6_top.h"
        !            38: #include "ospf6_area.h"
        !            39: #include "ospf6_interface.h"
        !            40: #include "ospf6_neighbor.h"
        !            41: #include "ospf6_intra.h"
        !            42: #include "ospf6_spf.h"
        !            43: #include "ospf6d.h"
        !            44: 
        !            45: unsigned char conf_debug_ospf6_interface = 0;
        !            46: 
        !            47: const char *ospf6_interface_state_str[] =
        !            48: {
        !            49:   "None",
        !            50:   "Down",
        !            51:   "Loopback",
        !            52:   "Waiting",
        !            53:   "PointToPoint",
        !            54:   "DROther",
        !            55:   "BDR",
        !            56:   "DR",
        !            57:   NULL
        !            58: };
        !            59: 
        !            60: struct ospf6_interface *
        !            61: ospf6_interface_lookup_by_ifindex (int ifindex)
        !            62: {
        !            63:   struct ospf6_interface *oi;
        !            64:   struct interface *ifp;
        !            65: 
        !            66:   ifp = if_lookup_by_index (ifindex);
        !            67:   if (ifp == NULL)
        !            68:     return (struct ospf6_interface *) NULL;
        !            69: 
        !            70:   oi = (struct ospf6_interface *) ifp->info;
        !            71:   return oi;
        !            72: }
        !            73: 
        !            74: /* schedule routing table recalculation */
        !            75: static void
        !            76: ospf6_interface_lsdb_hook (struct ospf6_lsa *lsa)
        !            77: {
        !            78:   switch (ntohs (lsa->header->type))
        !            79:     {
        !            80:       case OSPF6_LSTYPE_LINK:
        !            81:         if (OSPF6_INTERFACE (lsa->lsdb->data)->state == OSPF6_INTERFACE_DR)
        !            82:           OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (OSPF6_INTERFACE (lsa->lsdb->data));
        !            83:         ospf6_spf_schedule (OSPF6_INTERFACE (lsa->lsdb->data)->area);
        !            84:         break;
        !            85: 
        !            86:       default:
        !            87:         break;
        !            88:     }
        !            89: }
        !            90: 
        !            91: /* Create new ospf6 interface structure */
        !            92: struct ospf6_interface *
        !            93: ospf6_interface_create (struct interface *ifp)
        !            94: {
        !            95:   struct ospf6_interface *oi;
        !            96:   unsigned int iobuflen;
        !            97: 
        !            98:   oi = (struct ospf6_interface *)
        !            99:     XCALLOC (MTYPE_OSPF6_IF, sizeof (struct ospf6_interface));
        !           100: 
        !           101:   if (!oi)
        !           102:     {
        !           103:       zlog_err ("Can't malloc ospf6_interface for ifindex %d", ifp->ifindex);
        !           104:       return (struct ospf6_interface *) NULL;
        !           105:     }
        !           106: 
        !           107:   oi->area = (struct ospf6_area *) NULL;
        !           108:   oi->neighbor_list = list_new ();
        !           109:   oi->neighbor_list->cmp = ospf6_neighbor_cmp;
        !           110:   oi->linklocal_addr = (struct in6_addr *) NULL;
        !           111:   oi->instance_id = 0;
        !           112:   oi->transdelay = 1;
        !           113:   oi->priority = 1;
        !           114: 
        !           115:   oi->hello_interval = 10;
        !           116:   oi->dead_interval = 40;
        !           117:   oi->rxmt_interval = 5;
        !           118:   oi->cost = 1;
        !           119:   oi->state = OSPF6_INTERFACE_DOWN;
        !           120:   oi->flag = 0;
        !           121:   oi->mtu_ignore = 0;
        !           122: 
        !           123:   /* Try to adjust I/O buffer size with IfMtu */
        !           124:   oi->ifmtu = ifp->mtu6;
        !           125:   iobuflen = ospf6_iobuf_size (ifp->mtu6);
        !           126:   if (oi->ifmtu > iobuflen)
        !           127:     {
        !           128:       if (IS_OSPF6_DEBUG_INTERFACE)
        !           129:         zlog_debug ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
        !           130:                    ifp->name, iobuflen);
        !           131:       oi->ifmtu = iobuflen;
        !           132:     }
        !           133: 
        !           134:   oi->lsupdate_list = ospf6_lsdb_create (oi);
        !           135:   oi->lsack_list = ospf6_lsdb_create (oi);
        !           136:   oi->lsdb = ospf6_lsdb_create (oi);
        !           137:   oi->lsdb->hook_add = ospf6_interface_lsdb_hook;
        !           138:   oi->lsdb->hook_remove = ospf6_interface_lsdb_hook;
        !           139:   oi->lsdb_self = ospf6_lsdb_create (oi);
        !           140: 
        !           141:   oi->route_connected = OSPF6_ROUTE_TABLE_CREATE (INTERFACE, CONNECTED_ROUTES);
        !           142:   oi->route_connected->scope = oi;
        !           143: 
        !           144:   /* link both */
        !           145:   oi->interface = ifp;
        !           146:   ifp->info = oi;
        !           147: 
        !           148:   return oi;
        !           149: }
        !           150: 
        !           151: void
        !           152: ospf6_interface_delete (struct ospf6_interface *oi)
        !           153: {
        !           154:   struct listnode *node, *nnode;
        !           155:   struct ospf6_neighbor *on;
        !           156: 
        !           157:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !           158:       ospf6_neighbor_delete (on);
        !           159:   
        !           160:   list_delete (oi->neighbor_list);
        !           161: 
        !           162:   THREAD_OFF (oi->thread_send_hello);
        !           163:   THREAD_OFF (oi->thread_send_lsupdate);
        !           164:   THREAD_OFF (oi->thread_send_lsack);
        !           165: 
        !           166:   ospf6_lsdb_remove_all (oi->lsdb);
        !           167:   ospf6_lsdb_remove_all (oi->lsupdate_list);
        !           168:   ospf6_lsdb_remove_all (oi->lsack_list);
        !           169: 
        !           170:   ospf6_lsdb_delete (oi->lsdb);
        !           171:   ospf6_lsdb_delete (oi->lsdb_self);
        !           172: 
        !           173:   ospf6_lsdb_delete (oi->lsupdate_list);
        !           174:   ospf6_lsdb_delete (oi->lsack_list);
        !           175: 
        !           176:   ospf6_route_table_delete (oi->route_connected);
        !           177: 
        !           178:   /* cut link */
        !           179:   oi->interface->info = NULL;
        !           180: 
        !           181:   /* plist_name */
        !           182:   if (oi->plist_name)
        !           183:     XFREE (MTYPE_PREFIX_LIST_STR, oi->plist_name);
        !           184: 
        !           185:   XFREE (MTYPE_OSPF6_IF, oi);
        !           186: }
        !           187: 
        !           188: void
        !           189: ospf6_interface_enable (struct ospf6_interface *oi)
        !           190: {
        !           191:   UNSET_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE);
        !           192: 
        !           193:   oi->thread_send_hello =
        !           194:     thread_add_event (master, ospf6_hello_send, oi, 0);
        !           195: }
        !           196: 
        !           197: void
        !           198: ospf6_interface_disable (struct ospf6_interface *oi)
        !           199: {
        !           200:   struct listnode *node, *nnode;
        !           201:   struct ospf6_neighbor *on;
        !           202: 
        !           203:   SET_FLAG (oi->flag, OSPF6_INTERFACE_DISABLE);
        !           204: 
        !           205:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !           206:       ospf6_neighbor_delete (on);
        !           207: 
        !           208:   list_delete_all_node (oi->neighbor_list);
        !           209: 
        !           210:   ospf6_lsdb_remove_all (oi->lsdb);
        !           211:   ospf6_lsdb_remove_all (oi->lsupdate_list);
        !           212:   ospf6_lsdb_remove_all (oi->lsack_list);
        !           213: 
        !           214:   THREAD_OFF (oi->thread_send_hello);
        !           215:   THREAD_OFF (oi->thread_send_lsupdate);
        !           216:   THREAD_OFF (oi->thread_send_lsack);
        !           217: }
        !           218: 
        !           219: static struct in6_addr *
        !           220: ospf6_interface_get_linklocal_address (struct interface *ifp)
        !           221: {
        !           222:   struct listnode *n;
        !           223:   struct connected *c;
        !           224:   struct in6_addr *l = (struct in6_addr *) NULL;
        !           225: 
        !           226:   /* for each connected address */
        !           227:   for (ALL_LIST_ELEMENTS_RO (ifp->connected, n, c))
        !           228:     {
        !           229:       /* if family not AF_INET6, ignore */
        !           230:       if (c->address->family != AF_INET6)
        !           231:         continue;
        !           232: 
        !           233:       /* linklocal scope check */
        !           234:       if (IN6_IS_ADDR_LINKLOCAL (&c->address->u.prefix6))
        !           235:         l = &c->address->u.prefix6;
        !           236:     }
        !           237:   return l;
        !           238: }
        !           239: 
        !           240: void
        !           241: ospf6_interface_if_add (struct interface *ifp)
        !           242: {
        !           243:   struct ospf6_interface *oi;
        !           244:   unsigned int iobuflen;
        !           245: 
        !           246:   oi = (struct ospf6_interface *) ifp->info;
        !           247:   if (oi == NULL)
        !           248:     return;
        !           249: 
        !           250:   /* Try to adjust I/O buffer size with IfMtu */
        !           251:   if (oi->ifmtu == 0)
        !           252:     oi->ifmtu = ifp->mtu6;
        !           253:   iobuflen = ospf6_iobuf_size (ifp->mtu6);
        !           254:   if (oi->ifmtu > iobuflen)
        !           255:     {
        !           256:       if (IS_OSPF6_DEBUG_INTERFACE)
        !           257:         zlog_debug ("Interface %s: IfMtu is adjusted to I/O buffer size: %d.",
        !           258:                    ifp->name, iobuflen);
        !           259:       oi->ifmtu = iobuflen;
        !           260:     }
        !           261: 
        !           262:   /* interface start */
        !           263:   if (oi->area)
        !           264:     thread_add_event (master, interface_up, oi, 0);
        !           265: }
        !           266: 
        !           267: void
        !           268: ospf6_interface_if_del (struct interface *ifp)
        !           269: {
        !           270:   struct ospf6_interface *oi;
        !           271: 
        !           272:   oi = (struct ospf6_interface *) ifp->info;
        !           273:   if (oi == NULL)
        !           274:     return;
        !           275: 
        !           276:   /* interface stop */
        !           277:   if (oi->area)
        !           278:     thread_execute (master, interface_down, oi, 0);
        !           279: 
        !           280:   listnode_delete (oi->area->if_list, oi);
        !           281:   oi->area = (struct ospf6_area *) NULL;
        !           282: 
        !           283:   /* cut link */
        !           284:   oi->interface = NULL;
        !           285:   ifp->info = NULL;
        !           286: 
        !           287:   ospf6_interface_delete (oi);
        !           288: }
        !           289: 
        !           290: void
        !           291: ospf6_interface_state_update (struct interface *ifp)
        !           292: {
        !           293:   struct ospf6_interface *oi;
        !           294: 
        !           295:   oi = (struct ospf6_interface *) ifp->info;
        !           296:   if (oi == NULL)
        !           297:     return;
        !           298:   if (oi->area == NULL)
        !           299:     return;
        !           300: 
        !           301:   if (if_is_up (ifp))
        !           302:     thread_add_event (master, interface_up, oi, 0);
        !           303:   else
        !           304:     thread_add_event (master, interface_down, oi, 0);
        !           305: 
        !           306:   return;
        !           307: }
        !           308: 
        !           309: void
        !           310: ospf6_interface_connected_route_update (struct interface *ifp)
        !           311: {
        !           312:   struct ospf6_interface *oi;
        !           313:   struct ospf6_route *route;
        !           314:   struct connected *c;
        !           315:   struct listnode *node, *nnode;
        !           316: 
        !           317:   oi = (struct ospf6_interface *) ifp->info;
        !           318:   if (oi == NULL)
        !           319:     return;
        !           320: 
        !           321:   /* reset linklocal pointer */
        !           322:   oi->linklocal_addr = ospf6_interface_get_linklocal_address (ifp);
        !           323: 
        !           324:   /* if area is null, do not make connected-route list */
        !           325:   if (oi->area == NULL)
        !           326:     return;
        !           327: 
        !           328:   /* update "route to advertise" interface route table */
        !           329:   ospf6_route_remove_all (oi->route_connected);
        !           330: 
        !           331:   for (ALL_LIST_ELEMENTS (oi->interface->connected, node, nnode, c))
        !           332:     {
        !           333:       if (c->address->family != AF_INET6)
        !           334:         continue;
        !           335: 
        !           336:       CONTINUE_IF_ADDRESS_LINKLOCAL (IS_OSPF6_DEBUG_INTERFACE, c->address);
        !           337:       CONTINUE_IF_ADDRESS_UNSPECIFIED (IS_OSPF6_DEBUG_INTERFACE, c->address);
        !           338:       CONTINUE_IF_ADDRESS_LOOPBACK (IS_OSPF6_DEBUG_INTERFACE, c->address);
        !           339:       CONTINUE_IF_ADDRESS_V4COMPAT (IS_OSPF6_DEBUG_INTERFACE, c->address);
        !           340:       CONTINUE_IF_ADDRESS_V4MAPPED (IS_OSPF6_DEBUG_INTERFACE, c->address);
        !           341: 
        !           342:       /* apply filter */
        !           343:       if (oi->plist_name)
        !           344:         {
        !           345:           struct prefix_list *plist;
        !           346:           enum prefix_list_type ret;
        !           347:           char buf[128];
        !           348: 
        !           349:           prefix2str (c->address, buf, sizeof (buf));
        !           350:           plist = prefix_list_lookup (AFI_IP6, oi->plist_name);
        !           351:           ret = prefix_list_apply (plist, (void *) c->address);
        !           352:           if (ret == PREFIX_DENY)
        !           353:             {
        !           354:               if (IS_OSPF6_DEBUG_INTERFACE)
        !           355:                 zlog_debug ("%s on %s filtered by prefix-list %s ",
        !           356:                            buf, oi->interface->name, oi->plist_name);
        !           357:               continue;
        !           358:             }
        !           359:         }
        !           360: 
        !           361:       route = ospf6_route_create ();
        !           362:       memcpy (&route->prefix, c->address, sizeof (struct prefix));
        !           363:       apply_mask (&route->prefix);
        !           364:       route->type = OSPF6_DEST_TYPE_NETWORK;
        !           365:       route->path.area_id = oi->area->area_id;
        !           366:       route->path.type = OSPF6_PATH_TYPE_INTRA;
        !           367:       route->path.cost = oi->cost;
        !           368:       route->nexthop[0].ifindex = oi->interface->ifindex;
        !           369:       inet_pton (AF_INET6, "::1", &route->nexthop[0].address);
        !           370:       ospf6_route_add (route, oi->route_connected);
        !           371:     }
        !           372: 
        !           373:   /* create new Link-LSA */
        !           374:   OSPF6_LINK_LSA_SCHEDULE (oi);
        !           375:   OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
        !           376:   OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
        !           377: }
        !           378: 
        !           379: static void
        !           380: ospf6_interface_state_change (u_char next_state, struct ospf6_interface *oi)
        !           381: {
        !           382:   u_char prev_state;
        !           383: 
        !           384:   prev_state = oi->state;
        !           385:   oi->state = next_state;
        !           386: 
        !           387:   if (prev_state == next_state)
        !           388:     return;
        !           389: 
        !           390:   /* log */
        !           391:   if (IS_OSPF6_DEBUG_INTERFACE)
        !           392:     {
        !           393:       zlog_debug ("Interface state change %s: %s -> %s", oi->interface->name,
        !           394:                  ospf6_interface_state_str[prev_state],
        !           395:                  ospf6_interface_state_str[next_state]);
        !           396:     }
        !           397: 
        !           398:   if ((prev_state == OSPF6_INTERFACE_DR ||
        !           399:        prev_state == OSPF6_INTERFACE_BDR) &&
        !           400:       (next_state != OSPF6_INTERFACE_DR &&
        !           401:        next_state != OSPF6_INTERFACE_BDR))
        !           402:     ospf6_leave_alldrouters (oi->interface->ifindex);
        !           403:   if ((prev_state != OSPF6_INTERFACE_DR &&
        !           404:        prev_state != OSPF6_INTERFACE_BDR) &&
        !           405:       (next_state == OSPF6_INTERFACE_DR ||
        !           406:        next_state == OSPF6_INTERFACE_BDR))
        !           407:     ospf6_join_alldrouters (oi->interface->ifindex);
        !           408: 
        !           409:   OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
        !           410:   if (next_state == OSPF6_INTERFACE_DOWN)
        !           411:     {
        !           412:       OSPF6_NETWORK_LSA_EXECUTE (oi);
        !           413:       OSPF6_INTRA_PREFIX_LSA_EXECUTE_TRANSIT (oi);
        !           414:       OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
        !           415:     }
        !           416:   else if (prev_state == OSPF6_INTERFACE_DR ||
        !           417:            next_state == OSPF6_INTERFACE_DR)
        !           418:     {
        !           419:       OSPF6_NETWORK_LSA_SCHEDULE (oi);
        !           420:       OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
        !           421:       OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
        !           422:     }
        !           423: }
        !           424: 
        !           425: 
        !           426: /* DR Election, RFC2328 section 9.4 */
        !           427: 
        !           428: #define IS_ELIGIBLE(n) \
        !           429:   ((n)->state >= OSPF6_NEIGHBOR_TWOWAY && (n)->priority != 0)
        !           430: 
        !           431: static struct ospf6_neighbor *
        !           432: better_bdrouter (struct ospf6_neighbor *a, struct ospf6_neighbor *b)
        !           433: {
        !           434:   if ((a == NULL || ! IS_ELIGIBLE (a) || a->drouter == a->router_id) &&
        !           435:       (b == NULL || ! IS_ELIGIBLE (b) || b->drouter == b->router_id))
        !           436:     return NULL;
        !           437:   else if (a == NULL || ! IS_ELIGIBLE (a) || a->drouter == a->router_id)
        !           438:     return b;
        !           439:   else if (b == NULL || ! IS_ELIGIBLE (b) || b->drouter == b->router_id)
        !           440:     return a;
        !           441: 
        !           442:   if (a->bdrouter == a->router_id && b->bdrouter != b->router_id)
        !           443:     return a;
        !           444:   if (a->bdrouter != a->router_id && b->bdrouter == b->router_id)
        !           445:     return b;
        !           446: 
        !           447:   if (a->priority > b->priority)
        !           448:     return a;
        !           449:   if (a->priority < b->priority)
        !           450:     return b;
        !           451: 
        !           452:   if (ntohl (a->router_id) > ntohl (b->router_id))
        !           453:     return a;
        !           454:   if (ntohl (a->router_id) < ntohl (b->router_id))
        !           455:     return b;
        !           456: 
        !           457:   zlog_warn ("Router-ID duplicate ?");
        !           458:   return a;
        !           459: }
        !           460: 
        !           461: static struct ospf6_neighbor *
        !           462: better_drouter (struct ospf6_neighbor *a, struct ospf6_neighbor *b)
        !           463: {
        !           464:   if ((a == NULL || ! IS_ELIGIBLE (a) || a->drouter != a->router_id) &&
        !           465:       (b == NULL || ! IS_ELIGIBLE (b) || b->drouter != b->router_id))
        !           466:     return NULL;
        !           467:   else if (a == NULL || ! IS_ELIGIBLE (a) || a->drouter != a->router_id)
        !           468:     return b;
        !           469:   else if (b == NULL || ! IS_ELIGIBLE (b) || b->drouter != b->router_id)
        !           470:     return a;
        !           471: 
        !           472:   if (a->drouter == a->router_id && b->drouter != b->router_id)
        !           473:     return a;
        !           474:   if (a->drouter != a->router_id && b->drouter == b->router_id)
        !           475:     return b;
        !           476: 
        !           477:   if (a->priority > b->priority)
        !           478:     return a;
        !           479:   if (a->priority < b->priority)
        !           480:     return b;
        !           481: 
        !           482:   if (ntohl (a->router_id) > ntohl (b->router_id))
        !           483:     return a;
        !           484:   if (ntohl (a->router_id) < ntohl (b->router_id))
        !           485:     return b;
        !           486: 
        !           487:   zlog_warn ("Router-ID duplicate ?");
        !           488:   return a;
        !           489: }
        !           490: 
        !           491: static u_char
        !           492: dr_election (struct ospf6_interface *oi)
        !           493: {
        !           494:   struct listnode *node, *nnode;
        !           495:   struct ospf6_neighbor *on, *drouter, *bdrouter, myself;
        !           496:   struct ospf6_neighbor *best_drouter, *best_bdrouter;
        !           497:   u_char next_state = 0;
        !           498: 
        !           499:   drouter = bdrouter = NULL;
        !           500:   best_drouter = best_bdrouter = NULL;
        !           501: 
        !           502:   /* pseudo neighbor myself, including noting current DR/BDR (1) */
        !           503:   memset (&myself, 0, sizeof (myself));
        !           504:   inet_ntop (AF_INET, &oi->area->ospf6->router_id, myself.name,
        !           505:              sizeof (myself.name));
        !           506:   myself.state = OSPF6_NEIGHBOR_TWOWAY;
        !           507:   myself.drouter = oi->drouter;
        !           508:   myself.bdrouter = oi->bdrouter;
        !           509:   myself.priority = oi->priority;
        !           510:   myself.router_id = oi->area->ospf6->router_id;
        !           511: 
        !           512:   /* Electing BDR (2) */
        !           513:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !           514:     bdrouter = better_bdrouter (bdrouter, on);
        !           515:   
        !           516:   best_bdrouter = bdrouter;
        !           517:   bdrouter = better_bdrouter (best_bdrouter, &myself);
        !           518: 
        !           519:   /* Electing DR (3) */
        !           520:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !           521:     drouter = better_drouter (drouter, on);
        !           522: 
        !           523:   best_drouter = drouter;
        !           524:   drouter = better_drouter (best_drouter, &myself);
        !           525:   if (drouter == NULL)
        !           526:     drouter = bdrouter;
        !           527: 
        !           528:   /* the router itself is newly/no longer DR/BDR (4) */
        !           529:   if ((drouter == &myself && myself.drouter != myself.router_id) ||
        !           530:       (drouter != &myself && myself.drouter == myself.router_id) ||
        !           531:       (bdrouter == &myself && myself.bdrouter != myself.router_id) ||
        !           532:       (bdrouter != &myself && myself.bdrouter == myself.router_id))
        !           533:     {
        !           534:       myself.drouter = (drouter ? drouter->router_id : htonl (0));
        !           535:       myself.bdrouter = (bdrouter ? bdrouter->router_id : htonl (0));
        !           536: 
        !           537:       /* compatible to Electing BDR (2) */
        !           538:       bdrouter = better_bdrouter (best_bdrouter, &myself);
        !           539: 
        !           540:       /* compatible to Electing DR (3) */
        !           541:       drouter = better_drouter (best_drouter, &myself);
        !           542:       if (drouter == NULL)
        !           543:         drouter = bdrouter;
        !           544:     }
        !           545: 
        !           546:   /* Set interface state accordingly (5) */
        !           547:   if (drouter && drouter == &myself)
        !           548:     next_state = OSPF6_INTERFACE_DR;
        !           549:   else if (bdrouter && bdrouter == &myself)
        !           550:     next_state = OSPF6_INTERFACE_BDR;
        !           551:   else
        !           552:     next_state = OSPF6_INTERFACE_DROTHER;
        !           553: 
        !           554:   /* If NBMA, schedule Start for each neighbor having priority of 0 (6) */
        !           555:   /* XXX */
        !           556: 
        !           557:   /* If DR or BDR change, invoke AdjOK? for each neighbor (7) */
        !           558:   /* RFC 2328 section 12.4. Originating LSAs (3) will be handled
        !           559:      accordingly after AdjOK */
        !           560:   if (oi->drouter != (drouter ? drouter->router_id : htonl (0)) ||
        !           561:       oi->bdrouter != (bdrouter ? bdrouter->router_id : htonl (0)))
        !           562:     {
        !           563:       if (IS_OSPF6_DEBUG_INTERFACE)
        !           564:         zlog_debug ("DR Election on %s: DR: %s BDR: %s", oi->interface->name,
        !           565:                    (drouter ? drouter->name : "0.0.0.0"),
        !           566:                    (bdrouter ? bdrouter->name : "0.0.0.0"));
        !           567: 
        !           568:       for (ALL_LIST_ELEMENTS_RO (oi->neighbor_list, node, on))
        !           569:         {
        !           570:           if (on->state < OSPF6_NEIGHBOR_TWOWAY)
        !           571:             continue;
        !           572:           /* Schedule AdjOK. */
        !           573:           thread_add_event (master, adj_ok, on, 0);
        !           574:         }
        !           575:     }
        !           576: 
        !           577:   oi->drouter = (drouter ? drouter->router_id : htonl (0));
        !           578:   oi->bdrouter = (bdrouter ? bdrouter->router_id : htonl (0));
        !           579:   return next_state;
        !           580: }
        !           581: 
        !           582: 
        !           583: /* Interface State Machine */
        !           584: int
        !           585: interface_up (struct thread *thread)
        !           586: {
        !           587:   struct ospf6_interface *oi;
        !           588: 
        !           589:   oi = (struct ospf6_interface *) THREAD_ARG (thread);
        !           590:   assert (oi && oi->interface);
        !           591: 
        !           592:   if (IS_OSPF6_DEBUG_INTERFACE)
        !           593:     zlog_debug ("Interface Event %s: [InterfaceUp]",
        !           594:                oi->interface->name);
        !           595: 
        !           596:   /* check physical interface is up */
        !           597:   if (! if_is_up (oi->interface))
        !           598:     {
        !           599:       if (IS_OSPF6_DEBUG_INTERFACE)
        !           600:         zlog_debug ("Interface %s is down, can't execute [InterfaceUp]",
        !           601:                    oi->interface->name);
        !           602:       return 0;
        !           603:     }
        !           604: 
        !           605:   /* if already enabled, do nothing */
        !           606:   if (oi->state > OSPF6_INTERFACE_DOWN)
        !           607:     {
        !           608:       if (IS_OSPF6_DEBUG_INTERFACE)
        !           609:         zlog_debug ("Interface %s already enabled",
        !           610:                    oi->interface->name);
        !           611:       return 0;
        !           612:     }
        !           613: 
        !           614:   /* Join AllSPFRouters */
        !           615:   ospf6_join_allspfrouters (oi->interface->ifindex);
        !           616: 
        !           617:   /* Update interface route */
        !           618:   ospf6_interface_connected_route_update (oi->interface);
        !           619: 
        !           620:   /* Schedule Hello */
        !           621:   if (! CHECK_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE))
        !           622:     thread_add_event (master, ospf6_hello_send, oi, 0);
        !           623: 
        !           624:   /* decide next interface state */
        !           625:   if (if_is_pointopoint (oi->interface))
        !           626:     ospf6_interface_state_change (OSPF6_INTERFACE_POINTTOPOINT, oi);
        !           627:   else if (oi->priority == 0)
        !           628:     ospf6_interface_state_change (OSPF6_INTERFACE_DROTHER, oi);
        !           629:   else
        !           630:     {
        !           631:       ospf6_interface_state_change (OSPF6_INTERFACE_WAITING, oi);
        !           632:       thread_add_timer (master, wait_timer, oi, oi->dead_interval);
        !           633:     }
        !           634: 
        !           635:   return 0;
        !           636: }
        !           637: 
        !           638: int
        !           639: wait_timer (struct thread *thread)
        !           640: {
        !           641:   struct ospf6_interface *oi;
        !           642: 
        !           643:   oi = (struct ospf6_interface *) THREAD_ARG (thread);
        !           644:   assert (oi && oi->interface);
        !           645: 
        !           646:   if (IS_OSPF6_DEBUG_INTERFACE)
        !           647:     zlog_debug ("Interface Event %s: [WaitTimer]",
        !           648:                oi->interface->name);
        !           649: 
        !           650:   if (oi->state == OSPF6_INTERFACE_WAITING)
        !           651:     ospf6_interface_state_change (dr_election (oi), oi);
        !           652: 
        !           653:   return 0;
        !           654: }
        !           655: 
        !           656: int
        !           657: backup_seen (struct thread *thread)
        !           658: {
        !           659:   struct ospf6_interface *oi;
        !           660: 
        !           661:   oi = (struct ospf6_interface *) THREAD_ARG (thread);
        !           662:   assert (oi && oi->interface);
        !           663: 
        !           664:   if (IS_OSPF6_DEBUG_INTERFACE)
        !           665:     zlog_debug ("Interface Event %s: [BackupSeen]",
        !           666:                oi->interface->name);
        !           667: 
        !           668:   if (oi->state == OSPF6_INTERFACE_WAITING)
        !           669:     ospf6_interface_state_change (dr_election (oi), oi);
        !           670: 
        !           671:   return 0;
        !           672: }
        !           673: 
        !           674: int
        !           675: neighbor_change (struct thread *thread)
        !           676: {
        !           677:   struct ospf6_interface *oi;
        !           678: 
        !           679:   oi = (struct ospf6_interface *) THREAD_ARG (thread);
        !           680:   assert (oi && oi->interface);
        !           681: 
        !           682:   if (IS_OSPF6_DEBUG_INTERFACE)
        !           683:     zlog_debug ("Interface Event %s: [NeighborChange]",
        !           684:                oi->interface->name);
        !           685: 
        !           686:   if (oi->state == OSPF6_INTERFACE_DROTHER ||
        !           687:       oi->state == OSPF6_INTERFACE_BDR ||
        !           688:       oi->state == OSPF6_INTERFACE_DR)
        !           689:     ospf6_interface_state_change (dr_election (oi), oi);
        !           690: 
        !           691:   return 0;
        !           692: }
        !           693: 
        !           694: int
        !           695: interface_down (struct thread *thread)
        !           696: {
        !           697:   struct ospf6_interface *oi;
        !           698:   struct listnode *node, *nnode;
        !           699:   struct ospf6_neighbor *on;
        !           700: 
        !           701:   oi = (struct ospf6_interface *) THREAD_ARG (thread);
        !           702:   assert (oi && oi->interface);
        !           703: 
        !           704:   if (IS_OSPF6_DEBUG_INTERFACE)
        !           705:     zlog_debug ("Interface Event %s: [InterfaceDown]",
        !           706:                oi->interface->name);
        !           707: 
        !           708:   /* Leave AllSPFRouters */
        !           709:   if (oi->state > OSPF6_INTERFACE_DOWN)
        !           710:     ospf6_leave_allspfrouters (oi->interface->ifindex);
        !           711: 
        !           712:   ospf6_interface_state_change (OSPF6_INTERFACE_DOWN, oi);
        !           713: 
        !           714:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !           715:     ospf6_neighbor_delete (on);
        !           716:   
        !           717:   list_delete_all_node (oi->neighbor_list);
        !           718: 
        !           719:   return 0;
        !           720: }
        !           721: 
        !           722: 
        !           723: /* show specified interface structure */
        !           724: static int
        !           725: ospf6_interface_show (struct vty *vty, struct interface *ifp)
        !           726: {
        !           727:   struct ospf6_interface *oi;
        !           728:   struct connected *c;
        !           729:   struct prefix *p;
        !           730:   struct listnode *i;
        !           731:   char strbuf[64], drouter[32], bdrouter[32];
        !           732:   const char *updown[3] = {"down", "up", NULL};
        !           733:   const char *type;
        !           734:   struct timeval res, now;
        !           735:   char duration[32];
        !           736:   struct ospf6_lsa *lsa;
        !           737: 
        !           738:   /* check physical interface type */
        !           739:   if (if_is_loopback (ifp))
        !           740:     type = "LOOPBACK";
        !           741:   else if (if_is_broadcast (ifp))
        !           742:     type = "BROADCAST";
        !           743:   else if (if_is_pointopoint (ifp))
        !           744:     type = "POINTOPOINT";
        !           745:   else
        !           746:     type = "UNKNOWN";
        !           747: 
        !           748:   vty_out (vty, "%s is %s, type %s%s",
        !           749:            ifp->name, updown[if_is_up (ifp)], type,
        !           750:           VNL);
        !           751:   vty_out (vty, "  Interface ID: %d%s", ifp->ifindex, VNL);
        !           752: 
        !           753:   if (ifp->info == NULL)
        !           754:     {
        !           755:       vty_out (vty, "   OSPF not enabled on this interface%s", VNL);
        !           756:       return 0;
        !           757:     }
        !           758:   else
        !           759:     oi = (struct ospf6_interface *) ifp->info;
        !           760: 
        !           761:   vty_out (vty, "  Internet Address:%s", VNL);
        !           762: 
        !           763:   for (ALL_LIST_ELEMENTS_RO (ifp->connected, i, c))
        !           764:     {
        !           765:       p = c->address;
        !           766:       prefix2str (p, strbuf, sizeof (strbuf));
        !           767:       switch (p->family)
        !           768:         {
        !           769:         case AF_INET:
        !           770:           vty_out (vty, "    inet : %s%s", strbuf,
        !           771:                   VNL);
        !           772:           break;
        !           773:         case AF_INET6:
        !           774:           vty_out (vty, "    inet6: %s%s", strbuf,
        !           775:                   VNL);
        !           776:           break;
        !           777:         default:
        !           778:           vty_out (vty, "    ???  : %s%s", strbuf,
        !           779:                   VNL);
        !           780:           break;
        !           781:         }
        !           782:     }
        !           783: 
        !           784:   if (oi->area)
        !           785:     {
        !           786:       vty_out (vty, "  Instance ID %d, Interface MTU %d (autodetect: %d)%s",
        !           787:               oi->instance_id, oi->ifmtu, ifp->mtu6, VNL);
        !           788:       vty_out (vty, "  MTU mismatch detection: %s%s", oi->mtu_ignore ?
        !           789:               "disabled" : "enabled", VNL);
        !           790:       inet_ntop (AF_INET, &oi->area->area_id,
        !           791:                  strbuf, sizeof (strbuf));
        !           792:       vty_out (vty, "  Area ID %s, Cost %hu%s", strbuf, oi->cost,
        !           793:               VNL);
        !           794:     }
        !           795:   else
        !           796:     vty_out (vty, "  Not Attached to Area%s", VNL);
        !           797: 
        !           798:   vty_out (vty, "  State %s, Transmit Delay %d sec, Priority %d%s",
        !           799:            ospf6_interface_state_str[oi->state],
        !           800:            oi->transdelay, oi->priority,
        !           801:           VNL);
        !           802:   vty_out (vty, "  Timer intervals configured:%s", VNL);
        !           803:   vty_out (vty, "   Hello %d, Dead %d, Retransmit %d%s",
        !           804:            oi->hello_interval, oi->dead_interval, oi->rxmt_interval,
        !           805:           VNL);
        !           806: 
        !           807:   inet_ntop (AF_INET, &oi->drouter, drouter, sizeof (drouter));
        !           808:   inet_ntop (AF_INET, &oi->bdrouter, bdrouter, sizeof (bdrouter));
        !           809:   vty_out (vty, "  DR: %s BDR: %s%s", drouter, bdrouter, VNL);
        !           810: 
        !           811:   vty_out (vty, "  Number of I/F scoped LSAs is %u%s",
        !           812:            oi->lsdb->count, VNL);
        !           813: 
        !           814:   quagga_gettime (QUAGGA_CLK_MONOTONIC, &now);
        !           815: 
        !           816:   timerclear (&res);
        !           817:   if (oi->thread_send_lsupdate)
        !           818:     timersub (&oi->thread_send_lsupdate->u.sands, &now, &res);
        !           819:   timerstring (&res, duration, sizeof (duration));
        !           820:   vty_out (vty, "    %d Pending LSAs for LSUpdate in Time %s [thread %s]%s",
        !           821:            oi->lsupdate_list->count, duration,
        !           822:            (oi->thread_send_lsupdate ? "on" : "off"),
        !           823:            VNL);
        !           824:   for (lsa = ospf6_lsdb_head (oi->lsupdate_list); lsa;
        !           825:        lsa = ospf6_lsdb_next (lsa))
        !           826:     vty_out (vty, "      %s%s", lsa->name, VNL);
        !           827: 
        !           828:   timerclear (&res);
        !           829:   if (oi->thread_send_lsack)
        !           830:     timersub (&oi->thread_send_lsack->u.sands, &now, &res);
        !           831:   timerstring (&res, duration, sizeof (duration));
        !           832:   vty_out (vty, "    %d Pending LSAs for LSAck in Time %s [thread %s]%s",
        !           833:            oi->lsack_list->count, duration,
        !           834:            (oi->thread_send_lsack ? "on" : "off"),
        !           835:            VNL);
        !           836:   for (lsa = ospf6_lsdb_head (oi->lsack_list); lsa;
        !           837:        lsa = ospf6_lsdb_next (lsa))
        !           838:     vty_out (vty, "      %s%s", lsa->name, VNL);
        !           839: 
        !           840:   return 0;
        !           841: }
        !           842: 
        !           843: /* show interface */
        !           844: DEFUN (show_ipv6_ospf6_interface,
        !           845:        show_ipv6_ospf6_interface_ifname_cmd,
        !           846:        "show ipv6 ospf6 interface IFNAME",
        !           847:        SHOW_STR
        !           848:        IP6_STR
        !           849:        OSPF6_STR
        !           850:        INTERFACE_STR
        !           851:        IFNAME_STR
        !           852:        )
        !           853: {
        !           854:   struct interface *ifp;
        !           855:   struct listnode *i;
        !           856: 
        !           857:   if (argc)
        !           858:     {
        !           859:       ifp = if_lookup_by_name (argv[0]);
        !           860:       if (ifp == NULL)
        !           861:         {
        !           862:           vty_out (vty, "No such Interface: %s%s", argv[0],
        !           863:                    VNL);
        !           864:           return CMD_WARNING;
        !           865:         }
        !           866:       ospf6_interface_show (vty, ifp);
        !           867:     }
        !           868:   else
        !           869:     {
        !           870:       for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
        !           871:         ospf6_interface_show (vty, ifp);
        !           872:     }
        !           873: 
        !           874:   return CMD_SUCCESS;
        !           875: }
        !           876: 
        !           877: ALIAS (show_ipv6_ospf6_interface,
        !           878:        show_ipv6_ospf6_interface_cmd,
        !           879:        "show ipv6 ospf6 interface",
        !           880:        SHOW_STR
        !           881:        IP6_STR
        !           882:        OSPF6_STR
        !           883:        INTERFACE_STR
        !           884:        )
        !           885: 
        !           886: DEFUN (show_ipv6_ospf6_interface_ifname_prefix,
        !           887:        show_ipv6_ospf6_interface_ifname_prefix_cmd,
        !           888:        "show ipv6 ospf6 interface IFNAME prefix",
        !           889:        SHOW_STR
        !           890:        IP6_STR
        !           891:        OSPF6_STR
        !           892:        INTERFACE_STR
        !           893:        IFNAME_STR
        !           894:        "Display connected prefixes to advertise\n"
        !           895:        )
        !           896: {
        !           897:   struct interface *ifp;
        !           898:   struct ospf6_interface *oi;
        !           899: 
        !           900:   ifp = if_lookup_by_name (argv[0]);
        !           901:   if (ifp == NULL)
        !           902:     {
        !           903:       vty_out (vty, "No such Interface: %s%s", argv[0], VNL);
        !           904:       return CMD_WARNING;
        !           905:     }
        !           906: 
        !           907:   oi = ifp->info;
        !           908:   if (oi == NULL)
        !           909:     {
        !           910:       vty_out (vty, "OSPFv3 is not enabled on %s%s", argv[0], VNL);
        !           911:       return CMD_WARNING;
        !           912:     }
        !           913: 
        !           914:   argc--;
        !           915:   argv++;
        !           916:   ospf6_route_table_show (vty, argc, argv, oi->route_connected);
        !           917: 
        !           918:   return CMD_SUCCESS;
        !           919: }
        !           920: 
        !           921: ALIAS (show_ipv6_ospf6_interface_ifname_prefix,
        !           922:        show_ipv6_ospf6_interface_ifname_prefix_detail_cmd,
        !           923:        "show ipv6 ospf6 interface IFNAME prefix (X:X::X:X|X:X::X:X/M|detail)",
        !           924:        SHOW_STR
        !           925:        IP6_STR
        !           926:        OSPF6_STR
        !           927:        INTERFACE_STR
        !           928:        IFNAME_STR
        !           929:        "Display connected prefixes to advertise\n"
        !           930:        OSPF6_ROUTE_ADDRESS_STR
        !           931:        OSPF6_ROUTE_PREFIX_STR
        !           932:        "Display details of the prefixes\n"
        !           933:        )
        !           934: 
        !           935: ALIAS (show_ipv6_ospf6_interface_ifname_prefix,
        !           936:        show_ipv6_ospf6_interface_ifname_prefix_match_cmd,
        !           937:        "show ipv6 ospf6 interface IFNAME prefix X:X::X:X/M (match|detail)",
        !           938:        SHOW_STR
        !           939:        IP6_STR
        !           940:        OSPF6_STR
        !           941:        INTERFACE_STR
        !           942:        IFNAME_STR
        !           943:        "Display connected prefixes to advertise\n"
        !           944:        OSPF6_ROUTE_PREFIX_STR
        !           945:        OSPF6_ROUTE_MATCH_STR
        !           946:        "Display details of the prefixes\n"
        !           947:        )
        !           948: 
        !           949: DEFUN (show_ipv6_ospf6_interface_prefix,
        !           950:        show_ipv6_ospf6_interface_prefix_cmd,
        !           951:        "show ipv6 ospf6 interface prefix",
        !           952:        SHOW_STR
        !           953:        IP6_STR
        !           954:        OSPF6_STR
        !           955:        INTERFACE_STR
        !           956:        "Display connected prefixes to advertise\n"
        !           957:        )
        !           958: {
        !           959:   struct listnode *i;
        !           960:   struct ospf6_interface *oi;
        !           961:   struct interface *ifp;
        !           962: 
        !           963:   for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
        !           964:     {
        !           965:       oi = (struct ospf6_interface *) ifp->info;
        !           966:       if (oi == NULL)
        !           967:         continue;
        !           968: 
        !           969:       ospf6_route_table_show (vty, argc, argv, oi->route_connected);
        !           970:     }
        !           971: 
        !           972:   return CMD_SUCCESS;
        !           973: }
        !           974: 
        !           975: ALIAS (show_ipv6_ospf6_interface_prefix,
        !           976:        show_ipv6_ospf6_interface_prefix_detail_cmd,
        !           977:        "show ipv6 ospf6 interface prefix (X:X::X:X|X:X::X:X/M|detail)",
        !           978:        SHOW_STR
        !           979:        IP6_STR
        !           980:        OSPF6_STR
        !           981:        INTERFACE_STR
        !           982:        "Display connected prefixes to advertise\n"
        !           983:        OSPF6_ROUTE_ADDRESS_STR
        !           984:        OSPF6_ROUTE_PREFIX_STR
        !           985:        "Display details of the prefixes\n"
        !           986:        )
        !           987: 
        !           988: ALIAS (show_ipv6_ospf6_interface_prefix,
        !           989:        show_ipv6_ospf6_interface_prefix_match_cmd,
        !           990:        "show ipv6 ospf6 interface prefix X:X::X:X/M (match|detail)",
        !           991:        SHOW_STR
        !           992:        IP6_STR
        !           993:        OSPF6_STR
        !           994:        INTERFACE_STR
        !           995:        "Display connected prefixes to advertise\n"
        !           996:        OSPF6_ROUTE_PREFIX_STR
        !           997:        OSPF6_ROUTE_MATCH_STR
        !           998:        "Display details of the prefixes\n"
        !           999:        )
        !          1000: 
        !          1001: 
        !          1002: /* interface variable set command */
        !          1003: DEFUN (ipv6_ospf6_ifmtu,
        !          1004:        ipv6_ospf6_ifmtu_cmd,
        !          1005:        "ipv6 ospf6 ifmtu <1-65535>",
        !          1006:        IP6_STR
        !          1007:        OSPF6_STR
        !          1008:        "Interface MTU\n"
        !          1009:        "OSPFv3 Interface MTU\n"
        !          1010:        )
        !          1011: {
        !          1012:   struct ospf6_interface *oi;
        !          1013:   struct interface *ifp;
        !          1014:   unsigned int ifmtu, iobuflen;
        !          1015:   struct listnode *node, *nnode;
        !          1016:   struct ospf6_neighbor *on;
        !          1017: 
        !          1018:   ifp = (struct interface *) vty->index;
        !          1019:   assert (ifp);
        !          1020: 
        !          1021:   oi = (struct ospf6_interface *) ifp->info;
        !          1022:   if (oi == NULL)
        !          1023:     oi = ospf6_interface_create (ifp);
        !          1024:   assert (oi);
        !          1025: 
        !          1026:   ifmtu = strtol (argv[0], NULL, 10);
        !          1027: 
        !          1028:   if (oi->ifmtu == ifmtu)
        !          1029:     return CMD_SUCCESS;
        !          1030: 
        !          1031:   if (ifp->mtu6 != 0 && ifp->mtu6 < ifmtu)
        !          1032:     {
        !          1033:       vty_out (vty, "%s's ospf6 ifmtu cannot go beyond physical mtu (%d)%s",
        !          1034:                ifp->name, ifp->mtu6, VNL);
        !          1035:       return CMD_WARNING;
        !          1036:     }
        !          1037: 
        !          1038:   if (oi->ifmtu < ifmtu)
        !          1039:     {
        !          1040:       iobuflen = ospf6_iobuf_size (ifmtu);
        !          1041:       if (iobuflen < ifmtu)
        !          1042:         {
        !          1043:           vty_out (vty, "%s's ifmtu is adjusted to I/O buffer size (%d).%s",
        !          1044:                    ifp->name, iobuflen, VNL);
        !          1045:           oi->ifmtu = iobuflen;
        !          1046:         }
        !          1047:       else
        !          1048:         oi->ifmtu = ifmtu;
        !          1049:     }
        !          1050:   else
        !          1051:     oi->ifmtu = ifmtu;
        !          1052: 
        !          1053:   /* re-establish adjacencies */
        !          1054:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !          1055:     {
        !          1056:       THREAD_OFF (on->inactivity_timer);
        !          1057:       thread_add_event (master, inactivity_timer, on, 0);
        !          1058:     }
        !          1059: 
        !          1060:   return CMD_SUCCESS;
        !          1061: }
        !          1062: 
        !          1063: DEFUN (no_ipv6_ospf6_ifmtu,
        !          1064:        no_ipv6_ospf6_ifmtu_cmd,
        !          1065:        "no ipv6 ospf6 ifmtu",
        !          1066:        NO_STR
        !          1067:        IP6_STR
        !          1068:        OSPF6_STR
        !          1069:        "Interface MTU\n"
        !          1070:        )
        !          1071: {
        !          1072:   struct ospf6_interface *oi;
        !          1073:   struct interface *ifp;
        !          1074:   unsigned int iobuflen;
        !          1075:   struct listnode *node, *nnode;
        !          1076:   struct ospf6_neighbor *on;
        !          1077: 
        !          1078:   ifp = (struct interface *) vty->index;
        !          1079:   assert (ifp);
        !          1080: 
        !          1081:   oi = (struct ospf6_interface *) ifp->info;
        !          1082:   if (oi == NULL)
        !          1083:     oi = ospf6_interface_create (ifp);
        !          1084:   assert (oi);
        !          1085: 
        !          1086:   if (oi->ifmtu < ifp->mtu)
        !          1087:     {
        !          1088:       iobuflen = ospf6_iobuf_size (ifp->mtu);
        !          1089:       if (iobuflen < ifp->mtu)
        !          1090:         {
        !          1091:           vty_out (vty, "%s's ifmtu is adjusted to I/O buffer size (%d).%s",
        !          1092:                    ifp->name, iobuflen, VNL);
        !          1093:           oi->ifmtu = iobuflen;
        !          1094:         }
        !          1095:       else
        !          1096:         oi->ifmtu = ifp->mtu;
        !          1097:     }
        !          1098:   else
        !          1099:     oi->ifmtu = ifp->mtu;
        !          1100: 
        !          1101:   /* re-establish adjacencies */
        !          1102:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !          1103:     {
        !          1104:       THREAD_OFF (on->inactivity_timer);
        !          1105:       thread_add_event (master, inactivity_timer, on, 0);
        !          1106:     }
        !          1107: 
        !          1108:   return CMD_SUCCESS;
        !          1109: }
        !          1110: 
        !          1111: DEFUN (ipv6_ospf6_cost,
        !          1112:        ipv6_ospf6_cost_cmd,
        !          1113:        "ipv6 ospf6 cost <1-65535>",
        !          1114:        IP6_STR
        !          1115:        OSPF6_STR
        !          1116:        "Interface cost\n"
        !          1117:        "Outgoing metric of this interface\n"
        !          1118:        )
        !          1119: {
        !          1120:   struct ospf6_interface *oi;
        !          1121:   struct interface *ifp;
        !          1122:   unsigned long int lcost;
        !          1123: 
        !          1124:   ifp = (struct interface *) vty->index;
        !          1125:   assert (ifp);
        !          1126: 
        !          1127:   oi = (struct ospf6_interface *) ifp->info;
        !          1128:   if (oi == NULL)
        !          1129:     oi = ospf6_interface_create (ifp);
        !          1130:   assert (oi);
        !          1131: 
        !          1132:   lcost = strtol (argv[0], NULL, 10);
        !          1133: 
        !          1134:   if (lcost > UINT32_MAX)
        !          1135:     {
        !          1136:       vty_out (vty, "Cost %ld is out of range%s", lcost, VNL);
        !          1137:       return CMD_WARNING;
        !          1138:     }
        !          1139:   
        !          1140:   if (oi->cost == lcost)
        !          1141:     return CMD_SUCCESS;
        !          1142:   
        !          1143:   oi->cost = lcost;
        !          1144:   
        !          1145:   /* update cost held in route_connected list in ospf6_interface */
        !          1146:   ospf6_interface_connected_route_update (oi->interface);
        !          1147: 
        !          1148:   /* execute LSA hooks */
        !          1149:   if (oi->area)
        !          1150:     {
        !          1151:       OSPF6_LINK_LSA_SCHEDULE (oi);
        !          1152:       OSPF6_ROUTER_LSA_SCHEDULE (oi->area);
        !          1153:       OSPF6_NETWORK_LSA_SCHEDULE (oi);
        !          1154:       OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
        !          1155:       OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
        !          1156:     }
        !          1157: 
        !          1158:   return CMD_SUCCESS;
        !          1159: }
        !          1160: 
        !          1161: DEFUN (ipv6_ospf6_hellointerval,
        !          1162:        ipv6_ospf6_hellointerval_cmd,
        !          1163:        "ipv6 ospf6 hello-interval <1-65535>",
        !          1164:        IP6_STR
        !          1165:        OSPF6_STR
        !          1166:        "Interval time of Hello packets\n"
        !          1167:        SECONDS_STR
        !          1168:        )
        !          1169: {
        !          1170:   struct ospf6_interface *oi;
        !          1171:   struct interface *ifp;
        !          1172: 
        !          1173:   ifp = (struct interface *) vty->index;
        !          1174:   assert (ifp);
        !          1175: 
        !          1176:   oi = (struct ospf6_interface *) ifp->info;
        !          1177:   if (oi == NULL)
        !          1178:     oi = ospf6_interface_create (ifp);
        !          1179:   assert (oi);
        !          1180: 
        !          1181:   oi->hello_interval = strtol (argv[0], NULL, 10);
        !          1182:   return CMD_SUCCESS;
        !          1183: }
        !          1184: 
        !          1185: /* interface variable set command */
        !          1186: DEFUN (ipv6_ospf6_deadinterval,
        !          1187:        ipv6_ospf6_deadinterval_cmd,
        !          1188:        "ipv6 ospf6 dead-interval <1-65535>",
        !          1189:        IP6_STR
        !          1190:        OSPF6_STR
        !          1191:        "Interval time after which a neighbor is declared down\n"
        !          1192:        SECONDS_STR
        !          1193:        )
        !          1194: {
        !          1195:   struct ospf6_interface *oi;
        !          1196:   struct interface *ifp;
        !          1197: 
        !          1198:   ifp = (struct interface *) vty->index;
        !          1199:   assert (ifp);
        !          1200: 
        !          1201:   oi = (struct ospf6_interface *) ifp->info;
        !          1202:   if (oi == NULL)
        !          1203:     oi = ospf6_interface_create (ifp);
        !          1204:   assert (oi);
        !          1205: 
        !          1206:   oi->dead_interval = strtol (argv[0], NULL, 10);
        !          1207:   return CMD_SUCCESS;
        !          1208: }
        !          1209: 
        !          1210: /* interface variable set command */
        !          1211: DEFUN (ipv6_ospf6_transmitdelay,
        !          1212:        ipv6_ospf6_transmitdelay_cmd,
        !          1213:        "ipv6 ospf6 transmit-delay <1-3600>",
        !          1214:        IP6_STR
        !          1215:        OSPF6_STR
        !          1216:        "Transmit delay of this interface\n"
        !          1217:        SECONDS_STR
        !          1218:        )
        !          1219: {
        !          1220:   struct ospf6_interface *oi;
        !          1221:   struct interface *ifp;
        !          1222: 
        !          1223:   ifp = (struct interface *) vty->index;
        !          1224:   assert (ifp);
        !          1225: 
        !          1226:   oi = (struct ospf6_interface *) ifp->info;
        !          1227:   if (oi == NULL)
        !          1228:     oi = ospf6_interface_create (ifp);
        !          1229:   assert (oi);
        !          1230: 
        !          1231:   oi->transdelay = strtol (argv[0], NULL, 10);
        !          1232:   return CMD_SUCCESS;
        !          1233: }
        !          1234: 
        !          1235: /* interface variable set command */
        !          1236: DEFUN (ipv6_ospf6_retransmitinterval,
        !          1237:        ipv6_ospf6_retransmitinterval_cmd,
        !          1238:        "ipv6 ospf6 retransmit-interval <1-65535>",
        !          1239:        IP6_STR
        !          1240:        OSPF6_STR
        !          1241:        "Time between retransmitting lost link state advertisements\n"
        !          1242:        SECONDS_STR
        !          1243:        )
        !          1244: {
        !          1245:   struct ospf6_interface *oi;
        !          1246:   struct interface *ifp;
        !          1247: 
        !          1248:   ifp = (struct interface *) vty->index;
        !          1249:   assert (ifp);
        !          1250: 
        !          1251:   oi = (struct ospf6_interface *) ifp->info;
        !          1252:   if (oi == NULL)
        !          1253:     oi = ospf6_interface_create (ifp);
        !          1254:   assert (oi);
        !          1255: 
        !          1256:   oi->rxmt_interval = strtol (argv[0], NULL, 10);
        !          1257:   return CMD_SUCCESS;
        !          1258: }
        !          1259: 
        !          1260: /* interface variable set command */
        !          1261: DEFUN (ipv6_ospf6_priority,
        !          1262:        ipv6_ospf6_priority_cmd,
        !          1263:        "ipv6 ospf6 priority <0-255>",
        !          1264:        IP6_STR
        !          1265:        OSPF6_STR
        !          1266:        "Router priority\n"
        !          1267:        "Priority value\n"
        !          1268:        )
        !          1269: {
        !          1270:   struct ospf6_interface *oi;
        !          1271:   struct interface *ifp;
        !          1272: 
        !          1273:   ifp = (struct interface *) vty->index;
        !          1274:   assert (ifp);
        !          1275: 
        !          1276:   oi = (struct ospf6_interface *) ifp->info;
        !          1277:   if (oi == NULL)
        !          1278:     oi = ospf6_interface_create (ifp);
        !          1279:   assert (oi);
        !          1280: 
        !          1281:   oi->priority = strtol (argv[0], NULL, 10);
        !          1282: 
        !          1283:   if (oi->area)
        !          1284:     ospf6_interface_state_change (dr_election (oi), oi);
        !          1285: 
        !          1286:   return CMD_SUCCESS;
        !          1287: }
        !          1288: 
        !          1289: DEFUN (ipv6_ospf6_instance,
        !          1290:        ipv6_ospf6_instance_cmd,
        !          1291:        "ipv6 ospf6 instance-id <0-255>",
        !          1292:        IP6_STR
        !          1293:        OSPF6_STR
        !          1294:        "Instance ID for this interface\n"
        !          1295:        "Instance ID value\n"
        !          1296:        )
        !          1297: {
        !          1298:   struct ospf6_interface *oi;
        !          1299:   struct interface *ifp;
        !          1300: 
        !          1301:   ifp = (struct interface *)vty->index;
        !          1302:   assert (ifp);
        !          1303: 
        !          1304:   oi = (struct ospf6_interface *)ifp->info;
        !          1305:   if (oi == NULL)
        !          1306:     oi = ospf6_interface_create (ifp);
        !          1307:   assert (oi);
        !          1308: 
        !          1309:   oi->instance_id = strtol (argv[0], NULL, 10);
        !          1310:   return CMD_SUCCESS;
        !          1311: }
        !          1312: 
        !          1313: DEFUN (ipv6_ospf6_passive,
        !          1314:        ipv6_ospf6_passive_cmd,
        !          1315:        "ipv6 ospf6 passive",
        !          1316:        IP6_STR
        !          1317:        OSPF6_STR
        !          1318:        "passive interface, No adjacency will be formed on this interface\n"
        !          1319:        )
        !          1320: {
        !          1321:   struct ospf6_interface *oi;
        !          1322:   struct interface *ifp;
        !          1323:   struct listnode *node, *nnode;
        !          1324:   struct ospf6_neighbor *on;
        !          1325: 
        !          1326:   ifp = (struct interface *) vty->index;
        !          1327:   assert (ifp);
        !          1328: 
        !          1329:   oi = (struct ospf6_interface *) ifp->info;
        !          1330:   if (oi == NULL)
        !          1331:     oi = ospf6_interface_create (ifp);
        !          1332:   assert (oi);
        !          1333: 
        !          1334:   SET_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE);
        !          1335:   THREAD_OFF (oi->thread_send_hello);
        !          1336: 
        !          1337:   for (ALL_LIST_ELEMENTS (oi->neighbor_list, node, nnode, on))
        !          1338:     {
        !          1339:       THREAD_OFF (on->inactivity_timer);
        !          1340:       thread_add_event (master, inactivity_timer, on, 0);
        !          1341:     }
        !          1342: 
        !          1343:   return CMD_SUCCESS;
        !          1344: }
        !          1345: 
        !          1346: DEFUN (no_ipv6_ospf6_passive,
        !          1347:        no_ipv6_ospf6_passive_cmd,
        !          1348:        "no ipv6 ospf6 passive",
        !          1349:        NO_STR
        !          1350:        IP6_STR
        !          1351:        OSPF6_STR
        !          1352:        "passive interface: No Adjacency will be formed on this I/F\n"
        !          1353:        )
        !          1354: {
        !          1355:   struct ospf6_interface *oi;
        !          1356:   struct interface *ifp;
        !          1357: 
        !          1358:   ifp = (struct interface *) vty->index;
        !          1359:   assert (ifp);
        !          1360: 
        !          1361:   oi = (struct ospf6_interface *) ifp->info;
        !          1362:   if (oi == NULL)
        !          1363:     oi = ospf6_interface_create (ifp);
        !          1364:   assert (oi);
        !          1365: 
        !          1366:   UNSET_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE);
        !          1367:   THREAD_OFF (oi->thread_send_hello);
        !          1368:   oi->thread_send_hello =
        !          1369:     thread_add_event (master, ospf6_hello_send, oi, 0);
        !          1370: 
        !          1371:   return CMD_SUCCESS;
        !          1372: }
        !          1373: 
        !          1374: DEFUN (ipv6_ospf6_mtu_ignore,
        !          1375:        ipv6_ospf6_mtu_ignore_cmd,
        !          1376:        "ipv6 ospf6 mtu-ignore",
        !          1377:        IP6_STR
        !          1378:        OSPF6_STR
        !          1379:        "Ignore MTU mismatch on this interface\n"
        !          1380:        )
        !          1381: {
        !          1382:   struct ospf6_interface *oi;
        !          1383:   struct interface *ifp;
        !          1384: 
        !          1385:   ifp = (struct interface *) vty->index;
        !          1386:   assert (ifp);
        !          1387: 
        !          1388:   oi = (struct ospf6_interface *) ifp->info;
        !          1389:   if (oi == NULL)
        !          1390:     oi = ospf6_interface_create (ifp);
        !          1391:   assert (oi);
        !          1392: 
        !          1393:   oi->mtu_ignore = 1;
        !          1394: 
        !          1395:   return CMD_SUCCESS;
        !          1396: }
        !          1397: 
        !          1398: DEFUN (no_ipv6_ospf6_mtu_ignore,
        !          1399:        no_ipv6_ospf6_mtu_ignore_cmd,
        !          1400:        "no ipv6 ospf6 mtu-ignore",
        !          1401:        NO_STR
        !          1402:        IP6_STR
        !          1403:        OSPF6_STR
        !          1404:        "Ignore MTU mismatch on this interface\n"
        !          1405:        )
        !          1406: {
        !          1407:   struct ospf6_interface *oi;
        !          1408:   struct interface *ifp;
        !          1409: 
        !          1410:   ifp = (struct interface *) vty->index;
        !          1411:   assert (ifp);
        !          1412: 
        !          1413:   oi = (struct ospf6_interface *) ifp->info;
        !          1414:   if (oi == NULL)
        !          1415:     oi = ospf6_interface_create (ifp);
        !          1416:   assert (oi);
        !          1417: 
        !          1418:   oi->mtu_ignore = 0;
        !          1419: 
        !          1420:   return CMD_SUCCESS;
        !          1421: }
        !          1422: 
        !          1423: DEFUN (ipv6_ospf6_advertise_prefix_list,
        !          1424:        ipv6_ospf6_advertise_prefix_list_cmd,
        !          1425:        "ipv6 ospf6 advertise prefix-list WORD",
        !          1426:        IP6_STR
        !          1427:        OSPF6_STR
        !          1428:        "Advertising options\n"
        !          1429:        "Filter prefix using prefix-list\n"
        !          1430:        "Prefix list name\n"
        !          1431:        )
        !          1432: {
        !          1433:   struct ospf6_interface *oi;
        !          1434:   struct interface *ifp;
        !          1435: 
        !          1436:   ifp = (struct interface *) vty->index;
        !          1437:   assert (ifp);
        !          1438: 
        !          1439:   oi = (struct ospf6_interface *) ifp->info;
        !          1440:   if (oi == NULL)
        !          1441:     oi = ospf6_interface_create (ifp);
        !          1442:   assert (oi);
        !          1443: 
        !          1444:   if (oi->plist_name)
        !          1445:     XFREE (MTYPE_PREFIX_LIST_STR, oi->plist_name);
        !          1446:   oi->plist_name = XSTRDUP (MTYPE_PREFIX_LIST_STR, argv[0]);
        !          1447: 
        !          1448:   ospf6_interface_connected_route_update (oi->interface);
        !          1449: 
        !          1450:   if (oi->area)
        !          1451:     {
        !          1452:       OSPF6_LINK_LSA_SCHEDULE (oi);
        !          1453:       if (oi->state == OSPF6_INTERFACE_DR)
        !          1454:         {
        !          1455:           OSPF6_NETWORK_LSA_SCHEDULE (oi);
        !          1456:           OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
        !          1457:         }
        !          1458:       OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
        !          1459:     }
        !          1460: 
        !          1461:   return CMD_SUCCESS;
        !          1462: }
        !          1463: 
        !          1464: DEFUN (no_ipv6_ospf6_advertise_prefix_list,
        !          1465:        no_ipv6_ospf6_advertise_prefix_list_cmd,
        !          1466:        "no ipv6 ospf6 advertise prefix-list",
        !          1467:        NO_STR
        !          1468:        IP6_STR
        !          1469:        OSPF6_STR
        !          1470:        "Advertising options\n"
        !          1471:        "Filter prefix using prefix-list\n"
        !          1472:        )
        !          1473: {
        !          1474:   struct ospf6_interface *oi;
        !          1475:   struct interface *ifp;
        !          1476: 
        !          1477:   ifp = (struct interface *) vty->index;
        !          1478:   assert (ifp);
        !          1479: 
        !          1480:   oi = (struct ospf6_interface *) ifp->info;
        !          1481:   if (oi == NULL)
        !          1482:     oi = ospf6_interface_create (ifp);
        !          1483:   assert (oi);
        !          1484: 
        !          1485:   if (oi->plist_name)
        !          1486:     {
        !          1487:       XFREE (MTYPE_PREFIX_LIST_STR, oi->plist_name);
        !          1488:       oi->plist_name = NULL;
        !          1489:     }
        !          1490: 
        !          1491:   ospf6_interface_connected_route_update (oi->interface);
        !          1492: 
        !          1493:   if (oi->area)
        !          1494:     {
        !          1495:       OSPF6_LINK_LSA_SCHEDULE (oi);
        !          1496:       if (oi->state == OSPF6_INTERFACE_DR)
        !          1497:         {
        !          1498:           OSPF6_NETWORK_LSA_SCHEDULE (oi);
        !          1499:           OSPF6_INTRA_PREFIX_LSA_SCHEDULE_TRANSIT (oi);
        !          1500:         }
        !          1501:       OSPF6_INTRA_PREFIX_LSA_SCHEDULE_STUB (oi->area);
        !          1502:     }
        !          1503: 
        !          1504:   return CMD_SUCCESS;
        !          1505: }
        !          1506: 
        !          1507: static int
        !          1508: config_write_ospf6_interface (struct vty *vty)
        !          1509: {
        !          1510:   struct listnode *i;
        !          1511:   struct ospf6_interface *oi;
        !          1512:   struct interface *ifp;
        !          1513: 
        !          1514:   for (ALL_LIST_ELEMENTS_RO (iflist, i, ifp))
        !          1515:     {
        !          1516:       oi = (struct ospf6_interface *) ifp->info;
        !          1517:       if (oi == NULL)
        !          1518:         continue;
        !          1519: 
        !          1520:       vty_out (vty, "interface %s%s",
        !          1521:                oi->interface->name, VNL);
        !          1522: 
        !          1523:       if (ifp->desc)
        !          1524:         vty_out (vty, " description %s%s", ifp->desc, VNL);
        !          1525: 
        !          1526:       if (ifp->mtu6 != oi->ifmtu)
        !          1527:         vty_out (vty, " ipv6 ospf6 ifmtu %d%s", oi->ifmtu, VNL);
        !          1528:       vty_out (vty, " ipv6 ospf6 cost %d%s",
        !          1529:                oi->cost, VNL);
        !          1530:       vty_out (vty, " ipv6 ospf6 hello-interval %d%s",
        !          1531:                oi->hello_interval, VNL);
        !          1532:       vty_out (vty, " ipv6 ospf6 dead-interval %d%s",
        !          1533:                oi->dead_interval, VNL);
        !          1534:       vty_out (vty, " ipv6 ospf6 retransmit-interval %d%s",
        !          1535:                oi->rxmt_interval, VNL);
        !          1536:       vty_out (vty, " ipv6 ospf6 priority %d%s",
        !          1537:                oi->priority, VNL);
        !          1538:       vty_out (vty, " ipv6 ospf6 transmit-delay %d%s",
        !          1539:                oi->transdelay, VNL);
        !          1540:       vty_out (vty, " ipv6 ospf6 instance-id %d%s",
        !          1541:                oi->instance_id, VNL);
        !          1542: 
        !          1543:       if (oi->plist_name)
        !          1544:         vty_out (vty, " ipv6 ospf6 advertise prefix-list %s%s",
        !          1545:                  oi->plist_name, VNL);
        !          1546: 
        !          1547:       if (CHECK_FLAG (oi->flag, OSPF6_INTERFACE_PASSIVE))
        !          1548:         vty_out (vty, " ipv6 ospf6 passive%s", VNL);
        !          1549: 
        !          1550:       if (oi->mtu_ignore)
        !          1551:         vty_out (vty, " ipv6 ospf6 mtu-ignore%s", VNL);
        !          1552: 
        !          1553:       vty_out (vty, "!%s", VNL);
        !          1554:     }
        !          1555:   return 0;
        !          1556: }
        !          1557: 
        !          1558: static struct cmd_node interface_node =
        !          1559: {
        !          1560:   INTERFACE_NODE,
        !          1561:   "%s(config-if)# ",
        !          1562:   1 /* VTYSH */
        !          1563: };
        !          1564: 
        !          1565: void
        !          1566: ospf6_interface_init (void)
        !          1567: {
        !          1568:   /* Install interface node. */
        !          1569:   install_node (&interface_node, config_write_ospf6_interface);
        !          1570: 
        !          1571:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_cmd);
        !          1572:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_prefix_cmd);
        !          1573:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_prefix_detail_cmd);
        !          1574:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_prefix_match_cmd);
        !          1575:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_cmd);
        !          1576:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_prefix_cmd);
        !          1577:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_prefix_detail_cmd);
        !          1578:   install_element (VIEW_NODE, &show_ipv6_ospf6_interface_ifname_prefix_match_cmd);
        !          1579:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_cmd);
        !          1580:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_prefix_cmd);
        !          1581:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_prefix_detail_cmd);
        !          1582:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_prefix_match_cmd);
        !          1583:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_cmd);
        !          1584:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_prefix_cmd);
        !          1585:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_prefix_detail_cmd);
        !          1586:   install_element (ENABLE_NODE, &show_ipv6_ospf6_interface_ifname_prefix_match_cmd);
        !          1587: 
        !          1588:   install_element (CONFIG_NODE, &interface_cmd);
        !          1589:   install_default (INTERFACE_NODE);
        !          1590:   install_element (INTERFACE_NODE, &interface_desc_cmd);
        !          1591:   install_element (INTERFACE_NODE, &no_interface_desc_cmd);
        !          1592:   install_element (INTERFACE_NODE, &ipv6_ospf6_cost_cmd);
        !          1593:   install_element (INTERFACE_NODE, &ipv6_ospf6_ifmtu_cmd);
        !          1594:   install_element (INTERFACE_NODE, &no_ipv6_ospf6_ifmtu_cmd);
        !          1595:   install_element (INTERFACE_NODE, &ipv6_ospf6_deadinterval_cmd);
        !          1596:   install_element (INTERFACE_NODE, &ipv6_ospf6_hellointerval_cmd);
        !          1597:   install_element (INTERFACE_NODE, &ipv6_ospf6_priority_cmd);
        !          1598:   install_element (INTERFACE_NODE, &ipv6_ospf6_retransmitinterval_cmd);
        !          1599:   install_element (INTERFACE_NODE, &ipv6_ospf6_transmitdelay_cmd);
        !          1600:   install_element (INTERFACE_NODE, &ipv6_ospf6_instance_cmd);
        !          1601: 
        !          1602:   install_element (INTERFACE_NODE, &ipv6_ospf6_passive_cmd);
        !          1603:   install_element (INTERFACE_NODE, &no_ipv6_ospf6_passive_cmd);
        !          1604: 
        !          1605:   install_element (INTERFACE_NODE, &ipv6_ospf6_mtu_ignore_cmd);
        !          1606:   install_element (INTERFACE_NODE, &no_ipv6_ospf6_mtu_ignore_cmd);
        !          1607: 
        !          1608:   install_element (INTERFACE_NODE, &ipv6_ospf6_advertise_prefix_list_cmd);
        !          1609:   install_element (INTERFACE_NODE, &no_ipv6_ospf6_advertise_prefix_list_cmd);
        !          1610: }
        !          1611: 
        !          1612: DEFUN (debug_ospf6_interface,
        !          1613:        debug_ospf6_interface_cmd,
        !          1614:        "debug ospf6 interface",
        !          1615:        DEBUG_STR
        !          1616:        OSPF6_STR
        !          1617:        "Debug OSPFv3 Interface\n"
        !          1618:       )
        !          1619: {
        !          1620:   OSPF6_DEBUG_INTERFACE_ON ();
        !          1621:   return CMD_SUCCESS;
        !          1622: }
        !          1623: 
        !          1624: DEFUN (no_debug_ospf6_interface,
        !          1625:        no_debug_ospf6_interface_cmd,
        !          1626:        "no debug ospf6 interface",
        !          1627:        NO_STR
        !          1628:        DEBUG_STR
        !          1629:        OSPF6_STR
        !          1630:        "Debug OSPFv3 Interface\n"
        !          1631:       )
        !          1632: {
        !          1633:   OSPF6_DEBUG_INTERFACE_OFF ();
        !          1634:   return CMD_SUCCESS;
        !          1635: }
        !          1636: 
        !          1637: int
        !          1638: config_write_ospf6_debug_interface (struct vty *vty)
        !          1639: {
        !          1640:   if (IS_OSPF6_DEBUG_INTERFACE)
        !          1641:     vty_out (vty, "debug ospf6 interface%s", VNL);
        !          1642:   return 0;
        !          1643: }
        !          1644: 
        !          1645: void
        !          1646: install_element_ospf6_debug_interface (void)
        !          1647: {
        !          1648:   install_element (ENABLE_NODE, &debug_ospf6_interface_cmd);
        !          1649:   install_element (ENABLE_NODE, &no_debug_ospf6_interface_cmd);
        !          1650:   install_element (CONFIG_NODE, &debug_ospf6_interface_cmd);
        !          1651:   install_element (CONFIG_NODE, &no_debug_ospf6_interface_cmd);
        !          1652: }
        !          1653: 
        !          1654: 

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