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

    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>