File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / zebra / zebra_vty.c
Revision 1.1.1.4 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Nov 2 10:09:10 2016 UTC (7 years, 8 months ago) by misho
Branches: quagga, MAIN
CVS tags: v1_0_20160315, HEAD
quagga 1.0.20160315

    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: #include "vrf.h"
   31: 
   32: #include "zebra/zserv.h"
   33: 
   34: static int do_show_ip_route(struct vty *vty, safi_t safi, vrf_id_t vrf_id);
   35: static void vty_show_ip_route_detail (struct vty *vty, struct route_node *rn,
   36:                                       int mcast);
   37: static void vty_show_ip_route (struct vty *vty, struct route_node *rn,
   38:                                struct rib *rib);
   39: 
   40: /* General function for static route. */
   41: static int
   42: zebra_static_ipv4_safi (struct vty *vty, safi_t safi, int add_cmd,
   43: 			const char *dest_str, const char *mask_str,
   44: 			const char *gate_str, const char *flag_str,
   45: 			const char *distance_str, const char *vrf_id_str)
   46: {
   47:   int ret;
   48:   u_char distance;
   49:   struct prefix p;
   50:   struct in_addr gate;
   51:   struct in_addr mask;
   52:   const char *ifname;
   53:   u_char flag = 0;
   54:   vrf_id_t vrf_id = VRF_DEFAULT;
   55:   
   56:   ret = str2prefix (dest_str, &p);
   57:   if (ret <= 0)
   58:     {
   59:       vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
   60:       return CMD_WARNING;
   61:     }
   62: 
   63:   /* Cisco like mask notation. */
   64:   if (mask_str)
   65:     {
   66:       ret = inet_aton (mask_str, &mask);
   67:       if (ret == 0)
   68:         {
   69:           vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
   70:           return CMD_WARNING;
   71:         }
   72:       p.prefixlen = ip_masklen (mask);
   73:     }
   74: 
   75:   /* Apply mask for given prefix. */
   76:   apply_mask (&p);
   77: 
   78:   /* Administrative distance. */
   79:   if (distance_str)
   80:     distance = atoi (distance_str);
   81:   else
   82:     distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
   83: 
   84:   /* VRF id */
   85:   if (vrf_id_str)
   86:     VTY_GET_INTEGER ("VRF ID", vrf_id, vrf_id_str);
   87: 
   88:   /* Null0 static route.  */
   89:   if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
   90:     {
   91:       if (flag_str)
   92:         {
   93:           vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE);
   94:           return CMD_WARNING;
   95:         }
   96:       if (add_cmd)
   97:         static_add_ipv4_safi (safi, &p, NULL, NULL, ZEBRA_FLAG_BLACKHOLE, distance, vrf_id);
   98:       else
   99:         static_delete_ipv4_safi (safi, &p, NULL, NULL, distance, vrf_id);
  100:       return CMD_SUCCESS;
  101:     }
  102: 
  103:   /* Route flags */
  104:   if (flag_str) {
  105:     switch(flag_str[0]) {
  106:       case 'r':
  107:       case 'R': /* XXX */
  108:         SET_FLAG (flag, ZEBRA_FLAG_REJECT);
  109:         break;
  110:       case 'b':
  111:       case 'B': /* XXX */
  112:         SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
  113:         break;
  114:       default:
  115:         vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
  116:         return CMD_WARNING;
  117:     }
  118:   }
  119: 
  120:   if (gate_str == NULL)
  121:   {
  122:     if (add_cmd)
  123:       static_add_ipv4_safi (safi, &p, NULL, NULL, flag, distance, vrf_id);
  124:     else
  125:       static_delete_ipv4_safi (safi, &p, NULL, NULL, distance, vrf_id);
  126: 
  127:     return CMD_SUCCESS;
  128:   }
  129:   
  130:   /* When gateway is A.B.C.D format, gate is treated as nexthop
  131:      address other case gate is treated as interface name. */
  132:   ret = inet_aton (gate_str, &gate);
  133:   if (ret)
  134:     ifname = NULL;
  135:   else
  136:     ifname = gate_str;
  137: 
  138:   if (add_cmd)
  139:     static_add_ipv4_safi (safi, &p, ifname ? NULL : &gate, ifname, flag, distance, vrf_id);
  140:   else
  141:     static_delete_ipv4_safi (safi, &p, ifname ? NULL : &gate, ifname, distance, vrf_id);
  142: 
  143:   return CMD_SUCCESS;
  144: }
  145: 
  146: static int
  147: zebra_static_ipv4 (struct vty *vty, int add_cmd, const char *dest_str,
  148: 		   const char *mask_str, const char *gate_str,
  149: 		   const char *flag_str, const char *distance_str,
  150: 		   const char *vrf_id_str)
  151: {
  152:   return zebra_static_ipv4_safi (vty, SAFI_UNICAST, add_cmd, dest_str, mask_str,
  153:                                  gate_str, flag_str, distance_str, vrf_id_str);
  154: }
  155: 
  156: /* Static unicast routes for multicast RPF lookup. */
  157: DEFUN (ip_mroute_dist,
  158:        ip_mroute_dist_cmd,
  159:        "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
  160:        IP_STR
  161:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  162:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  163:        "Nexthop address\n"
  164:        "Nexthop interface name\n"
  165:        "Distance\n")
  166: {
  167:   VTY_WARN_EXPERIMENTAL();
  168:   return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 1, argv[0], NULL, argv[1],
  169:                                 NULL, argc > 2 ? argv[2] : NULL, NULL);
  170: }
  171: 
  172: ALIAS (ip_mroute_dist,
  173:        ip_mroute_cmd,
  174:        "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
  175:        IP_STR
  176:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  177:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  178:        "Nexthop address\n"
  179:        "Nexthop interface name\n")
  180: 
  181: DEFUN (ip_mroute_dist_vrf,
  182:        ip_mroute_dist_vrf_cmd,
  183:        "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255> " VRF_CMD_STR,
  184:        IP_STR
  185:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  186:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  187:        "Nexthop address\n"
  188:        "Nexthop interface name\n"
  189:        "Distance\n"
  190:        VRF_CMD_HELP_STR)
  191: {
  192:   VTY_WARN_EXPERIMENTAL();
  193:   return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 1, argv[0], NULL, argv[1],
  194:                                 NULL, argc > 3 ? argv[2] : NULL,
  195:                                 argc > 3 ? argv[3] : argv[2]);
  196: }
  197: 
  198: ALIAS (ip_mroute_dist_vrf,
  199:        ip_mroute_vrf_cmd,
  200:        "ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) "VRF_CMD_STR,
  201:        IP_STR
  202:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  203:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  204:        "Nexthop address\n"
  205:        "Nexthop interface name\n"
  206:        VRF_CMD_HELP_STR)
  207: 
  208: DEFUN (no_ip_mroute_dist,
  209:        no_ip_mroute_dist_cmd,
  210:        "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
  211:        IP_STR
  212:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  213:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  214:        "Nexthop address\n"
  215:        "Nexthop interface name\n"
  216:        "Distance\n")
  217: {
  218:   VTY_WARN_EXPERIMENTAL();
  219:   return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 0, argv[0], NULL, argv[1],
  220:                                 NULL, argc > 2 ? argv[2] : NULL, NULL);
  221: }
  222: 
  223: ALIAS (no_ip_mroute_dist,
  224:        no_ip_mroute_cmd,
  225:        "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
  226:        NO_STR
  227:        IP_STR
  228:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  229:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  230:        "Nexthop address\n"
  231:        "Nexthop interface name\n")
  232: 
  233: DEFUN (no_ip_mroute_dist_vrf,
  234:        no_ip_mroute_dist_vrf_cmd,
  235:        "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255> " VRF_CMD_STR,
  236:        IP_STR
  237:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  238:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  239:        "Nexthop address\n"
  240:        "Nexthop interface name\n"
  241:        "Distance\n"
  242:        VRF_CMD_HELP_STR)
  243: {
  244:   VTY_WARN_EXPERIMENTAL();
  245:   return zebra_static_ipv4_safi(vty, SAFI_MULTICAST, 0, argv[0], NULL, argv[1],
  246:                                 NULL, argc > 3 ? argv[2] : NULL,
  247:                                 argc > 3 ? argv[3] : argv[2]);
  248: }
  249: 
  250: ALIAS (no_ip_mroute_dist_vrf,
  251:        no_ip_mroute_vrf_cmd,
  252:        "no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) " VRF_CMD_STR,
  253:        NO_STR
  254:        IP_STR
  255:        "Configure static unicast route into MRIB for multicast RPF lookup\n"
  256:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  257:        "Nexthop address\n"
  258:        "Nexthop interface name\n"
  259:        VRF_CMD_HELP_STR)
  260: 
  261: DEFUN (ip_multicast_mode,
  262:        ip_multicast_mode_cmd,
  263:        "ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
  264:        IP_STR
  265:        "Multicast options\n"
  266:        "RPF lookup behavior\n"
  267:        "Lookup in unicast RIB only\n"
  268:        "Lookup in multicast RIB only\n"
  269:        "Try multicast RIB first, fall back to unicast RIB\n"
  270:        "Lookup both, use entry with lower distance\n"
  271:        "Lookup both, use entry with longer prefix\n")
  272: {
  273:   VTY_WARN_EXPERIMENTAL();
  274: 
  275:   if (!strncmp (argv[0], "u", 1))
  276:     multicast_mode_ipv4_set (MCAST_URIB_ONLY);
  277:   else if (!strncmp (argv[0], "mrib-o", 6))
  278:     multicast_mode_ipv4_set (MCAST_MRIB_ONLY);
  279:   else if (!strncmp (argv[0], "mrib-t", 6))
  280:     multicast_mode_ipv4_set (MCAST_MIX_MRIB_FIRST);
  281:   else if (!strncmp (argv[0], "low", 3))
  282:     multicast_mode_ipv4_set (MCAST_MIX_DISTANCE);
  283:   else if (!strncmp (argv[0], "lon", 3))
  284:     multicast_mode_ipv4_set (MCAST_MIX_PFXLEN);
  285:   else
  286:     {
  287:       vty_out (vty, "Invalid mode specified%s", VTY_NEWLINE);
  288:       return CMD_WARNING;
  289:     }
  290: 
  291:   return CMD_SUCCESS;
  292: }
  293: 
  294: DEFUN (no_ip_multicast_mode,
  295:        no_ip_multicast_mode_cmd,
  296:        "no ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
  297:        NO_STR
  298:        IP_STR
  299:        "Multicast options\n"
  300:        "RPF lookup behavior\n"
  301:        "Lookup in unicast RIB only\n"
  302:        "Lookup in multicast RIB only\n"
  303:        "Try multicast RIB first, fall back to unicast RIB\n"
  304:        "Lookup both, use entry with lower distance\n"
  305:        "Lookup both, use entry with longer prefix\n")
  306: {
  307:   multicast_mode_ipv4_set (MCAST_NO_CONFIG);
  308:   return CMD_SUCCESS;
  309: }
  310: 
  311: ALIAS (no_ip_multicast_mode,
  312:        no_ip_multicast_mode_noarg_cmd,
  313:        "no ip multicast rpf-lookup-mode",
  314:        NO_STR
  315:        IP_STR
  316:        "Multicast options\n"
  317:        "RPF lookup behavior\n")
  318: 
  319: DEFUN (show_ip_rpf,
  320:        show_ip_rpf_cmd,
  321:        "show ip rpf",
  322:        SHOW_STR
  323:        IP_STR
  324:        "Display RPF information for multicast source\n")
  325: {
  326:   vrf_id_t vrf_id = VRF_DEFAULT;
  327: 
  328:   if (argc > 0)
  329:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
  330: 
  331:   VTY_WARN_EXPERIMENTAL();
  332:   return do_show_ip_route(vty, SAFI_MULTICAST, vrf_id);
  333: }
  334: 
  335: ALIAS (show_ip_rpf,
  336:        show_ip_rpf_vrf_cmd,
  337:        "show ip rpf " VRF_CMD_STR,
  338:        SHOW_STR
  339:        IP_STR
  340:        "Display RPF information for multicast source\n"
  341:        VRF_CMD_HELP_STR)
  342: 
  343: DEFUN (show_ip_rpf_addr,
  344:        show_ip_rpf_addr_cmd,
  345:        "show ip rpf A.B.C.D",
  346:        SHOW_STR
  347:        IP_STR
  348:        "Display RPF information for multicast source\n"
  349:        "IP multicast source address (e.g. 10.0.0.0)\n")
  350: {
  351:   struct in_addr addr;
  352:   struct route_node *rn;
  353:   struct rib *rib;
  354:   vrf_id_t vrf_id = VRF_DEFAULT;
  355:   int ret;
  356: 
  357:   if (argc > 1)
  358:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
  359: 
  360:   VTY_WARN_EXPERIMENTAL();
  361: 
  362:   ret = inet_aton (argv[0], &addr);
  363:   if (ret == 0)
  364:     {
  365:       vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
  366:       return CMD_WARNING;
  367:     }
  368: 
  369:   rib = rib_match_ipv4_multicast (addr, &rn, vrf_id);
  370: 
  371:   if (rib)
  372:     vty_show_ip_route_detail (vty, rn, 1);
  373:   else
  374:     vty_out (vty, "%% No match for RPF lookup%s", VTY_NEWLINE);
  375: 
  376:   return CMD_SUCCESS;
  377: }
  378: 
  379: ALIAS (show_ip_rpf_addr,
  380:        show_ip_rpf_addr_vrf_cmd,
  381:        "show ip rpf A.B.C.D " VRF_CMD_STR,
  382:        SHOW_STR
  383:        IP_STR
  384:        "Display RPF information for multicast source\n"
  385:        "IP multicast source address (e.g. 10.0.0.0)\n"
  386:        VRF_CMD_HELP_STR)
  387: 
  388: DEFUN (show_ip_rpf_vrf_all,
  389:        show_ip_rpf_vrf_all_cmd,
  390:        "show ip rpf " VRF_ALL_CMD_STR,
  391:        SHOW_STR
  392:        IP_STR
  393:        "Display RPF information for multicast source\n"
  394:        VRF_ALL_CMD_HELP_STR)
  395: {
  396:   struct zebra_vrf *zvrf;
  397:   struct route_table *table;
  398:   struct route_node *rn;
  399:   struct rib *rib;
  400:   vrf_iter_t iter;
  401:   int first = 1;
  402: 
  403:   VTY_WARN_EXPERIMENTAL();
  404: 
  405:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
  406:     {
  407:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
  408:           (table = zvrf->table[AFI_IP][SAFI_MULTICAST]) == NULL)
  409:         continue;
  410: 
  411:       /* Show all IPv4 routes. */
  412:       for (rn = route_top (table); rn; rn = route_next (rn))
  413:         RNODE_FOREACH_RIB (rn, rib)
  414:           {
  415:             if (first)
  416:               {
  417:                 vty_out (vty, SHOW_ROUTE_V4_HEADER);
  418:                 first = 0;
  419:               }
  420:             vty_show_ip_route (vty, rn, rib);
  421:           }
  422:     }
  423: 
  424:   return CMD_SUCCESS;
  425: }
  426: 
  427: DEFUN (show_ip_rpf_addr_vrf_all,
  428:        show_ip_rpf_addr_vrf_all_cmd,
  429:        "show ip rpf A.B.C.D " VRF_ALL_CMD_STR,
  430:        SHOW_STR
  431:        IP_STR
  432:        "Display RPF information for multicast source\n"
  433:        "IP multicast source address (e.g. 10.0.0.0)\n"
  434:        VRF_ALL_CMD_HELP_STR)
  435: {
  436:   struct in_addr addr;
  437:   struct route_node *rn;
  438:   vrf_iter_t iter;
  439:   int ret;
  440: 
  441:   VTY_WARN_EXPERIMENTAL();
  442: 
  443:   ret = inet_aton (argv[0], &addr);
  444:   if (ret == 0)
  445:     {
  446:       vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
  447:       return CMD_WARNING;
  448:     }
  449: 
  450:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
  451:     {
  452:       if (rib_match_ipv4_multicast (addr, &rn, vrf_iter2id (iter)))
  453:         vty_show_ip_route_detail (vty, rn, 1);
  454:     }
  455: 
  456:   return CMD_SUCCESS;
  457: }
  458: 
  459: /* Static route configuration.  */
  460: DEFUN (ip_route, 
  461:        ip_route_cmd,
  462:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
  463:        IP_STR
  464:        "Establish static routes\n"
  465:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  466:        "IP gateway address\n"
  467:        "IP gateway interface name\n"
  468:        "Null interface\n")
  469: {
  470:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, NULL,
  471:                             NULL);
  472: }
  473: 
  474: DEFUN (ip_route_flags,
  475:        ip_route_flags_cmd,
  476:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
  477:        IP_STR
  478:        "Establish static routes\n"
  479:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  480:        "IP gateway address\n"
  481:        "IP gateway interface name\n"
  482:        "Emit an ICMP unreachable when matched\n"
  483:        "Silently discard pkts when matched\n")
  484: {
  485:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], NULL,
  486:                             NULL);
  487: }
  488: 
  489: DEFUN (ip_route_flags2,
  490:        ip_route_flags2_cmd,
  491:        "ip route A.B.C.D/M (reject|blackhole)",
  492:        IP_STR
  493:        "Establish static routes\n"
  494:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  495:        "Emit an ICMP unreachable when matched\n"
  496:        "Silently discard pkts when matched\n")
  497: {
  498:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], NULL,
  499:                             NULL);
  500: }
  501: 
  502: /* Mask as A.B.C.D format.  */
  503: DEFUN (ip_route_mask,
  504:        ip_route_mask_cmd,
  505:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
  506:        IP_STR
  507:        "Establish static routes\n"
  508:        "IP destination prefix\n"
  509:        "IP destination prefix mask\n"
  510:        "IP gateway address\n"
  511:        "IP gateway interface name\n"
  512:        "Null interface\n")
  513: {
  514:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
  515:                             NULL);
  516: }
  517: 
  518: DEFUN (ip_route_mask_flags,
  519:        ip_route_mask_flags_cmd,
  520:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
  521:        IP_STR
  522:        "Establish static routes\n"
  523:        "IP destination prefix\n"
  524:        "IP destination prefix mask\n"
  525:        "IP gateway address\n"
  526:        "IP gateway interface name\n"
  527:        "Emit an ICMP unreachable when matched\n"
  528:        "Silently discard pkts when matched\n")
  529: {
  530:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
  531:                             NULL);
  532: }
  533: 
  534: DEFUN (ip_route_mask_flags2,
  535:        ip_route_mask_flags2_cmd,
  536:        "ip route A.B.C.D A.B.C.D (reject|blackhole)",
  537:        IP_STR
  538:        "Establish static routes\n"
  539:        "IP destination prefix\n"
  540:        "IP destination prefix mask\n"
  541:        "Emit an ICMP unreachable when matched\n"
  542:        "Silently discard pkts when matched\n")
  543: {
  544:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
  545:                             NULL);
  546: }
  547: 
  548: /* Distance option value.  */
  549: DEFUN (ip_route_distance,
  550:        ip_route_distance_cmd,
  551:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
  552:        IP_STR
  553:        "Establish static routes\n"
  554:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  555:        "IP gateway address\n"
  556:        "IP gateway interface name\n"
  557:        "Null interface\n"
  558:        "Distance value for this route\n")
  559: {
  560:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, argv[2],
  561:                             NULL);
  562: }
  563: 
  564: DEFUN (ip_route_flags_distance,
  565:        ip_route_flags_distance_cmd,
  566:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
  567:        IP_STR
  568:        "Establish static routes\n"
  569:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  570:        "IP gateway address\n"
  571:        "IP gateway interface name\n"
  572:        "Emit an ICMP unreachable when matched\n"
  573:        "Silently discard pkts when matched\n"
  574:        "Distance value for this route\n")
  575: {
  576:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], argv[3],
  577:                             NULL);
  578: }
  579: 
  580: DEFUN (ip_route_flags_distance2,
  581:        ip_route_flags_distance2_cmd,
  582:        "ip route A.B.C.D/M (reject|blackhole) <1-255>",
  583:        IP_STR
  584:        "Establish static routes\n"
  585:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  586:        "Emit an ICMP unreachable when matched\n"
  587:        "Silently discard pkts when matched\n"
  588:        "Distance value for this route\n")
  589: {
  590:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], argv[2],
  591:                             NULL);
  592: }
  593: 
  594: DEFUN (ip_route_mask_distance,
  595:        ip_route_mask_distance_cmd,
  596:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
  597:        IP_STR
  598:        "Establish static routes\n"
  599:        "IP destination prefix\n"
  600:        "IP destination prefix mask\n"
  601:        "IP gateway address\n"
  602:        "IP gateway interface name\n"
  603:        "Null interface\n"
  604:        "Distance value for this route\n")
  605: {
  606:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
  607:                             NULL);
  608: }
  609: 
  610: DEFUN (ip_route_mask_flags_distance,
  611:        ip_route_mask_flags_distance_cmd,
  612:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
  613:        IP_STR
  614:        "Establish static routes\n"
  615:        "IP destination prefix\n"
  616:        "IP destination prefix mask\n"
  617:        "IP gateway address\n"
  618:        "IP gateway interface name\n"
  619:        "Emit an ICMP unreachable when matched\n"
  620:        "Silently discard pkts when matched\n"
  621:        "Distance value for this route\n")
  622: {
  623:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
  624:                             NULL);
  625: }
  626: 
  627: DEFUN (ip_route_mask_flags_distance2,
  628:        ip_route_mask_flags_distance2_cmd,
  629:        "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
  630:        IP_STR
  631:        "Establish static routes\n"
  632:        "IP destination prefix\n"
  633:        "IP destination prefix mask\n"
  634:        "Emit an ICMP unreachable when matched\n"
  635:        "Silently discard pkts when matched\n"
  636:        "Distance value for this route\n")
  637: {
  638:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
  639:                             NULL);
  640: }
  641: 
  642: DEFUN (no_ip_route, 
  643:        no_ip_route_cmd,
  644:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
  645:        NO_STR
  646:        IP_STR
  647:        "Establish static routes\n"
  648:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  649:        "IP gateway address\n"
  650:        "IP gateway interface name\n"
  651:        "Null interface\n")
  652: {
  653:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, NULL,
  654:                             NULL);
  655: }
  656: 
  657: ALIAS (no_ip_route,
  658:        no_ip_route_flags_cmd,
  659:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
  660:        NO_STR
  661:        IP_STR
  662:        "Establish static routes\n"
  663:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  664:        "IP gateway address\n"
  665:        "IP gateway interface name\n"
  666:        "Emit an ICMP unreachable when matched\n"
  667:        "Silently discard pkts when matched\n")
  668: 
  669: DEFUN (no_ip_route_flags2,
  670:        no_ip_route_flags2_cmd,
  671:        "no ip route A.B.C.D/M (reject|blackhole)",
  672:        NO_STR
  673:        IP_STR
  674:        "Establish static routes\n"
  675:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  676:        "Emit an ICMP unreachable when matched\n"
  677:        "Silently discard pkts when matched\n")
  678: {
  679:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, NULL, NULL,
  680:                             NULL);
  681: }
  682: 
  683: DEFUN (no_ip_route_mask,
  684:        no_ip_route_mask_cmd,
  685:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
  686:        NO_STR
  687:        IP_STR
  688:        "Establish static routes\n"
  689:        "IP destination prefix\n"
  690:        "IP destination prefix mask\n"
  691:        "IP gateway address\n"
  692:        "IP gateway interface name\n"
  693:        "Null interface\n")
  694: {
  695:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
  696:                             NULL);
  697: }
  698: 
  699: ALIAS (no_ip_route_mask,
  700:        no_ip_route_mask_flags_cmd,
  701:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
  702:        NO_STR
  703:        IP_STR
  704:        "Establish static routes\n"
  705:        "IP destination prefix\n"
  706:        "IP destination prefix mask\n"
  707:        "IP gateway address\n"
  708:        "IP gateway interface name\n"
  709:        "Emit an ICMP unreachable when matched\n"
  710:        "Silently discard pkts when matched\n")
  711: 
  712: DEFUN (no_ip_route_mask_flags2,
  713:        no_ip_route_mask_flags2_cmd,
  714:        "no ip route A.B.C.D A.B.C.D (reject|blackhole)",
  715:        NO_STR
  716:        IP_STR
  717:        "Establish static routes\n"
  718:        "IP destination prefix\n"
  719:        "IP destination prefix mask\n"
  720:        "Emit an ICMP unreachable when matched\n"
  721:        "Silently discard pkts when matched\n")
  722: {
  723:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
  724:                             NULL);
  725: }
  726: 
  727: DEFUN (no_ip_route_distance,
  728:        no_ip_route_distance_cmd,
  729:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
  730:        NO_STR
  731:        IP_STR
  732:        "Establish static routes\n"
  733:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  734:        "IP gateway address\n"
  735:        "IP gateway interface name\n"
  736:        "Null interface\n"
  737:        "Distance value for this route\n")
  738: {
  739:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, argv[2],
  740:                             NULL);
  741: }
  742: 
  743: DEFUN (no_ip_route_flags_distance,
  744:        no_ip_route_flags_distance_cmd,
  745:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
  746:        NO_STR
  747:        IP_STR
  748:        "Establish static routes\n"
  749:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  750:        "IP gateway address\n"
  751:        "IP gateway interface name\n"
  752:        "Emit an ICMP unreachable when matched\n"
  753:        "Silently discard pkts when matched\n"
  754:        "Distance value for this route\n")
  755: {
  756:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], argv[2], argv[3],
  757:                             NULL);
  758: }
  759: 
  760: DEFUN (no_ip_route_flags_distance2,
  761:        no_ip_route_flags_distance2_cmd,
  762:        "no ip route A.B.C.D/M (reject|blackhole) <1-255>",
  763:        NO_STR
  764:        IP_STR
  765:        "Establish static routes\n"
  766:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  767:        "Emit an ICMP unreachable when matched\n"
  768:        "Silently discard pkts when matched\n"
  769:        "Distance value for this route\n")
  770: {
  771:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, argv[1], argv[2],
  772:                             NULL);
  773: }
  774: 
  775: DEFUN (no_ip_route_mask_distance,
  776:        no_ip_route_mask_distance_cmd,
  777:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
  778:        NO_STR
  779:        IP_STR
  780:        "Establish static routes\n"
  781:        "IP destination prefix\n"
  782:        "IP destination prefix mask\n"
  783:        "IP gateway address\n"
  784:        "IP gateway interface name\n"
  785:        "Null interface\n"
  786:        "Distance value for this route\n")
  787: {
  788:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
  789:                             NULL);
  790: }
  791: 
  792: DEFUN (no_ip_route_mask_flags_distance,
  793:        no_ip_route_mask_flags_distance_cmd,
  794:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
  795:        NO_STR
  796:        IP_STR
  797:        "Establish static routes\n"
  798:        "IP destination prefix\n"
  799:        "IP destination prefix mask\n"
  800:        "IP gateway address\n"
  801:        "IP gateway interface name\n"
  802:        "Emit an ICMP unreachable when matched\n"
  803:        "Silently discard pkts when matched\n"
  804:        "Distance value for this route\n")
  805: {
  806:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
  807:                             NULL);
  808: }
  809: 
  810: DEFUN (no_ip_route_mask_flags_distance2,
  811:        no_ip_route_mask_flags_distance2_cmd,
  812:        "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
  813:        NO_STR
  814:        IP_STR
  815:        "Establish static routes\n"
  816:        "IP destination prefix\n"
  817:        "IP destination prefix mask\n"
  818:        "Emit an ICMP unreachable when matched\n"
  819:        "Silently discard pkts when matched\n"
  820:        "Distance value for this route\n")
  821: {
  822:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
  823:                             NULL);
  824: }
  825: 
  826: DEFUN (ip_route_vrf,
  827:        ip_route_vrf_cmd,
  828:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
  829:        IP_STR
  830:        "Establish static routes\n"
  831:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  832:        "IP gateway address\n"
  833:        "IP gateway interface name\n"
  834:        "Null interface\n"
  835:        VRF_CMD_HELP_STR)
  836: {
  837:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, NULL,
  838:                             argv[2]);
  839: }
  840: 
  841: DEFUN (ip_route_flags_vrf,
  842:        ip_route_flags_vrf_cmd,
  843:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
  844:        IP_STR
  845:        "Establish static routes\n"
  846:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  847:        "IP gateway address\n"
  848:        "IP gateway interface name\n"
  849:        "Emit an ICMP unreachable when matched\n"
  850:        "Silently discard pkts when matched\n"
  851:        VRF_CMD_HELP_STR)
  852: {
  853:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], NULL,
  854:                             argv[3]);
  855: }
  856: 
  857: DEFUN (ip_route_flags2_vrf,
  858:        ip_route_flags2_vrf_cmd,
  859:        "ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
  860:        IP_STR
  861:        "Establish static routes\n"
  862:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  863:        "Emit an ICMP unreachable when matched\n"
  864:        "Silently discard pkts when matched\n"
  865:        VRF_CMD_HELP_STR)
  866: {
  867:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], NULL,
  868:                             argv[2]);
  869: }
  870: 
  871: /* Mask as A.B.C.D format.  */
  872: DEFUN (ip_route_mask_vrf,
  873:        ip_route_mask_vrf_cmd,
  874:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
  875:        IP_STR
  876:        "Establish static routes\n"
  877:        "IP destination prefix\n"
  878:        "IP destination prefix mask\n"
  879:        "IP gateway address\n"
  880:        "IP gateway interface name\n"
  881:        "Null interface\n"
  882:        VRF_CMD_HELP_STR)
  883: {
  884:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
  885:                             argv[3]);
  886: }
  887: 
  888: DEFUN (ip_route_mask_flags_vrf,
  889:        ip_route_mask_flags_vrf_cmd,
  890:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
  891:        IP_STR
  892:        "Establish static routes\n"
  893:        "IP destination prefix\n"
  894:        "IP destination prefix mask\n"
  895:        "IP gateway address\n"
  896:        "IP gateway interface name\n"
  897:        "Emit an ICMP unreachable when matched\n"
  898:        "Silently discard pkts when matched\n"
  899:        VRF_CMD_HELP_STR)
  900: {
  901:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
  902:                             argv[4]);
  903: }
  904: 
  905: DEFUN (ip_route_mask_flags2_vrf,
  906:        ip_route_mask_flags2_vrf_cmd,
  907:        "ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
  908:        IP_STR
  909:        "Establish static routes\n"
  910:        "IP destination prefix\n"
  911:        "IP destination prefix mask\n"
  912:        "Emit an ICMP unreachable when matched\n"
  913:        "Silently discard pkts when matched\n"
  914:        VRF_CMD_HELP_STR)
  915: {
  916:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
  917:                             argv[3]);
  918: }
  919: 
  920: /* Distance option value.  */
  921: DEFUN (ip_route_distance_vrf,
  922:        ip_route_distance_vrf_cmd,
  923:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
  924:        IP_STR
  925:        "Establish static routes\n"
  926:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  927:        "IP gateway address\n"
  928:        "IP gateway interface name\n"
  929:        "Null interface\n"
  930:        "Distance value for this route\n"
  931:        VRF_CMD_HELP_STR)
  932: {
  933:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], NULL, argv[2],
  934:                             argv[3]);
  935: }
  936: 
  937: DEFUN (ip_route_flags_distance_vrf,
  938:        ip_route_flags_distance_vrf_cmd,
  939:        "ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
  940:        IP_STR
  941:        "Establish static routes\n"
  942:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  943:        "IP gateway address\n"
  944:        "IP gateway interface name\n"
  945:        "Emit an ICMP unreachable when matched\n"
  946:        "Silently discard pkts when matched\n"
  947:        "Distance value for this route\n"
  948:        VRF_CMD_HELP_STR)
  949: {
  950:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, argv[1], argv[2], argv[3],
  951:                             argv[4]);
  952: }
  953: 
  954: DEFUN (ip_route_flags_distance2_vrf,
  955:        ip_route_flags_distance2_vrf_cmd,
  956:        "ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
  957:        IP_STR
  958:        "Establish static routes\n"
  959:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
  960:        "Emit an ICMP unreachable when matched\n"
  961:        "Silently discard pkts when matched\n"
  962:        "Distance value for this route\n"
  963:        VRF_CMD_HELP_STR)
  964: {
  965:   return zebra_static_ipv4 (vty, 1, argv[0], NULL, NULL, argv[1], argv[2],
  966:                             argv[3]);
  967: }
  968: 
  969: DEFUN (ip_route_mask_distance_vrf,
  970:        ip_route_mask_distance_vrf_cmd,
  971:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
  972:        IP_STR
  973:        "Establish static routes\n"
  974:        "IP destination prefix\n"
  975:        "IP destination prefix mask\n"
  976:        "IP gateway address\n"
  977:        "IP gateway interface name\n"
  978:        "Null interface\n"
  979:        "Distance value for this route\n"
  980:        VRF_CMD_HELP_STR)
  981: {
  982:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
  983:                             argv[4]);
  984: }
  985: 
  986: DEFUN (ip_route_mask_flags_distance_vrf,
  987:        ip_route_mask_flags_distance_vrf_cmd,
  988:        "ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
  989:        IP_STR
  990:        "Establish static routes\n"
  991:        "IP destination prefix\n"
  992:        "IP destination prefix mask\n"
  993:        "IP gateway address\n"
  994:        "IP gateway interface name\n"
  995:        "Emit an ICMP unreachable when matched\n"
  996:        "Silently discard pkts when matched\n"
  997:        "Distance value for this route\n"
  998:        VRF_CMD_HELP_STR)
  999: {
 1000:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
 1001:                             argv[5]);
 1002: }
 1003: 
 1004: DEFUN (ip_route_mask_flags_distance2_vrf,
 1005:        ip_route_mask_flags_distance2_vrf_cmd,
 1006:        "ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
 1007:        IP_STR
 1008:        "Establish static routes\n"
 1009:        "IP destination prefix\n"
 1010:        "IP destination prefix mask\n"
 1011:        "Emit an ICMP unreachable when matched\n"
 1012:        "Silently discard pkts when matched\n"
 1013:        "Distance value for this route\n"
 1014:        VRF_CMD_HELP_STR)
 1015: {
 1016:   return zebra_static_ipv4 (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
 1017:                             argv[4]);
 1018: }
 1019: 
 1020: DEFUN (no_ip_route_vrf,
 1021:        no_ip_route_vrf_cmd,
 1022:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
 1023:        NO_STR
 1024:        IP_STR
 1025:        "Establish static routes\n"
 1026:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
 1027:        "IP gateway address\n"
 1028:        "IP gateway interface name\n"
 1029:        "Null interface\n"
 1030:        VRF_CMD_HELP_STR)
 1031: {
 1032:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, NULL,
 1033:                             (argc > 3) ? argv[3] : argv[2]);
 1034: }
 1035: 
 1036: ALIAS (no_ip_route_vrf,
 1037:        no_ip_route_flags_vrf_cmd,
 1038:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
 1039:        NO_STR
 1040:        IP_STR
 1041:        "Establish static routes\n"
 1042:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
 1043:        "IP gateway address\n"
 1044:        "IP gateway interface name\n"
 1045:        "Emit an ICMP unreachable when matched\n"
 1046:        "Silently discard pkts when matched\n"
 1047:        VRF_CMD_HELP_STR)
 1048: 
 1049: DEFUN (no_ip_route_flags2_vrf,
 1050:        no_ip_route_flags2_vrf_cmd,
 1051:        "no ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
 1052:        NO_STR
 1053:        IP_STR
 1054:        "Establish static routes\n"
 1055:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
 1056:        "Emit an ICMP unreachable when matched\n"
 1057:        "Silently discard pkts when matched\n"
 1058:        VRF_CMD_HELP_STR)
 1059: {
 1060:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, NULL, NULL,
 1061:                             argv[2]);
 1062: }
 1063: 
 1064: DEFUN (no_ip_route_mask_vrf,
 1065:        no_ip_route_mask_vrf_cmd,
 1066:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
 1067:        NO_STR
 1068:        IP_STR
 1069:        "Establish static routes\n"
 1070:        "IP destination prefix\n"
 1071:        "IP destination prefix mask\n"
 1072:        "IP gateway address\n"
 1073:        "IP gateway interface name\n"
 1074:        "Null interface\n"
 1075:        VRF_CMD_HELP_STR)
 1076: {
 1077:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
 1078:                             (argc > 4) ? argv[4] : argv[3]);
 1079: }
 1080: 
 1081: ALIAS (no_ip_route_mask_vrf,
 1082:        no_ip_route_mask_flags_vrf_cmd,
 1083:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
 1084:        NO_STR
 1085:        IP_STR
 1086:        "Establish static routes\n"
 1087:        "IP destination prefix\n"
 1088:        "IP destination prefix mask\n"
 1089:        "IP gateway address\n"
 1090:        "IP gateway interface name\n"
 1091:        "Emit an ICMP unreachable when matched\n"
 1092:        "Silently discard pkts when matched\n"
 1093:        VRF_CMD_HELP_STR)
 1094: 
 1095: DEFUN (no_ip_route_mask_flags2_vrf,
 1096:        no_ip_route_mask_flags2_vrf_cmd,
 1097:        "no ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
 1098:        NO_STR
 1099:        IP_STR
 1100:        "Establish static routes\n"
 1101:        "IP destination prefix\n"
 1102:        "IP destination prefix mask\n"
 1103:        "Emit an ICMP unreachable when matched\n"
 1104:        "Silently discard pkts when matched\n"
 1105:        VRF_CMD_HELP_STR)
 1106: {
 1107:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
 1108:                             argv[2]);
 1109: }
 1110: 
 1111: DEFUN (no_ip_route_distance_vrf,
 1112:        no_ip_route_distance_vrf_cmd,
 1113:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
 1114:        NO_STR
 1115:        IP_STR
 1116:        "Establish static routes\n"
 1117:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
 1118:        "IP gateway address\n"
 1119:        "IP gateway interface name\n"
 1120:        "Null interface\n"
 1121:        "Distance value for this route\n"
 1122:        VRF_CMD_HELP_STR)
 1123: {
 1124:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], NULL, argv[2],
 1125:                             argv[3]);
 1126: }
 1127: 
 1128: DEFUN (no_ip_route_flags_distance_vrf,
 1129:        no_ip_route_flags_distance_vrf_cmd,
 1130:        "no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
 1131:        NO_STR
 1132:        IP_STR
 1133:        "Establish static routes\n"
 1134:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
 1135:        "IP gateway address\n"
 1136:        "IP gateway interface name\n"
 1137:        "Emit an ICMP unreachable when matched\n"
 1138:        "Silently discard pkts when matched\n"
 1139:        "Distance value for this route\n"
 1140:        VRF_CMD_HELP_STR)
 1141: {
 1142:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, argv[1], argv[2], argv[3],
 1143:                             argv[4]);
 1144: }
 1145: 
 1146: DEFUN (no_ip_route_flags_distance2_vrf,
 1147:        no_ip_route_flags_distance2_vrf_cmd,
 1148:        "no ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
 1149:        NO_STR
 1150:        IP_STR
 1151:        "Establish static routes\n"
 1152:        "IP destination prefix (e.g. 10.0.0.0/8)\n"
 1153:        "Emit an ICMP unreachable when matched\n"
 1154:        "Silently discard pkts when matched\n"
 1155:        "Distance value for this route\n"
 1156:        VRF_CMD_HELP_STR)
 1157: {
 1158:   return zebra_static_ipv4 (vty, 0, argv[0], NULL, NULL, argv[1], argv[2],
 1159:                             argv[3]);
 1160: }
 1161: 
 1162: DEFUN (no_ip_route_mask_distance_vrf,
 1163:        no_ip_route_mask_distance_vrf_cmd,
 1164:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
 1165:        NO_STR
 1166:        IP_STR
 1167:        "Establish static routes\n"
 1168:        "IP destination prefix\n"
 1169:        "IP destination prefix mask\n"
 1170:        "IP gateway address\n"
 1171:        "IP gateway interface name\n"
 1172:        "Null interface\n"
 1173:        "Distance value for this route\n"
 1174:        VRF_CMD_HELP_STR)
 1175: {
 1176:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
 1177:                             argv[4]);
 1178: }
 1179: 
 1180: DEFUN (no_ip_route_mask_flags_distance_vrf,
 1181:        no_ip_route_mask_flags_distance_vrf_cmd,
 1182:        "no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
 1183:        NO_STR
 1184:        IP_STR
 1185:        "Establish static routes\n"
 1186:        "IP destination prefix\n"
 1187:        "IP destination prefix mask\n"
 1188:        "IP gateway address\n"
 1189:        "IP gateway interface name\n"
 1190:        "Emit an ICMP unreachable when matched\n"
 1191:        "Silently discard pkts when matched\n"
 1192:        "Distance value for this route\n"
 1193:        VRF_CMD_HELP_STR)
 1194: {
 1195:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
 1196:                             argv[5]);
 1197: }
 1198: 
 1199: DEFUN (no_ip_route_mask_flags_distance2_vrf,
 1200:        no_ip_route_mask_flags_distance2_vrf_cmd,
 1201:        "no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
 1202:        NO_STR
 1203:        IP_STR
 1204:        "Establish static routes\n"
 1205:        "IP destination prefix\n"
 1206:        "IP destination prefix mask\n"
 1207:        "Emit an ICMP unreachable when matched\n"
 1208:        "Silently discard pkts when matched\n"
 1209:        "Distance value for this route\n"
 1210:        VRF_CMD_HELP_STR)
 1211: {
 1212:   return zebra_static_ipv4 (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
 1213:                             argv[4]);
 1214: }
 1215: 
 1216: char *proto_rm[AFI_MAX][ZEBRA_ROUTE_MAX+1];	/* "any" == ZEBRA_ROUTE_MAX */
 1217: 
 1218: DEFUN (ip_protocol,
 1219:        ip_protocol_cmd,
 1220:        "ip protocol PROTO route-map ROUTE-MAP",
 1221:        NO_STR
 1222:        "Apply route map to PROTO\n"
 1223:        "Protocol name\n"
 1224:        "Route map name\n")
 1225: {
 1226:   int i;
 1227: 
 1228:   if (strcasecmp(argv[0], "any") == 0)
 1229:     i = ZEBRA_ROUTE_MAX;
 1230:   else
 1231:     i = proto_name2num(argv[0]);
 1232:   if (i < 0)
 1233:     {
 1234:       vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
 1235:                VTY_NEWLINE);
 1236:       return CMD_WARNING;
 1237:     }
 1238:   if (proto_rm[AFI_IP][i])
 1239:     XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
 1240:   proto_rm[AFI_IP][i] = XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[1]);
 1241:   return CMD_SUCCESS;
 1242: }
 1243: 
 1244: DEFUN (no_ip_protocol,
 1245:        no_ip_protocol_cmd,
 1246:        "no ip protocol PROTO",
 1247:        NO_STR
 1248:        "Remove route map from PROTO\n"
 1249:        "Protocol name\n")
 1250: {
 1251:   int i;
 1252: 
 1253:   if (strcasecmp(argv[0], "any") == 0)
 1254:     i = ZEBRA_ROUTE_MAX;
 1255:   else
 1256:     i = proto_name2num(argv[0]);
 1257:   if (i < 0)
 1258:     {
 1259:       vty_out (vty, "invalid protocol name \"%s\"%s", argv[0] ? argv[0] : "",
 1260:                VTY_NEWLINE);
 1261:      return CMD_WARNING;
 1262:     }
 1263:   if (proto_rm[AFI_IP][i])
 1264:     XFREE (MTYPE_ROUTE_MAP_NAME, proto_rm[AFI_IP][i]);
 1265:   proto_rm[AFI_IP][i] = NULL;
 1266:   return CMD_SUCCESS;
 1267: }
 1268: 
 1269: /* New RIB.  Detailed information for IPv4 route. */
 1270: static void
 1271: vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast)
 1272: {
 1273:   struct rib *rib;
 1274:   struct nexthop *nexthop, *tnexthop;
 1275:   int recursing;
 1276:   char buf[PREFIX_STRLEN];
 1277: 
 1278:   RNODE_FOREACH_RIB (rn, rib)
 1279:     {
 1280:       const char *mcast_info = "";
 1281:       if (mcast)
 1282:         {
 1283:           rib_table_info_t *info = rn->table->info;
 1284:           mcast_info = (info->safi == SAFI_MULTICAST)
 1285:                        ? " using Multicast RIB"
 1286:                        : " using Unicast RIB";
 1287:         }
 1288:       vty_out (vty, "Routing entry for %s%s%s",
 1289:                prefix2str (&rn->p, buf, sizeof(buf)), mcast_info,
 1290:               VTY_NEWLINE);
 1291:       vty_out (vty, "  Known via \"%s\"", zebra_route_string (rib->type));
 1292:       vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
 1293:       if (rib->mtu)
 1294:         vty_out (vty, ", mtu %u", rib->mtu);
 1295:       vty_out (vty, ", vrf %u", rib->vrf_id);
 1296:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
 1297:         vty_out (vty, ", best");
 1298:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_FIB_OVERRIDE))
 1299:         vty_out (vty, ", fib-override");
 1300:       if (CHECK_FLAG (rib->status, RIB_ENTRY_SELECTED_FIB))
 1301:         vty_out (vty, ", fib");
 1302:       if (rib->refcnt)
 1303:         vty_out (vty, ", refcnt %ld", rib->refcnt);
 1304:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
 1305:        vty_out (vty, ", blackhole");
 1306:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
 1307:        vty_out (vty, ", reject");
 1308:       vty_out (vty, "%s", VTY_NEWLINE);
 1309: 
 1310: #define ONE_DAY_SECOND 60*60*24
 1311: #define ONE_WEEK_SECOND 60*60*24*7
 1312:       if (rib->type == ZEBRA_ROUTE_RIP
 1313:           || rib->type == ZEBRA_ROUTE_RIPNG
 1314:           || rib->type == ZEBRA_ROUTE_OSPF
 1315:           || rib->type == ZEBRA_ROUTE_OSPF6
 1316:           || rib->type == ZEBRA_ROUTE_BABEL
 1317:           || rib->type == ZEBRA_ROUTE_ISIS
 1318:           || rib->type == ZEBRA_ROUTE_BGP)
 1319: 	{
 1320: 	  time_t uptime;
 1321: 	  struct tm *tm;
 1322: 
 1323: 	  uptime = time (NULL);
 1324: 	  uptime -= rib->uptime;
 1325: 	  tm = gmtime (&uptime);
 1326: 
 1327: 	  vty_out (vty, "  Last update ");
 1328: 
 1329: 	  if (uptime < ONE_DAY_SECOND)
 1330: 	    vty_out (vty,  "%02d:%02d:%02d", 
 1331: 		     tm->tm_hour, tm->tm_min, tm->tm_sec);
 1332: 	  else if (uptime < ONE_WEEK_SECOND)
 1333: 	    vty_out (vty, "%dd%02dh%02dm", 
 1334: 		     tm->tm_yday, tm->tm_hour, tm->tm_min);
 1335: 	  else
 1336: 	    vty_out (vty, "%02dw%dd%02dh", 
 1337: 		     tm->tm_yday/7,
 1338: 		     tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
 1339: 	  vty_out (vty, " ago%s", VTY_NEWLINE);
 1340: 	}
 1341: 
 1342:       for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
 1343:         {
 1344:           vty_out (vty, "  %c%s",
 1345:                    CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
 1346:                    recursing ? "  " : "");
 1347: 
 1348:           switch (nexthop->type)
 1349:             {
 1350:             case NEXTHOP_TYPE_IPV4:
 1351:             case NEXTHOP_TYPE_IPV4_IFINDEX:
 1352:               vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4));
 1353:               if (nexthop->ifindex)
 1354:                 vty_out (vty, ", via %s",
 1355:                          ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
 1356:               break;
 1357:             case NEXTHOP_TYPE_IPV6:
 1358:             case NEXTHOP_TYPE_IPV6_IFINDEX:
 1359:             case NEXTHOP_TYPE_IPV6_IFNAME:
 1360:               vty_out (vty, " %s",
 1361:                        inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, sizeof(buf)));
 1362:               if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
 1363:                 vty_out (vty, ", %s", nexthop->ifname);
 1364:               else if (nexthop->ifindex)
 1365:                 vty_out (vty, ", via %s",
 1366:                          ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
 1367:               break;
 1368:             case NEXTHOP_TYPE_IFINDEX:
 1369:               vty_out (vty, " directly connected, %s",
 1370:                        ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
 1371:               break;
 1372:             case NEXTHOP_TYPE_IFNAME:
 1373:               vty_out (vty, " directly connected, %s", nexthop->ifname);
 1374:               break;
 1375:             case NEXTHOP_TYPE_BLACKHOLE:
 1376:               vty_out (vty, " directly connected, Null0");
 1377:               break;
 1378:             default:
 1379:               break;
 1380:             }
 1381:           if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
 1382:             vty_out (vty, " inactive");
 1383: 
 1384:           if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
 1385:             vty_out (vty, " onlink");
 1386: 
 1387:           if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
 1388:             vty_out (vty, " (recursive)");
 1389: 
 1390:           switch (nexthop->type)
 1391:             {
 1392:             case NEXTHOP_TYPE_IPV4:
 1393:             case NEXTHOP_TYPE_IPV4_IFINDEX:
 1394:             case NEXTHOP_TYPE_IPV4_IFNAME:
 1395:               if (nexthop->src.ipv4.s_addr)
 1396:                 {
 1397:                   if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
 1398:                     vty_out (vty, ", src %s", buf);
 1399:                 }
 1400:               break;
 1401: #ifdef HAVE_IPV6
 1402:             case NEXTHOP_TYPE_IPV6:
 1403:             case NEXTHOP_TYPE_IPV6_IFINDEX:
 1404:             case NEXTHOP_TYPE_IPV6_IFNAME:
 1405:               if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
 1406:                 {
 1407:                   if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
 1408:                     vty_out (vty, ", src %s", buf);
 1409:                 }
 1410:               break;
 1411: #endif /* HAVE_IPV6 */
 1412:             default:
 1413:                break;
 1414:             }
 1415:           vty_out (vty, "%s", VTY_NEWLINE);
 1416:         }
 1417:       vty_out (vty, "%s", VTY_NEWLINE);
 1418:     }
 1419: }
 1420: 
 1421: static void
 1422: vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
 1423: {
 1424:   struct nexthop *nexthop, *tnexthop;
 1425:   int recursing;
 1426:   int len = 0;
 1427:   char buf[BUFSIZ];
 1428: 
 1429:   /* Nexthop information. */
 1430:   for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
 1431:     {
 1432:       if (nexthop == rib->nexthop)
 1433: 	{
 1434: 	  /* Prefix information. */
 1435: 	  len = vty_out (vty, "%c%c%c %s",
 1436: 			 zebra_route_char (rib->type),
 1437: 			 CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
 1438: 			 ? '>' : ' ',
 1439: 			 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
 1440: 			 ? '*' : ' ',
 1441: 			 prefix2str (&rn->p, buf, sizeof buf));
 1442: 		
 1443: 	  /* Distance and metric display. */
 1444: 	  if (rib->type != ZEBRA_ROUTE_CONNECT 
 1445: 	      && rib->type != ZEBRA_ROUTE_KERNEL)
 1446: 	    len += vty_out (vty, " [%d/%d]", rib->distance,
 1447: 			    rib->metric);
 1448: 
 1449:           if (rib->vrf_id != VRF_DEFAULT)
 1450:             len += vty_out (vty, " [vrf %u]", rib->vrf_id);
 1451: 	}
 1452:       else
 1453: 	vty_out (vty, "  %c%*c",
 1454: 		 CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
 1455: 		 ? '*' : ' ',
 1456: 		 len - 3 + (2 * recursing), ' ');
 1457: 
 1458:       switch (nexthop->type)
 1459:         {
 1460:         case NEXTHOP_TYPE_IPV4:
 1461:         case NEXTHOP_TYPE_IPV4_IFINDEX:
 1462:           vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4));
 1463:           if (nexthop->ifindex)
 1464:             vty_out (vty, ", %s",
 1465:                      ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
 1466:           break;
 1467:         case NEXTHOP_TYPE_IPV6:
 1468:         case NEXTHOP_TYPE_IPV6_IFINDEX:
 1469:         case NEXTHOP_TYPE_IPV6_IFNAME:
 1470:           vty_out (vty, " via %s",
 1471:                    inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
 1472:           if (nexthop->type == NEXTHOP_TYPE_IPV6_IFNAME)
 1473:             vty_out (vty, ", %s", nexthop->ifname);
 1474:           else if (nexthop->ifindex)
 1475:             vty_out (vty, ", %s",
 1476:                      ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
 1477:           break;
 1478:         case NEXTHOP_TYPE_IFINDEX:
 1479:           vty_out (vty, " is directly connected, %s",
 1480:                    ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
 1481:           break;
 1482:         case NEXTHOP_TYPE_IFNAME:
 1483:           vty_out (vty, " is directly connected, %s", nexthop->ifname);
 1484:           break;
 1485:         case NEXTHOP_TYPE_BLACKHOLE:
 1486:           vty_out (vty, " is directly connected, Null0");
 1487:           break;
 1488:         default:
 1489:           break;
 1490:         }
 1491:       if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
 1492:         vty_out (vty, " inactive");
 1493: 
 1494:       if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
 1495:         vty_out (vty, " onlink");
 1496: 
 1497:       if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
 1498:         vty_out (vty, " (recursive)");
 1499: 
 1500:       switch (nexthop->type)
 1501:         {
 1502:           case NEXTHOP_TYPE_IPV4:
 1503:           case NEXTHOP_TYPE_IPV4_IFINDEX:
 1504:           case NEXTHOP_TYPE_IPV4_IFNAME:
 1505:             if (nexthop->src.ipv4.s_addr)
 1506:               {
 1507:                 if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
 1508:                   vty_out (vty, ", src %s", buf);
 1509:               }
 1510:             break;
 1511: #ifdef HAVE_IPV6
 1512:           case NEXTHOP_TYPE_IPV6:
 1513:           case NEXTHOP_TYPE_IPV6_IFINDEX:
 1514:           case NEXTHOP_TYPE_IPV6_IFNAME:
 1515:             if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
 1516:               {
 1517:                 if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
 1518:                   vty_out (vty, ", src %s", buf);
 1519:               }
 1520:             break;
 1521: #endif /* HAVE_IPV6 */
 1522:           default:
 1523:             break;
 1524:         }
 1525: 
 1526:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
 1527:                vty_out (vty, ", bh");
 1528:       if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
 1529:                vty_out (vty, ", rej");
 1530: 
 1531:       if (rib->type == ZEBRA_ROUTE_RIP
 1532:           || rib->type == ZEBRA_ROUTE_RIPNG
 1533:           || rib->type == ZEBRA_ROUTE_OSPF
 1534:           || rib->type == ZEBRA_ROUTE_OSPF6
 1535:           || rib->type == ZEBRA_ROUTE_BABEL
 1536:           || rib->type == ZEBRA_ROUTE_ISIS
 1537:           || rib->type == ZEBRA_ROUTE_BGP)
 1538: 	{
 1539: 	  time_t uptime;
 1540: 	  struct tm *tm;
 1541: 
 1542: 	  uptime = time (NULL);
 1543: 	  uptime -= rib->uptime;
 1544: 	  tm = gmtime (&uptime);
 1545: 
 1546: #define ONE_DAY_SECOND 60*60*24
 1547: #define ONE_WEEK_SECOND 60*60*24*7
 1548: 
 1549: 	  if (uptime < ONE_DAY_SECOND)
 1550: 	    vty_out (vty,  ", %02d:%02d:%02d", 
 1551: 		     tm->tm_hour, tm->tm_min, tm->tm_sec);
 1552: 	  else if (uptime < ONE_WEEK_SECOND)
 1553: 	    vty_out (vty, ", %dd%02dh%02dm", 
 1554: 		     tm->tm_yday, tm->tm_hour, tm->tm_min);
 1555: 	  else
 1556: 	    vty_out (vty, ", %02dw%dd%02dh", 
 1557: 		     tm->tm_yday/7,
 1558: 		     tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
 1559: 	}
 1560:       vty_out (vty, "%s", VTY_NEWLINE);
 1561:     }
 1562: }
 1563: 
 1564: DEFUN (show_ip_route,
 1565:        show_ip_route_cmd,
 1566:        "show ip route",
 1567:        SHOW_STR
 1568:        IP_STR
 1569:        "IP routing table\n")
 1570: {
 1571:   vrf_id_t vrf_id = VRF_DEFAULT;
 1572: 
 1573:   if (argc > 0)
 1574:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 1575: 
 1576:   return do_show_ip_route(vty, SAFI_UNICAST, vrf_id);
 1577: }
 1578: 
 1579: static int do_show_ip_route(struct vty *vty, safi_t safi, vrf_id_t vrf_id)
 1580: {
 1581:   struct route_table *table;
 1582:   struct route_node *rn;
 1583:   struct rib *rib;
 1584:   int first = 1;
 1585: 
 1586:   table = zebra_vrf_table (AFI_IP, safi, vrf_id);
 1587:   if (! table)
 1588:     return CMD_SUCCESS;
 1589: 
 1590:   /* Show all IPv4 routes. */
 1591:   for (rn = route_top (table); rn; rn = route_next (rn))
 1592:     RNODE_FOREACH_RIB (rn, rib)
 1593:       {
 1594: 	if (first)
 1595: 	  {
 1596: 	    vty_out (vty, SHOW_ROUTE_V4_HEADER);
 1597: 	    first = 0;
 1598: 	  }
 1599: 	vty_show_ip_route (vty, rn, rib);
 1600:       }
 1601:   return CMD_SUCCESS;
 1602: }
 1603: 
 1604: ALIAS (show_ip_route,
 1605:        show_ip_route_vrf_cmd,
 1606:        "show ip route " VRF_CMD_STR,
 1607:        SHOW_STR
 1608:        IP_STR
 1609:        "IP routing table\n"
 1610:        VRF_CMD_HELP_STR)
 1611: 
 1612: DEFUN (show_ip_route_prefix_longer,
 1613:        show_ip_route_prefix_longer_cmd,
 1614:        "show ip route A.B.C.D/M longer-prefixes",
 1615:        SHOW_STR
 1616:        IP_STR
 1617:        "IP routing table\n"
 1618:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
 1619:        "Show route matching the specified Network/Mask pair only\n")
 1620: {
 1621:   struct route_table *table;
 1622:   struct route_node *rn;
 1623:   struct rib *rib;
 1624:   struct prefix p;
 1625:   int ret;
 1626:   int first = 1;
 1627:   vrf_id_t vrf_id = VRF_DEFAULT;
 1628: 
 1629:   ret = str2prefix (argv[0], &p);
 1630:   if (! ret)
 1631:     {
 1632:       vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
 1633:       return CMD_WARNING;
 1634:     }
 1635: 
 1636:   if (argc > 1)
 1637:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 1638: 
 1639:   table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 1640:   if (! table)
 1641:     return CMD_SUCCESS;
 1642: 
 1643:   /* Show matched type IPv4 routes. */
 1644:   for (rn = route_top (table); rn; rn = route_next (rn))
 1645:     RNODE_FOREACH_RIB (rn, rib)
 1646:       if (prefix_match (&p, &rn->p))
 1647: 	{
 1648: 	  if (first)
 1649: 	    {
 1650: 	      vty_out (vty, SHOW_ROUTE_V4_HEADER);
 1651: 	      first = 0;
 1652: 	    }
 1653: 	  vty_show_ip_route (vty, rn, rib);
 1654: 	}
 1655:   return CMD_SUCCESS;
 1656: }
 1657: 
 1658: ALIAS (show_ip_route_prefix_longer,
 1659:        show_ip_route_prefix_longer_vrf_cmd,
 1660:        "show ip route A.B.C.D/M longer-prefixes " VRF_CMD_STR,
 1661:        SHOW_STR
 1662:        IP_STR
 1663:        "IP routing table\n"
 1664:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
 1665:        "Show route matching the specified Network/Mask pair only\n"
 1666:        VRF_CMD_HELP_STR)
 1667: 
 1668: DEFUN (show_ip_route_supernets,
 1669:        show_ip_route_supernets_cmd,
 1670:        "show ip route supernets-only",
 1671:        SHOW_STR
 1672:        IP_STR
 1673:        "IP routing table\n"
 1674:        "Show supernet entries only\n")
 1675: {
 1676:   struct route_table *table;
 1677:   struct route_node *rn;
 1678:   struct rib *rib;
 1679:   u_int32_t addr;
 1680:   int first = 1;
 1681:   vrf_id_t vrf_id = VRF_DEFAULT;
 1682: 
 1683:   if (argc > 0)
 1684:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 1685: 
 1686:   table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 1687:   if (! table)
 1688:     return CMD_SUCCESS;
 1689: 
 1690:   /* Show matched type IPv4 routes. */
 1691:   for (rn = route_top (table); rn; rn = route_next (rn))
 1692:     RNODE_FOREACH_RIB (rn, rib)
 1693:       {
 1694: 	addr = ntohl (rn->p.u.prefix4.s_addr);
 1695: 
 1696: 	if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
 1697: 	   || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
 1698: 	   || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
 1699: 	  {
 1700: 	    if (first)
 1701: 	      {
 1702: 		vty_out (vty, SHOW_ROUTE_V4_HEADER);
 1703: 		first = 0;
 1704: 	      }
 1705: 	    vty_show_ip_route (vty, rn, rib);
 1706: 	  }
 1707:       }
 1708:   return CMD_SUCCESS;
 1709: }
 1710: 
 1711: ALIAS (show_ip_route_supernets,
 1712:        show_ip_route_supernets_vrf_cmd,
 1713:        "show ip route supernets-only " VRF_CMD_STR,
 1714:        SHOW_STR
 1715:        IP_STR
 1716:        "IP routing table\n"
 1717:        "Show supernet entries only\n"
 1718:        VRF_CMD_HELP_STR)
 1719: 
 1720: DEFUN (show_ip_route_protocol,
 1721:        show_ip_route_protocol_cmd,
 1722:        "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA,
 1723:        SHOW_STR
 1724:        IP_STR
 1725:        "IP routing table\n"
 1726:        QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
 1727: {
 1728:   int type;
 1729:   struct route_table *table;
 1730:   struct route_node *rn;
 1731:   struct rib *rib;
 1732:   int first = 1;
 1733:   vrf_id_t vrf_id = VRF_DEFAULT;
 1734: 
 1735:   type = proto_redistnum (AFI_IP, argv[0]);
 1736:   if (type < 0)
 1737:     {
 1738:       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
 1739:       return CMD_WARNING;
 1740:     }
 1741: 
 1742:   if (argc > 1)
 1743:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 1744: 
 1745:   table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 1746:   if (! table)
 1747:     return CMD_SUCCESS;
 1748: 
 1749:   /* Show matched type IPv4 routes. */
 1750:   for (rn = route_top (table); rn; rn = route_next (rn))
 1751:     RNODE_FOREACH_RIB (rn, rib)
 1752:       if (rib->type == type)
 1753: 	{
 1754: 	  if (first)
 1755: 	    {
 1756: 	      vty_out (vty, SHOW_ROUTE_V4_HEADER);
 1757: 	      first = 0;
 1758: 	    }
 1759: 	  vty_show_ip_route (vty, rn, rib);
 1760: 	}
 1761:   return CMD_SUCCESS;
 1762: }
 1763: 
 1764: ALIAS (show_ip_route_protocol,
 1765:        show_ip_route_protocol_vrf_cmd,
 1766:        "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA " " VRF_CMD_STR,
 1767:        SHOW_STR
 1768:        IP_STR
 1769:        "IP routing table\n"
 1770:        QUAGGA_IP_REDIST_HELP_STR_ZEBRA
 1771:        VRF_CMD_HELP_STR)
 1772: 
 1773: DEFUN (show_ip_route_addr,
 1774:        show_ip_route_addr_cmd,
 1775:        "show ip route A.B.C.D",
 1776:        SHOW_STR
 1777:        IP_STR
 1778:        "IP routing table\n"
 1779:        "Network in the IP routing table to display\n")
 1780: {
 1781:   int ret;
 1782:   struct prefix_ipv4 p;
 1783:   struct route_table *table;
 1784:   struct route_node *rn;
 1785:   vrf_id_t vrf_id = VRF_DEFAULT;
 1786: 
 1787:   ret = str2prefix_ipv4 (argv[0], &p);
 1788:   if (ret <= 0)
 1789:     {
 1790:       vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
 1791:       return CMD_WARNING;
 1792:     }
 1793: 
 1794:   if (argc > 1)
 1795:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 1796: 
 1797:   table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 1798:   if (! table)
 1799:     return CMD_SUCCESS;
 1800: 
 1801:   rn = route_node_match (table, (struct prefix *) &p);
 1802:   if (! rn)
 1803:     {
 1804:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
 1805:       return CMD_WARNING;
 1806:     }
 1807: 
 1808:   vty_show_ip_route_detail (vty, rn, 0);
 1809: 
 1810:   route_unlock_node (rn);
 1811: 
 1812:   return CMD_SUCCESS;
 1813: }
 1814: 
 1815: ALIAS (show_ip_route_addr,
 1816:        show_ip_route_addr_vrf_cmd,
 1817:        "show ip route A.B.C.D " VRF_CMD_STR,
 1818:        SHOW_STR
 1819:        IP_STR
 1820:        "IP routing table\n"
 1821:        "Network in the IP routing table to display\n"
 1822:        VRF_CMD_HELP_STR)
 1823: 
 1824: DEFUN (show_ip_route_prefix,
 1825:        show_ip_route_prefix_cmd,
 1826:        "show ip route A.B.C.D/M",
 1827:        SHOW_STR
 1828:        IP_STR
 1829:        "IP routing table\n"
 1830:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
 1831: {
 1832:   int ret;
 1833:   struct prefix_ipv4 p;
 1834:   struct route_table *table;
 1835:   struct route_node *rn;
 1836:   vrf_id_t vrf_id = VRF_DEFAULT;
 1837: 
 1838:   ret = str2prefix_ipv4 (argv[0], &p);
 1839:   if (ret <= 0)
 1840:     {
 1841:       vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
 1842:       return CMD_WARNING;
 1843:     }
 1844: 
 1845:   if (argc > 1)
 1846:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 1847: 
 1848:   table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 1849:   if (! table)
 1850:     return CMD_SUCCESS;
 1851: 
 1852:   rn = route_node_match (table, (struct prefix *) &p);
 1853:   if (! rn || rn->p.prefixlen != p.prefixlen)
 1854:     {
 1855:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
 1856:       if (rn)
 1857:         route_unlock_node (rn);
 1858:       return CMD_WARNING;
 1859:     }
 1860: 
 1861:   vty_show_ip_route_detail (vty, rn, 0);
 1862: 
 1863:   route_unlock_node (rn);
 1864: 
 1865:   return CMD_SUCCESS;
 1866: }
 1867: 
 1868: ALIAS (show_ip_route_prefix,
 1869:        show_ip_route_prefix_vrf_cmd,
 1870:        "show ip route A.B.C.D/M " VRF_CMD_STR,
 1871:        SHOW_STR
 1872:        IP_STR
 1873:        "IP routing table\n"
 1874:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
 1875:        VRF_CMD_HELP_STR)
 1876: 
 1877: static void
 1878: vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
 1879: {
 1880:   struct route_node *rn;
 1881:   struct rib *rib;
 1882:   struct nexthop *nexthop;
 1883: #define ZEBRA_ROUTE_IBGP  ZEBRA_ROUTE_MAX
 1884: #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
 1885:   u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
 1886:   u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
 1887:   u_int32_t i;
 1888: 
 1889:   memset (&rib_cnt, 0, sizeof(rib_cnt));
 1890:   memset (&fib_cnt, 0, sizeof(fib_cnt));
 1891:   for (rn = route_top (table); rn; rn = route_next (rn))
 1892:     RNODE_FOREACH_RIB (rn, rib)
 1893:       for (nexthop = rib->nexthop; nexthop; nexthop = nexthop->next)
 1894:         {
 1895: 	  rib_cnt[ZEBRA_ROUTE_TOTAL]++;
 1896: 	  rib_cnt[rib->type]++;
 1897: 	  if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
 1898: 	      || nexthop_has_fib_child(nexthop))
 1899: 	    {
 1900: 	      fib_cnt[ZEBRA_ROUTE_TOTAL]++;
 1901: 	      fib_cnt[rib->type]++;
 1902: 	    }
 1903: 	  if (rib->type == ZEBRA_ROUTE_BGP && 
 1904: 	      CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP)) 
 1905: 	    {
 1906: 	      rib_cnt[ZEBRA_ROUTE_IBGP]++;
 1907: 	      if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
 1908: 		  || nexthop_has_fib_child(nexthop))
 1909: 		fib_cnt[ZEBRA_ROUTE_IBGP]++;
 1910: 	    }
 1911: 	}
 1912: 
 1913:   vty_out (vty, "%-20s %-20s %s  (vrf %u)%s",
 1914:            "Route Source", "Routes", "FIB",
 1915:            ((rib_table_info_t *)table->info)->zvrf->vrf_id,
 1916:            VTY_NEWLINE);
 1917: 
 1918:   for (i = 0; i < ZEBRA_ROUTE_MAX; i++) 
 1919:     {
 1920:       if (rib_cnt[i] > 0)
 1921: 	{
 1922: 	  if (i == ZEBRA_ROUTE_BGP)
 1923: 	    {
 1924: 	      vty_out (vty, "%-20s %-20d %-20d %s", "ebgp", 
 1925: 		       rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
 1926: 		       fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
 1927: 		       VTY_NEWLINE);
 1928: 	      vty_out (vty, "%-20s %-20d %-20d %s", "ibgp", 
 1929: 		       rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
 1930: 		       VTY_NEWLINE);
 1931: 	    }
 1932: 	  else 
 1933: 	    vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i), 
 1934: 		     rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
 1935: 	}
 1936:     }
 1937: 
 1938:   vty_out (vty, "------%s", VTY_NEWLINE);
 1939:   vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL], 
 1940: 	   fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);  
 1941:   vty_out (vty, "%s", VTY_NEWLINE);
 1942: }
 1943: 
 1944: /*
 1945:  * Implementation of the ip route summary prefix command.
 1946:  *
 1947:  * This command prints the primary prefixes that have been installed by various
 1948:  * protocols on the box.
 1949:  *
 1950:  */
 1951: static void
 1952: vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table)
 1953: {
 1954:   struct route_node *rn;
 1955:   struct rib *rib;
 1956:   struct nexthop *nexthop;
 1957: #define ZEBRA_ROUTE_IBGP  ZEBRA_ROUTE_MAX
 1958: #define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
 1959:   u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
 1960:   u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
 1961:   u_int32_t i;
 1962:   int       cnt;
 1963: 
 1964:   memset (&rib_cnt, 0, sizeof(rib_cnt));
 1965:   memset (&fib_cnt, 0, sizeof(fib_cnt));
 1966:   for (rn = route_top (table); rn; rn = route_next (rn))
 1967:     RNODE_FOREACH_RIB (rn, rib)
 1968:       {
 1969: 
 1970:        /*
 1971:         * In case of ECMP, count only once.
 1972:         */
 1973:        cnt = 0;
 1974:        for (nexthop = rib->nexthop; (!cnt && nexthop); nexthop = nexthop->next)
 1975:          {
 1976:           cnt++;
 1977:           rib_cnt[ZEBRA_ROUTE_TOTAL]++;
 1978:           rib_cnt[rib->type]++;
 1979:           if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
 1980: 	        {
 1981: 	         fib_cnt[ZEBRA_ROUTE_TOTAL]++;
 1982:              fib_cnt[rib->type]++;
 1983:             }
 1984: 	      if (rib->type == ZEBRA_ROUTE_BGP &&
 1985: 	          CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
 1986:             {
 1987: 	         rib_cnt[ZEBRA_ROUTE_IBGP]++;
 1988: 		     if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
 1989: 		        fib_cnt[ZEBRA_ROUTE_IBGP]++;
 1990:             }
 1991: 	     }
 1992:       }
 1993: 
 1994:   vty_out (vty, "%-20s %-20s %s  (vrf %u)%s",
 1995:            "Route Source", "Prefix Routes", "FIB",
 1996:            ((rib_table_info_t *)table->info)->zvrf->vrf_id,
 1997:            VTY_NEWLINE);
 1998: 
 1999:   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
 2000:     {
 2001:       if (rib_cnt[i] > 0)
 2002: 	{
 2003: 	  if (i == ZEBRA_ROUTE_BGP)
 2004: 	    {
 2005: 	      vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
 2006: 		       rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
 2007: 		       fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
 2008: 		       VTY_NEWLINE);
 2009: 	      vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
 2010: 		       rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
 2011: 		       VTY_NEWLINE);
 2012: 	    }
 2013: 	  else
 2014: 	    vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
 2015: 		     rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
 2016: 	}
 2017:     }
 2018: 
 2019:   vty_out (vty, "------%s", VTY_NEWLINE);
 2020:   vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
 2021: 	   fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
 2022:   vty_out (vty, "%s", VTY_NEWLINE);
 2023: }
 2024: 
 2025: /* Show route summary.  */
 2026: DEFUN (show_ip_route_summary,
 2027:        show_ip_route_summary_cmd,
 2028:        "show ip route summary",
 2029:        SHOW_STR
 2030:        IP_STR
 2031:        "IP routing table\n"
 2032:        "Summary of all routes\n")
 2033: {
 2034:   struct route_table *table;
 2035:   vrf_id_t vrf_id = VRF_DEFAULT;
 2036: 
 2037:   if (argc > 0)
 2038:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 2039: 
 2040:   table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 2041:   if (! table)
 2042:     return CMD_SUCCESS;
 2043: 
 2044:   vty_show_ip_route_summary (vty, table);
 2045: 
 2046:   return CMD_SUCCESS;
 2047: }
 2048: 
 2049: ALIAS (show_ip_route_summary,
 2050:        show_ip_route_summary_vrf_cmd,
 2051:        "show ip route summary " VRF_CMD_STR,
 2052:        SHOW_STR
 2053:        IP_STR
 2054:        "IP routing table\n"
 2055:        "Summary of all routes\n"
 2056:        VRF_CMD_HELP_STR)
 2057: 
 2058: /* Show route summary prefix.  */
 2059: DEFUN (show_ip_route_summary_prefix,
 2060:        show_ip_route_summary_prefix_cmd,
 2061:        "show ip route summary prefix",
 2062:        SHOW_STR
 2063:        IP_STR
 2064:        "IP routing table\n"
 2065:        "Summary of all routes\n"
 2066:        "Prefix routes\n")
 2067: {
 2068:   struct route_table *table;
 2069:   vrf_id_t vrf_id = VRF_DEFAULT;
 2070: 
 2071:   if (argc > 0)
 2072:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 2073: 
 2074:   table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 2075:   if (! table)
 2076:     return CMD_SUCCESS;
 2077: 
 2078:   vty_show_ip_route_summary_prefix (vty, table);
 2079: 
 2080:   return CMD_SUCCESS;
 2081: }
 2082: 
 2083: ALIAS (show_ip_route_summary_prefix,
 2084:        show_ip_route_summary_prefix_vrf_cmd,
 2085:        "show ip route summary prefix " VRF_CMD_STR,
 2086:        SHOW_STR
 2087:        IP_STR
 2088:        "IP routing table\n"
 2089:        "Summary of all routes\n"
 2090:        "Prefix routes\n"
 2091:        VRF_CMD_HELP_STR)
 2092: 
 2093: DEFUN (show_ip_route_vrf_all,
 2094:        show_ip_route_vrf_all_cmd,
 2095:        "show ip route " VRF_ALL_CMD_STR,
 2096:        SHOW_STR
 2097:        IP_STR
 2098:        "IP routing table\n"
 2099:        VRF_ALL_CMD_HELP_STR)
 2100: {
 2101:   struct route_table *table;
 2102:   struct route_node *rn;
 2103:   struct rib *rib;
 2104:   struct zebra_vrf *zvrf;
 2105:   vrf_iter_t iter;
 2106:   int first = 1;
 2107: 
 2108:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2109:     {
 2110:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 2111:           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 2112:         continue;
 2113: 
 2114:       /* Show all IPv4 routes. */
 2115:       for (rn = route_top (table); rn; rn = route_next (rn))
 2116:         RNODE_FOREACH_RIB (rn, rib)
 2117:           {
 2118:             if (first)
 2119:               {
 2120:                 vty_out (vty, SHOW_ROUTE_V4_HEADER);
 2121:                 first = 0;
 2122:               }
 2123:             vty_show_ip_route (vty, rn, rib);
 2124:           }
 2125:     }
 2126: 
 2127:   return CMD_SUCCESS;
 2128: }
 2129: 
 2130: DEFUN (show_ip_route_prefix_longer_vrf_all,
 2131:        show_ip_route_prefix_longer_vrf_all_cmd,
 2132:        "show ip route A.B.C.D/M longer-prefixes " VRF_ALL_CMD_STR,
 2133:        SHOW_STR
 2134:        IP_STR
 2135:        "IP routing table\n"
 2136:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
 2137:        "Show route matching the specified Network/Mask pair only\n"
 2138:        VRF_ALL_CMD_HELP_STR)
 2139: {
 2140:   struct route_table *table;
 2141:   struct route_node *rn;
 2142:   struct rib *rib;
 2143:   struct prefix p;
 2144:   struct zebra_vrf *zvrf;
 2145:   vrf_iter_t iter;
 2146:   int ret;
 2147:   int first = 1;
 2148: 
 2149:   ret = str2prefix (argv[0], &p);
 2150:   if (! ret)
 2151:     {
 2152:       vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
 2153:       return CMD_WARNING;
 2154:     }
 2155: 
 2156:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2157:     {
 2158:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 2159:           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 2160:         continue;
 2161: 
 2162:       /* Show matched type IPv4 routes. */
 2163:       for (rn = route_top (table); rn; rn = route_next (rn))
 2164:         RNODE_FOREACH_RIB (rn, rib)
 2165:           if (prefix_match (&p, &rn->p))
 2166:             {
 2167:               if (first)
 2168:                 {
 2169:                   vty_out (vty, SHOW_ROUTE_V4_HEADER);
 2170:                   first = 0;
 2171:                 }
 2172:               vty_show_ip_route (vty, rn, rib);
 2173:             }
 2174:     }
 2175: 
 2176:   return CMD_SUCCESS;
 2177: }
 2178: 
 2179: DEFUN (show_ip_route_supernets_vrf_all,
 2180:        show_ip_route_supernets_vrf_all_cmd,
 2181:        "show ip route supernets-only " VRF_ALL_CMD_STR,
 2182:        SHOW_STR
 2183:        IP_STR
 2184:        "IP routing table\n"
 2185:        "Show supernet entries only\n"
 2186:        VRF_ALL_CMD_HELP_STR)
 2187: {
 2188:   struct route_table *table;
 2189:   struct route_node *rn;
 2190:   struct rib *rib;
 2191:   struct zebra_vrf *zvrf;
 2192:   vrf_iter_t iter;
 2193:   u_int32_t addr;
 2194:   int first = 1;
 2195: 
 2196:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2197:     {
 2198:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 2199:           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 2200:         continue;
 2201: 
 2202:       /* Show matched type IPv4 routes. */
 2203:       for (rn = route_top (table); rn; rn = route_next (rn))
 2204:         RNODE_FOREACH_RIB (rn, rib)
 2205:           {
 2206:             addr = ntohl (rn->p.u.prefix4.s_addr);
 2207: 
 2208:             if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
 2209:                || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
 2210:                || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
 2211:               {
 2212:                 if (first)
 2213:                   {
 2214:                     vty_out (vty, SHOW_ROUTE_V4_HEADER);
 2215:                     first = 0;
 2216:                   }
 2217:                 vty_show_ip_route (vty, rn, rib);
 2218:               }
 2219:           }
 2220:     }
 2221: 
 2222:   return CMD_SUCCESS;
 2223: }
 2224: 
 2225: DEFUN (show_ip_route_protocol_vrf_all,
 2226:        show_ip_route_protocol_vrf_all_cmd,
 2227:        "show ip route " QUAGGA_IP_REDIST_STR_ZEBRA " " VRF_ALL_CMD_STR,
 2228:        SHOW_STR
 2229:        IP_STR
 2230:        "IP routing table\n"
 2231:        QUAGGA_IP_REDIST_HELP_STR_ZEBRA
 2232:        VRF_ALL_CMD_HELP_STR)
 2233: {
 2234:   int type;
 2235:   struct route_table *table;
 2236:   struct route_node *rn;
 2237:   struct rib *rib;
 2238:   struct zebra_vrf *zvrf;
 2239:   vrf_iter_t iter;
 2240:   int first = 1;
 2241: 
 2242:   type = proto_redistnum (AFI_IP, argv[0]);
 2243:   if (type < 0)
 2244:     {
 2245:       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
 2246:       return CMD_WARNING;
 2247:     }
 2248: 
 2249:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2250:     {
 2251:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 2252:           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 2253:         continue;
 2254: 
 2255:       /* Show matched type IPv4 routes. */
 2256:       for (rn = route_top (table); rn; rn = route_next (rn))
 2257:         RNODE_FOREACH_RIB (rn, rib)
 2258:           if (rib->type == type)
 2259:             {
 2260:               if (first)
 2261:                 {
 2262:                   vty_out (vty, SHOW_ROUTE_V4_HEADER);
 2263:                   first = 0;
 2264:                 }
 2265:               vty_show_ip_route (vty, rn, rib);
 2266:             }
 2267:     }
 2268: 
 2269:   return CMD_SUCCESS;
 2270: }
 2271: 
 2272: DEFUN (show_ip_route_addr_vrf_all,
 2273:        show_ip_route_addr_vrf_all_cmd,
 2274:        "show ip route A.B.C.D " VRF_ALL_CMD_STR,
 2275:        SHOW_STR
 2276:        IP_STR
 2277:        "IP routing table\n"
 2278:        "Network in the IP routing table to display\n"
 2279:        VRF_ALL_CMD_HELP_STR)
 2280: {
 2281:   int ret;
 2282:   struct prefix_ipv4 p;
 2283:   struct route_table *table;
 2284:   struct route_node *rn;
 2285:   struct zebra_vrf *zvrf;
 2286:   vrf_iter_t iter;
 2287: 
 2288:   ret = str2prefix_ipv4 (argv[0], &p);
 2289:   if (ret <= 0)
 2290:     {
 2291:       vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
 2292:       return CMD_WARNING;
 2293:     }
 2294: 
 2295:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2296:     {
 2297:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 2298:           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 2299:         continue;
 2300: 
 2301:       rn = route_node_match (table, (struct prefix *) &p);
 2302:       if (! rn)
 2303:         continue;
 2304: 
 2305:       vty_show_ip_route_detail (vty, rn, 0);
 2306: 
 2307:       route_unlock_node (rn);
 2308:     }
 2309: 
 2310:   return CMD_SUCCESS;
 2311: }
 2312: 
 2313: DEFUN (show_ip_route_prefix_vrf_all,
 2314:        show_ip_route_prefix_vrf_all_cmd,
 2315:        "show ip route A.B.C.D/M " VRF_ALL_CMD_STR,
 2316:        SHOW_STR
 2317:        IP_STR
 2318:        "IP routing table\n"
 2319:        "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
 2320:        VRF_ALL_CMD_HELP_STR)
 2321: {
 2322:   int ret;
 2323:   struct prefix_ipv4 p;
 2324:   struct route_table *table;
 2325:   struct route_node *rn;
 2326:   struct zebra_vrf *zvrf;
 2327:   vrf_iter_t iter;
 2328: 
 2329:   ret = str2prefix_ipv4 (argv[0], &p);
 2330:   if (ret <= 0)
 2331:     {
 2332:       vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
 2333:       return CMD_WARNING;
 2334:     }
 2335: 
 2336:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2337:     {
 2338:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 2339:           (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 2340:         continue;
 2341: 
 2342:       rn = route_node_match (table, (struct prefix *) &p);
 2343:       if (! rn)
 2344:         continue;
 2345:       if (rn->p.prefixlen != p.prefixlen)
 2346:         {
 2347:           route_unlock_node (rn);
 2348:           continue;
 2349:         }
 2350: 
 2351:       vty_show_ip_route_detail (vty, rn, 0);
 2352: 
 2353:       route_unlock_node (rn);
 2354:     }
 2355: 
 2356:   return CMD_SUCCESS;
 2357: }
 2358: 
 2359: DEFUN (show_ip_route_summary_vrf_all,
 2360:        show_ip_route_summary_vrf_all_cmd,
 2361:        "show ip route summary " VRF_ALL_CMD_STR,
 2362:        SHOW_STR
 2363:        IP_STR
 2364:        "IP routing table\n"
 2365:        "Summary of all routes\n"
 2366:        VRF_ALL_CMD_HELP_STR)
 2367: {
 2368:   struct zebra_vrf *zvrf;
 2369:   vrf_iter_t iter;
 2370: 
 2371:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2372:     if ((zvrf = vrf_iter2info (iter)) != NULL)
 2373:       vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
 2374: 
 2375:   return CMD_SUCCESS;
 2376: }
 2377: 
 2378: DEFUN (show_ip_route_summary_prefix_vrf_all,
 2379:        show_ip_route_summary_prefix_vrf_all_cmd,
 2380:        "show ip route summary prefix " VRF_ALL_CMD_STR,
 2381:        SHOW_STR
 2382:        IP_STR
 2383:        "IP routing table\n"
 2384:        "Summary of all routes\n"
 2385:        "Prefix routes\n"
 2386:        VRF_ALL_CMD_HELP_STR)
 2387: {
 2388:   struct zebra_vrf *zvrf;
 2389:   vrf_iter_t iter;
 2390: 
 2391:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2392:     if ((zvrf = vrf_iter2info (iter)) != NULL)
 2393:       vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
 2394: 
 2395:   return CMD_SUCCESS;
 2396: }
 2397: 
 2398: /* Write IPv4 static route configuration. */
 2399: static int
 2400: static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)
 2401: {
 2402:   struct route_node *rn;
 2403:   struct static_route *si;  
 2404:   struct route_table *stable;
 2405:   struct zebra_vrf *zvrf;
 2406:   vrf_iter_t iter;
 2407:   int write;
 2408: 
 2409:   write = 0;
 2410: 
 2411:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 2412:     {
 2413:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 2414:           (stable = zvrf->stable[AFI_IP][safi]) == NULL)
 2415:         continue;
 2416: 
 2417:       for (rn = route_top (stable); rn; rn = route_next (rn))
 2418:         for (si = rn->info; si; si = si->next)
 2419:           {
 2420:             vty_out (vty, "%s %s/%d", cmd, inet_ntoa (rn->p.u.prefix4),
 2421:                      rn->p.prefixlen);
 2422: 
 2423:             switch (si->type)
 2424:               {
 2425:                 case STATIC_IPV4_GATEWAY:
 2426:                   vty_out (vty, " %s", inet_ntoa (si->addr.ipv4));
 2427:                   break;
 2428:                 case STATIC_IPV4_IFNAME:
 2429:                   vty_out (vty, " %s", si->ifname);
 2430:                   break;
 2431:                 case STATIC_IPV4_BLACKHOLE:
 2432:                   vty_out (vty, " Null0");
 2433:                   break;
 2434:               }
 2435: 
 2436:             /* flags are incompatible with STATIC_IPV4_BLACKHOLE */
 2437:             if (si->type != STATIC_IPV4_BLACKHOLE)
 2438:               {
 2439:                 if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
 2440:                   vty_out (vty, " %s", "reject");
 2441: 
 2442:                 if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
 2443:                   vty_out (vty, " %s", "blackhole");
 2444:               }
 2445: 
 2446:             if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
 2447:               vty_out (vty, " %d", si->distance);
 2448: 
 2449:             if (si->vrf_id != VRF_DEFAULT)
 2450:               vty_out (vty, " vrf %u", si->vrf_id);
 2451: 
 2452:             vty_out (vty, "%s", VTY_NEWLINE);
 2453: 
 2454:             write = 1;
 2455:           }
 2456:     }
 2457:   return write;
 2458: }
 2459: 
 2460: DEFUN (show_ip_protocol,
 2461:        show_ip_protocol_cmd,
 2462:        "show ip protocol",
 2463:         SHOW_STR
 2464:         IP_STR
 2465:        "IP protocol filtering status\n")
 2466: {
 2467:     int i; 
 2468: 
 2469:     vty_out(vty, "Protocol    : route-map %s", VTY_NEWLINE);
 2470:     vty_out(vty, "------------------------%s", VTY_NEWLINE);
 2471:     for (i=0;i<ZEBRA_ROUTE_MAX;i++)
 2472:     {
 2473:         if (proto_rm[AFI_IP][i])
 2474:           vty_out (vty, "%-10s  : %-10s%s", zebra_route_string(i),
 2475: 					proto_rm[AFI_IP][i],
 2476: 					VTY_NEWLINE);
 2477:         else
 2478:           vty_out (vty, "%-10s  : none%s", zebra_route_string(i), VTY_NEWLINE);
 2479:     }
 2480:     if (proto_rm[AFI_IP][i])
 2481:       vty_out (vty, "%-10s  : %-10s%s", "any", proto_rm[AFI_IP][i],
 2482: 					VTY_NEWLINE);
 2483:     else
 2484:       vty_out (vty, "%-10s  : none%s", "any", VTY_NEWLINE);
 2485: 
 2486:     return CMD_SUCCESS;
 2487: }
 2488: 
 2489: #ifdef HAVE_IPV6
 2490: /* General fucntion for IPv6 static route. */
 2491: static int
 2492: static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,
 2493: 		  const char *gate_str, const char *ifname,
 2494: 		  const char *flag_str, const char *distance_str,
 2495: 		  const char *vrf_id_str)
 2496: {
 2497:   int ret;
 2498:   u_char distance;
 2499:   struct prefix p;
 2500:   struct in6_addr *gate = NULL;
 2501:   struct in6_addr gate_addr;
 2502:   u_char type = 0;
 2503:   vrf_id_t vrf_id = VRF_DEFAULT;
 2504:   u_char flag = 0;
 2505:   
 2506:   ret = str2prefix (dest_str, &p);
 2507:   if (ret <= 0)
 2508:     {
 2509:       vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
 2510:       return CMD_WARNING;
 2511:     }
 2512: 
 2513:   /* Apply mask for given prefix. */
 2514:   apply_mask (&p);
 2515: 
 2516:   /* Route flags */
 2517:   if (flag_str) {
 2518:     switch(flag_str[0]) {
 2519:       case 'r':
 2520:       case 'R': /* XXX */
 2521:         SET_FLAG (flag, ZEBRA_FLAG_REJECT);
 2522:         break;
 2523:       case 'b':
 2524:       case 'B': /* XXX */
 2525:         SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
 2526:         break;
 2527:       default:
 2528:         vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
 2529:         return CMD_WARNING;
 2530:     }
 2531:   }
 2532: 
 2533:   /* Administrative distance. */
 2534:   if (distance_str)
 2535:     distance = atoi (distance_str);
 2536:   else
 2537:     distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
 2538: 
 2539:   /* When gateway is valid IPv6 addrees, then gate is treated as
 2540:      nexthop address other case gate is treated as interface name. */
 2541:   ret = inet_pton (AF_INET6, gate_str, &gate_addr);
 2542: 
 2543:   if (ifname)
 2544:     {
 2545:       /* When ifname is specified.  It must be come with gateway
 2546:          address. */
 2547:       if (ret != 1)
 2548: 	{
 2549: 	  vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
 2550: 	  return CMD_WARNING;
 2551: 	}
 2552:       type = STATIC_IPV6_GATEWAY_IFNAME;
 2553:       gate = &gate_addr;
 2554:     }
 2555:   else
 2556:     {
 2557:       if (ret == 1)
 2558: 	{
 2559: 	  type = STATIC_IPV6_GATEWAY;
 2560: 	  gate = &gate_addr;
 2561: 	}
 2562:       else
 2563: 	{
 2564: 	  type = STATIC_IPV6_IFNAME;
 2565: 	  ifname = gate_str;
 2566: 	}
 2567:     }
 2568: 
 2569:   /* VRF id */
 2570:   if (vrf_id_str)
 2571:     VTY_GET_INTEGER ("VRF ID", vrf_id, vrf_id_str);
 2572: 
 2573:   if (add_cmd)
 2574:     static_add_ipv6 (&p, type, gate, ifname, flag, distance, vrf_id);
 2575:   else
 2576:     static_delete_ipv6 (&p, type, gate, ifname, distance, vrf_id);
 2577: 
 2578:   return CMD_SUCCESS;
 2579: }
 2580: 
 2581: DEFUN (ipv6_route,
 2582:        ipv6_route_cmd,
 2583:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
 2584:        IP_STR
 2585:        "Establish static routes\n"
 2586:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2587:        "IPv6 gateway address\n"
 2588:        "IPv6 gateway interface name\n")
 2589: {
 2590:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL,
 2591:                            NULL);
 2592: }
 2593: 
 2594: DEFUN (ipv6_route_flags,
 2595:        ipv6_route_flags_cmd,
 2596:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
 2597:        IP_STR
 2598:        "Establish static routes\n"
 2599:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2600:        "IPv6 gateway address\n"
 2601:        "IPv6 gateway interface name\n"
 2602:        "Emit an ICMP unreachable when matched\n"
 2603:        "Silently discard pkts when matched\n")
 2604: {
 2605:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
 2606:                            NULL);
 2607: }
 2608: 
 2609: DEFUN (ipv6_route_ifname,
 2610:        ipv6_route_ifname_cmd,
 2611:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
 2612:        IP_STR
 2613:        "Establish static routes\n"
 2614:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2615:        "IPv6 gateway address\n"
 2616:        "IPv6 gateway interface name\n")
 2617: {
 2618:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
 2619:                            NULL);
 2620: }
 2621: 
 2622: DEFUN (ipv6_route_ifname_flags,
 2623:        ipv6_route_ifname_flags_cmd,
 2624:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
 2625:        IP_STR
 2626:        "Establish static routes\n"
 2627:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2628:        "IPv6 gateway address\n"
 2629:        "IPv6 gateway interface name\n"
 2630:        "Emit an ICMP unreachable when matched\n"
 2631:        "Silently discard pkts when matched\n")
 2632: {
 2633:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
 2634:                            NULL);
 2635: }
 2636: 
 2637: DEFUN (ipv6_route_pref,
 2638:        ipv6_route_pref_cmd,
 2639:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
 2640:        IP_STR
 2641:        "Establish static routes\n"
 2642:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2643:        "IPv6 gateway address\n"
 2644:        "IPv6 gateway interface name\n"
 2645:        "Distance value for this prefix\n")
 2646: {
 2647:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2],
 2648:                            NULL);
 2649: }
 2650: 
 2651: DEFUN (ipv6_route_flags_pref,
 2652:        ipv6_route_flags_pref_cmd,
 2653:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
 2654:        IP_STR
 2655:        "Establish static routes\n"
 2656:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2657:        "IPv6 gateway address\n"
 2658:        "IPv6 gateway interface name\n"
 2659:        "Emit an ICMP unreachable when matched\n"
 2660:        "Silently discard pkts when matched\n"
 2661:        "Distance value for this prefix\n")
 2662: {
 2663:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
 2664:                            NULL);
 2665: }
 2666: 
 2667: DEFUN (ipv6_route_ifname_pref,
 2668:        ipv6_route_ifname_pref_cmd,
 2669:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
 2670:        IP_STR
 2671:        "Establish static routes\n"
 2672:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2673:        "IPv6 gateway address\n"
 2674:        "IPv6 gateway interface name\n"
 2675:        "Distance value for this prefix\n")
 2676: {
 2677:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
 2678:                            NULL);
 2679: }
 2680: 
 2681: DEFUN (ipv6_route_ifname_flags_pref,
 2682:        ipv6_route_ifname_flags_pref_cmd,
 2683:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
 2684:        IP_STR
 2685:        "Establish static routes\n"
 2686:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2687:        "IPv6 gateway address\n"
 2688:        "IPv6 gateway interface name\n"
 2689:        "Emit an ICMP unreachable when matched\n"
 2690:        "Silently discard pkts when matched\n"
 2691:        "Distance value for this prefix\n")
 2692: {
 2693:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
 2694:                            NULL);
 2695: }
 2696: 
 2697: DEFUN (no_ipv6_route,
 2698:        no_ipv6_route_cmd,
 2699:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
 2700:        NO_STR
 2701:        IP_STR
 2702:        "Establish static routes\n"
 2703:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2704:        "IPv6 gateway address\n"
 2705:        "IPv6 gateway interface name\n")
 2706: {
 2707:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
 2708:                            NULL);
 2709: }
 2710: 
 2711: ALIAS (no_ipv6_route,
 2712:        no_ipv6_route_flags_cmd,
 2713:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
 2714:        NO_STR
 2715:        IP_STR
 2716:        "Establish static routes\n"
 2717:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2718:        "IPv6 gateway address\n"
 2719:        "IPv6 gateway interface name\n"
 2720:        "Emit an ICMP unreachable when matched\n"
 2721:        "Silently discard pkts when matched\n")
 2722: 
 2723: DEFUN (no_ipv6_route_ifname,
 2724:        no_ipv6_route_ifname_cmd,
 2725:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
 2726:        NO_STR
 2727:        IP_STR
 2728:        "Establish static routes\n"
 2729:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2730:        "IPv6 gateway address\n"
 2731:        "IPv6 gateway interface name\n")
 2732: {
 2733:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
 2734:                            NULL);
 2735: }
 2736: 
 2737: ALIAS (no_ipv6_route_ifname,
 2738:        no_ipv6_route_ifname_flags_cmd,
 2739:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
 2740:        NO_STR
 2741:        IP_STR
 2742:        "Establish static routes\n"
 2743:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2744:        "IPv6 gateway address\n"
 2745:        "IPv6 gateway interface name\n"
 2746:        "Emit an ICMP unreachable when matched\n"
 2747:        "Silently discard pkts when matched\n")
 2748: 
 2749: DEFUN (no_ipv6_route_pref,
 2750:        no_ipv6_route_pref_cmd,
 2751:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255>",
 2752:        NO_STR
 2753:        IP_STR
 2754:        "Establish static routes\n"
 2755:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2756:        "IPv6 gateway address\n"
 2757:        "IPv6 gateway interface name\n"
 2758:        "Distance value for this prefix\n")
 2759: {
 2760:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2],
 2761:                            NULL);
 2762: }
 2763: 
 2764: DEFUN (no_ipv6_route_flags_pref,
 2765:        no_ipv6_route_flags_pref_cmd,
 2766:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
 2767:        NO_STR
 2768:        IP_STR
 2769:        "Establish static routes\n"
 2770:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2771:        "IPv6 gateway address\n"
 2772:        "IPv6 gateway interface name\n"
 2773:        "Emit an ICMP unreachable when matched\n"
 2774:        "Silently discard pkts when matched\n"
 2775:        "Distance value for this prefix\n")
 2776: {
 2777:   /* We do not care about argv[2] */
 2778:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
 2779:                            NULL);
 2780: }
 2781: 
 2782: DEFUN (no_ipv6_route_ifname_pref,
 2783:        no_ipv6_route_ifname_pref_cmd,
 2784:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
 2785:        NO_STR
 2786:        IP_STR
 2787:        "Establish static routes\n"
 2788:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2789:        "IPv6 gateway address\n"
 2790:        "IPv6 gateway interface name\n"
 2791:        "Distance value for this prefix\n")
 2792: {
 2793:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
 2794:                            NULL);
 2795: }
 2796: 
 2797: DEFUN (no_ipv6_route_ifname_flags_pref,
 2798:        no_ipv6_route_ifname_flags_pref_cmd,
 2799:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
 2800:        NO_STR
 2801:        IP_STR
 2802:        "Establish static routes\n"
 2803:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2804:        "IPv6 gateway address\n"
 2805:        "IPv6 gateway interface name\n"
 2806:        "Emit an ICMP unreachable when matched\n"
 2807:        "Silently discard pkts when matched\n"
 2808:        "Distance value for this prefix\n")
 2809: {
 2810:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
 2811:                            NULL);
 2812: }
 2813: 
 2814: DEFUN (ipv6_route_vrf,
 2815:        ipv6_route_vrf_cmd,
 2816:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) " VRF_CMD_STR,
 2817:        IP_STR
 2818:        "Establish static routes\n"
 2819:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2820:        "IPv6 gateway address\n"
 2821:        "IPv6 gateway interface name\n"
 2822:        VRF_CMD_HELP_STR)
 2823: {
 2824:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL,
 2825:                            argv[2]);
 2826: }
 2827: 
 2828: DEFUN (ipv6_route_flags_vrf,
 2829:        ipv6_route_flags_vrf_cmd,
 2830:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
 2831:        IP_STR
 2832:        "Establish static routes\n"
 2833:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2834:        "IPv6 gateway address\n"
 2835:        "IPv6 gateway interface name\n"
 2836:        "Emit an ICMP unreachable when matched\n"
 2837:        "Silently discard pkts when matched\n"
 2838:        VRF_CMD_HELP_STR)
 2839: {
 2840:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL,
 2841:                            argv[3]);
 2842: }
 2843: 
 2844: DEFUN (ipv6_route_ifname_vrf,
 2845:        ipv6_route_ifname_vrf_cmd,
 2846:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
 2847:        IP_STR
 2848:        "Establish static routes\n"
 2849:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2850:        "IPv6 gateway address\n"
 2851:        "IPv6 gateway interface name\n"
 2852:        VRF_CMD_HELP_STR)
 2853: {
 2854:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL,
 2855:                            argv[3]);
 2856: }
 2857: 
 2858: DEFUN (ipv6_route_ifname_flags_vrf,
 2859:        ipv6_route_ifname_flags_vrf_cmd,
 2860:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) " VRF_CMD_STR,
 2861:        IP_STR
 2862:        "Establish static routes\n"
 2863:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2864:        "IPv6 gateway address\n"
 2865:        "IPv6 gateway interface name\n"
 2866:        "Emit an ICMP unreachable when matched\n"
 2867:        "Silently discard pkts when matched\n"
 2868:        VRF_CMD_HELP_STR)
 2869: {
 2870:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL,
 2871:                            argv[4]);
 2872: }
 2873: 
 2874: DEFUN (ipv6_route_pref_vrf,
 2875:        ipv6_route_pref_vrf_cmd,
 2876:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255> " VRF_CMD_STR,
 2877:        IP_STR
 2878:        "Establish static routes\n"
 2879:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2880:        "IPv6 gateway address\n"
 2881:        "IPv6 gateway interface name\n"
 2882:        "Distance value for this prefix\n"
 2883:        VRF_CMD_HELP_STR)
 2884: {
 2885:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2],
 2886:                            argv[3]);
 2887: }
 2888: 
 2889: DEFUN (ipv6_route_flags_pref_vrf,
 2890:        ipv6_route_flags_pref_vrf_cmd,
 2891:        "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
 2892:        IP_STR
 2893:        "Establish static routes\n"
 2894:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2895:        "IPv6 gateway address\n"
 2896:        "IPv6 gateway interface name\n"
 2897:        "Emit an ICMP unreachable when matched\n"
 2898:        "Silently discard pkts when matched\n"
 2899:        "Distance value for this prefix\n"
 2900:        VRF_CMD_HELP_STR)
 2901: {
 2902:   return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3],
 2903:                            argv[4]);
 2904: }
 2905: 
 2906: DEFUN (ipv6_route_ifname_pref_vrf,
 2907:        ipv6_route_ifname_pref_vrf_cmd,
 2908:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
 2909:        IP_STR
 2910:        "Establish static routes\n"
 2911:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2912:        "IPv6 gateway address\n"
 2913:        "IPv6 gateway interface name\n"
 2914:        "Distance value for this prefix\n"
 2915:        VRF_CMD_HELP_STR)
 2916: {
 2917:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3],
 2918:                            argv[4]);
 2919: }
 2920: 
 2921: DEFUN (ipv6_route_ifname_flags_pref_vrf,
 2922:        ipv6_route_ifname_flags_pref_vrf_cmd,
 2923:        "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " VRF_CMD_STR,
 2924:        IP_STR
 2925:        "Establish static routes\n"
 2926:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2927:        "IPv6 gateway address\n"
 2928:        "IPv6 gateway interface name\n"
 2929:        "Emit an ICMP unreachable when matched\n"
 2930:        "Silently discard pkts when matched\n"
 2931:        "Distance value for this prefix\n"
 2932:        VRF_CMD_HELP_STR)
 2933: {
 2934:   return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
 2935:                            argv[5]);
 2936: }
 2937: 
 2938: DEFUN (no_ipv6_route_vrf,
 2939:        no_ipv6_route_vrf_cmd,
 2940:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) " VRF_CMD_STR,
 2941:        NO_STR
 2942:        IP_STR
 2943:        "Establish static routes\n"
 2944:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2945:        "IPv6 gateway address\n"
 2946:        "IPv6 gateway interface name\n"
 2947:        VRF_CMD_HELP_STR)
 2948: {
 2949:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL,
 2950:                            (argc > 3) ? argv[3] : argv[2]);
 2951: }
 2952: 
 2953: ALIAS (no_ipv6_route_vrf,
 2954:        no_ipv6_route_flags_vrf_cmd,
 2955:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
 2956:        NO_STR
 2957:        IP_STR
 2958:        "Establish static routes\n"
 2959:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2960:        "IPv6 gateway address\n"
 2961:        "IPv6 gateway interface name\n"
 2962:        "Emit an ICMP unreachable when matched\n"
 2963:        "Silently discard pkts when matched\n"
 2964:        VRF_CMD_HELP_STR)
 2965: 
 2966: DEFUN (no_ipv6_route_ifname_vrf,
 2967:        no_ipv6_route_ifname_vrf_cmd,
 2968:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
 2969:        NO_STR
 2970:        IP_STR
 2971:        "Establish static routes\n"
 2972:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2973:        "IPv6 gateway address\n"
 2974:        "IPv6 gateway interface name\n"
 2975:        VRF_CMD_HELP_STR)
 2976: {
 2977:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL,
 2978:                            (argc > 4) ? argv[4] : argv[3]);
 2979: }
 2980: 
 2981: ALIAS (no_ipv6_route_ifname_vrf,
 2982:        no_ipv6_route_ifname_flags_vrf_cmd,
 2983:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) " VRF_CMD_STR,
 2984:        NO_STR
 2985:        IP_STR
 2986:        "Establish static routes\n"
 2987:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 2988:        "IPv6 gateway address\n"
 2989:        "IPv6 gateway interface name\n"
 2990:        "Emit an ICMP unreachable when matched\n"
 2991:        "Silently discard pkts when matched\n"
 2992:        VRF_CMD_HELP_STR)
 2993: 
 2994: DEFUN (no_ipv6_route_pref_vrf,
 2995:        no_ipv6_route_pref_vrf_cmd,
 2996:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255> " VRF_CMD_STR,
 2997:        NO_STR
 2998:        IP_STR
 2999:        "Establish static routes\n"
 3000:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 3001:        "IPv6 gateway address\n"
 3002:        "IPv6 gateway interface name\n"
 3003:        "Distance value for this prefix\n"
 3004:        VRF_CMD_HELP_STR)
 3005: {
 3006:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2],
 3007:                            argv[3]);
 3008: }
 3009: 
 3010: DEFUN (no_ipv6_route_flags_pref_vrf,
 3011:        no_ipv6_route_flags_pref_vrf_cmd,
 3012:        "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
 3013:        NO_STR
 3014:        IP_STR
 3015:        "Establish static routes\n"
 3016:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 3017:        "IPv6 gateway address\n"
 3018:        "IPv6 gateway interface name\n"
 3019:        "Emit an ICMP unreachable when matched\n"
 3020:        "Silently discard pkts when matched\n"
 3021:        "Distance value for this prefix\n"
 3022:        VRF_CMD_HELP_STR)
 3023: {
 3024:   /* We do not care about argv[2] */
 3025:   return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3],
 3026:                            argv[4]);
 3027: }
 3028: 
 3029: DEFUN (no_ipv6_route_ifname_pref_vrf,
 3030:        no_ipv6_route_ifname_pref_vrf_cmd,
 3031:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
 3032:        NO_STR
 3033:        IP_STR
 3034:        "Establish static routes\n"
 3035:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 3036:        "IPv6 gateway address\n"
 3037:        "IPv6 gateway interface name\n"
 3038:        "Distance value for this prefix\n"
 3039:        VRF_CMD_HELP_STR)
 3040: {
 3041:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3],
 3042:                            argv[4]);
 3043: }
 3044: 
 3045: DEFUN (no_ipv6_route_ifname_flags_pref_vrf,
 3046:        no_ipv6_route_ifname_flags_pref_vrf_cmd,
 3047:        "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " VRF_CMD_STR,
 3048:        NO_STR
 3049:        IP_STR
 3050:        "Establish static routes\n"
 3051:        "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 3052:        "IPv6 gateway address\n"
 3053:        "IPv6 gateway interface name\n"
 3054:        "Emit an ICMP unreachable when matched\n"
 3055:        "Silently discard pkts when matched\n"
 3056:        "Distance value for this prefix\n"
 3057:        VRF_CMD_HELP_STR)
 3058: {
 3059:   return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
 3060:                            argv[5]);
 3061: }
 3062: 
 3063: DEFUN (show_ipv6_route,
 3064:        show_ipv6_route_cmd,
 3065:        "show ipv6 route",
 3066:        SHOW_STR
 3067:        IP_STR
 3068:        "IPv6 routing table\n")
 3069: {
 3070:   struct route_table *table;
 3071:   struct route_node *rn;
 3072:   struct rib *rib;
 3073:   int first = 1;
 3074:   vrf_id_t vrf_id = VRF_DEFAULT;
 3075: 
 3076:   if (argc > 0)
 3077:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 3078: 
 3079:   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
 3080:   if (! table)
 3081:     return CMD_SUCCESS;
 3082: 
 3083:   /* Show all IPv6 route. */
 3084:   for (rn = route_top (table); rn; rn = route_next (rn))
 3085:     RNODE_FOREACH_RIB (rn, rib)
 3086:       {
 3087: 	if (first)
 3088: 	  {
 3089: 	    vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3090: 	    first = 0;
 3091: 	  }
 3092: 	vty_show_ip_route (vty, rn, rib);
 3093:       }
 3094:   return CMD_SUCCESS;
 3095: }
 3096: 
 3097: ALIAS (show_ipv6_route,
 3098:        show_ipv6_route_vrf_cmd,
 3099:        "show ipv6 route " VRF_CMD_STR,
 3100:        SHOW_STR
 3101:        IP_STR
 3102:        "IPv6 routing table\n"
 3103:        VRF_CMD_HELP_STR)
 3104: 
 3105: DEFUN (show_ipv6_route_prefix_longer,
 3106:        show_ipv6_route_prefix_longer_cmd,
 3107:        "show ipv6 route X:X::X:X/M longer-prefixes",
 3108:        SHOW_STR
 3109:        IP_STR
 3110:        "IPv6 routing table\n"
 3111:        "IPv6 prefix\n"
 3112:        "Show route matching the specified Network/Mask pair only\n")
 3113: {
 3114:   struct route_table *table;
 3115:   struct route_node *rn;
 3116:   struct rib *rib;
 3117:   struct prefix p;
 3118:   int ret;
 3119:   int first = 1;
 3120:   vrf_id_t vrf_id = VRF_DEFAULT;
 3121: 
 3122:   ret = str2prefix (argv[0], &p);
 3123:   if (! ret)
 3124:     {
 3125:       vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
 3126:       return CMD_WARNING;
 3127:     }
 3128: 
 3129:   if (argc > 1)
 3130:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 3131: 
 3132:   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
 3133:   if (! table)
 3134:     return CMD_SUCCESS;
 3135: 
 3136:   /* Show matched type IPv6 routes. */
 3137:   for (rn = route_top (table); rn; rn = route_next (rn))
 3138:     RNODE_FOREACH_RIB (rn, rib)
 3139:       if (prefix_match (&p, &rn->p))
 3140: 	{
 3141: 	  if (first)
 3142: 	    {
 3143: 	      vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3144: 	      first = 0;
 3145: 	    }
 3146: 	  vty_show_ip_route (vty, rn, rib);
 3147: 	}
 3148:   return CMD_SUCCESS;
 3149: }
 3150: 
 3151: ALIAS (show_ipv6_route_prefix_longer,
 3152:        show_ipv6_route_prefix_longer_vrf_cmd,
 3153:        "show ipv6 route X:X::X:X/M longer-prefixes " VRF_CMD_STR,
 3154:        SHOW_STR
 3155:        IP_STR
 3156:        "IPv6 routing table\n"
 3157:        "IPv6 prefix\n"
 3158:        "Show route matching the specified Network/Mask pair only\n"
 3159:        VRF_CMD_HELP_STR)
 3160: 
 3161: DEFUN (show_ipv6_route_protocol,
 3162:        show_ipv6_route_protocol_cmd,
 3163:        "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA,
 3164:        SHOW_STR
 3165:        IP_STR
 3166:        "IP routing table\n"
 3167: 	QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
 3168: {
 3169:   int type;
 3170:   struct route_table *table;
 3171:   struct route_node *rn;
 3172:   struct rib *rib;
 3173:   int first = 1;
 3174:   vrf_id_t vrf_id = VRF_DEFAULT;
 3175: 
 3176:   type = proto_redistnum (AFI_IP6, argv[0]);
 3177:   if (type < 0)
 3178:     {
 3179:       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
 3180:       return CMD_WARNING;
 3181:     }
 3182: 
 3183:   if (argc > 1)
 3184:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 3185: 
 3186:   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
 3187:   if (! table)
 3188:     return CMD_SUCCESS;
 3189: 
 3190:   /* Show matched type IPv6 routes. */
 3191:   for (rn = route_top (table); rn; rn = route_next (rn))
 3192:     RNODE_FOREACH_RIB (rn, rib)
 3193:       if (rib->type == type)
 3194: 	{
 3195: 	  if (first)
 3196: 	    {
 3197: 	      vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3198: 	      first = 0;
 3199: 	    }
 3200: 	  vty_show_ip_route (vty, rn, rib);
 3201: 	}
 3202:   return CMD_SUCCESS;
 3203: }
 3204: 
 3205: ALIAS (show_ipv6_route_protocol,
 3206:        show_ipv6_route_protocol_vrf_cmd,
 3207:        "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA " " VRF_CMD_STR,
 3208:        SHOW_STR
 3209:        IP_STR
 3210:        "IP routing table\n"
 3211:        QUAGGA_IP6_REDIST_HELP_STR_ZEBRA
 3212:        VRF_CMD_HELP_STR)
 3213: 
 3214: DEFUN (show_ipv6_route_addr,
 3215:        show_ipv6_route_addr_cmd,
 3216:        "show ipv6 route X:X::X:X",
 3217:        SHOW_STR
 3218:        IP_STR
 3219:        "IPv6 routing table\n"
 3220:        "IPv6 Address\n")
 3221: {
 3222:   int ret;
 3223:   struct prefix_ipv6 p;
 3224:   struct route_table *table;
 3225:   struct route_node *rn;
 3226:   vrf_id_t vrf_id = VRF_DEFAULT;
 3227: 
 3228:   ret = str2prefix_ipv6 (argv[0], &p);
 3229:   if (ret <= 0)
 3230:     {
 3231:       vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
 3232:       return CMD_WARNING;
 3233:     }
 3234: 
 3235:   if (argc > 1)
 3236:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 3237: 
 3238:   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
 3239:   if (! table)
 3240:     return CMD_SUCCESS;
 3241: 
 3242:   rn = route_node_match (table, (struct prefix *) &p);
 3243:   if (! rn)
 3244:     {
 3245:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
 3246:       return CMD_WARNING;
 3247:     }
 3248: 
 3249:   vty_show_ip_route_detail (vty, rn, 0);
 3250: 
 3251:   route_unlock_node (rn);
 3252: 
 3253:   return CMD_SUCCESS;
 3254: }
 3255: 
 3256: ALIAS (show_ipv6_route_addr,
 3257:        show_ipv6_route_addr_vrf_cmd,
 3258:        "show ipv6 route X:X::X:X " VRF_CMD_STR,
 3259:        SHOW_STR
 3260:        IP_STR
 3261:        "IPv6 routing table\n"
 3262:        "IPv6 Address\n"
 3263:        VRF_CMD_HELP_STR)
 3264: 
 3265: DEFUN (show_ipv6_route_prefix,
 3266:        show_ipv6_route_prefix_cmd,
 3267:        "show ipv6 route X:X::X:X/M",
 3268:        SHOW_STR
 3269:        IP_STR
 3270:        "IPv6 routing table\n"
 3271:        "IPv6 prefix\n")
 3272: {
 3273:   int ret;
 3274:   struct prefix_ipv6 p;
 3275:   struct route_table *table;
 3276:   struct route_node *rn;
 3277:   vrf_id_t vrf_id = VRF_DEFAULT;
 3278: 
 3279:   ret = str2prefix_ipv6 (argv[0], &p);
 3280:   if (ret <= 0)
 3281:     {
 3282:       vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
 3283:       return CMD_WARNING;
 3284:     }
 3285: 
 3286:   if (argc > 1)
 3287:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
 3288: 
 3289:   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
 3290:   if (! table)
 3291:     return CMD_SUCCESS;
 3292: 
 3293:   rn = route_node_match (table, (struct prefix *) &p);
 3294:   if (! rn || rn->p.prefixlen != p.prefixlen)
 3295:     {
 3296:       vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
 3297:       if (rn)
 3298:         route_unlock_node (rn);
 3299:       return CMD_WARNING;
 3300:     }
 3301: 
 3302:   vty_show_ip_route_detail (vty, rn, 0);
 3303: 
 3304:   route_unlock_node (rn);
 3305: 
 3306:   return CMD_SUCCESS;
 3307: }
 3308: 
 3309: ALIAS (show_ipv6_route_prefix,
 3310:        show_ipv6_route_prefix_vrf_cmd,
 3311:        "show ipv6 route X:X::X:X/M " VRF_CMD_STR,
 3312:        SHOW_STR
 3313:        IP_STR
 3314:        "IPv6 routing table\n"
 3315:        "IPv6 prefix\n"
 3316:        VRF_CMD_HELP_STR)
 3317: 
 3318: /* Show route summary.  */
 3319: DEFUN (show_ipv6_route_summary,
 3320:        show_ipv6_route_summary_cmd,
 3321:        "show ipv6 route summary",
 3322:        SHOW_STR
 3323:        IP_STR
 3324:        "IPv6 routing table\n"
 3325:        "Summary of all IPv6 routes\n")
 3326: {
 3327:   struct route_table *table;
 3328:   vrf_id_t vrf_id = VRF_DEFAULT;
 3329: 
 3330:   if (argc > 0)
 3331:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 3332: 
 3333:   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
 3334:   if (! table)
 3335:     return CMD_SUCCESS;
 3336: 
 3337:   vty_show_ip_route_summary (vty, table);
 3338: 
 3339:   return CMD_SUCCESS;
 3340: }
 3341: 
 3342: ALIAS (show_ipv6_route_summary,
 3343:        show_ipv6_route_summary_vrf_cmd,
 3344:        "show ipv6 route summary " VRF_CMD_STR,
 3345:        SHOW_STR
 3346:        IP_STR
 3347:        "IPv6 routing table\n"
 3348:        "Summary of all IPv6 routes\n"
 3349:        VRF_CMD_HELP_STR)
 3350: 
 3351: /* Show ipv6 route summary prefix.  */
 3352: DEFUN (show_ipv6_route_summary_prefix,
 3353:        show_ipv6_route_summary_prefix_cmd,
 3354:        "show ipv6 route summary prefix",
 3355:        SHOW_STR
 3356:        IP_STR
 3357:        "IPv6 routing table\n"
 3358:        "Summary of all IPv6 routes\n"
 3359:        "Prefix routes\n")
 3360: {
 3361:   struct route_table *table;
 3362:   vrf_id_t vrf_id = VRF_DEFAULT;
 3363: 
 3364:   if (argc > 0)
 3365:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 3366: 
 3367:   table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
 3368:   if (! table)
 3369:     return CMD_SUCCESS;
 3370: 
 3371:   vty_show_ip_route_summary_prefix (vty, table);
 3372: 
 3373:   return CMD_SUCCESS;
 3374: }
 3375: 
 3376: ALIAS (show_ipv6_route_summary_prefix,
 3377:        show_ipv6_route_summary_prefix_vrf_cmd,
 3378:        "show ipv6 route summary prefix " VRF_CMD_STR,
 3379:        SHOW_STR
 3380:        IP_STR
 3381:        "IPv6 routing table\n"
 3382:        "Summary of all IPv6 routes\n"
 3383:        "Prefix routes\n"
 3384:        VRF_CMD_HELP_STR)
 3385: 
 3386: /*
 3387:  * Show IPv6 mroute command.Used to dump
 3388:  * the Multicast routing table.
 3389:  */
 3390: 
 3391: DEFUN (show_ipv6_mroute,
 3392:        show_ipv6_mroute_cmd,
 3393:        "show ipv6 mroute",
 3394:        SHOW_STR
 3395:        IP_STR
 3396:        "IPv6 Multicast routing table\n")
 3397: {
 3398:   struct route_table *table;
 3399:   struct route_node *rn;
 3400:   struct rib *rib;
 3401:   int first = 1;
 3402:   vrf_id_t vrf_id = VRF_DEFAULT;
 3403: 
 3404:   if (argc > 0)
 3405:     VTY_GET_INTEGER ("VRF ID", vrf_id, argv[0]);
 3406: 
 3407:   table = zebra_vrf_table (AFI_IP6, SAFI_MULTICAST, vrf_id);
 3408:   if (! table)
 3409:     return CMD_SUCCESS;
 3410: 
 3411:   /* Show all IPv6 route. */
 3412:   for (rn = route_top (table); rn; rn = route_next (rn))
 3413:     RNODE_FOREACH_RIB (rn, rib)
 3414:       {
 3415:        if (first)
 3416:          {
 3417: 	   vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3418:            first = 0;
 3419:          }
 3420:        vty_show_ip_route (vty, rn, rib);
 3421:       }
 3422:   return CMD_SUCCESS;
 3423: }
 3424: 
 3425: ALIAS (show_ipv6_mroute,
 3426:        show_ipv6_mroute_vrf_cmd,
 3427:        "show ipv6 mroute " VRF_CMD_STR,
 3428:        SHOW_STR
 3429:        IP_STR
 3430:        "IPv6 Multicast routing table\n"
 3431:        VRF_CMD_HELP_STR)
 3432: 
 3433: DEFUN (show_ipv6_route_vrf_all,
 3434:        show_ipv6_route_vrf_all_cmd,
 3435:        "show ipv6 route " VRF_ALL_CMD_STR,
 3436:        SHOW_STR
 3437:        IP_STR
 3438:        "IPv6 routing table\n"
 3439:        VRF_ALL_CMD_HELP_STR)
 3440: {
 3441:   struct route_table *table;
 3442:   struct route_node *rn;
 3443:   struct rib *rib;
 3444:   struct zebra_vrf *zvrf;
 3445:   vrf_iter_t iter;
 3446:   int first = 1;
 3447: 
 3448:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3449:     {
 3450:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 3451:           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
 3452:         continue;
 3453: 
 3454:       /* Show all IPv6 route. */
 3455:       for (rn = route_top (table); rn; rn = route_next (rn))
 3456:         RNODE_FOREACH_RIB (rn, rib)
 3457:           {
 3458:             if (first)
 3459:               {
 3460:                 vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3461:                 first = 0;
 3462:               }
 3463:             vty_show_ip_route (vty, rn, rib);
 3464:           }
 3465:     }
 3466: 
 3467:   return CMD_SUCCESS;
 3468: }
 3469: 
 3470: DEFUN (show_ipv6_route_prefix_longer_vrf_all,
 3471:        show_ipv6_route_prefix_longer_vrf_all_cmd,
 3472:        "show ipv6 route X:X::X:X/M longer-prefixes " VRF_ALL_CMD_STR,
 3473:        SHOW_STR
 3474:        IP_STR
 3475:        "IPv6 routing table\n"
 3476:        "IPv6 prefix\n"
 3477:        "Show route matching the specified Network/Mask pair only\n"
 3478:        VRF_ALL_CMD_HELP_STR)
 3479: {
 3480:   struct route_table *table;
 3481:   struct route_node *rn;
 3482:   struct rib *rib;
 3483:   struct prefix p;
 3484:   struct zebra_vrf *zvrf;
 3485:   vrf_iter_t iter;
 3486:   int ret;
 3487:   int first = 1;
 3488: 
 3489:   ret = str2prefix (argv[0], &p);
 3490:   if (! ret)
 3491:     {
 3492:       vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
 3493:       return CMD_WARNING;
 3494:     }
 3495: 
 3496:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3497:     {
 3498:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 3499:           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
 3500:         continue;
 3501: 
 3502:       /* Show matched type IPv6 routes. */
 3503:       for (rn = route_top (table); rn; rn = route_next (rn))
 3504:         RNODE_FOREACH_RIB (rn, rib)
 3505:           if (prefix_match (&p, &rn->p))
 3506:             {
 3507:               if (first)
 3508:                 {
 3509:                   vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3510:                   first = 0;
 3511:                 }
 3512:               vty_show_ip_route (vty, rn, rib);
 3513:             }
 3514:     }
 3515: 
 3516:   return CMD_SUCCESS;
 3517: }
 3518: 
 3519: DEFUN (show_ipv6_route_protocol_vrf_all,
 3520:        show_ipv6_route_protocol_vrf_all_cmd,
 3521:        "show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA " " VRF_ALL_CMD_STR,
 3522:        SHOW_STR
 3523:        IP_STR
 3524:        "IP routing table\n"
 3525:        QUAGGA_IP6_REDIST_HELP_STR_ZEBRA
 3526:        VRF_ALL_CMD_HELP_STR)
 3527: {
 3528:   int type;
 3529:   struct route_table *table;
 3530:   struct route_node *rn;
 3531:   struct rib *rib;
 3532:   struct zebra_vrf *zvrf;
 3533:   vrf_iter_t iter;
 3534:   int first = 1;
 3535: 
 3536:   type = proto_redistnum (AFI_IP6, argv[0]);
 3537:   if (type < 0)
 3538:     {
 3539:       vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
 3540:       return CMD_WARNING;
 3541:     }
 3542: 
 3543:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3544:     {
 3545:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 3546:           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
 3547:         continue;
 3548: 
 3549:       /* Show matched type IPv6 routes. */
 3550:       for (rn = route_top (table); rn; rn = route_next (rn))
 3551:         RNODE_FOREACH_RIB (rn, rib)
 3552:           if (rib->type == type)
 3553:             {
 3554:               if (first)
 3555:                 {
 3556:                   vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3557:                   first = 0;
 3558:                 }
 3559:               vty_show_ip_route (vty, rn, rib);
 3560:             }
 3561:     }
 3562: 
 3563:   return CMD_SUCCESS;
 3564: }
 3565: 
 3566: DEFUN (show_ipv6_route_addr_vrf_all,
 3567:        show_ipv6_route_addr_vrf_all_cmd,
 3568:        "show ipv6 route X:X::X:X " VRF_ALL_CMD_STR,
 3569:        SHOW_STR
 3570:        IP_STR
 3571:        "IPv6 routing table\n"
 3572:        "IPv6 Address\n"
 3573:        VRF_ALL_CMD_HELP_STR)
 3574: {
 3575:   int ret;
 3576:   struct prefix_ipv6 p;
 3577:   struct route_table *table;
 3578:   struct route_node *rn;
 3579:   struct zebra_vrf *zvrf;
 3580:   vrf_iter_t iter;
 3581: 
 3582:   ret = str2prefix_ipv6 (argv[0], &p);
 3583:   if (ret <= 0)
 3584:     {
 3585:       vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
 3586:       return CMD_WARNING;
 3587:     }
 3588: 
 3589:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3590:     {
 3591:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 3592:           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
 3593:         continue;
 3594: 
 3595:       rn = route_node_match (table, (struct prefix *) &p);
 3596:       if (! rn)
 3597:         continue;
 3598: 
 3599:       vty_show_ip_route_detail (vty, rn, 0);
 3600: 
 3601:       route_unlock_node (rn);
 3602:     }
 3603: 
 3604:   return CMD_SUCCESS;
 3605: }
 3606: 
 3607: DEFUN (show_ipv6_route_prefix_vrf_all,
 3608:        show_ipv6_route_prefix_vrf_all_cmd,
 3609:        "show ipv6 route X:X::X:X/M " VRF_ALL_CMD_STR,
 3610:        SHOW_STR
 3611:        IP_STR
 3612:        "IPv6 routing table\n"
 3613:        "IPv6 prefix\n"
 3614:        VRF_ALL_CMD_HELP_STR)
 3615: {
 3616:   int ret;
 3617:   struct prefix_ipv6 p;
 3618:   struct route_table *table;
 3619:   struct route_node *rn;
 3620:   struct zebra_vrf *zvrf;
 3621:   vrf_iter_t iter;
 3622: 
 3623:   ret = str2prefix_ipv6 (argv[0], &p);
 3624:   if (ret <= 0)
 3625:     {
 3626:       vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
 3627:       return CMD_WARNING;
 3628:     }
 3629: 
 3630:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3631:     {
 3632:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 3633:           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
 3634:         continue;
 3635: 
 3636:       rn = route_node_match (table, (struct prefix *) &p);
 3637:       if (! rn)
 3638:         continue;
 3639:       if (rn->p.prefixlen != p.prefixlen)
 3640:         {
 3641:           route_unlock_node (rn);
 3642:           continue;
 3643:         }
 3644: 
 3645:       vty_show_ip_route_detail (vty, rn, 0);
 3646: 
 3647:       route_unlock_node (rn);
 3648:     }
 3649: 
 3650:   return CMD_SUCCESS;
 3651: }
 3652: 
 3653: /* Show route summary.  */
 3654: DEFUN (show_ipv6_route_summary_vrf_all,
 3655:        show_ipv6_route_summary_vrf_all_cmd,
 3656:        "show ipv6 route summary " VRF_ALL_CMD_STR,
 3657:        SHOW_STR
 3658:        IP_STR
 3659:        "IPv6 routing table\n"
 3660:        "Summary of all IPv6 routes\n"
 3661:        VRF_ALL_CMD_HELP_STR)
 3662: {
 3663:   struct zebra_vrf *zvrf;
 3664:   vrf_iter_t iter;
 3665: 
 3666:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3667:     if ((zvrf = vrf_iter2info (iter)) != NULL)
 3668:       vty_show_ip_route_summary (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
 3669: 
 3670:   return CMD_SUCCESS;
 3671: }
 3672: 
 3673: DEFUN (show_ipv6_mroute_vrf_all,
 3674:        show_ipv6_mroute_vrf_all_cmd,
 3675:        "show ipv6 mroute " VRF_ALL_CMD_STR,
 3676:        SHOW_STR
 3677:        IP_STR
 3678:        "IPv6 Multicast routing table\n"
 3679:        VRF_ALL_CMD_HELP_STR)
 3680: {
 3681:   struct route_table *table;
 3682:   struct route_node *rn;
 3683:   struct rib *rib;
 3684:   struct zebra_vrf *zvrf;
 3685:   vrf_iter_t iter;
 3686:   int first = 1;
 3687: 
 3688:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3689:     {
 3690:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 3691:           (table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
 3692:         continue;
 3693: 
 3694:       /* Show all IPv6 route. */
 3695:       for (rn = route_top (table); rn; rn = route_next (rn))
 3696:         RNODE_FOREACH_RIB (rn, rib)
 3697:           {
 3698:            if (first)
 3699:              {
 3700:                vty_out (vty, SHOW_ROUTE_V6_HEADER);
 3701:                first = 0;
 3702:              }
 3703:            vty_show_ip_route (vty, rn, rib);
 3704:           }
 3705:     }
 3706:   return CMD_SUCCESS;
 3707: }
 3708: 
 3709: DEFUN (show_ipv6_route_summary_prefix_vrf_all,
 3710:        show_ipv6_route_summary_prefix_vrf_all_cmd,
 3711:        "show ipv6 route summary prefix " VRF_ALL_CMD_STR,
 3712:        SHOW_STR
 3713:        IP_STR
 3714:        "IPv6 routing table\n"
 3715:        "Summary of all IPv6 routes\n"
 3716:        "Prefix routes\n"
 3717:        VRF_ALL_CMD_HELP_STR)
 3718: {
 3719:   struct zebra_vrf *zvrf;
 3720:   vrf_iter_t iter;
 3721: 
 3722:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3723:     if ((zvrf = vrf_iter2info (iter)) != NULL)
 3724:       vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
 3725: 
 3726:   return CMD_SUCCESS;
 3727: }
 3728: 
 3729: /* Write IPv6 static route configuration. */
 3730: static int
 3731: static_config_ipv6 (struct vty *vty)
 3732: {
 3733:   struct route_node *rn;
 3734:   struct static_route *si;  
 3735:   int write;
 3736:   char buf[BUFSIZ];
 3737:   struct route_table *stable;
 3738:   struct zebra_vrf *zvrf;
 3739:   vrf_iter_t iter;
 3740: 
 3741:   write = 0;
 3742: 
 3743:   for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
 3744:     {
 3745:       if ((zvrf = vrf_iter2info (iter)) == NULL ||
 3746:           (stable = zvrf->stable[AFI_IP6][SAFI_UNICAST]) == NULL)
 3747:         continue;
 3748: 
 3749:       for (rn = route_top (stable); rn; rn = route_next (rn))
 3750:         for (si = rn->info; si; si = si->next)
 3751:           {
 3752:             vty_out (vty, "ipv6 route %s", prefix2str (&rn->p, buf, sizeof buf));
 3753: 
 3754:             switch (si->type)
 3755:               {
 3756:               case STATIC_IPV6_GATEWAY:
 3757:                 vty_out (vty, " %s",
 3758:                          inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ));
 3759:                 break;
 3760:               case STATIC_IPV6_IFNAME:
 3761:                 vty_out (vty, " %s", si->ifname);
 3762:                 break;
 3763:               case STATIC_IPV6_GATEWAY_IFNAME:
 3764:                 vty_out (vty, " %s %s",
 3765:                          inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ),
 3766:                          si->ifname);
 3767:                 break;
 3768:               }
 3769: 
 3770:             if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
 3771:               vty_out (vty, " %s", "reject");
 3772: 
 3773:             if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
 3774:               vty_out (vty, " %s", "blackhole");
 3775: 
 3776:             if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
 3777:               vty_out (vty, " %d", si->distance);
 3778: 
 3779:             if (si->vrf_id != VRF_DEFAULT)
 3780:               vty_out (vty, " vrf %u", si->vrf_id);
 3781: 
 3782:             vty_out (vty, "%s", VTY_NEWLINE);
 3783: 
 3784:             write = 1;
 3785:           }
 3786:     }
 3787:   return write;
 3788: }
 3789: #endif /* HAVE_IPV6 */
 3790: 
 3791: /* Static ip route configuration write function. */
 3792: static int
 3793: zebra_ip_config (struct vty *vty)
 3794: {
 3795:   int write = 0;
 3796: 
 3797:   write += static_config_ipv4 (vty, SAFI_UNICAST, "ip route");
 3798:   write += static_config_ipv4 (vty, SAFI_MULTICAST, "ip mroute");
 3799: #ifdef HAVE_IPV6
 3800:   write += static_config_ipv6 (vty);
 3801: #endif /* HAVE_IPV6 */
 3802: 
 3803:   return write;
 3804: }
 3805: 
 3806: static int config_write_vty(struct vty *vty)
 3807: {
 3808:   int i;
 3809:   enum multicast_mode ipv4_multicast_mode = multicast_mode_ipv4_get ();
 3810: 
 3811:   if (ipv4_multicast_mode != MCAST_NO_CONFIG)
 3812:     vty_out (vty, "ip multicast rpf-lookup-mode %s%s",
 3813:              ipv4_multicast_mode == MCAST_URIB_ONLY ? "urib-only" :
 3814:              ipv4_multicast_mode == MCAST_MRIB_ONLY ? "mrib-only" :
 3815:              ipv4_multicast_mode == MCAST_MIX_MRIB_FIRST ? "mrib-then-urib" :
 3816:              ipv4_multicast_mode == MCAST_MIX_DISTANCE ? "lower-distance" :
 3817:              "longer-prefix",
 3818:              VTY_NEWLINE);
 3819: 
 3820:   for (i=0;i<ZEBRA_ROUTE_MAX;i++)
 3821:     {
 3822:       if (proto_rm[AFI_IP][i])
 3823:         vty_out (vty, "ip protocol %s route-map %s%s", zebra_route_string(i),
 3824:                  proto_rm[AFI_IP][i], VTY_NEWLINE);
 3825:     }
 3826:   if (proto_rm[AFI_IP][ZEBRA_ROUTE_MAX])
 3827:       vty_out (vty, "ip protocol %s route-map %s%s", "any",
 3828:                proto_rm[AFI_IP][ZEBRA_ROUTE_MAX], VTY_NEWLINE);
 3829: 
 3830:   return 1;
 3831: }   
 3832: 
 3833: /* table node for protocol filtering */
 3834: static struct cmd_node protocol_node = { PROTOCOL_NODE, "", 1 };
 3835: 
 3836: /* IP node for static routes. */
 3837: static struct cmd_node ip_node = { IP_NODE,  "",  1 };
 3838: 
 3839: /* Route VTY.  */
 3840: void
 3841: zebra_vty_init (void)
 3842: {
 3843:   install_node (&ip_node, zebra_ip_config);
 3844:   install_node (&protocol_node, config_write_vty);
 3845: 
 3846:   install_element (CONFIG_NODE, &ip_mroute_cmd);
 3847:   install_element (CONFIG_NODE, &ip_mroute_dist_cmd);
 3848:   install_element (CONFIG_NODE, &no_ip_mroute_cmd);
 3849:   install_element (CONFIG_NODE, &no_ip_mroute_dist_cmd);
 3850:   install_element (CONFIG_NODE, &ip_multicast_mode_cmd);
 3851:   install_element (CONFIG_NODE, &no_ip_multicast_mode_cmd);
 3852:   install_element (CONFIG_NODE, &no_ip_multicast_mode_noarg_cmd);
 3853:   install_element (CONFIG_NODE, &ip_protocol_cmd);
 3854:   install_element (CONFIG_NODE, &no_ip_protocol_cmd);
 3855:   install_element (VIEW_NODE, &show_ip_protocol_cmd);
 3856:   install_element (ENABLE_NODE, &show_ip_protocol_cmd);
 3857:   install_element (CONFIG_NODE, &ip_route_cmd);
 3858:   install_element (CONFIG_NODE, &ip_route_flags_cmd);
 3859:   install_element (CONFIG_NODE, &ip_route_flags2_cmd);
 3860:   install_element (CONFIG_NODE, &ip_route_mask_cmd);
 3861:   install_element (CONFIG_NODE, &ip_route_mask_flags_cmd);
 3862:   install_element (CONFIG_NODE, &ip_route_mask_flags2_cmd);
 3863:   install_element (CONFIG_NODE, &no_ip_route_cmd);
 3864:   install_element (CONFIG_NODE, &no_ip_route_flags_cmd);
 3865:   install_element (CONFIG_NODE, &no_ip_route_flags2_cmd);
 3866:   install_element (CONFIG_NODE, &no_ip_route_mask_cmd);
 3867:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd);
 3868:   install_element (CONFIG_NODE, &no_ip_route_mask_flags2_cmd);
 3869:   install_element (CONFIG_NODE, &ip_route_distance_cmd);
 3870:   install_element (CONFIG_NODE, &ip_route_flags_distance_cmd);
 3871:   install_element (CONFIG_NODE, &ip_route_flags_distance2_cmd);
 3872:   install_element (CONFIG_NODE, &ip_route_mask_distance_cmd);
 3873:   install_element (CONFIG_NODE, &ip_route_mask_flags_distance_cmd);
 3874:   install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_cmd);
 3875:   install_element (CONFIG_NODE, &no_ip_route_distance_cmd);
 3876:   install_element (CONFIG_NODE, &no_ip_route_flags_distance_cmd);
 3877:   install_element (CONFIG_NODE, &no_ip_route_flags_distance2_cmd);
 3878:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_cmd);
 3879:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_cmd);
 3880: 
 3881:   install_element (VIEW_NODE, &show_ip_route_cmd);
 3882:   install_element (VIEW_NODE, &show_ip_route_addr_cmd);
 3883:   install_element (VIEW_NODE, &show_ip_route_prefix_cmd);
 3884:   install_element (VIEW_NODE, &show_ip_route_prefix_longer_cmd);
 3885:   install_element (VIEW_NODE, &show_ip_route_protocol_cmd);
 3886:   install_element (VIEW_NODE, &show_ip_route_supernets_cmd);
 3887:   install_element (VIEW_NODE, &show_ip_route_summary_cmd);
 3888:   install_element (VIEW_NODE, &show_ip_route_summary_prefix_cmd);
 3889:   install_element (ENABLE_NODE, &show_ip_route_cmd);
 3890:   install_element (ENABLE_NODE, &show_ip_route_addr_cmd);
 3891:   install_element (ENABLE_NODE, &show_ip_route_prefix_cmd);
 3892:   install_element (ENABLE_NODE, &show_ip_route_prefix_longer_cmd);
 3893:   install_element (ENABLE_NODE, &show_ip_route_protocol_cmd);
 3894:   install_element (ENABLE_NODE, &show_ip_route_supernets_cmd);
 3895:   install_element (ENABLE_NODE, &show_ip_route_summary_cmd);
 3896:   install_element (ENABLE_NODE, &show_ip_route_summary_prefix_cmd);
 3897: 
 3898:   install_element (VIEW_NODE, &show_ip_rpf_cmd);
 3899:   install_element (ENABLE_NODE, &show_ip_rpf_cmd);
 3900:   install_element (VIEW_NODE, &show_ip_rpf_addr_cmd);
 3901:   install_element (ENABLE_NODE, &show_ip_rpf_addr_cmd);
 3902: 
 3903:   /* Commands for VRF */
 3904: 
 3905:   install_element (CONFIG_NODE, &ip_mroute_vrf_cmd);
 3906:   install_element (CONFIG_NODE, &ip_mroute_dist_vrf_cmd);
 3907:   install_element (CONFIG_NODE, &no_ip_mroute_vrf_cmd);
 3908:   install_element (CONFIG_NODE, &no_ip_mroute_dist_vrf_cmd);
 3909: 
 3910:   install_element (CONFIG_NODE, &ip_route_vrf_cmd);
 3911:   install_element (CONFIG_NODE, &ip_route_flags_vrf_cmd);
 3912:   install_element (CONFIG_NODE, &ip_route_flags2_vrf_cmd);
 3913:   install_element (CONFIG_NODE, &ip_route_mask_vrf_cmd);
 3914:   install_element (CONFIG_NODE, &ip_route_mask_flags_vrf_cmd);
 3915:   install_element (CONFIG_NODE, &ip_route_mask_flags2_vrf_cmd);
 3916:   install_element (CONFIG_NODE, &no_ip_route_vrf_cmd);
 3917:   install_element (CONFIG_NODE, &no_ip_route_flags_vrf_cmd);
 3918:   install_element (CONFIG_NODE, &no_ip_route_flags2_vrf_cmd);
 3919:   install_element (CONFIG_NODE, &no_ip_route_mask_vrf_cmd);
 3920:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_vrf_cmd);
 3921:   install_element (CONFIG_NODE, &no_ip_route_mask_flags2_vrf_cmd);
 3922:   install_element (CONFIG_NODE, &ip_route_distance_vrf_cmd);
 3923:   install_element (CONFIG_NODE, &ip_route_flags_distance_vrf_cmd);
 3924:   install_element (CONFIG_NODE, &ip_route_flags_distance2_vrf_cmd);
 3925:   install_element (CONFIG_NODE, &ip_route_mask_distance_vrf_cmd);
 3926:   install_element (CONFIG_NODE, &ip_route_mask_flags_distance_vrf_cmd);
 3927:   install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_vrf_cmd);
 3928:   install_element (CONFIG_NODE, &no_ip_route_distance_vrf_cmd);
 3929:   install_element (CONFIG_NODE, &no_ip_route_flags_distance_vrf_cmd);
 3930:   install_element (CONFIG_NODE, &no_ip_route_flags_distance2_vrf_cmd);
 3931:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_vrf_cmd);
 3932:   install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_vrf_cmd);
 3933: 
 3934:   install_element (VIEW_NODE, &show_ip_route_vrf_cmd);
 3935:   install_element (VIEW_NODE, &show_ip_route_addr_vrf_cmd);
 3936:   install_element (VIEW_NODE, &show_ip_route_prefix_vrf_cmd);
 3937:   install_element (VIEW_NODE, &show_ip_route_prefix_longer_vrf_cmd);
 3938:   install_element (VIEW_NODE, &show_ip_route_protocol_vrf_cmd);
 3939:   install_element (VIEW_NODE, &show_ip_route_supernets_vrf_cmd);
 3940:   install_element (VIEW_NODE, &show_ip_route_summary_vrf_cmd);
 3941:   install_element (VIEW_NODE, &show_ip_route_summary_prefix_vrf_cmd);
 3942:   install_element (ENABLE_NODE, &show_ip_route_vrf_cmd);
 3943:   install_element (ENABLE_NODE, &show_ip_route_addr_vrf_cmd);
 3944:   install_element (ENABLE_NODE, &show_ip_route_prefix_vrf_cmd);
 3945:   install_element (ENABLE_NODE, &show_ip_route_prefix_longer_vrf_cmd);
 3946:   install_element (ENABLE_NODE, &show_ip_route_protocol_vrf_cmd);
 3947:   install_element (ENABLE_NODE, &show_ip_route_supernets_vrf_cmd);
 3948:   install_element (ENABLE_NODE, &show_ip_route_summary_vrf_cmd);
 3949:   install_element (ENABLE_NODE, &show_ip_route_summary_prefix_vrf_cmd);
 3950: 
 3951:   install_element (VIEW_NODE, &show_ip_route_vrf_all_cmd);
 3952:   install_element (VIEW_NODE, &show_ip_route_addr_vrf_all_cmd);
 3953:   install_element (VIEW_NODE, &show_ip_route_prefix_vrf_all_cmd);
 3954:   install_element (VIEW_NODE, &show_ip_route_prefix_longer_vrf_all_cmd);
 3955:   install_element (VIEW_NODE, &show_ip_route_protocol_vrf_all_cmd);
 3956:   install_element (VIEW_NODE, &show_ip_route_supernets_vrf_all_cmd);
 3957:   install_element (VIEW_NODE, &show_ip_route_summary_vrf_all_cmd);
 3958:   install_element (VIEW_NODE, &show_ip_route_summary_prefix_vrf_all_cmd);
 3959:   install_element (ENABLE_NODE, &show_ip_route_vrf_all_cmd);
 3960:   install_element (ENABLE_NODE, &show_ip_route_addr_vrf_all_cmd);
 3961:   install_element (ENABLE_NODE, &show_ip_route_prefix_vrf_all_cmd);
 3962:   install_element (ENABLE_NODE, &show_ip_route_prefix_longer_vrf_all_cmd);
 3963:   install_element (ENABLE_NODE, &show_ip_route_protocol_vrf_all_cmd);
 3964:   install_element (ENABLE_NODE, &show_ip_route_supernets_vrf_all_cmd);
 3965:   install_element (ENABLE_NODE, &show_ip_route_summary_vrf_all_cmd);
 3966:   install_element (ENABLE_NODE, &show_ip_route_summary_prefix_vrf_all_cmd);
 3967: 
 3968:   install_element (VIEW_NODE, &show_ip_rpf_vrf_cmd);
 3969:   install_element (VIEW_NODE, &show_ip_rpf_vrf_all_cmd);
 3970:   install_element (VIEW_NODE, &show_ip_rpf_addr_vrf_cmd);
 3971:   install_element (VIEW_NODE, &show_ip_rpf_addr_vrf_all_cmd);
 3972:   install_element (ENABLE_NODE, &show_ip_rpf_vrf_cmd);
 3973:   install_element (ENABLE_NODE, &show_ip_rpf_vrf_all_cmd);
 3974:   install_element (ENABLE_NODE, &show_ip_rpf_addr_vrf_cmd);
 3975:   install_element (ENABLE_NODE, &show_ip_rpf_addr_vrf_all_cmd);
 3976: 
 3977: #ifdef HAVE_IPV6
 3978:   install_element (CONFIG_NODE, &ipv6_route_cmd);
 3979:   install_element (CONFIG_NODE, &ipv6_route_flags_cmd);
 3980:   install_element (CONFIG_NODE, &ipv6_route_ifname_cmd);
 3981:   install_element (CONFIG_NODE, &ipv6_route_ifname_flags_cmd);
 3982:   install_element (CONFIG_NODE, &no_ipv6_route_cmd);
 3983:   install_element (CONFIG_NODE, &no_ipv6_route_flags_cmd);
 3984:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_cmd);
 3985:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd);
 3986:   install_element (CONFIG_NODE, &ipv6_route_pref_cmd);
 3987:   install_element (CONFIG_NODE, &ipv6_route_flags_pref_cmd);
 3988:   install_element (CONFIG_NODE, &ipv6_route_ifname_pref_cmd);
 3989:   install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_cmd);
 3990:   install_element (CONFIG_NODE, &no_ipv6_route_pref_cmd);
 3991:   install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_cmd);
 3992:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_cmd);
 3993:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_cmd);
 3994:   install_element (VIEW_NODE, &show_ipv6_route_cmd);
 3995:   install_element (VIEW_NODE, &show_ipv6_route_summary_cmd);
 3996:   install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_cmd);
 3997:   install_element (VIEW_NODE, &show_ipv6_route_protocol_cmd);
 3998:   install_element (VIEW_NODE, &show_ipv6_route_addr_cmd);
 3999:   install_element (VIEW_NODE, &show_ipv6_route_prefix_cmd);
 4000:   install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_cmd);
 4001:   install_element (ENABLE_NODE, &show_ipv6_route_cmd);
 4002:   install_element (ENABLE_NODE, &show_ipv6_route_protocol_cmd);
 4003:   install_element (ENABLE_NODE, &show_ipv6_route_addr_cmd);
 4004:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_cmd);
 4005:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_cmd);
 4006:   install_element (ENABLE_NODE, &show_ipv6_route_summary_cmd);
 4007:   install_element (ENABLE_NODE, &show_ipv6_route_summary_prefix_cmd);
 4008: 
 4009:   install_element (VIEW_NODE, &show_ipv6_mroute_cmd);
 4010:   install_element (ENABLE_NODE, &show_ipv6_mroute_cmd);
 4011: 
 4012:   /* Commands for VRF */
 4013: 
 4014:   install_element (CONFIG_NODE, &ipv6_route_vrf_cmd);
 4015:   install_element (CONFIG_NODE, &ipv6_route_flags_vrf_cmd);
 4016:   install_element (CONFIG_NODE, &ipv6_route_ifname_vrf_cmd);
 4017:   install_element (CONFIG_NODE, &ipv6_route_ifname_flags_vrf_cmd);
 4018:   install_element (CONFIG_NODE, &no_ipv6_route_vrf_cmd);
 4019:   install_element (CONFIG_NODE, &no_ipv6_route_flags_vrf_cmd);
 4020:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_vrf_cmd);
 4021:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_vrf_cmd);
 4022:   install_element (CONFIG_NODE, &ipv6_route_pref_vrf_cmd);
 4023:   install_element (CONFIG_NODE, &ipv6_route_flags_pref_vrf_cmd);
 4024:   install_element (CONFIG_NODE, &ipv6_route_ifname_pref_vrf_cmd);
 4025:   install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_vrf_cmd);
 4026:   install_element (CONFIG_NODE, &no_ipv6_route_pref_vrf_cmd);
 4027:   install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_vrf_cmd);
 4028:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_vrf_cmd);
 4029:   install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_vrf_cmd);
 4030: 
 4031:   install_element (VIEW_NODE, &show_ipv6_route_vrf_cmd);
 4032:   install_element (VIEW_NODE, &show_ipv6_route_summary_vrf_cmd);
 4033:   install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_vrf_cmd);
 4034:   install_element (VIEW_NODE, &show_ipv6_route_protocol_vrf_cmd);
 4035:   install_element (VIEW_NODE, &show_ipv6_route_addr_vrf_cmd);
 4036:   install_element (VIEW_NODE, &show_ipv6_route_prefix_vrf_cmd);
 4037:   install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_vrf_cmd);
 4038:   install_element (ENABLE_NODE, &show_ipv6_route_vrf_cmd);
 4039:   install_element (ENABLE_NODE, &show_ipv6_route_protocol_vrf_cmd);
 4040:   install_element (ENABLE_NODE, &show_ipv6_route_addr_vrf_cmd);
 4041:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_vrf_cmd);
 4042:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_vrf_cmd);
 4043:   install_element (ENABLE_NODE, &show_ipv6_route_summary_vrf_cmd);
 4044:   install_element (ENABLE_NODE, &show_ipv6_route_summary_prefix_vrf_cmd);
 4045: 
 4046:   install_element (VIEW_NODE, &show_ipv6_route_vrf_all_cmd);
 4047:   install_element (VIEW_NODE, &show_ipv6_route_summary_vrf_all_cmd);
 4048:   install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_vrf_all_cmd);
 4049:   install_element (VIEW_NODE, &show_ipv6_route_protocol_vrf_all_cmd);
 4050:   install_element (VIEW_NODE, &show_ipv6_route_addr_vrf_all_cmd);
 4051:   install_element (VIEW_NODE, &show_ipv6_route_prefix_vrf_all_cmd);
 4052:   install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_vrf_all_cmd);
 4053:   install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_cmd);
 4054:   install_element (ENABLE_NODE, &show_ipv6_route_protocol_vrf_all_cmd);
 4055:   install_element (ENABLE_NODE, &show_ipv6_route_addr_vrf_all_cmd);
 4056:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_vrf_all_cmd);
 4057:   install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_vrf_all_cmd);
 4058:   install_element (ENABLE_NODE, &show_ipv6_route_summary_vrf_all_cmd);
 4059:   install_element (ENABLE_NODE, &show_ipv6_route_summary_prefix_vrf_all_cmd);
 4060: 
 4061:   install_element (VIEW_NODE, &show_ipv6_mroute_vrf_cmd);
 4062:   install_element (ENABLE_NODE, &show_ipv6_mroute_vrf_cmd);
 4063: 
 4064:   install_element (VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd);
 4065:   install_element (ENABLE_NODE, &show_ipv6_mroute_vrf_all_cmd);
 4066: #endif /* HAVE_IPV6 */
 4067: }

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