]> git.puffer.fish Git - matthieu/frr.git/commitdiff
Merge branch 'stable/2.0-for-merge'
authorDavid Lamparter <equinox@opensourcerouting.org>
Fri, 13 Jan 2017 14:24:25 +0000 (15:24 +0100)
committerDavid Lamparter <equinox@opensourcerouting.org>
Fri, 13 Jan 2017 14:24:25 +0000 (15:24 +0100)
Conflicts (CLI vs. atol()):
- bgpd/bgp_vty.c
- ospfd/ospf_vty.c
- zebra/zebra_vty.c

NB: pull req #65 (LabNConsulting/working/2.0/afi-safi-vty/c) was
excluded from this merge.

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
1  2 
bgpd/bgp_vty.c
lib/vrf.c
ospf6d/ospf6_area.c
ospfd/ospf_vty.c
zebra/zebra_vty.c

diff --cc bgpd/bgp_vty.c
index 5129c0ecff1ede8cad66fbaeed1571f7fcdba4ab,b435543e3945bc5f5fda792a49aa485b2d1837e5..3705015a53fcc61bd4b5934111ec1b0457039a6d
@@@ -2944,16 -3235,15 +2944,18 @@@ DEFUN (neighbor_local_as
         "Specify a local-as number\n"
         "AS number used as local AS\n")
  {
 +  int idx_peer = 1;
 +  int idx_number = 3;
    struct peer *peer;
    int ret;
 -  peer = peer_and_group_lookup_vty (vty, argv[0]);
+   as_t as;
 +
 +  peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
    if (! peer)
      return CMD_WARNING;
  
-   ret = peer_local_as_set (peer, atoi (argv[idx_number]->arg), 0, 0);
 -  VTY_GET_INTEGER_RANGE ("Local AS", as, argv[1], 1, BGP_AS4_MAX);
++  VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX);
+   ret = peer_local_as_set (peer, as, 0, 0);
    return bgp_vty_return (vty, ret);
  }
  
@@@ -2966,16 -3256,16 +2968,18 @@@ DEFUN (neighbor_local_as_no_prepend
         "AS number used as local AS\n"
         "Do not prepend local-as to updates from ebgp peers\n")
  {
 +  int idx_peer = 1;
 +  int idx_number = 3;
    struct peer *peer;
    int ret;
+   as_t as;
  
 -  peer = peer_and_group_lookup_vty (vty, argv[0]);
 +  peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
    if (! peer)
      return CMD_WARNING;
  
-   ret = peer_local_as_set (peer, atoi (argv[idx_number]->arg), 1, 0);
 -  VTY_GET_INTEGER_RANGE ("Local AS", as, argv[1], 1, BGP_AS4_MAX);
++  VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX);
+   ret = peer_local_as_set (peer, as, 1, 0);
    return bgp_vty_return (vty, ret);
  }
  
@@@ -2989,16 -3279,16 +2993,18 @@@ DEFUN (neighbor_local_as_no_prepend_rep
         "Do not prepend local-as to updates from ebgp peers\n"
         "Do not prepend local-as to updates from ibgp peers\n")
  {
 +  int idx_peer = 1;
 +  int idx_number = 3;
    struct peer *peer;
    int ret;
+   as_t as;
  
 -  peer = peer_and_group_lookup_vty (vty, argv[0]);
 +  peer = peer_and_group_lookup_vty (vty, argv[idx_peer]->arg);
    if (! peer)
      return CMD_WARNING;
  
-   ret = peer_local_as_set (peer, atoi (argv[idx_number]->arg), 1, 1);
 -  VTY_GET_INTEGER_RANGE ("Local AS", as, argv[1], 1, BGP_AS4_MAX);
++  VTY_GET_INTEGER_RANGE ("Local AS", as, argv[idx_number]->arg, 1, BGP_AS4_MAX);
+   ret = peer_local_as_set (peer, as, 1, 1);
    return bgp_vty_return (vty, ret);
  }
  
diff --cc lib/vrf.c
Simple merge
index 06ff40a9832cc5c74b1e68996ebb7ac1dc35739a,bbab8598b8511ef1f2d1c9c6bc42a2d9523097ee..d9cf97a713abeef542d15f5025449b0dcc00f41f
@@@ -472,13 -465,11 +472,11 @@@ DEFUN (area_range
        range->prefix = prefix;
        range->path.area_id = oa->area_id;
        range->path.cost = OSPF_AREA_RANGE_COST_UNSPEC;
-       range->linkstate_id =
-       (u_int32_t) htonl(ospf6_new_range_ls_id (oa->range_table));
      }
  
 -  if (argc > 2)
 +  if (argc > idx_type)
      {
 -      if (strcmp (argv[2], "not-advertise") == 0)
 +      if (strmatch (argv[idx_type]->text, "not-advertise"))
        {
          SET_FLAG (range->flag, OSPF6_ROUTE_DO_NOT_ADVERTISE);
        }
index fb24e05728c91b15c61c78b1de959d3824afece4,2c3aaa68086134423641d55b12517bbd0df79cc2..6d6c0d364027705eedb72c19ff2c6675d1557bb1
@@@ -1266,12 -1290,37 +1266,17 @@@ DEFUN (no_ospf_area_vlink
          /* message-digest-key */
          /* Delete one key */
          i++;
-         vl_config.crypto_key_id = strtol (argv[i]->arg, NULL, 10);
-         if (vl_config.crypto_key_id < 0)
+         if (i < argc)
+           {
 -            vl_config.crypto_key_id = strtol (argv[i], NULL, 10);
++            vl_config.crypto_key_id = strtol (argv[i]->arg, NULL, 10);
+             if (vl_config.crypto_key_id < 0)
+               return CMD_WARNING;
+             vl_config.md5_key = NULL;
+           }
+         else
            return CMD_WARNING;
-         vl_config.md5_key = NULL; 
          break;
  
 -      case 'h':
 -        /* Hello interval */
 -        vl_config.hello_interval = OSPF_HELLO_INTERVAL_DEFAULT;
 -        break;
 -
 -      case 'r':
 -        /* Retransmit Interval */
 -        vl_config.retransmit_interval = OSPF_RETRANSMIT_INTERVAL_DEFAULT;
 -        break;
 -
 -      case 't':
 -        /* Transmit Delay */
 -        vl_config.transmit_delay = OSPF_TRANSMIT_DELAY_DEFAULT;
 -        break;
 -
 -      case 'd':
 -        /* Dead Interval */
 -        i++;
 -        vl_config.dead_interval = OSPF_ROUTER_DEAD_INTERVAL_DEFAULT;
 -        break;
        }
      }
  
index 27ef5f934dd7e4aeb1da899dd24955547ad59732,508819862440ab1bc11d3bd08e83a53c10482d0c..3138e7c867dfd8b1d5827389cdd0e7025b5cd658
@@@ -1333,39 -3334,43 +1333,39 @@@ DEFUN (show_ip_route_tag
    struct route_table *table;
    struct route_node *rn;
    struct rib *rib;
 -  struct vrf *vrf;
 -  struct zebra_vrf *zvrf;
    int first = 1;
 -  int vrf_header = 1;
    route_tag_t tag = 0;
 +  vrf_id_t vrf_id = VRF_DEFAULT;
  
 -  if (argv[0])
 -    VTY_GET_INTEGER_RANGE("tag", tag, argv[0], 0, 4294967295);
 -
 -  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +  if (strmatch(argv[idx_vrf]->text, "vrf"))
      {
 -      if ((zvrf = vrf->info) == NULL ||
 -          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 -        continue;
 +      VRF_GET_ID (vrf_id, argv[idx_name]->arg);
-       tag = atol(argv[idx_tag]->arg);
++      VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295);
 +    }
 +  else
 +    {
 +      idx_tag -= 2;
-       tag = atol(argv[idx_tag]->arg);
++      VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295);
 +    }
  
 -      /* Show all IPv4 routes with matching tag value. */
 -      for (rn = route_top (table); rn; rn = route_next (rn))
 -        RNODE_FOREACH_RIB (rn, rib)
 -          {
 -            if (rib->tag != tag)
 -              continue;
 +  table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
 +  if (! table)
 +    return CMD_SUCCESS;
  
 -            if (first)
 -              {
 -                vty_out (vty, SHOW_ROUTE_V4_HEADER);
 -                first = 0;
 -              }
 +  /* Show all IPv4 routes with matching tag value. */
 +  for (rn = route_top (table); rn; rn = route_next (rn))
 +    RNODE_FOREACH_RIB (rn, rib)
 +      {
 +        if (rib->tag != tag)
 +          continue;
  
 -            if (vrf_header)
 -              {
 -                vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE);
 -                vrf_header = 0;
 -              }
 -            vty_show_ip_route (vty, rn, rib, NULL);
 +        if (first)
 +          {
 +            vty_out (vty, SHOW_ROUTE_V4_HEADER);
 +            first = 0;
            }
 -      vrf_header = 1;
 -    }
 +        vty_show_ip_route (vty, rn, rib, NULL);
 +      }
    return CMD_SUCCESS;
  }
  
@@@ -1851,632 -3895,830 +1851,632 @@@ DEFUN (show_ip_route_summary_prefix
    return CMD_SUCCESS;
  }
  
 -DEFUN (ipv6_route,
 -       ipv6_route_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0)",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, NULL, NULL, NULL);
 -}
  
 -DEFUN (ipv6_route_tag,
 -       ipv6_route_tag_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295>",
 +DEFUN (show_ip_route_vrf_all,
 +       show_ip_route_vrf_all_cmd,
 +       "show ip route vrf all",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Set tag for this route\n"
 -       "Tag value\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR)
  {
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], NULL, NULL, NULL);
 -}
 +  struct route_table *table;
 +  struct route_node *rn;
 +  struct rib *rib;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
 +  int first = 1;
 +  int vrf_header = 1;
  
 -DEFUN (ipv6_route_flags,
 -       ipv6_route_flags_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, NULL, NULL, NULL);
 -}
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if ((zvrf = vrf->info) == NULL ||
 +          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 +        continue;
  
 -DEFUN (ipv6_route_flags_tag,
 -       ipv6_route_flags_tag_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295>",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], NULL, NULL, NULL);
 -}
 +      /* Show all IPv4 routes. */
 +      for (rn = route_top (table); rn; rn = route_next (rn))
 +        RNODE_FOREACH_RIB (rn, rib)
 +          {
 +            if (first)
 +              {
 +                vty_out (vty, SHOW_ROUTE_V4_HEADER);
 +                first = 0;
 +              }
  
 -DEFUN (ipv6_route_ifname,
 -       ipv6_route_ifname_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, NULL, NULL, NULL);
 +            if (vrf_header)
 +              {
 +                vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE);
 +                vrf_header = 0;
 +              }
 +            vty_show_ip_route (vty, rn, rib, NULL);
 +          }
 +      vrf_header  = 1;
 +    }
 +
 +  return CMD_SUCCESS;
  }
 -DEFUN (ipv6_route_ifname_tag,
 -       ipv6_route_ifname_tag_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295>",
 +
 +DEFUN (show_ip_route_vrf_all_tag,
 +       show_ip_route_vrf_all_tag_cmd,
 +       "show ip route vrf all tag (1-4294967295)",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Set tag for this route\n"
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       "Show only routes with tag\n"
         "Tag value\n")
  {
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], NULL, NULL, NULL);
 -}
 +  int idx_number = 6;
 +  struct route_table *table;
 +  struct route_node *rn;
 +  struct rib *rib;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
 +  int first = 1;
 +  int vrf_header = 1;
 +  route_tag_t tag = 0;
  
 -DEFUN (ipv6_route_ifname_flags,
 -       ipv6_route_ifname_flags_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, NULL, NULL, NULL);
 +  if (argv[idx_number]->arg)
-     tag = atol(argv[idx_number]->arg);
++    VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_number]->arg, 0, 4294967295);
 +
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if ((zvrf = vrf->info) == NULL ||
 +          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 +        continue;
 +
 +      /* Show all IPv4 routes with matching tag value. */
 +      for (rn = route_top (table); rn; rn = route_next (rn))
 +        RNODE_FOREACH_RIB (rn, rib)
 +          {
 +            if (rib->tag != tag)
 +              continue;
 +
 +            if (first)
 +              {
 +                vty_out (vty, SHOW_ROUTE_V4_HEADER);
 +                first = 0;
 +              }
 +
 +            if (vrf_header)
 +              {
 +                vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE);
 +                vrf_header = 0;
 +              }
 +            vty_show_ip_route (vty, rn, rib, NULL);
 +          }
 +      vrf_header = 1;
 +    }
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (ipv6_route_ifname_flags_tag,
 -       ipv6_route_ifname_flags_tag_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295>",
 +DEFUN (show_ip_route_vrf_all_prefix_longer,
 +       show_ip_route_vrf_all_prefix_longer_cmd,
 +       "show ip route vrf all A.B.C.D/M longer-prefixes",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
 +       "Show route matching the specified Network/Mask pair only\n")
  {
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, NULL, NULL);
 +  int idx_ipv4_prefixlen = 5;
 +  struct route_table *table;
 +  struct route_node *rn;
 +  struct rib *rib;
 +  struct prefix p;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
 +  int ret;
 +  int first = 1;
 +  int vrf_header = 1;
 +
 +  ret = str2prefix (argv[idx_ipv4_prefixlen]->arg, &p);
 +  if (! ret)
 +    {
 +      vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
 +      return CMD_WARNING;
 +    }
 +
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if ((zvrf = vrf->info) == NULL ||
 +          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 +        continue;
 +
 +      /* Show matched type IPv4 routes. */
 +      for (rn = route_top (table); rn; rn = route_next (rn))
 +        RNODE_FOREACH_RIB (rn, rib)
 +          if (prefix_match (&p, &rn->p))
 +            {
 +              if (first)
 +                {
 +                  vty_out (vty, SHOW_ROUTE_V4_HEADER);
 +                  first = 0;
 +                }
 +
 +              if (vrf_header)
 +                {
 +                  vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE);
 +                  vrf_header = 0;
 +                }
 +              vty_show_ip_route (vty, rn, rib, NULL);
 +            }
 +      vrf_header = 1;
 +    }
 +
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (ipv6_route_pref,
 -       ipv6_route_pref_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) <1-255>",
 +DEFUN (show_ip_route_vrf_all_supernets,
 +       show_ip_route_vrf_all_supernets_cmd,
 +       "show ip route vrf all supernets-only",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Distance value for this prefix\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       "Show supernet entries only\n")
  {
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, argv[2], NULL, NULL);
 -}
 +  struct route_table *table;
 +  struct route_node *rn;
 +  struct rib *rib;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
 +  u_int32_t addr;
 +  int first = 1;
 +  int vrf_header = 1;
 +
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if ((zvrf = vrf->info) == NULL ||
 +          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 +        continue;
 +
 +      /* Show matched type IPv4 routes. */
 +      for (rn = route_top (table); rn; rn = route_next (rn))
 +        RNODE_FOREACH_RIB (rn, rib)
 +          {
 +            addr = ntohl (rn->p.u.prefix4.s_addr);
 +
 +            if ((IN_CLASSC (addr) && rn->p.prefixlen < 24)
 +               || (IN_CLASSB (addr) && rn->p.prefixlen < 16)
 +               || (IN_CLASSA (addr) && rn->p.prefixlen < 8))
 +              {
 +                if (first)
 +                  {
 +                    vty_out (vty, SHOW_ROUTE_V4_HEADER);
 +                    first = 0;
 +                  }
 +                if (vrf_header)
 +                  {
 +                    vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE);
 +                    vrf_header = 0;
 +                  }
 +                vty_show_ip_route (vty, rn, rib, NULL);
 +              }
 +          }
 +      vrf_header = 1;
 +    }
  
 -DEFUN (ipv6_route_pref_tag,
 -       ipv6_route_pref_tag_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> <1-255>",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], argv[3], NULL, NULL);
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (ipv6_route_flags_pref,
 -       ipv6_route_flags_pref_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
 +DEFUN (show_ip_route_vrf_all_protocol,
 +       show_ip_route_vrf_all_protocol_cmd,
 +       "show ip route vrf all <kernel|connected|static|rip|ospf|isis|bgp|pim|table>",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Distance value for this prefix\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       FRR_IP_REDIST_HELP_STR_ZEBRA"\n")
  {
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, argv[3], NULL, NULL);
 -}
 +  int type;
 +  struct route_table *table;
 +  struct route_node *rn;
 +  struct rib *rib;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
 +  int first = 1;
 +  int vrf_header = 1;
  
 -DEFUN (ipv6_route_flags_pref_tag,
 -       ipv6_route_flags_pref_tag_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255>",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], NULL, NULL);
 -}
 +  char *proto = argv[argc - 1]->text;
 +  type = proto_redistnum (AFI_IP, proto);
  
 -DEFUN (ipv6_route_ifname_pref,
 -       ipv6_route_ifname_pref_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, argv[3], NULL, NULL);
 -}
 +  if (type < 0)
 +    {
 +      vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
 +      return CMD_WARNING;
 +    }
  
 -DEFUN (ipv6_route_ifname_pref_tag,
 -       ipv6_route_ifname_pref_tag_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> <1-255>",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], NULL, NULL);
 -}
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if ((zvrf = vrf->info) == NULL ||
 +          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 +        continue;
  
 -DEFUN (ipv6_route_ifname_flags_pref,
 -       ipv6_route_ifname_flags_pref_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], NULL, NULL);
 -}
 +      /* Show matched type IPv4 routes. */
 +      for (rn = route_top (table); rn; rn = route_next (rn))
 +        RNODE_FOREACH_RIB (rn, rib)
 +          if (rib->type == type)
 +            {
 +              if (first)
 +                {
 +                  vty_out (vty, SHOW_ROUTE_V4_HEADER);
 +                  first = 0;
 +                }
  
 -DEFUN (ipv6_route_ifname_flags_pref_tag,
 -       ipv6_route_ifname_flags_pref_tag_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> <1-255>",
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], NULL, NULL);
 -}
 +              if (vrf_header)
 +                {
 +                  vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf_name (zvrf), VTY_NEWLINE);
 +                  vrf_header = 0;
 +                }
 +              vty_show_ip_route (vty, rn, rib, NULL);
 +            }
 +      vrf_header = 1;
 +    }
  
 -DEFUN (no_ipv6_route,
 -       no_ipv6_route_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0)",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null Interface\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, NULL, NULL, NULL);
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (no_ipv6_route_tag,
 -       no_ipv6_route_tag_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295>",
 -       NO_STR
 +DEFUN (show_ip_route_vrf_all_addr,
 +       show_ip_route_vrf_all_addr_cmd,
 +       "show ip route vrf all A.B.C.D",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Set tag for this route\n"
 -       "Tag value\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       "Network in the IP routing table to display\n")
  {
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], NULL, NULL, NULL);
 -}
 +  int idx_ipv4 = 5;
 +  int ret;
 +  struct prefix_ipv4 p;
 +  struct route_table *table;
 +  struct route_node *rn;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
  
 -DEFUN (no_ipv6_route_flags,
 -       no_ipv6_route_flags_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole)",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, NULL, NULL, NULL);
 -}
 +  ret = str2prefix_ipv4 (argv[idx_ipv4]->arg, &p);
 +  if (ret <= 0)
 +    {
 +      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
 +      return CMD_WARNING;
 +    }
  
 -DEFUN (no_ipv6_route_flags_tag,
 -       no_ipv6_route_flags_tag_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], NULL, NULL, NULL);
 -}
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if ((zvrf = vrf->info) == NULL ||
 +          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 +        continue;
  
 -DEFUN (no_ipv6_route_ifname,
 -       no_ipv6_route_ifname_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, NULL, NULL, NULL);
 -}
 +      rn = route_node_match (table, (struct prefix *) &p);
 +      if (! rn)
 +        continue;
  
 -DEFUN (no_ipv6_route_ifname_tag,
 -       no_ipv6_route_ifname_tag_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Set tag for this route\n"
 -       "Tag value\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], NULL, NULL, NULL);
 -}
 +      vty_show_ip_route_detail (vty, rn, 0);
  
 -DEFUN (no_ipv6_route_ifname_flags,
 -       no_ipv6_route_ifname_flags_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole)",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], NULL, NULL, NULL, NULL);
 +      route_unlock_node (rn);
 +    }
 +
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (no_ipv6_route_ifname_flags_tag,
 -       no_ipv6_route_ifname_flags_tag_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295>",
 -       NO_STR
 +DEFUN (show_ip_route_vrf_all_prefix,
 +       show_ip_route_vrf_all_prefix_cmd,
 +       "show ip route vrf all A.B.C.D/M",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       "IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
  {
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, NULL, NULL);
 -}
 +  int idx_ipv4_prefixlen = 5;
 +  int ret;
 +  struct prefix_ipv4 p;
 +  struct route_table *table;
 +  struct route_node *rn;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
 +
 +  ret = str2prefix_ipv4 (argv[idx_ipv4_prefixlen]->arg, &p);
 +  if (ret <= 0)
 +    {
 +      vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
 +      return CMD_WARNING;
 +    }
 +
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if ((zvrf = vrf->info) == NULL ||
 +          (table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
 +        continue;
 +
 +      rn = route_node_match (table, (struct prefix *) &p);
 +      if (! rn)
 +        continue;
 +      if (rn->p.prefixlen != p.prefixlen)
 +        {
 +          route_unlock_node (rn);
 +          continue;
 +        }
 +
 +      vty_show_ip_route_detail (vty, rn, 0);
 +
 +      route_unlock_node (rn);
 +    }
  
 -DEFUN (no_ipv6_route_pref,
 -       no_ipv6_route_pref_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) <1-255>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, argv[2], NULL, NULL);
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (no_ipv6_route_pref_tag,
 -       no_ipv6_route_pref_tag_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> <1-255>",
 -       NO_STR
 +DEFUN (show_ip_route_vrf_all_summary,
 +       show_ip_route_vrf_all_summary_cmd,
 +       "show ip route vrf all summary ",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       "Summary of all routes\n")
  {
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], argv[3], NULL, NULL);
 -}
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
  
 -DEFUN (no_ipv6_route_flags_pref,
 -       no_ipv6_route_flags_pref_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Distance value for this prefix\n")
 -{
 -  /* We do not care about argv[2] */
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, argv[3], NULL, NULL);
 -}
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    if ((zvrf = vrf->info) != NULL)
 +      vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
  
 -DEFUN (no_ipv6_route_flags_pref_tag,
 -       no_ipv6_route_flags_pref_tag_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 -{
 -  /* We do not care about argv[2] */
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], NULL, NULL);
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (no_ipv6_route_ifname_pref,
 -       no_ipv6_route_ifname_pref_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255>",
 -       NO_STR
 +DEFUN (show_ip_route_vrf_all_summary_prefix,
 +       show_ip_route_vrf_all_summary_prefix_cmd,
 +       "show ip route vrf all summary prefix",
 +       SHOW_STR
         IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Distance value for this prefix\n")
 +       "IP routing table\n"
 +       VRF_ALL_CMD_HELP_STR
 +       "Summary of all routes\n"
 +       "Prefix routes\n")
  {
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, argv[3], NULL, NULL);
 -}
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
  
 -DEFUN (no_ipv6_route_ifname_pref_tag,
 -       no_ipv6_route_ifname_pref_tag_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> <1-255>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], NULL, NULL);
 -}
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    if ((zvrf = vrf->info) != NULL)
 +      vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
  
 -DEFUN (no_ipv6_route_ifname_flags_pref,
 -       no_ipv6_route_ifname_flags_pref_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Distance value for this prefix\n")
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], NULL, NULL);
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (no_ipv6_route_ifname_flags_pref_tag,
 -       no_ipv6_route_ifname_flags_pref_tag_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> <1-255>",
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n")
 +/* Write IPv4 static route configuration. */
 +static int
 +static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)
  {
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], NULL, NULL);
 -}
 +  struct route_node *rn;
 +  struct static_route *si;
 +  struct route_table *stable;
 +  struct vrf *vrf;
 +  struct zebra_vrf *zvrf;
 +  char buf[BUFSIZ];
 +  int write =0;
  
 -DEFUN (ipv6_route_vrf,
 -       ipv6_route_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, NULL, argv[2], NULL);
 -}
 +  RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
 +    {
 +      if (!(zvrf = vrf->info))
 +        continue;
 +      if ((stable = zvrf->stable[AFI_IP][safi]) == NULL)
 +        continue;
  
 -DEFUN (ipv6_route_tag_vrf,
 -       ipv6_route_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], NULL, argv[3], NULL);
 -}
 +      for (rn = route_top (stable); rn; rn = route_next (rn))
 +        for (si = rn->info; si; si = si->next)
 +          {
 +            vty_out (vty, "%s %s", cmd, prefix2str (&rn->p, buf, sizeof buf));
  
 -DEFUN (ipv6_route_flags_vrf,
 -       ipv6_route_flags_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, NULL, argv[3], NULL);
 -}
 +            switch (si->type)
 +              {
 +              case STATIC_IPV4_GATEWAY:
 +                vty_out (vty, " %s", inet_ntoa (si->addr.ipv4));
 +                break;
 +              case STATIC_IFINDEX:
 +                vty_out (vty, " %s", si->ifname);
 +                break;
 +              case STATIC_BLACKHOLE:
 +                vty_out (vty, " Null0");
 +                break;
 +              }
  
 -DEFUN (ipv6_route_flags_tag_vrf,
 -       ipv6_route_flags_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], NULL, argv[4], NULL);
 -}
 +            /* flags are incompatible with STATIC_BLACKHOLE */
 +            if (si->type != STATIC_BLACKHOLE)
 +              {
 +                if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
 +                  vty_out (vty, " %s", "reject");
  
 -DEFUN (ipv6_route_ifname_vrf,
 -       ipv6_route_ifname_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3], NULL);
 -}
 -DEFUN (ipv6_route_ifname_tag_vrf,
 -       ipv6_route_ifname_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], NULL, argv[4], NULL);
 -}
 +                if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
 +                  vty_out (vty, " %s", "blackhole");
 +              }
  
 -DEFUN (ipv6_route_ifname_flags_vrf,
 -       ipv6_route_ifname_flags_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, NULL, argv[4], NULL);
 -}
 +            if (si->tag)
 +              vty_out (vty, " tag %"ROUTE_TAG_PRI, si->tag);
  
 -DEFUN (ipv6_route_ifname_flags_tag_vrf,
 -       ipv6_route_ifname_flags_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, argv[5], NULL);
 -}
 +            if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
 +              vty_out (vty, " %d", si->distance);
  
 -DEFUN (ipv6_route_pref_vrf,
 -       ipv6_route_pref_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, argv[2], argv[3], NULL);
 -}
 +            if (si->vrf_id != VRF_DEFAULT)
 +                vty_out (vty, " vrf %s", zvrf ? zvrf_name (zvrf) : "");
  
 -DEFUN (ipv6_route_pref_tag_vrf,
 -       ipv6_route_pref_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, argv[2], argv[3], argv[4], NULL);
 -}
 +            /* Label information */
 +            if (si->snh_label.num_labels)
 +              vty_out (vty, " label %s",
 +                       mpls_label2str (si->snh_label.num_labels,
 +                                       si->snh_label.label, buf, sizeof buf));
  
 -DEFUN (ipv6_route_flags_pref_vrf,
 -       ipv6_route_flags_pref_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, argv[3], argv[4], NULL);
 -}
 +            vty_out (vty, "%s", VTY_NEWLINE);
  
 -DEFUN (ipv6_route_flags_pref_tag_vrf,
 -       ipv6_route_flags_pref_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], argv[5], NULL);
 +            write = 1;
 +          }
 +    }
 +  return write;
  }
  
 -DEFUN (ipv6_route_ifname_pref_vrf,
 -       ipv6_route_ifname_pref_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 +/* General fucntion for IPv6 static route. */
 +int
 +static_ipv6_func (struct vty *vty, int add_cmd, const char *dest_str,
 +                  const char *gate_str, const char *ifname,
 +                  const char *flag_str, const char *tag_str,
 +                  const char *distance_str, const char *vrf_id_str,
 +                  const char *label_str)
  {
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, argv[3], argv[4], NULL);
 -}
 +  int ret;
 +  u_char distance;
 +  struct prefix p;
 +  struct in6_addr *gate = NULL;
 +  struct in6_addr gate_addr;
 +  u_char type = STATIC_BLACKHOLE;
 +  u_char flag = 0;
 +  route_tag_t tag = 0;
 +  unsigned int ifindex = 0;
 +  struct interface *ifp = NULL;
 +  struct zebra_vrf *zvrf;
 +  struct static_nh_label snh_label;
  
 -DEFUN (ipv6_route_ifname_pref_tag_vrf,
 -       ipv6_route_ifname_pref_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], argv[5], NULL);
 -}
 +  ret = str2prefix (dest_str, &p);
 +  if (ret <= 0)
 +    {
 +      vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
 +      return CMD_WARNING;
 +    }
  
 -DEFUN (ipv6_route_ifname_flags_pref_vrf,
 -       ipv6_route_ifname_flags_pref_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], argv[5], NULL);
 -}
 +  /* Apply mask for given prefix. */
 +  apply_mask (&p);
  
 -DEFUN (ipv6_route_ifname_flags_pref_tag_vrf,
 -       ipv6_route_ifname_flags_pref_tag_vrf_cmd,
 -       "ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-4294967295> <1-255> " VRF_CMD_STR,
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       "Distance value for this prefix\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], NULL);
 -}
 +  /* Administrative distance. */
 +  if (distance_str)
 +    distance = atoi (distance_str);
 +  else
 +    distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
  
 -DEFUN (no_ipv6_route_vrf,
 -       no_ipv6_route_vrf_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) " VRF_CMD_STR,
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, NULL, argv[2], NULL);
 -}
 +  /* tag */
 +  if (tag_str)
-     tag = atol(tag_str);
++    VTY_GET_INTEGER_RANGE("tag", tag, tag_str, 0, 4294967295);
  
 -DEFUN (no_ipv6_route_tag_vrf,
 -       no_ipv6_route_tag_vrf_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE|null0) tag <1-4294967295> " VRF_CMD_STR,
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Null interface\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], NULL, argv[3], NULL);
 -}
 +  /* When gateway is valid IPv6 addrees, then gate is treated as
 +     nexthop address other case gate is treated as interface name. */
 +  ret = inet_pton (AF_INET6, gate_str, &gate_addr);
  
 -DEFUN (no_ipv6_route_flags_vrf,
 -       no_ipv6_route_flags_vrf_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, NULL, argv[3], NULL);
 -}
 +  /* VRF id */
 +  zvrf = zebra_vrf_lookup_by_name (vrf_id_str);
  
 -DEFUN (no_ipv6_route_flags_tag_vrf,
 -       no_ipv6_route_flags_tag_vrf_cmd,
 -       "no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-4294967295> " VRF_CMD_STR,
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       "Emit an ICMP unreachable when matched\n"
 -       "Silently discard pkts when matched\n"
 -       "Set tag for this route\n"
 -       "Tag value\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], NULL, argv[4], NULL);
 -}
 +  if (!zvrf)
 +    {
 +      vty_out (vty, "%% vrf %s is not defined%s", vrf_id_str, VTY_NEWLINE);
 +      return CMD_WARNING;
 +    }
  
 -DEFUN (no_ipv6_route_ifname_vrf,
 -       no_ipv6_route_ifname_vrf_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE " VRF_CMD_STR,
 -       NO_STR
 -       IP_STR
 -       "Establish static routes\n"
 -       "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
 -       "IPv6 gateway address\n"
 -       "IPv6 gateway interface name\n"
 -       VRF_CMD_HELP_STR)
 -{
 -  return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3], NULL);
 +  /* Labels */
 +  memset (&snh_label, 0, sizeof (struct static_nh_label));
 +  if (label_str)
 +    {
 +      if (!mpls_enabled)
 +        {
 +          vty_out (vty, "%% MPLS not turned on in kernel, ignoring command%s",
 +                   VTY_NEWLINE);
 +          return CMD_WARNING;
 +        }
 +      if (mpls_str2label (label_str, &snh_label.num_labels,
 +                          snh_label.label))
 +        {
 +          vty_out (vty, "%% Malformed label(s)%s", VTY_NEWLINE);
 +          return CMD_WARNING;
 +        }
 +    }
 +
 +  /* Null0 static route.  */
 +  if ((gate_str != NULL) && (strncasecmp (gate_str, "Null0", strlen (gate_str)) == 0))
 +    {
 +      if (flag_str)
 +        {
 +          vty_out (vty, "%% can not have flag %s with Null0%s", flag_str, VTY_NEWLINE);
 +          return CMD_WARNING;
 +        }
 +      if (add_cmd)
 +        static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, NULL, ifindex, ifname,
 +                          ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf, &snh_label);
 +      else
 +        static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p,  NULL, ifindex, tag,
 +                             distance, zvrf, &snh_label);
 +      return CMD_SUCCESS;
 +    }
 +
 +  /* Route flags */
 +  if (flag_str) {
 +    switch(flag_str[0]) {
 +      case 'r':
 +      case 'R': /* XXX */
 +        SET_FLAG (flag, ZEBRA_FLAG_REJECT);
 +        break;
 +      case 'b':
 +      case 'B': /* XXX */
 +        SET_FLAG (flag, ZEBRA_FLAG_BLACKHOLE);
 +        break;
 +      default:
 +        vty_out (vty, "%% Malformed flag %s %s", flag_str, VTY_NEWLINE);
 +        return CMD_WARNING;
 +    }
 +  }
 +
 + if (ifname)
 +    {
 +      /* When ifname is specified.  It must be come with gateway
 +         address. */
 +      if (ret != 1)
 +        {
 +          vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
 +          return CMD_WARNING;
 +        }
 +      type = STATIC_IPV6_GATEWAY_IFINDEX;
 +      gate = &gate_addr;
 +      ifp = if_lookup_by_name_vrf (ifname, zvrf_id (zvrf));
 +      if (!ifp)
 +        {
 +          vty_out (vty, "%% Malformed Interface name %s%s", ifname, VTY_NEWLINE);
 +          return CMD_WARNING;
 +        }
 +      ifindex = ifp->ifindex;
 +    }
 +  else
 +    {
 +      if (ret == 1)
 +        {
 +          type = STATIC_IPV6_GATEWAY;
 +          gate = &gate_addr;
 +        }
 +      else
 +        {
 +          type = STATIC_IFINDEX;
 +          ifp = if_lookup_by_name_vrf (gate_str, zvrf_id (zvrf));
 +          if (!ifp)
 +            {
 +              vty_out (vty, "%% Malformed Interface name %s%s", gate_str, VTY_NEWLINE);
 +              ifindex = IFINDEX_DELETED;
 +            }
 +          else
 +            ifindex = ifp->ifindex;
 +          ifname = gate_str;
 +        }
 +    }
 +
 +  if (add_cmd)
 +    static_add_route (AFI_IP6, SAFI_UNICAST, type, &p, (union g_addr *)gate,
 +                      ifindex, ifname, flag, tag, distance, zvrf, &snh_label);
 +  else
 +    static_delete_route (AFI_IP6, SAFI_UNICAST, type, &p, (union g_addr *)gate,
 +                         ifindex, tag, distance, zvrf, &snh_label);
 +
 +  return CMD_SUCCESS;
  }
  
 -DEFUN (no_ipv6_route_ifname_tag_vrf,
 -       no_ipv6_route_ifname_tag_vrf_cmd,
 -       "no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-4294967295> " VRF_CMD_STR,
 -       NO_STR
 +DEFUN (ipv6_route,
 +       ipv6_route_cmd,
 +       "ipv6 route X:X::X:X/M <X:X::X:X|INTERFACE|null0> [tag (1-4294967295)] [(1-255)] [vrf NAME]",
         IP_STR
         "Establish static routes\n"
         "IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
@@@ -2863,16 -5023,13 +2863,16 @@@ DEFUN (show_ipv6_route_tag
    route_tag_t tag = 0;
    vrf_id_t vrf_id = VRF_DEFAULT;
  
 -  if (argc > 1)
 +  if (strmatch(argv[idx_vrf]->text, "vrf"))
      {
 -      VRF_GET_ID (vrf_id, argv[0]);
 -      VTY_GET_INTEGER_RANGE("tag", tag, argv[1], 0, 4294967295);
 +      VRF_GET_ID (vrf_id, argv[idx_name]->arg);
-       tag = atol(argv[idx_tag]->arg);
++      VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295);
      }
    else
 -    VTY_GET_INTEGER_RANGE("tag", tag, argv[0], 0, 4294967295);
 +    {
 +      idx_tag -= 2;
-       tag = atol(argv[idx_tag]->arg);
++      VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_tag]->arg, 0, 4294967295);
 +    }
  
    table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
    if (! table)
@@@ -3251,8 -5468,8 +3251,8 @@@ DEFUN (show_ipv6_route_vrf_all_tag
    int vrf_header = 1;
    route_tag_t tag = 0;
  
 -  if (argv[0])
 -    VTY_GET_INTEGER_RANGE("tag", tag, argv[0], 0, 4294967295);
 +  if (argv[idx_number]->arg)
-     tag = atol(argv[idx_number]->arg);
++    VTY_GET_INTEGER_RANGE("tag", tag, argv[idx_number]->arg, 0, 4294967295);
  
    RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name)
      {