Annotation of embedaddon/quagga/zebra/zebra_vty.c, revision 1.1

1.1     ! misho       1: /* Zebra VTY functions
        !             2:  * Copyright (C) 2002 Kunihiro Ishiguro
        !             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 "prefix.h"
        !            27: #include "command.h"
        !            28: #include "table.h"
        !            29: #include "rib.h"
        !            30: 
        !            31: #include "zebra/zserv.h"
        !            32: 
        !            33: /* General fucntion for static route. */
        !            34: static int
        !            35: zebra_static_ipv4 (struct vty *vty, int add_cmd, const char *dest_str,
        !            36:                   const char *mask_str, const char *gate_str,
        !            37:                   const char *flag_str, const char *distance_str)
        !            38: {
        !            39:   int ret;
        !            40:   u_char distance;
        !            41:   struct prefix p;
        !            42:   struct in_addr gate;
        !            43:   struct in_addr mask;
        !            44:   const char *ifname;
        !            45:   u_char flag = 0;
        !            46:   
        !            47:   ret = str2prefix (dest_str, &p);
        !            48:   if (ret <= 0)
        !            49:     {
        !            50:       vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
        !            51:       return CMD_WARNING;
        !            52:     }
        !            53: 
        !            54:   /* Cisco like mask notation. */
        !            55:   if (mask_str)
        !            56:     {
        !            57:       ret = inet_aton (mask_str, &mask);
        !            58:       if (ret == 0)
        !            59:         {
        !            60:           vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
        !            61:           return CMD_WARNING;
        !            62:         }
        !            63:       p.prefixlen = ip_masklen (mask);
        !            64:     }
        !            65: 
        !            66:   /* Apply mask for given prefix. */
        !            67:   apply_mask (&p);
        !            68: 
        !            69:   /* Administrative distance. */
        !            70:   if (distance_str)
        !            71:     distance = atoi (distance_str);
        !            72:   else
        !            73:     distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
        !            74: 
        !            75:   /* Null0 static route.  */
        !            76:   if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
        !            77:     {
        !            78:       if (flag_str)
        !            79:         {
        !            80:           vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE);
        !            81:           return CMD_WARNING;
        !            82:         }
        !            83:       if (add_cmd)
        !            84:         static_add_ipv4 (&p, NULL, NULL, ZEBRA_FLAG_BLACKHOLE, distance, 0);
        !            85:       else
        !            86:         static_delete_ipv4 (&p, NULL, NULL, distance, 0);
        !            87:       return CMD_SUCCESS;
        !            88:     }
        !            89: 
        !            90:   /* Route flags */
        !            91:   if (flag_str) {
        !            92:     switch(flag_str[0]) {
        !            93:       case 'r':
        !            94:       case 'R': /* XXX */
        !            95:         SET_FLAG (flag, ZEBRA_FLAG_REJECT);
        !            96:         break;
        !            97:       case 'b':
        !            98:       case 'B': /* XXX */
        !            99:         SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
        !           100:         break;
        !           101:       default:
        !           102:         vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
        !           103:         return CMD_WARNING;
        !           104:     }
        !           105:   }
        !           106: 
        !           107:   if (gate_str == NULL)
        !           108:   {
        !           109:     if (add_cmd)
        !           110:       static_add_ipv4 (&p, NULL, NULL, flag, distance, 0);
        !           111:     else
        !           112:       static_delete_ipv4 (&p, NULL, NULL, distance, 0);
        !           113: 
        !           114:     return CMD_SUCCESS;
        !           115:   }
        !           116:   
        !           117:   /* When gateway is A.B.C.D format, gate is treated as nexthop
        !           118:      address other case gate is treated as interface name. */
        !           119:   ret = inet_aton (gate_str, &gate);
        !           120:   if (ret)
        !           121:     ifname = NULL;
        !           122:   else
        !           123:     ifname = gate_str;
        !           124: 
        !           125:   if (add_cmd)
        !           126:     static_add_ipv4 (&p, ifname ? NULL : &gate, ifname, flag, distance, 0);
        !           127:   else
        !           128:     static_delete_ipv4 (&p, ifname ? NULL : &gate, ifname, distance, 0);
        !           129: 
        !           130:   return CMD_SUCCESS;
        !           131: }
        !           132: 
        !           133: /* Static route configuration.  */
        !           134: DEFUN (ip_route, 
        !           135:        ip_route_cmd,
        !           136:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
        !           137:        IP_STR
        !           138:        "Establish static routes\n"
        !           139:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           140:        "IP gateway address\n"
        !           141:        "IP gateway interface name\n"
        !           142:        "Null interface\n")
        !           143: {
        !           144:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, NULL);
        !           145: }
        !           146: 
        !           147: DEFUN (ip_route_flags,
        !           148:        ip_route_flags_cmd,
        !           149:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
        !           150:        IP_STR
        !           151:        "Establish static routes\n"
        !           152:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           153:        "IP gateway address\n"
        !           154:        "IP gateway interface name\n"
        !           155:        "Emit an ICMP unreachable when matched\n"
        !           156:        "Silently discard pkts when matched\n")
        !           157: {
        !           158:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], NULL);
        !           159: }
        !           160: 
        !           161: DEFUN (ip_route_flags2,
        !           162:        ip_route_flags2_cmd,
        !           163:        "ip route A.B.C.D/M (reject|blackhole)",
        !           164:        IP_STR
        !           165:        "Establish static routes\n"
        !           166:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           167:        "Emit an ICMP unreachable when matched\n"
        !           168:        "Silently discard pkts when matched\n")
        !           169: {
        !           170:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], NULL);
        !           171: }
        !           172: 
        !           173: /* Mask as A.B.C.D format.  */
        !           174: DEFUN (ip_route_mask,
        !           175:        ip_route_mask_cmd,
        !           176:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
        !           177:        IP_STR
        !           178:        "Establish static routes\n"
        !           179:        "IP destination prefix\n"
        !           180:        "IP destination prefix mask\n"
        !           181:        "IP gateway address\n"
        !           182:        "IP gateway interface name\n"
        !           183:        "Null interface\n")
        !           184: {
        !           185:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, NULL);
        !           186: }
        !           187: 
        !           188: DEFUN (ip_route_mask_flags,
        !           189:        ip_route_mask_flags_cmd,
        !           190:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
        !           191:        IP_STR
        !           192:        "Establish static routes\n"
        !           193:        "IP destination prefix\n"
        !           194:        "IP destination prefix mask\n"
        !           195:        "IP gateway address\n"
        !           196:        "IP gateway interface name\n"
        !           197:        "Emit an ICMP unreachable when matched\n"
        !           198:        "Silently discard pkts when matched\n")
        !           199: {
        !           200:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL);
        !           201: }
        !           202: 
        !           203: DEFUN (ip_route_mask_flags2,
        !           204:        ip_route_mask_flags2_cmd,
        !           205:        "ip route A.B.C.D A.B.C.D (reject|blackhole)",
        !           206:        IP_STR
        !           207:        "Establish static routes\n"
        !           208:        "IP destination prefix\n"
        !           209:        "IP destination prefix mask\n"
        !           210:        "Emit an ICMP unreachable when matched\n"
        !           211:        "Silently discard pkts when matched\n")
        !           212: {
        !           213:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], NULL);
        !           214: }
        !           215: 
        !           216: /* Distance option value.  */
        !           217: DEFUN (ip_route_distance,
        !           218:        ip_route_distance_cmd,
        !           219:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
        !           220:        IP_STR
        !           221:        "Establish static routes\n"
        !           222:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           223:        "IP gateway address\n"
        !           224:        "IP gateway interface name\n"
        !           225:        "Null interface\n"
        !           226:        "Distance value for this route\n")
        !           227: {
        !           228:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, argv[2]);
        !           229: }
        !           230: 
        !           231: DEFUN (ip_route_flags_distance,
        !           232:        ip_route_flags_distance_cmd,
        !           233:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
        !           234:        IP_STR
        !           235:        "Establish static routes\n"
        !           236:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           237:        "IP gateway address\n"
        !           238:        "IP gateway interface name\n"
        !           239:        "Emit an ICMP unreachable when matched\n"
        !           240:        "Silently discard pkts when matched\n"
        !           241:        "Distance value for this route\n")
        !           242: {
        !           243:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], argv[3]);
        !           244: }
        !           245: 
        !           246: DEFUN (ip_route_flags_distance2,
        !           247:        ip_route_flags_distance2_cmd,
        !           248:        "ip route A.B.C.D/M (reject|blackhole) <1-255>",
        !           249:        IP_STR
        !           250:        "Establish static routes\n"
        !           251:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           252:        "Emit an ICMP unreachable when matched\n"
        !           253:        "Silently discard pkts when matched\n"
        !           254:        "Distance value for this route\n")
        !           255: {
        !           256:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], argv[2]);
        !           257: }
        !           258: 
        !           259: DEFUN (ip_route_mask_distance,
        !           260:        ip_route_mask_distance_cmd,
        !           261:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
        !           262:        IP_STR
        !           263:        "Establish static routes\n"
        !           264:        "IP destination prefix\n"
        !           265:        "IP destination prefix mask\n"
        !           266:        "IP gateway address\n"
        !           267:        "IP gateway interface name\n"
        !           268:        "Null interface\n"
        !           269:        "Distance value for this route\n")
        !           270: {
        !           271:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3]);
        !           272: }
        !           273: 
        !           274: DEFUN (ip_route_mask_flags_distance,
        !           275:        ip_route_mask_flags_distance_cmd,
        !           276:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
        !           277:        IP_STR
        !           278:        "Establish static routes\n"
        !           279:        "IP destination prefix\n"
        !           280:        "IP destination prefix mask\n"
        !           281:        "IP gateway address\n"
        !           282:        "IP gateway interface name\n"
        !           283:        "Distance value for this route\n"
        !           284:        "Emit an ICMP unreachable when matched\n"
        !           285:        "Silently discard pkts when matched\n")
        !           286: {
        !           287:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4]);
        !           288: }
        !           289: 
        !           290: DEFUN (ip_route_mask_flags_distance2,
        !           291:        ip_route_mask_flags_distance2_cmd,
        !           292:        "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
        !           293:        IP_STR
        !           294:        "Establish static routes\n"
        !           295:        "IP destination prefix\n"
        !           296:        "IP destination prefix mask\n"
        !           297:        "Distance value for this route\n"
        !           298:        "Emit an ICMP unreachable when matched\n"
        !           299:        "Silently discard pkts when matched\n")
        !           300: {
        !           301:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3]);
        !           302: }
        !           303: 
        !           304: DEFUN (no_ip_route, 
        !           305:        no_ip_route_cmd,
        !           306:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
        !           307:        NO_STR
        !           308:        IP_STR
        !           309:        "Establish static routes\n"
        !           310:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           311:        "IP gateway address\n"
        !           312:        "IP gateway interface name\n"
        !           313:        "Null interface\n")
        !           314: {
        !           315:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, NULL);
        !           316: }
        !           317: 
        !           318: ALIAS (no_ip_route,
        !           319:        no_ip_route_flags_cmd,
        !           320:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
        !           321:        NO_STR
        !           322:        IP_STR
        !           323:        "Establish static routes\n"
        !           324:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           325:        "IP gateway address\n"
        !           326:        "IP gateway interface name\n"
        !           327:        "Emit an ICMP unreachable when matched\n"
        !           328:        "Silently discard pkts when matched\n")
        !           329: 
        !           330: DEFUN (no_ip_route_flags2,
        !           331:        no_ip_route_flags2_cmd,
        !           332:        "no ip route A.B.C.D/M (reject|blackhole)",
        !           333:        NO_STR
        !           334:        IP_STR
        !           335:        "Establish static routes\n"
        !           336:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           337:        "Emit an ICMP unreachable when matched\n"
        !           338:        "Silently discard pkts when matched\n")
        !           339: {
        !           340:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, NULL, NULL);
        !           341: }
        !           342: 
        !           343: DEFUN (no_ip_route_mask,
        !           344:        no_ip_route_mask_cmd,
        !           345:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
        !           346:        NO_STR
        !           347:        IP_STR
        !           348:        "Establish static routes\n"
        !           349:        "IP destination prefix\n"
        !           350:        "IP destination prefix mask\n"
        !           351:        "IP gateway address\n"
        !           352:        "IP gateway interface name\n"
        !           353:        "Null interface\n")
        !           354: {
        !           355:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, NULL);
        !           356: }
        !           357: 
        !           358: ALIAS (no_ip_route_mask,
        !           359:        no_ip_route_mask_flags_cmd,
        !           360:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
        !           361:        NO_STR
        !           362:        IP_STR
        !           363:        "Establish static routes\n"
        !           364:        "IP destination prefix\n"
        !           365:        "IP destination prefix mask\n"
        !           366:        "IP gateway address\n"
        !           367:        "IP gateway interface name\n"
        !           368:        "Emit an ICMP unreachable when matched\n"
        !           369:        "Silently discard pkts when matched\n")
        !           370: 
        !           371: DEFUN (no_ip_route_mask_flags2,
        !           372:        no_ip_route_mask_flags2_cmd,
        !           373:        "no ip route A.B.C.D A.B.C.D (reject|blackhole)",
        !           374:        NO_STR
        !           375:        IP_STR
        !           376:        "Establish static routes\n"
        !           377:        "IP destination prefix\n"
        !           378:        "IP destination prefix mask\n"
        !           379:        "Emit an ICMP unreachable when matched\n"
        !           380:        "Silently discard pkts when matched\n")
        !           381: {
        !           382:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, NULL, NULL);
        !           383: }
        !           384: 
        !           385: DEFUN (no_ip_route_distance,
        !           386:        no_ip_route_distance_cmd,
        !           387:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
        !           388:        NO_STR
        !           389:        IP_STR
        !           390:        "Establish static routes\n"
        !           391:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           392:        "IP gateway address\n"
        !           393:        "IP gateway interface name\n"
        !           394:        "Null interface\n"
        !           395:        "Distance value for this route\n")
        !           396: {
        !           397:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, argv[2]);
        !           398: }
        !           399: 
        !           400: DEFUN (no_ip_route_flags_distance,
        !           401:        no_ip_route_flags_distance_cmd,
        !           402:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
        !           403:        NO_STR
        !           404:        IP_STR
        !           405:        "Establish static routes\n"
        !           406:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           407:        "IP gateway address\n"
        !           408:        "IP gateway interface name\n"
        !           409:        "Emit an ICMP unreachable when matched\n"
        !           410:        "Silently discard pkts when matched\n"
        !           411:        "Distance value for this route\n")
        !           412: {
        !           413:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], argv[2], argv[3]);
        !           414: }
        !           415: 
        !           416: DEFUN (no_ip_route_flags_distance2,
        !           417:        no_ip_route_flags_distance2_cmd,
        !           418:        "no ip route A.B.C.D/M (reject|blackhole) <1-255>",
        !           419:        NO_STR
        !           420:        IP_STR
        !           421:        "Establish static routes\n"
        !           422:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
        !           423:        "Emit an ICMP unreachable when matched\n"
        !           424:        "Silently discard pkts when matched\n"
        !           425:        "Distance value for this route\n")
        !           426: {
        !           427:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, argv[1], argv[2]);
        !           428: }
        !           429: 
        !           430: DEFUN (no_ip_route_mask_distance,
        !           431:        no_ip_route_mask_distance_cmd,
        !           432:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
        !           433:        NO_STR
        !           434:        IP_STR
        !           435:        "Establish static routes\n"
        !           436:        "IP destination prefix\n"
        !           437:        "IP destination prefix mask\n"
        !           438:        "IP gateway address\n"
        !           439:        "IP gateway interface name\n"
        !           440:        "Null interface\n"
        !           441:        "Distance value for this route\n")
        !           442: {
        !           443:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3]);
        !           444: }
        !           445: 
        !           446: DEFUN (no_ip_route_mask_flags_distance,
        !           447:        no_ip_route_mask_flags_distance_cmd,
        !           448:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
        !           449:        NO_STR
        !           450:        IP_STR
        !           451:        "Establish static routes\n"
        !           452:        "IP destination prefix\n"
        !           453:        "IP destination prefix mask\n"
        !           454:        "IP gateway address\n"
        !           455:        "IP gateway interface name\n"
        !           456:        "Emit an ICMP unreachable when matched\n"
        !           457:        "Silently discard pkts when matched\n"
        !           458:        "Distance value for this route\n")
        !           459: {
        !           460:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4]);
        !           461: }
        !           462: 
        !           463: DEFUN (no_ip_route_mask_flags_distance2,
        !           464:        no_ip_route_mask_flags_distance2_cmd,
        !           465:        "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
        !           466:        NO_STR
        !           467:        IP_STR
        !           468:        "Establish static routes\n"
        !           469:        "IP destination prefix\n"
        !           470:        "IP destination prefix mask\n"
        !           471:        "Emit an ICMP unreachable when matched\n"
        !           472:        "Silently discard pkts when matched\n"
        !           473:        "Distance value for this route\n")
        !           474: {
        !           475:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3]);
        !           476: }
        !           477: 
        !           478: char *proto_rm[AFI_MAX][ZEBRA_ROUTE_MAX+1];    /* "any" == ZEBRA_ROUTE_MAX */
        !           479: 
        !           480: DEFUN (ip_protocol,
        !           481:        ip_protocol_cmd,
        !           482:        "ip protocol PROTO route-map ROUTE-MAP",
        !           483:        NO_STR
        !           484:        "Apply route map to PROTO\n"
        !           485:        "Protocol name\n"
        !           486:        "Route map name\n")
        !           487: {
        !           488:   int i;
        !           489: 
        !           490:   if (strcasecmp(argv[0], "any") == 0)
        !           491:     i = ZEBRA_ROUTE_MAX;
        !           492:   else
        !           493:     i = proto_name2num(argv[0]);
        !           494:   if (i < 0)
        !           495:     {
        !           496:       vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
        !           497:                VTY_NEWLINE);
        !           498:       return CMD_WARNING;
        !           499:     }
        !           500:   if (proto_rm[AFI_IP][i])
        !           501:     XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
        !           502:   proto_rm[AFI_IP][i] = XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[1]);
        !           503:   return CMD_SUCCESS;
        !           504: }
        !           505: 
        !           506: DEFUN (no_ip_protocol,
        !           507:        no_ip_protocol_cmd,
        !           508:        "no ip protocol PROTO",
        !           509:        NO_STR
        !           510:        "Remove route map from PROTO\n"
        !           511:        "Protocol name\n")
        !           512: {
        !           513:   int i;
        !           514: 
        !           515:   if (strcasecmp(argv[0], "any") == 0)
        !           516:     i = ZEBRA_ROUTE_MAX;
        !           517:   else
        !           518:     i = proto_name2num(argv[0]);
        !           519:   if (i < 0)
        !           520:     {
        !           521:       vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
        !           522:                VTY_NEWLINE);
        !           523:      return CMD_WARNING;
        !           524:     }
        !           525:   if (proto_rm[AFI_IP][i])
        !           526:     XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
        !           527:   proto_rm[AFI_IP][i] = NULL;
        !           528:   return CMD_SUCCESS;
        !           529: }
        !           530: 
        !           531: /* New RIB.  Detailed information for IPv4 route. */
        !           532: static void
        !           533: vty_show_ip_route_detail (struct vty *vty, struct route_node *rn)
        !           534: {
        !           535:   struct rib *rib;
        !           536:   struct nexthop *nexthop;
        !           537: 
        !           538:   for (rib = rn->info; rib; rib = rib->next)
        !           539:     {
        !           540:       vty_out (vty, "Routing entry for %s/%d%s", 
        !           541:               inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen,
        !           542:               VTY_NEWLINE);
        !           543:       vty_out (vty, "  Known via \"%s\"", zebra_route_string (rib->type));
        !           544:       vty_out (vty, ", distance %d, metric %d", rib->distance, rib->metric);
        !           545:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
        !           546:        vty_out (vty, ", best");
        !           547:       if (rib->refcnt)
        !           548:        vty_out (vty, ", refcnt %ld", rib->refcnt);
        !           549:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
        !           550:        vty_out (vty, ", blackhole");
        !           551:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
        !           552:        vty_out (vty, ", reject");
        !           553:       vty_out (vty, "%s", VTY_NEWLINE);
        !           554: 
        !           555: #define ONE_DAY_SECOND 60*60*24
        !           556: #define ONE_WEEK_SECOND 60*60*24*7
        !           557:       if (rib->type == ZEBRA_ROUTE_RIP
        !           558:          || rib->type == ZEBRA_ROUTE_OSPF
        !           559:          || rib->type == ZEBRA_ROUTE_ISIS
        !           560:          || rib->type == ZEBRA_ROUTE_BGP)
        !           561:        {
        !           562:          time_t uptime;
        !           563:          struct tm *tm;
        !           564: 
        !           565:          uptime = time (NULL);
        !           566:          uptime -= rib->uptime;
        !           567:          tm = gmtime (&uptime);
        !           568: 
        !           569:          vty_out (vty, "  Last update ");
        !           570: 
        !           571:          if (uptime < ONE_DAY_SECOND)
        !           572:            vty_out (vty,  "%02d:%02d:%02d", 
        !           573:                     tm->tm_hour, tm->tm_min, tm->tm_sec);
        !           574:          else if (uptime < ONE_WEEK_SECOND)
        !           575:            vty_out (vty, "%dd%02dh%02dm", 
        !           576:                     tm->tm_yday, tm->tm_hour, tm->tm_min);
        !           577:          else
        !           578:            vty_out (vty, "%02dw%dd%02dh", 
        !           579:                     tm->tm_yday/7,
        !           580:                     tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
        !           581:          vty_out (vty, " ago%s", VTY_NEWLINE);
        !           582:        }
        !           583: 
        !           584:       for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
        !           585:        {
        !           586:           char addrstr[32];
        !           587: 
        !           588:          vty_out (vty, "  %c",
        !           589:                   CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ');
        !           590: 
        !           591:          switch (nexthop->type)
        !           592:            {
        !           593:            case NEXTHOP_TYPE_IPV4:
        !           594:            case NEXTHOP_TYPE_IPV4_IFINDEX:
        !           595:              vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4));
        !           596:              if (nexthop->ifindex)
        !           597:                vty_out (vty, ", via %s", ifindex2ifname (nexthop->ifindex));
        !           598:              break;
        !           599:            case NEXTHOP_TYPE_IFINDEX:
        !           600:              vty_out (vty, " directly connected, %s",
        !           601:                       ifindex2ifname (nexthop->ifindex));
        !           602:              break;
        !           603:            case NEXTHOP_TYPE_IFNAME:
        !           604:              vty_out (vty, " directly connected, %s", nexthop->ifname);
        !           605:              break;
        !           606:       case NEXTHOP_TYPE_BLACKHOLE:
        !           607:         vty_out (vty, " directly connected, Null0");
        !           608:         break;
        !           609:       default:
        !           610:              break;
        !           611:            }
        !           612:          if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
        !           613:            vty_out (vty, " inactive");
        !           614: 
        !           615:          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
        !           616:            {
        !           617:              vty_out (vty, " (recursive");
        !           618:                
        !           619:              switch (nexthop->rtype)
        !           620:                {
        !           621:                case NEXTHOP_TYPE_IPV4:
        !           622:                case NEXTHOP_TYPE_IPV4_IFINDEX:
        !           623:                  vty_out (vty, " via %s)", inet_ntoa (nexthop->rgate.ipv4));
        !           624:                  break;
        !           625:                case NEXTHOP_TYPE_IFINDEX:
        !           626:                case NEXTHOP_TYPE_IFNAME:
        !           627:                  vty_out (vty, " is directly connected, %s)",
        !           628:                           ifindex2ifname (nexthop->rifindex));
        !           629:                  break;
        !           630:                default:
        !           631:                  break;
        !           632:                }
        !           633:            }
        !           634:          switch (nexthop->type)
        !           635:             {
        !           636:             case NEXTHOP_TYPE_IPV4:
        !           637:             case NEXTHOP_TYPE_IPV4_IFINDEX:
        !           638:             case NEXTHOP_TYPE_IPV4_IFNAME:
        !           639:               if (nexthop->src.ipv4.s_addr)
        !           640:                 {
        !           641:                  if (inet_ntop(AF_INET, &nexthop->src.ipv4, addrstr,
        !           642:                      sizeof addrstr))
        !           643:                     vty_out (vty, ", src %s", addrstr);
        !           644:                 }
        !           645:               break;
        !           646: #ifdef HAVE_IPV6
        !           647:             case NEXTHOP_TYPE_IPV6:
        !           648:             case NEXTHOP_TYPE_IPV6_IFINDEX:
        !           649:             case NEXTHOP_TYPE_IPV6_IFNAME:
        !           650:               if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
        !           651:                 {
        !           652:                  if (inet_ntop(AF_INET6, &nexthop->src.ipv6, addrstr,
        !           653:                      sizeof addrstr))
        !           654:                     vty_out (vty, ", src %s", addrstr);
        !           655:                 }
        !           656:               break;
        !           657: #endif /* HAVE_IPV6 */
        !           658:             default:
        !           659:               break;
        !           660:             }
        !           661:          vty_out (vty, "%s", VTY_NEWLINE);
        !           662:        }
        !           663:       vty_out (vty, "%s", VTY_NEWLINE);
        !           664:     }
        !           665: }
        !           666: 
        !           667: static void
        !           668: vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
        !           669: {
        !           670:   struct nexthop *nexthop;
        !           671:   int len = 0;
        !           672:   char buf[BUFSIZ];
        !           673: 
        !           674:   /* Nexthop information. */
        !           675:   for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
        !           676:     {
        !           677:       if (nexthop == rib->nexthop)
        !           678:        {
        !           679:          /* Prefix information. */
        !           680:          len = vty_out (vty, "%c%c%c %s/%d",
        !           681:                         zebra_route_char (rib->type),
        !           682:                         CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
        !           683:                         ? '>' : ' ',
        !           684:                         CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
        !           685:                         ? '*' : ' ',
        !           686:                         inet_ntop (AF_INET, &rn->p.u.prefix, buf, BUFSIZ),
        !           687:                         rn->p.prefixlen);
        !           688:                
        !           689:          /* Distance and metric display. */
        !           690:          if (rib->type != ZEBRA_ROUTE_CONNECT 
        !           691:              && rib->type != ZEBRA_ROUTE_KERNEL)
        !           692:            len += vty_out (vty, " [%d/%d]", rib->distance,
        !           693:                            rib->metric);
        !           694:        }
        !           695:       else
        !           696:        vty_out (vty, "  %c%*c",
        !           697:                 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
        !           698:                 ? '*' : ' ',
        !           699:                 len - 3, ' ');
        !           700: 
        !           701:       switch (nexthop->type)
        !           702:        {
        !           703:        case NEXTHOP_TYPE_IPV4:
        !           704:        case NEXTHOP_TYPE_IPV4_IFINDEX:
        !           705:          vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4));
        !           706:          if (nexthop->ifindex)
        !           707:            vty_out (vty, ", %s", ifindex2ifname (nexthop->ifindex));
        !           708:          break;
        !           709:        case NEXTHOP_TYPE_IFINDEX:
        !           710:          vty_out (vty, " is directly connected, %s",
        !           711:                   ifindex2ifname (nexthop->ifindex));
        !           712:          break;
        !           713:        case NEXTHOP_TYPE_IFNAME:
        !           714:          vty_out (vty, " is directly connected, %s", nexthop->ifname);
        !           715:          break;
        !           716:   case NEXTHOP_TYPE_BLACKHOLE:
        !           717:     vty_out (vty, " is directly connected, Null0");
        !           718:     break;
        !           719:   default:
        !           720:          break;
        !           721:        }
        !           722:       if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
        !           723:        vty_out (vty, " inactive");
        !           724: 
        !           725:       if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
        !           726:        {
        !           727:          vty_out (vty, " (recursive");
        !           728:                
        !           729:          switch (nexthop->rtype)
        !           730:            {
        !           731:            case NEXTHOP_TYPE_IPV4:
        !           732:            case NEXTHOP_TYPE_IPV4_IFINDEX:
        !           733:              vty_out (vty, " via %s)", inet_ntoa (nexthop->rgate.ipv4));
        !           734:              break;
        !           735:            case NEXTHOP_TYPE_IFINDEX:
        !           736:            case NEXTHOP_TYPE_IFNAME:
        !           737:              vty_out (vty, " is directly connected, %s)",
        !           738:                       ifindex2ifname (nexthop->rifindex));
        !           739:              break;
        !           740:            default:
        !           741:              break;
        !           742:            }
        !           743:        }
        !           744:       switch (nexthop->type)
        !           745:         {
        !           746:           case NEXTHOP_TYPE_IPV4:
        !           747:           case NEXTHOP_TYPE_IPV4_IFINDEX:
        !           748:           case NEXTHOP_TYPE_IPV4_IFNAME:
        !           749:             if (nexthop->src.ipv4.s_addr)
        !           750:               {
        !           751:                if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
        !           752:                   vty_out (vty, ", src %s", buf);
        !           753:               }
        !           754:             break;
        !           755: #ifdef HAVE_IPV6
        !           756:           case NEXTHOP_TYPE_IPV6:
        !           757:           case NEXTHOP_TYPE_IPV6_IFINDEX:
        !           758:           case NEXTHOP_TYPE_IPV6_IFNAME:
        !           759:             if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
        !           760:               {
        !           761:                if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
        !           762:                   vty_out (vty, ", src %s", buf);
        !           763:               }
        !           764:             break;
        !           765: #endif /* HAVE_IPV6 */
        !           766:           default:
        !           767:            break;
        !           768:         }
        !           769: 
        !           770:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
        !           771:                vty_out (vty, ", bh");
        !           772:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
        !           773:                vty_out (vty, ", rej");
        !           774: 
        !           775:       if (rib->type == ZEBRA_ROUTE_RIP
        !           776:          || rib->type == ZEBRA_ROUTE_OSPF
        !           777:          || rib->type == ZEBRA_ROUTE_ISIS
        !           778:          || rib->type == ZEBRA_ROUTE_BGP)
        !           779:        {
        !           780:          time_t uptime;
        !           781:          struct tm *tm;
        !           782: 
        !           783:          uptime = time (NULL);
        !           784:          uptime -= rib->uptime;
        !           785:          tm = gmtime (&uptime);
        !           786: 
        !           787: #define ONE_DAY_SECOND 60*60*24
        !           788: #define ONE_WEEK_SECOND 60*60*24*7
        !           789: 
        !           790:          if (uptime < ONE_DAY_SECOND)
        !           791:            vty_out (vty,  ", %02d:%02d:%02d", 
        !           792:                     tm->tm_hour, tm->tm_min, tm->tm_sec);
        !           793:          else if (uptime < ONE_WEEK_SECOND)
        !           794:            vty_out (vty, ", %dd%02dh%02dm", 
        !           795:                     tm->tm_yday, tm->tm_hour, tm->tm_min);
        !           796:          else
        !           797:            vty_out (vty, ", %02dw%dd%02dh", 
        !           798:                     tm->tm_yday/7,
        !           799:                     tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
        !           800:        }
        !           801:       vty_out (vty, "%s", VTY_NEWLINE);
        !           802:     }
        !           803: }
        !           804: 
        !           805: #define SHOW_ROUTE_V4_HEADER "Codes: K - kernel route, C - connected, " \
        !           806:   "S - static, R - RIP, O - OSPF,%s       I - ISIS, B - BGP, " \
        !           807:   "> - selected route, * - FIB route%s%s"
        !           808: 
        !           809: DEFUN (show_ip_route,
        !           810:        show_ip_route_cmd,
        !           811:        "show ip route",
        !           812:        SHOW_STR
        !           813:        IP_STR
        !           814:        "IP routing table\n")
        !           815: {
        !           816:   struct route_table *table;
        !           817:   struct route_node *rn;
        !           818:   struct rib *rib;
        !           819:   int first = 1;
        !           820: 
        !           821:   table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
        !           822:   if (! table)
        !           823:     return CMD_SUCCESS;
        !           824: 
        !           825:   /* Show all IPv4 routes. */
        !           826:   for (rn = route_top (table); rn; rn = route_next (rn))
        !           827:     for (rib = rn->info; rib; rib = rib->next)
        !           828:       {
        !           829:        if (first)
        !           830:          {
        !           831:            vty_out (vty, SHOW_ROUTE_V4_HEADER, VTY_NEWLINE, VTY_NEWLINE,
        !           832:                     VTY_NEWLINE);
        !           833:            first = 0;
        !           834:          }
        !           835:        vty_show_ip_route (vty, rn, rib);
        !           836:       }
        !           837:   return CMD_SUCCESS;
        !           838: }
        !           839: 
        !           840: DEFUN (show_ip_route_prefix_longer,
        !           841:        show_ip_route_prefix_longer_cmd,
        !           842:        "show ip route A.B.C.D/M longer-prefixes",
        !           843:        SHOW_STR
        !           844:        IP_STR
        !           845:        "IP routing table\n"
        !           846:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
        !           847:        "Show route matching the specified Network/Mask pair only\n")
        !           848: {
        !           849:   struct route_table *table;
        !           850:   struct route_node *rn;
        !           851:   struct rib *rib;
        !           852:   struct prefix p;
        !           853:   int ret;
        !           854:   int first = 1;
        !           855: 
        !           856:   ret = str2prefix (argv[0], &p);
        !           857:   if (! ret)
        !           858:     {
        !           859:       vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
        !           860:       return CMD_WARNING;
        !           861:     }
        !           862:   
        !           863:   table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
        !           864:   if (! table)
        !           865:     return CMD_SUCCESS;
        !           866: 
        !           867:   /* Show matched type IPv4 routes. */
        !           868:   for (rn = route_top (table); rn; rn = route_next (rn))
        !           869:     for (rib = rn->info; rib; rib = rib->next)
        !           870:       if (prefix_match (&p, &rn->p))
        !           871:        {
        !           872:          if (first)
        !           873:            {
        !           874:              vty_out (vty, SHOW_ROUTE_V4_HEADER, VTY_NEWLINE,
        !           875:                       VTY_NEWLINE, VTY_NEWLINE);
        !           876:              first = 0;
        !           877:            }
        !           878:          vty_show_ip_route (vty, rn, rib);
        !           879:        }
        !           880:   return CMD_SUCCESS;
        !           881: }
        !           882: 
        !           883: DEFUN (show_ip_route_supernets,
        !           884:        show_ip_route_supernets_cmd,
        !           885:        "show ip route supernets-only",
        !           886:        SHOW_STR
        !           887:        IP_STR
        !           888:        "IP routing table\n"
        !           889:        "Show supernet entries only\n")
        !           890: {
        !           891:   struct route_table *table;
        !           892:   struct route_node *rn;
        !           893:   struct rib *rib;
        !           894:   u_int32_t addr; 
        !           895:   int first = 1;
        !           896: 
        !           897:   table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
        !           898:   if (! table)
        !           899:     return CMD_SUCCESS;
        !           900: 
        !           901:   /* Show matched type IPv4 routes. */
        !           902:   for (rn = route_top (table); rn; rn = route_next (rn))
        !           903:     for (rib = rn->info; rib; rib = rib->next)
        !           904:       {
        !           905:        addr = ntohl (rn->p.u.prefix4.s_addr);
        !           906: 
        !           907:        if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
        !           908:           || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
        !           909:           || (IN_CLASSA (addr) && rn->p.prefixlen < 8)) 
        !           910:          {
        !           911:            if (first)
        !           912:              {
        !           913:                vty_out (vty, SHOW_ROUTE_V4_HEADER, VTY_NEWLINE,
        !           914:                         VTY_NEWLINE, VTY_NEWLINE);
        !           915:                first = 0;
        !           916:              }
        !           917:            vty_show_ip_route (vty, rn, rib);
        !           918:          }
        !           919:       }
        !           920:   return CMD_SUCCESS;
        !           921: }
        !           922: 
        !           923: DEFUN (show_ip_route_protocol,
        !           924:        show_ip_route_protocol_cmd,
        !           925:        "show ip route (bgp|connected|isis|kernel|ospf|rip|static)",
        !           926:        SHOW_STR
        !           927:        IP_STR
        !           928:        "IP routing table\n"
        !           929:        "Border Gateway Protocol (BGP)\n"
        !           930:        "Connected\n"
        !           931:        "ISO IS-IS (ISIS)\n"
        !           932:        "Kernel\n"
        !           933:        "Open Shortest Path First (OSPF)\n"
        !           934:        "Routing Information Protocol (RIP)\n"
        !           935:        "Static routes\n")
        !           936: {
        !           937:   int type;
        !           938:   struct route_table *table;
        !           939:   struct route_node *rn;
        !           940:   struct rib *rib;
        !           941:   int first = 1;
        !           942: 
        !           943:   if (strncmp (argv[0], "b", 1) == 0)
        !           944:     type = ZEBRA_ROUTE_BGP;
        !           945:   else if (strncmp (argv[0], "c", 1) == 0)
        !           946:     type = ZEBRA_ROUTE_CONNECT;
        !           947:   else if (strncmp (argv[0], "k", 1) ==0)
        !           948:     type = ZEBRA_ROUTE_KERNEL;
        !           949:   else if (strncmp (argv[0], "o", 1) == 0)
        !           950:     type = ZEBRA_ROUTE_OSPF;
        !           951:   else if (strncmp (argv[0], "i", 1) == 0)
        !           952:     type = ZEBRA_ROUTE_ISIS;
        !           953:   else if (strncmp (argv[0], "r", 1) == 0)
        !           954:     type = ZEBRA_ROUTE_RIP;
        !           955:   else if (strncmp (argv[0], "s", 1) == 0)
        !           956:     type = ZEBRA_ROUTE_STATIC;
        !           957:   else 
        !           958:     {
        !           959:       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
        !           960:       return CMD_WARNING;
        !           961:     }
        !           962:   
        !           963:   table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
        !           964:   if (! table)
        !           965:     return CMD_SUCCESS;
        !           966: 
        !           967:   /* Show matched type IPv4 routes. */
        !           968:   for (rn = route_top (table); rn; rn = route_next (rn))
        !           969:     for (rib = rn->info; rib; rib = rib->next)
        !           970:       if (rib->type == type)
        !           971:        {
        !           972:          if (first)
        !           973:            {
        !           974:              vty_out (vty, SHOW_ROUTE_V4_HEADER,
        !           975:                       VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
        !           976:              first = 0;
        !           977:            }
        !           978:          vty_show_ip_route (vty, rn, rib);
        !           979:        }
        !           980:   return CMD_SUCCESS;
        !           981: }
        !           982: 
        !           983: DEFUN (show_ip_route_addr,
        !           984:        show_ip_route_addr_cmd,
        !           985:        "show ip route A.B.C.D",
        !           986:        SHOW_STR
        !           987:        IP_STR
        !           988:        "IP routing table\n"
        !           989:        "Network in the IP routing table to display\n")
        !           990: {
        !           991:   int ret;
        !           992:   struct prefix_ipv4 p;
        !           993:   struct route_table *table;
        !           994:   struct route_node *rn;
        !           995: 
        !           996:   ret = str2prefix_ipv4 (argv[0], &p);
        !           997:   if (ret <= 0)
        !           998:     {
        !           999:       vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
        !          1000:       return CMD_WARNING;
        !          1001:     }
        !          1002: 
        !          1003:   table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
        !          1004:   if (! table)
        !          1005:     return CMD_SUCCESS;
        !          1006: 
        !          1007:   rn = route_node_match (table, (struct prefix *) &p);
        !          1008:   if (! rn)
        !          1009:     {
        !          1010:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
        !          1011:       return CMD_WARNING;
        !          1012:     }
        !          1013: 
        !          1014:   vty_show_ip_route_detail (vty, rn);
        !          1015: 
        !          1016:   route_unlock_node (rn);
        !          1017: 
        !          1018:   return CMD_SUCCESS;
        !          1019: }
        !          1020: 
        !          1021: DEFUN (show_ip_route_prefix,
        !          1022:        show_ip_route_prefix_cmd,
        !          1023:        "show ip route A.B.C.D/M",
        !          1024:        SHOW_STR
        !          1025:        IP_STR
        !          1026:        "IP routing table\n"
        !          1027:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
        !          1028: {
        !          1029:   int ret;
        !          1030:   struct prefix_ipv4 p;
        !          1031:   struct route_table *table;
        !          1032:   struct route_node *rn;
        !          1033: 
        !          1034:   ret = str2prefix_ipv4 (argv[0], &p);
        !          1035:   if (ret <= 0)
        !          1036:     {
        !          1037:       vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
        !          1038:       return CMD_WARNING;
        !          1039:     }
        !          1040: 
        !          1041:   table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
        !          1042:   if (! table)
        !          1043:     return CMD_SUCCESS;
        !          1044: 
        !          1045:   rn = route_node_match (table, (struct prefix *) &p);
        !          1046:   if (! rn || rn->p.prefixlen != p.prefixlen)
        !          1047:     {
        !          1048:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
        !          1049:       return CMD_WARNING;
        !          1050:     }
        !          1051: 
        !          1052:   vty_show_ip_route_detail (vty, rn);
        !          1053: 
        !          1054:   route_unlock_node (rn);
        !          1055: 
        !          1056:   return CMD_SUCCESS;
        !          1057: }
        !          1058: 
        !          1059: static void
        !          1060: vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
        !          1061: {
        !          1062:   struct route_node *rn;
        !          1063:   struct rib *rib;
        !          1064:   struct nexthop *nexthop;
        !          1065: #define ZEBRA_ROUTE_IBGP  ZEBRA_ROUTE_MAX
        !          1066: #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
        !          1067:   u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
        !          1068:   u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
        !          1069:   u_int32_t i;
        !          1070: 
        !          1071:   memset (&rib_cnt, 0, sizeof(rib_cnt));
        !          1072:   memset (&fib_cnt, 0, sizeof(fib_cnt));
        !          1073:   for (rn = route_top (table); rn; rn = route_next (rn))
        !          1074:     for (rib = rn->info; rib; rib = rib->next)
        !          1075:       for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
        !          1076:         {
        !          1077:          rib_cnt[ZEBRA_ROUTE_TOTAL]++;
        !          1078:          rib_cnt[rib->type]++;
        !          1079:          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) 
        !          1080:            {
        !          1081:              fib_cnt[ZEBRA_ROUTE_TOTAL]++;
        !          1082:              fib_cnt[rib->type]++;
        !          1083:            }
        !          1084:          if (rib->type == ZEBRA_ROUTE_BGP && 
        !          1085:              CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP)) 
        !          1086:            {
        !          1087:              rib_cnt[ZEBRA_ROUTE_IBGP]++;
        !          1088:              if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)) 
        !          1089:                fib_cnt[ZEBRA_ROUTE_IBGP]++;
        !          1090:            }
        !          1091:        }
        !          1092: 
        !          1093:   vty_out (vty, "%-20s %-20s %-20s %s", 
        !          1094:           "Route Source", "Routes", "FIB", VTY_NEWLINE);
        !          1095: 
        !          1096:   for (i = 0; i < ZEBRA_ROUTE_MAX; i++) 
        !          1097:     {
        !          1098:       if (rib_cnt[i] > 0)
        !          1099:        {
        !          1100:          if (i == ZEBRA_ROUTE_BGP)
        !          1101:            {
        !          1102:              vty_out (vty, "%-20s %-20d %-20d %s", "ebgp", 
        !          1103:                       rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
        !          1104:                       fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
        !          1105:                       VTY_NEWLINE);
        !          1106:              vty_out (vty, "%-20s %-20d %-20d %s", "ibgp", 
        !          1107:                       rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
        !          1108:                       VTY_NEWLINE);
        !          1109:            }
        !          1110:          else 
        !          1111:            vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i), 
        !          1112:                     rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
        !          1113:        }
        !          1114:     }
        !          1115: 
        !          1116:   vty_out (vty, "------%s", VTY_NEWLINE);
        !          1117:   vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL], 
        !          1118:           fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);  
        !          1119: }
        !          1120: 
        !          1121: /* Show route summary.  */
        !          1122: DEFUN (show_ip_route_summary,
        !          1123:        show_ip_route_summary_cmd,
        !          1124:        "show ip route summary",
        !          1125:        SHOW_STR
        !          1126:        IP_STR
        !          1127:        "IP routing table\n"
        !          1128:        "Summary of all routes\n")
        !          1129: {
        !          1130:   struct route_table *table;
        !          1131: 
        !          1132:   table = vrf_table (AFI_IP, SAFI_UNICAST, 0);
        !          1133:   if (! table)
        !          1134:     return CMD_SUCCESS;
        !          1135: 
        !          1136:   vty_show_ip_route_summary (vty, table);
        !          1137: 
        !          1138:   return CMD_SUCCESS;
        !          1139: }
        !          1140: 
        !          1141: /* Write IPv4 static route configuration. */
        !          1142: static int
        !          1143: static_config_ipv4 (struct vty *vty)
        !          1144: {
        !          1145:   struct route_node *rn;
        !          1146:   struct static_ipv4 *si;  
        !          1147:   struct route_table *stable;
        !          1148:   int write;
        !          1149: 
        !          1150:   write = 0;
        !          1151: 
        !          1152:   /* Lookup table.  */
        !          1153:   stable = vrf_static_table (AFI_IP, SAFI_UNICAST, 0);
        !          1154:   if (! stable)
        !          1155:     return -1;
        !          1156: 
        !          1157:   for (rn = route_top (stable); rn; rn = route_next (rn))
        !          1158:     for (si = rn->info; si; si = si->next)
        !          1159:       {
        !          1160:         vty_out (vty, "ip route %s/%d", inet_ntoa (rn->p.u.prefix4),
        !          1161:                  rn->p.prefixlen);
        !          1162: 
        !          1163:         switch (si->type)
        !          1164:           {
        !          1165:             case STATIC_IPV4_GATEWAY:
        !          1166:               vty_out (vty, " %s", inet_ntoa (si->gate.ipv4));
        !          1167:               break;
        !          1168:             case STATIC_IPV4_IFNAME:
        !          1169:               vty_out (vty, " %s", si->gate.ifname);
        !          1170:               break;
        !          1171:             case STATIC_IPV4_BLACKHOLE:
        !          1172:               vty_out (vty, " Null0");
        !          1173:               break;
        !          1174:           }
        !          1175:         
        !          1176:         /* flags are incompatible with STATIC_IPV4_BLACKHOLE */
        !          1177:         if (si->type != STATIC_IPV4_BLACKHOLE)
        !          1178:           {
        !          1179:             if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
        !          1180:               vty_out (vty, " %s", "reject");
        !          1181: 
        !          1182:             if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
        !          1183:               vty_out (vty, " %s", "blackhole");
        !          1184:           }
        !          1185: 
        !          1186:         if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
        !          1187:           vty_out (vty, " %d", si->distance);
        !          1188: 
        !          1189:         vty_out (vty, "%s", VTY_NEWLINE);
        !          1190: 
        !          1191:         write = 1;
        !          1192:       }
        !          1193:   return write;
        !          1194: }
        !          1195: 
        !          1196: DEFUN (show_ip_protocol,
        !          1197:        show_ip_protocol_cmd,
        !          1198:        "show ip protocol",
        !          1199:         SHOW_STR
        !          1200:         IP_STR
        !          1201:        "IP protocol filtering status\n")
        !          1202: {
        !          1203:     int i; 
        !          1204: 
        !          1205:     vty_out(vty, "Protocol    : route-map %s", VTY_NEWLINE);
        !          1206:     vty_out(vty, "------------------------%s", VTY_NEWLINE);
        !          1207:     for (i=0;i<ZEBRA_ROUTE_MAX;i++)
        !          1208:     {
        !          1209:         if (proto_rm[AFI_IP][i])
        !          1210:           vty_out (vty, "%-10s  : %-10s%s", zebra_route_string(i),
        !          1211:                                        proto_rm[AFI_IP][i],
        !          1212:                                        VTY_NEWLINE);
        !          1213:         else
        !          1214:           vty_out (vty, "%-10s  : none%s", zebra_route_string(i), VTY_NEWLINE);
        !          1215:     }
        !          1216:     if (proto_rm[AFI_IP][i])
        !          1217:       vty_out (vty, "%-10s  : %-10s%s", "any", proto_rm[AFI_IP][i],
        !          1218:                                        VTY_NEWLINE);
        !          1219:     else
        !          1220:       vty_out (vty, "%-10s  : none%s", "any", VTY_NEWLINE);
        !          1221: 
        !          1222:     return CMD_SUCCESS;
        !          1223: }
        !          1224: 
        !          1225: 
        !          1226: #ifdef HAVE_IPV6
        !          1227: /* General fucntion for IPv6 static route. */
        !          1228: static int
        !          1229: static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,
        !          1230:                  const char *gate_str, const char *ifname,
        !          1231:                  const char *flag_str, const char *distance_str)
        !          1232: {
        !          1233:   int ret;
        !          1234:   u_char distance;
        !          1235:   struct prefix p;
        !          1236:   struct in6_addr *gate = NULL;
        !          1237:   struct in6_addr gate_addr;
        !          1238:   u_char type = 0;
        !          1239:   int table = 0;
        !          1240:   u_char flag = 0;
        !          1241:   
        !          1242:   ret = str2prefix (dest_str, &p);
        !          1243:   if (ret <= 0)
        !          1244:     {
        !          1245:       vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
        !          1246:       return CMD_WARNING;
        !          1247:     }
        !          1248: 
        !          1249:   /* Apply mask for given prefix. */
        !          1250:   apply_mask (&p);
        !          1251: 
        !          1252:   /* Route flags */
        !          1253:   if (flag_str) {
        !          1254:     switch(flag_str[0]) {
        !          1255:       case 'r':
        !          1256:       case 'R': /* XXX */
        !          1257:         SET_FLAG (flag, ZEBRA_FLAG_REJECT);
        !          1258:         break;
        !          1259:       case 'b':
        !          1260:       case 'B': /* XXX */
        !          1261:         SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
        !          1262:         break;
        !          1263:       default:
        !          1264:         vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
        !          1265:         return CMD_WARNING;
        !          1266:     }
        !          1267:   }
        !          1268: 
        !          1269:   /* Administrative distance. */
        !          1270:   if (distance_str)
        !          1271:     distance = atoi (distance_str);
        !          1272:   else
        !          1273:     distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
        !          1274: 
        !          1275:   /* When gateway is valid IPv6 addrees, then gate is treated as
        !          1276:      nexthop address other case gate is treated as interface name. */
        !          1277:   ret = inet_pton (AF_INET6, gate_str, &gate_addr);
        !          1278: 
        !          1279:   if (ifname)
        !          1280:     {
        !          1281:       /* When ifname is specified.  It must be come with gateway
        !          1282:          address. */
        !          1283:       if (ret != 1)
        !          1284:        {
        !          1285:          vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
        !          1286:          return CMD_WARNING;
        !          1287:        }
        !          1288:       type = STATIC_IPV6_GATEWAY_IFNAME;
        !          1289:       gate = &gate_addr;
        !          1290:     }
        !          1291:   else
        !          1292:     {
        !          1293:       if (ret == 1)
        !          1294:        {
        !          1295:          type = STATIC_IPV6_GATEWAY;
        !          1296:          gate = &gate_addr;
        !          1297:        }
        !          1298:       else
        !          1299:        {
        !          1300:          type = STATIC_IPV6_IFNAME;
        !          1301:          ifname = gate_str;
        !          1302:        }
        !          1303:     }
        !          1304: 
        !          1305:   if (add_cmd)
        !          1306:     static_add_ipv6 (&p, type, gate, ifname, flag, distance, table);
        !          1307:   else
        !          1308:     static_delete_ipv6 (&p, type, gate, ifname, distance, table);
        !          1309: 
        !          1310:   return CMD_SUCCESS;
        !          1311: }
        !          1312: 
        !          1313: DEFUN (ipv6_route,
        !          1314:        ipv6_route_cmd,
        !          1315:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
        !          1316:        IP_STR
        !          1317:        "Establish static routes\n"
        !          1318:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1319:        "IPv6 gateway address\n"
        !          1320:        "IPv6 gateway interface name\n")
        !          1321: {
        !          1322:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL);
        !          1323: }
        !          1324: 
        !          1325: DEFUN (ipv6_route_flags,
        !          1326:        ipv6_route_flags_cmd,
        !          1327:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
        !          1328:        IP_STR
        !          1329:        "Establish static routes\n"
        !          1330:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1331:        "IPv6 gateway address\n"
        !          1332:        "IPv6 gateway interface name\n"
        !          1333:        "Emit an ICMP unreachable when matched\n"
        !          1334:        "Silently discard pkts when matched\n")
        !          1335: {
        !          1336:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL);
        !          1337: }
        !          1338: 
        !          1339: DEFUN (ipv6_route_ifname,
        !          1340:        ipv6_route_ifname_cmd,
        !          1341:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
        !          1342:        IP_STR
        !          1343:        "Establish static routes\n"
        !          1344:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1345:        "IPv6 gateway address\n"
        !          1346:        "IPv6 gateway interface name\n")
        !          1347: {
        !          1348:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL);
        !          1349: }
        !          1350: 
        !          1351: DEFUN (ipv6_route_ifname_flags,
        !          1352:        ipv6_route_ifname_flags_cmd,
        !          1353:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
        !          1354:        IP_STR
        !          1355:        "Establish static routes\n"
        !          1356:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1357:        "IPv6 gateway address\n"
        !          1358:        "IPv6 gateway interface name\n"
        !          1359:        "Emit an ICMP unreachable when matched\n"
        !          1360:        "Silently discard pkts when matched\n")
        !          1361: {
        !          1362:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL);
        !          1363: }
        !          1364: 
        !          1365: DEFUN (ipv6_route_pref,
        !          1366:        ipv6_route_pref_cmd,
        !          1367:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
        !          1368:        IP_STR
        !          1369:        "Establish static routes\n"
        !          1370:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1371:        "IPv6 gateway address\n"
        !          1372:        "IPv6 gateway interface name\n"
        !          1373:        "Distance value for this prefix\n")
        !          1374: {
        !          1375:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2]);
        !          1376: }
        !          1377: 
        !          1378: DEFUN (ipv6_route_flags_pref,
        !          1379:        ipv6_route_flags_pref_cmd,
        !          1380:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
        !          1381:        IP_STR
        !          1382:        "Establish static routes\n"
        !          1383:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1384:        "IPv6 gateway address\n"
        !          1385:        "IPv6 gateway interface name\n"
        !          1386:        "Emit an ICMP unreachable when matched\n"
        !          1387:        "Silently discard pkts when matched\n"
        !          1388:        "Distance value for this prefix\n")
        !          1389: {
        !          1390:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3]);
        !          1391: }
        !          1392: 
        !          1393: DEFUN (ipv6_route_ifname_pref,
        !          1394:        ipv6_route_ifname_pref_cmd,
        !          1395:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
        !          1396:        IP_STR
        !          1397:        "Establish static routes\n"
        !          1398:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1399:        "IPv6 gateway address\n"
        !          1400:        "IPv6 gateway interface name\n"
        !          1401:        "Distance value for this prefix\n")
        !          1402: {
        !          1403:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3]);
        !          1404: }
        !          1405: 
        !          1406: DEFUN (ipv6_route_ifname_flags_pref,
        !          1407:        ipv6_route_ifname_flags_pref_cmd,
        !          1408:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
        !          1409:        IP_STR
        !          1410:        "Establish static routes\n"
        !          1411:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1412:        "IPv6 gateway address\n"
        !          1413:        "IPv6 gateway interface name\n"
        !          1414:        "Emit an ICMP unreachable when matched\n"
        !          1415:        "Silently discard pkts when matched\n"
        !          1416:        "Distance value for this prefix\n")
        !          1417: {
        !          1418:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4]);
        !          1419: }
        !          1420: 
        !          1421: DEFUN (no_ipv6_route,
        !          1422:        no_ipv6_route_cmd,
        !          1423:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
        !          1424:        NO_STR
        !          1425:        IP_STR
        !          1426:        "Establish static routes\n"
        !          1427:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1428:        "IPv6 gateway address\n"
        !          1429:        "IPv6 gateway interface name\n")
        !          1430: {
        !          1431:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL);
        !          1432: }
        !          1433: 
        !          1434: ALIAS (no_ipv6_route,
        !          1435:        no_ipv6_route_flags_cmd,
        !          1436:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
        !          1437:        NO_STR
        !          1438:        IP_STR
        !          1439:        "Establish static routes\n"
        !          1440:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1441:        "IPv6 gateway address\n"
        !          1442:        "IPv6 gateway interface name\n"
        !          1443:        "Emit an ICMP unreachable when matched\n"
        !          1444:        "Silently discard pkts when matched\n")
        !          1445: 
        !          1446: DEFUN (no_ipv6_route_ifname,
        !          1447:        no_ipv6_route_ifname_cmd,
        !          1448:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
        !          1449:        NO_STR
        !          1450:        IP_STR
        !          1451:        "Establish static routes\n"
        !          1452:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1453:        "IPv6 gateway address\n"
        !          1454:        "IPv6 gateway interface name\n")
        !          1455: {
        !          1456:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL);
        !          1457: }
        !          1458: 
        !          1459: ALIAS (no_ipv6_route_ifname,
        !          1460:        no_ipv6_route_ifname_flags_cmd,
        !          1461:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
        !          1462:        NO_STR
        !          1463:        IP_STR
        !          1464:        "Establish static routes\n"
        !          1465:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1466:        "IPv6 gateway address\n"
        !          1467:        "IPv6 gateway interface name\n"
        !          1468:        "Emit an ICMP unreachable when matched\n"
        !          1469:        "Silently discard pkts when matched\n")
        !          1470: 
        !          1471: DEFUN (no_ipv6_route_pref,
        !          1472:        no_ipv6_route_pref_cmd,
        !          1473:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
        !          1474:        NO_STR
        !          1475:        IP_STR
        !          1476:        "Establish static routes\n"
        !          1477:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1478:        "IPv6 gateway address\n"
        !          1479:        "IPv6 gateway interface name\n"
        !          1480:        "Distance value for this prefix\n")
        !          1481: {
        !          1482:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2]);
        !          1483: }
        !          1484: 
        !          1485: DEFUN (no_ipv6_route_flags_pref,
        !          1486:        no_ipv6_route_flags_pref_cmd,
        !          1487:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
        !          1488:        NO_STR
        !          1489:        IP_STR
        !          1490:        "Establish static routes\n"
        !          1491:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1492:        "IPv6 gateway address\n"
        !          1493:        "IPv6 gateway interface name\n"
        !          1494:        "Emit an ICMP unreachable when matched\n"
        !          1495:        "Silently discard pkts when matched\n"
        !          1496:        "Distance value for this prefix\n")
        !          1497: {
        !          1498:   /* We do not care about argv[2] */
        !          1499:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3]);
        !          1500: }
        !          1501: 
        !          1502: DEFUN (no_ipv6_route_ifname_pref,
        !          1503:        no_ipv6_route_ifname_pref_cmd,
        !          1504:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
        !          1505:        NO_STR
        !          1506:        IP_STR
        !          1507:        "Establish static routes\n"
        !          1508:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1509:        "IPv6 gateway address\n"
        !          1510:        "IPv6 gateway interface name\n"
        !          1511:        "Distance value for this prefix\n")
        !          1512: {
        !          1513:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3]);
        !          1514: }
        !          1515: 
        !          1516: DEFUN (no_ipv6_route_ifname_flags_pref,
        !          1517:        no_ipv6_route_ifname_flags_pref_cmd,
        !          1518:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
        !          1519:        NO_STR
        !          1520:        IP_STR
        !          1521:        "Establish static routes\n"
        !          1522:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
        !          1523:        "IPv6 gateway address\n"
        !          1524:        "IPv6 gateway interface name\n"
        !          1525:        "Emit an ICMP unreachable when matched\n"
        !          1526:        "Silently discard pkts when matched\n"
        !          1527:        "Distance value for this prefix\n")
        !          1528: {
        !          1529:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4]);
        !          1530: }
        !          1531: 
        !          1532: /* New RIB.  Detailed information for IPv6 route. */
        !          1533: static void
        !          1534: vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn)
        !          1535: {
        !          1536:   struct rib *rib;
        !          1537:   struct nexthop *nexthop;
        !          1538:   char buf[BUFSIZ];
        !          1539: 
        !          1540:   for (rib = rn->info; rib; rib = rib->next)
        !          1541:     {
        !          1542:       vty_out (vty, "Routing entry for %s/%d%s", 
        !          1543:               inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
        !          1544:               rn->p.prefixlen,
        !          1545:               VTY_NEWLINE);
        !          1546:       vty_out (vty, "  Known via \"%s\"", zebra_route_string (rib->type));
        !          1547:       vty_out (vty, ", distance %d, metric %d", rib->distance, rib->metric);
        !          1548:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
        !          1549:        vty_out (vty, ", best");
        !          1550:       if (rib->refcnt)
        !          1551:        vty_out (vty, ", refcnt %ld", rib->refcnt);
        !          1552:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
        !          1553:        vty_out (vty, ", blackhole");
        !          1554:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
        !          1555:        vty_out (vty, ", reject");
        !          1556:       vty_out (vty, "%s", VTY_NEWLINE);
        !          1557: 
        !          1558: #define ONE_DAY_SECOND 60*60*24
        !          1559: #define ONE_WEEK_SECOND 60*60*24*7
        !          1560:       if (rib->type == ZEBRA_ROUTE_RIPNG
        !          1561:          || rib->type == ZEBRA_ROUTE_OSPF6
        !          1562:          || rib->type == ZEBRA_ROUTE_ISIS
        !          1563:          || rib->type == ZEBRA_ROUTE_BGP)
        !          1564:        {
        !          1565:          time_t uptime;
        !          1566:          struct tm *tm;
        !          1567: 
        !          1568:          uptime = time (NULL);
        !          1569:          uptime -= rib->uptime;
        !          1570:          tm = gmtime (&uptime);
        !          1571: 
        !          1572:          vty_out (vty, "  Last update ");
        !          1573: 
        !          1574:          if (uptime < ONE_DAY_SECOND)
        !          1575:            vty_out (vty,  "%02d:%02d:%02d", 
        !          1576:                     tm->tm_hour, tm->tm_min, tm->tm_sec);
        !          1577:          else if (uptime < ONE_WEEK_SECOND)
        !          1578:            vty_out (vty, "%dd%02dh%02dm", 
        !          1579:                     tm->tm_yday, tm->tm_hour, tm->tm_min);
        !          1580:          else
        !          1581:            vty_out (vty, "%02dw%dd%02dh", 
        !          1582:                     tm->tm_yday/7,
        !          1583:                     tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
        !          1584:          vty_out (vty, " ago%s", VTY_NEWLINE);
        !          1585:        }
        !          1586: 
        !          1587:       for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
        !          1588:        {
        !          1589:          vty_out (vty, "  %c",
        !          1590:                   CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ');
        !          1591: 
        !          1592:          switch (nexthop->type)
        !          1593:            {
        !          1594:            case NEXTHOP_TYPE_IPV6:
        !          1595:            case NEXTHOP_TYPE_IPV6_IFINDEX:
        !          1596:            case NEXTHOP_TYPE_IPV6_IFNAME:
        !          1597:              vty_out (vty, " %s",
        !          1598:                       inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
        !          1599:              if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
        !          1600:                vty_out (vty, ", %s", nexthop->ifname);
        !          1601:              else if (nexthop->ifindex)
        !          1602:                vty_out (vty, ", via %s", ifindex2ifname (nexthop->ifindex));
        !          1603:              break;
        !          1604:            case NEXTHOP_TYPE_IFINDEX:
        !          1605:              vty_out (vty, " directly connected, %s",
        !          1606:                       ifindex2ifname (nexthop->ifindex));
        !          1607:              break;
        !          1608:            case NEXTHOP_TYPE_IFNAME:
        !          1609:              vty_out (vty, " directly connected, %s",
        !          1610:                       nexthop->ifname);
        !          1611:              break;
        !          1612:            default:
        !          1613:              break;
        !          1614:            }
        !          1615:          if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
        !          1616:            vty_out (vty, " inactive");
        !          1617: 
        !          1618:          if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
        !          1619:            {
        !          1620:              vty_out (vty, " (recursive");
        !          1621:                
        !          1622:              switch (nexthop->rtype)
        !          1623:                {
        !          1624:                case NEXTHOP_TYPE_IPV6:
        !          1625:                case NEXTHOP_TYPE_IPV6_IFINDEX:
        !          1626:                case NEXTHOP_TYPE_IPV6_IFNAME:
        !          1627:                  vty_out (vty, " via %s)",
        !          1628:                           inet_ntop (AF_INET6, &nexthop->rgate.ipv6,
        !          1629:                                      buf, BUFSIZ));
        !          1630:                  if (nexthop->rifindex)
        !          1631:                    vty_out (vty, ", %s", ifindex2ifname (nexthop->rifindex));
        !          1632:                  break;
        !          1633:                case NEXTHOP_TYPE_IFINDEX:
        !          1634:                case NEXTHOP_TYPE_IFNAME:
        !          1635:                  vty_out (vty, " is directly connected, %s)",
        !          1636:                           ifindex2ifname (nexthop->rifindex));
        !          1637:                  break;
        !          1638:                default:
        !          1639:                  break;
        !          1640:                }
        !          1641:            }
        !          1642:          vty_out (vty, "%s", VTY_NEWLINE);
        !          1643:        }
        !          1644:       vty_out (vty, "%s", VTY_NEWLINE);
        !          1645:     }
        !          1646: }
        !          1647: 
        !          1648: static void
        !          1649: vty_show_ipv6_route (struct vty *vty, struct route_node *rn,
        !          1650:                     struct rib *rib)
        !          1651: {
        !          1652:   struct nexthop *nexthop;
        !          1653:   int len = 0;
        !          1654:   char buf[BUFSIZ];
        !          1655: 
        !          1656:   /* Nexthop information. */
        !          1657:   for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
        !          1658:     {
        !          1659:       if (nexthop == rib->nexthop)
        !          1660:        {
        !          1661:          /* Prefix information. */
        !          1662:          len = vty_out (vty, "%c%c%c %s/%d",
        !          1663:                         zebra_route_char (rib->type),
        !          1664:                         CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
        !          1665:                         ? '>' : ' ',
        !          1666:                         CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
        !          1667:                         ? '*' : ' ',
        !          1668:                         inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
        !          1669:                         rn->p.prefixlen);
        !          1670: 
        !          1671:          /* Distance and metric display. */
        !          1672:          if (rib->type != ZEBRA_ROUTE_CONNECT 
        !          1673:              && rib->type != ZEBRA_ROUTE_KERNEL)
        !          1674:            len += vty_out (vty, " [%d/%d]", rib->distance,
        !          1675:                            rib->metric);
        !          1676:        }
        !          1677:       else
        !          1678:        vty_out (vty, "  %c%*c",
        !          1679:                 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
        !          1680:                 ? '*' : ' ',
        !          1681:                 len - 3, ' ');
        !          1682: 
        !          1683:       switch (nexthop->type)
        !          1684:        {
        !          1685:        case NEXTHOP_TYPE_IPV6:
        !          1686:        case NEXTHOP_TYPE_IPV6_IFINDEX:
        !          1687:        case NEXTHOP_TYPE_IPV6_IFNAME:
        !          1688:          vty_out (vty, " via %s",
        !          1689:                   inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
        !          1690:          if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
        !          1691:            vty_out (vty, ", %s", nexthop->ifname);
        !          1692:          else if (nexthop->ifindex)
        !          1693:            vty_out (vty, ", %s", ifindex2ifname (nexthop->ifindex));
        !          1694:          break;
        !          1695:        case NEXTHOP_TYPE_IFINDEX:
        !          1696:          vty_out (vty, " is directly connected, %s",
        !          1697:                   ifindex2ifname (nexthop->ifindex));
        !          1698:          break;
        !          1699:        case NEXTHOP_TYPE_IFNAME:
        !          1700:          vty_out (vty, " is directly connected, %s",
        !          1701:                   nexthop->ifname);
        !          1702:          break;
        !          1703:        default:
        !          1704:          break;
        !          1705:        }
        !          1706:       if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
        !          1707:        vty_out (vty, " inactive");
        !          1708: 
        !          1709:       if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
        !          1710:        {
        !          1711:          vty_out (vty, " (recursive");
        !          1712:                
        !          1713:          switch (nexthop->rtype)
        !          1714:            {
        !          1715:            case NEXTHOP_TYPE_IPV6:
        !          1716:            case NEXTHOP_TYPE_IPV6_IFINDEX:
        !          1717:            case NEXTHOP_TYPE_IPV6_IFNAME:
        !          1718:              vty_out (vty, " via %s)",
        !          1719:                       inet_ntop (AF_INET6, &nexthop->rgate.ipv6,
        !          1720:                                  buf, BUFSIZ));
        !          1721:              if (nexthop->rifindex)
        !          1722:                vty_out (vty, ", %s", ifindex2ifname (nexthop->rifindex));
        !          1723:              break;
        !          1724:            case NEXTHOP_TYPE_IFINDEX:
        !          1725:            case NEXTHOP_TYPE_IFNAME:
        !          1726:              vty_out (vty, " is directly connected, %s)",
        !          1727:                       ifindex2ifname (nexthop->rifindex));
        !          1728:              break;
        !          1729:            default:
        !          1730:              break;
        !          1731:            }
        !          1732:        }
        !          1733: 
        !          1734:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
        !          1735:        vty_out (vty, ", bh");
        !          1736:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
        !          1737:        vty_out (vty, ", rej");
        !          1738:       
        !          1739:       if (rib->type == ZEBRA_ROUTE_RIPNG
        !          1740:          || rib->type == ZEBRA_ROUTE_OSPF6
        !          1741:          || rib->type == ZEBRA_ROUTE_ISIS
        !          1742:          || rib->type == ZEBRA_ROUTE_BGP)
        !          1743:        {
        !          1744:          time_t uptime;
        !          1745:          struct tm *tm;
        !          1746: 
        !          1747:          uptime = time (NULL);
        !          1748:          uptime -= rib->uptime;
        !          1749:          tm = gmtime (&uptime);
        !          1750: 
        !          1751: #define ONE_DAY_SECOND 60*60*24
        !          1752: #define ONE_WEEK_SECOND 60*60*24*7
        !          1753: 
        !          1754:          if (uptime < ONE_DAY_SECOND)
        !          1755:            vty_out (vty,  ", %02d:%02d:%02d", 
        !          1756:                     tm->tm_hour, tm->tm_min, tm->tm_sec);
        !          1757:          else if (uptime < ONE_WEEK_SECOND)
        !          1758:            vty_out (vty, ", %dd%02dh%02dm", 
        !          1759:                     tm->tm_yday, tm->tm_hour, tm->tm_min);
        !          1760:          else
        !          1761:            vty_out (vty, ", %02dw%dd%02dh", 
        !          1762:                     tm->tm_yday/7,
        !          1763:                     tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
        !          1764:        }
        !          1765:       vty_out (vty, "%s", VTY_NEWLINE);
        !          1766:     }
        !          1767: }
        !          1768: 
        !          1769: #define SHOW_ROUTE_V6_HEADER "Codes: K - kernel route, C - connected, S - static, R - RIPng, O - OSPFv3,%s       I - ISIS, B - BGP, * - FIB route.%s%s"
        !          1770: 
        !          1771: DEFUN (show_ipv6_route,
        !          1772:        show_ipv6_route_cmd,
        !          1773:        "show ipv6 route",
        !          1774:        SHOW_STR
        !          1775:        IP_STR
        !          1776:        "IPv6 routing table\n")
        !          1777: {
        !          1778:   struct route_table *table;
        !          1779:   struct route_node *rn;
        !          1780:   struct rib *rib;
        !          1781:   int first = 1;
        !          1782: 
        !          1783:   table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
        !          1784:   if (! table)
        !          1785:     return CMD_SUCCESS;
        !          1786: 
        !          1787:   /* Show all IPv6 route. */
        !          1788:   for (rn = route_top (table); rn; rn = route_next (rn))
        !          1789:     for (rib = rn->info; rib; rib = rib->next)
        !          1790:       {
        !          1791:        if (first)
        !          1792:          {
        !          1793:            vty_out (vty, SHOW_ROUTE_V6_HEADER, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
        !          1794:            first = 0;
        !          1795:          }
        !          1796:        vty_show_ipv6_route (vty, rn, rib);
        !          1797:       }
        !          1798:   return CMD_SUCCESS;
        !          1799: }
        !          1800: 
        !          1801: DEFUN (show_ipv6_route_prefix_longer,
        !          1802:        show_ipv6_route_prefix_longer_cmd,
        !          1803:        "show ipv6 route X:X::X:X/M longer-prefixes",
        !          1804:        SHOW_STR
        !          1805:        IP_STR
        !          1806:        "IPv6 routing table\n"
        !          1807:        "IPv6 prefix\n"
        !          1808:        "Show route matching the specified Network/Mask pair only\n")
        !          1809: {
        !          1810:   struct route_table *table;
        !          1811:   struct route_node *rn;
        !          1812:   struct rib *rib;
        !          1813:   struct prefix p;
        !          1814:   int ret;
        !          1815:   int first = 1;
        !          1816: 
        !          1817:   table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
        !          1818:   if (! table)
        !          1819:     return CMD_SUCCESS;
        !          1820: 
        !          1821:   ret = str2prefix (argv[0], &p);
        !          1822:   if (! ret)
        !          1823:     {
        !          1824:       vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
        !          1825:       return CMD_WARNING;
        !          1826:     }
        !          1827: 
        !          1828:   /* Show matched type IPv6 routes. */
        !          1829:   for (rn = route_top (table); rn; rn = route_next (rn))
        !          1830:     for (rib = rn->info; rib; rib = rib->next)
        !          1831:       if (prefix_match (&p, &rn->p))
        !          1832:        {
        !          1833:          if (first)
        !          1834:            {
        !          1835:              vty_out (vty, SHOW_ROUTE_V6_HEADER, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
        !          1836:              first = 0;
        !          1837:            }
        !          1838:          vty_show_ipv6_route (vty, rn, rib);
        !          1839:        }
        !          1840:   return CMD_SUCCESS;
        !          1841: }
        !          1842: 
        !          1843: DEFUN (show_ipv6_route_protocol,
        !          1844:        show_ipv6_route_protocol_cmd,
        !          1845:        "show ipv6 route (bgp|connected|isis|kernel|ospf6|ripng|static)",
        !          1846:        SHOW_STR
        !          1847:        IP_STR
        !          1848:        "IP routing table\n"
        !          1849:        "Border Gateway Protocol (BGP)\n"
        !          1850:        "Connected\n"
        !          1851:        "ISO IS-IS (ISIS)\n"
        !          1852:        "Kernel\n"
        !          1853:        "Open Shortest Path First (OSPFv3)\n"
        !          1854:        "Routing Information Protocol (RIPng)\n"
        !          1855:        "Static routes\n")
        !          1856: {
        !          1857:   int type;
        !          1858:   struct route_table *table;
        !          1859:   struct route_node *rn;
        !          1860:   struct rib *rib;
        !          1861:   int first = 1;
        !          1862: 
        !          1863:   if (strncmp (argv[0], "b", 1) == 0)
        !          1864:     type = ZEBRA_ROUTE_BGP;
        !          1865:   else if (strncmp (argv[0], "c", 1) == 0)
        !          1866:     type = ZEBRA_ROUTE_CONNECT;
        !          1867:   else if (strncmp (argv[0], "k", 1) ==0)
        !          1868:     type = ZEBRA_ROUTE_KERNEL;
        !          1869:   else if (strncmp (argv[0], "o", 1) == 0)
        !          1870:     type = ZEBRA_ROUTE_OSPF6;
        !          1871:   else if (strncmp (argv[0], "i", 1) == 0)
        !          1872:     type = ZEBRA_ROUTE_ISIS;
        !          1873:   else if (strncmp (argv[0], "r", 1) == 0)
        !          1874:     type = ZEBRA_ROUTE_RIPNG;
        !          1875:   else if (strncmp (argv[0], "s", 1) == 0)
        !          1876:     type = ZEBRA_ROUTE_STATIC;
        !          1877:   else 
        !          1878:     {
        !          1879:       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
        !          1880:       return CMD_WARNING;
        !          1881:     }
        !          1882:   
        !          1883:   table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
        !          1884:   if (! table)
        !          1885:     return CMD_SUCCESS;
        !          1886: 
        !          1887:   /* Show matched type IPv6 routes. */
        !          1888:   for (rn = route_top (table); rn; rn = route_next (rn))
        !          1889:     for (rib = rn->info; rib; rib = rib->next)
        !          1890:       if (rib->type == type)
        !          1891:        {
        !          1892:          if (first)
        !          1893:            {
        !          1894:              vty_out (vty, SHOW_ROUTE_V6_HEADER, VTY_NEWLINE, VTY_NEWLINE, VTY_NEWLINE);
        !          1895:              first = 0;
        !          1896:            }
        !          1897:          vty_show_ipv6_route (vty, rn, rib);
        !          1898:        }
        !          1899:   return CMD_SUCCESS;
        !          1900: }
        !          1901: 
        !          1902: DEFUN (show_ipv6_route_addr,
        !          1903:        show_ipv6_route_addr_cmd,
        !          1904:        "show ipv6 route X:X::X:X",
        !          1905:        SHOW_STR
        !          1906:        IP_STR
        !          1907:        "IPv6 routing table\n"
        !          1908:        "IPv6 Address\n")
        !          1909: {
        !          1910:   int ret;
        !          1911:   struct prefix_ipv6 p;
        !          1912:   struct route_table *table;
        !          1913:   struct route_node *rn;
        !          1914: 
        !          1915:   ret = str2prefix_ipv6 (argv[0], &p);
        !          1916:   if (ret <= 0)
        !          1917:     {
        !          1918:       vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
        !          1919:       return CMD_WARNING;
        !          1920:     }
        !          1921: 
        !          1922:   table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
        !          1923:   if (! table)
        !          1924:     return CMD_SUCCESS;
        !          1925: 
        !          1926:   rn = route_node_match (table, (struct prefix *) &p);
        !          1927:   if (! rn)
        !          1928:     {
        !          1929:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
        !          1930:       return CMD_WARNING;
        !          1931:     }
        !          1932: 
        !          1933:   vty_show_ipv6_route_detail (vty, rn);
        !          1934: 
        !          1935:   route_unlock_node (rn);
        !          1936: 
        !          1937:   return CMD_SUCCESS;
        !          1938: }
        !          1939: 
        !          1940: DEFUN (show_ipv6_route_prefix,
        !          1941:        show_ipv6_route_prefix_cmd,
        !          1942:        "show ipv6 route X:X::X:X/M",
        !          1943:        SHOW_STR
        !          1944:        IP_STR
        !          1945:        "IPv6 routing table\n"
        !          1946:        "IPv6 prefix\n")
        !          1947: {
        !          1948:   int ret;
        !          1949:   struct prefix_ipv6 p;
        !          1950:   struct route_table *table;
        !          1951:   struct route_node *rn;
        !          1952: 
        !          1953:   ret = str2prefix_ipv6 (argv[0], &p);
        !          1954:   if (ret <= 0)
        !          1955:     {
        !          1956:       vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
        !          1957:       return CMD_WARNING;
        !          1958:     }
        !          1959: 
        !          1960:   table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
        !          1961:   if (! table)
        !          1962:     return CMD_SUCCESS;
        !          1963: 
        !          1964:   rn = route_node_match (table, (struct prefix *) &p);
        !          1965:   if (! rn || rn->p.prefixlen != p.prefixlen)
        !          1966:     {
        !          1967:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
        !          1968:       return CMD_WARNING;
        !          1969:     }
        !          1970: 
        !          1971:   vty_show_ipv6_route_detail (vty, rn);
        !          1972: 
        !          1973:   route_unlock_node (rn);
        !          1974: 
        !          1975:   return CMD_SUCCESS;
        !          1976: }
        !          1977: 
        !          1978: /* Show route summary.  */
        !          1979: DEFUN (show_ipv6_route_summary,
        !          1980:        show_ipv6_route_summary_cmd,
        !          1981:        "show ipv6 route summary",
        !          1982:        SHOW_STR
        !          1983:        IP_STR
        !          1984:        "IPv6 routing table\n"
        !          1985:        "Summary of all IPv6 routes\n")
        !          1986: {
        !          1987:   struct route_table *table;
        !          1988: 
        !          1989:   table = vrf_table (AFI_IP6, SAFI_UNICAST, 0);
        !          1990:   if (! table)
        !          1991:     return CMD_SUCCESS;
        !          1992: 
        !          1993:   vty_show_ip_route_summary (vty, table);
        !          1994: 
        !          1995:   return CMD_SUCCESS;
        !          1996: }
        !          1997: 
        !          1998: /* Write IPv6 static route configuration. */
        !          1999: static int
        !          2000: static_config_ipv6 (struct vty *vty)
        !          2001: {
        !          2002:   struct route_node *rn;
        !          2003:   struct static_ipv6 *si;  
        !          2004:   int write;
        !          2005:   char buf[BUFSIZ];
        !          2006:   struct route_table *stable;
        !          2007: 
        !          2008:   write = 0;
        !          2009: 
        !          2010:   /* Lookup table.  */
        !          2011:   stable = vrf_static_table (AFI_IP6, SAFI_UNICAST, 0);
        !          2012:   if (! stable)
        !          2013:     return -1;
        !          2014: 
        !          2015:   for (rn = route_top (stable); rn; rn = route_next (rn))
        !          2016:     for (si = rn->info; si; si = si->next)
        !          2017:       {
        !          2018:        vty_out (vty, "ipv6 route %s/%d",
        !          2019:                 inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
        !          2020:                 rn->p.prefixlen);
        !          2021: 
        !          2022:        switch (si->type)
        !          2023:          {
        !          2024:          case STATIC_IPV6_GATEWAY:
        !          2025:            vty_out (vty, " %s", inet_ntop (AF_INET6, &si->ipv6, buf, BUFSIZ));
        !          2026:            break;
        !          2027:          case STATIC_IPV6_IFNAME:
        !          2028:            vty_out (vty, " %s", si->ifname);
        !          2029:            break;
        !          2030:          case STATIC_IPV6_GATEWAY_IFNAME:
        !          2031:            vty_out (vty, " %s %s",
        !          2032:                     inet_ntop (AF_INET6, &si->ipv6, buf, BUFSIZ), si->ifname);
        !          2033:            break;
        !          2034:          }
        !          2035: 
        !          2036:        if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
        !          2037:                vty_out (vty, " %s", "reject");
        !          2038: 
        !          2039:        if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
        !          2040:                vty_out (vty, " %s", "blackhole");
        !          2041: 
        !          2042:        if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
        !          2043:          vty_out (vty, " %d", si->distance);
        !          2044:        vty_out (vty, "%s", VTY_NEWLINE);
        !          2045: 
        !          2046:        write = 1;
        !          2047:       }
        !          2048:   return write;
        !          2049: }
        !          2050: #endif /* HAVE_IPV6 */
        !          2051: 
        !          2052: /* Static ip route configuration write function. */
        !          2053: static int
        !          2054: zebra_ip_config (struct vty *vty)
        !          2055: {
        !          2056:   int write = 0;
        !          2057: 
        !          2058:   write += static_config_ipv4 (vty);
        !          2059: #ifdef HAVE_IPV6
        !          2060:   write += static_config_ipv6 (vty);
        !          2061: #endif /* HAVE_IPV6 */
        !          2062: 
        !          2063:   return write;
        !          2064: }
        !          2065: 
        !          2066: /* ip protocol configuration write function */
        !          2067: static int config_write_protocol(struct vty *vty)
        !          2068: {  
        !          2069:   int i;
        !          2070: 
        !          2071:   for (i=0;i<ZEBRA_ROUTE_MAX;i++)
        !          2072:     {
        !          2073:       if (proto_rm[AFI_IP][i])
        !          2074:         vty_out (vty, "ip protocol %s route-map %s%s", zebra_route_string(i),
        !          2075:                  proto_rm[AFI_IP][i], VTY_NEWLINE);
        !          2076:     }
        !          2077:   if (proto_rm[AFI_IP][ZEBRA_ROUTE_MAX])
        !          2078:       vty_out (vty, "ip protocol %s route-map %s%s", "any",
        !          2079:                proto_rm[AFI_IP][ZEBRA_ROUTE_MAX], VTY_NEWLINE);
        !          2080: 
        !          2081:   return 1;
        !          2082: }   
        !          2083: 
        !          2084: /* table node for protocol filtering */
        !          2085: static struct cmd_node protocol_node = { PROTOCOL_NODE, "", 1 };
        !          2086: 
        !          2087: /* IP node for static routes. */
        !          2088: static struct cmd_node ip_node = { IP_NODE,  "",  1 };
        !          2089: 
        !          2090: /* Route VTY.  */
        !          2091: void
        !          2092: zebra_vty_init (void)
        !          2093: {
        !          2094:   install_node (&ip_node, zebra_ip_config);
        !          2095:   install_node (&protocol_node, config_write_protocol);
        !          2096: 
        !          2097:   install_element (CONFIG_NODE, &ip_protocol_cmd);
        !          2098:   install_element (CONFIG_NODE, &no_ip_protocol_cmd);
        !          2099:   install_element (VIEW_NODE, &show_ip_protocol_cmd);
        !          2100:   install_element (ENABLE_NODE, &show_ip_protocol_cmd);
        !          2101:   install_element (CONFIG_NODE, &ip_route_cmd);
        !          2102:   install_element (CONFIG_NODE, &ip_route_flags_cmd);
        !          2103:   install_element (CONFIG_NODE, &ip_route_flags2_cmd);
        !          2104:   install_element (CONFIG_NODE, &ip_route_mask_cmd);
        !          2105:   install_element (CONFIG_NODE, &ip_route_mask_flags_cmd);
        !          2106:   install_element (CONFIG_NODE, &ip_route_mask_flags2_cmd);
        !          2107:   install_element (CONFIG_NODE, &no_ip_route_cmd);
        !          2108:   install_element (CONFIG_NODE, &no_ip_route_flags_cmd);
        !          2109:   install_element (CONFIG_NODE, &no_ip_route_flags2_cmd);
        !          2110:   install_element (CONFIG_NODE, &no_ip_route_mask_cmd);
        !          2111:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd);
        !          2112:   install_element (CONFIG_NODE, &no_ip_route_mask_flags2_cmd);
        !          2113:   install_element (CONFIG_NODE, &ip_route_distance_cmd);
        !          2114:   install_element (CONFIG_NODE, &ip_route_flags_distance_cmd);
        !          2115:   install_element (CONFIG_NODE, &ip_route_flags_distance2_cmd);
        !          2116:   install_element (CONFIG_NODE, &ip_route_mask_distance_cmd);
        !          2117:   install_element (CONFIG_NODE, &ip_route_mask_flags_distance_cmd);
        !          2118:   install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_cmd);
        !          2119:   install_element (CONFIG_NODE, &no_ip_route_distance_cmd);
        !          2120:   install_element (CONFIG_NODE, &no_ip_route_flags_distance_cmd);
        !          2121:   install_element (CONFIG_NODE, &no_ip_route_flags_distance2_cmd);
        !          2122:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_cmd);
        !          2123:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_cmd);
        !          2124: 
        !          2125:   install_element (VIEW_NODE, &show_ip_route_cmd);
        !          2126:   install_element (VIEW_NODE, &show_ip_route_addr_cmd);
        !          2127:   install_element (VIEW_NODE, &show_ip_route_prefix_cmd);
        !          2128:   install_element (VIEW_NODE, &show_ip_route_prefix_longer_cmd);
        !          2129:   install_element (VIEW_NODE, &show_ip_route_protocol_cmd);
        !          2130:   install_element (VIEW_NODE, &show_ip_route_supernets_cmd);
        !          2131:   install_element (VIEW_NODE, &show_ip_route_summary_cmd);
        !          2132:   install_element (ENABLE_NODE, &show_ip_route_cmd);
        !          2133:   install_element (ENABLE_NODE, &show_ip_route_addr_cmd);
        !          2134:   install_element (ENABLE_NODE, &show_ip_route_prefix_cmd);
        !          2135:   install_element (ENABLE_NODE, &show_ip_route_prefix_longer_cmd);
        !          2136:   install_element (ENABLE_NODE, &show_ip_route_protocol_cmd);
        !          2137:   install_element (ENABLE_NODE, &show_ip_route_supernets_cmd);
        !          2138:   install_element (ENABLE_NODE, &show_ip_route_summary_cmd);
        !          2139: 
        !          2140: #ifdef HAVE_IPV6
        !          2141:   install_element (CONFIG_NODE, &ipv6_route_cmd);
        !          2142:   install_element (CONFIG_NODE, &ipv6_route_flags_cmd);
        !          2143:   install_element (CONFIG_NODE, &ipv6_route_ifname_cmd);
        !          2144:   install_element (CONFIG_NODE, &ipv6_route_ifname_flags_cmd);
        !          2145:   install_element (CONFIG_NODE, &no_ipv6_route_cmd);
        !          2146:   install_element (CONFIG_NODE, &no_ipv6_route_flags_cmd);
        !          2147:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_cmd);
        !          2148:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd);
        !          2149:   install_element (CONFIG_NODE, &ipv6_route_pref_cmd);
        !          2150:   install_element (CONFIG_NODE, &ipv6_route_flags_pref_cmd);
        !          2151:   install_element (CONFIG_NODE, &ipv6_route_ifname_pref_cmd);
        !          2152:   install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_cmd);
        !          2153:   install_element (CONFIG_NODE, &no_ipv6_route_pref_cmd);
        !          2154:   install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_cmd);
        !          2155:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_cmd);
        !          2156:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_cmd);
        !          2157:   install_element (VIEW_NODE, &show_ipv6_route_cmd);
        !          2158:   install_element (VIEW_NODE, &show_ipv6_route_summary_cmd);
        !          2159:   install_element (VIEW_NODE, &show_ipv6_route_protocol_cmd);
        !          2160:   install_element (VIEW_NODE, &show_ipv6_route_addr_cmd);
        !          2161:   install_element (VIEW_NODE, &show_ipv6_route_prefix_cmd);
        !          2162:   install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_cmd);
        !          2163:   install_element (ENABLE_NODE, &show_ipv6_route_cmd);
        !          2164:   install_element (ENABLE_NODE, &show_ipv6_route_protocol_cmd);
        !          2165:   install_element (ENABLE_NODE, &show_ipv6_route_addr_cmd);
        !          2166:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_cmd);
        !          2167:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_cmd);
        !          2168:   install_element (ENABLE_NODE, &show_ipv6_route_summary_cmd);
        !          2169: #endif /* HAVE_IPV6 */
        !          2170: }

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