frr/zebra/zebra_vty.c

6205 lines
190 KiB
C
Raw Normal View History

2002-12-13 21:15:29 +01:00
/* Zebra VTY functions
* Copyright (C) 2002 Kunihiro Ishiguro
*
* This file is part of GNU Zebra.
*
* GNU Zebra is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* GNU Zebra is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Zebra; see the file COPYING. If not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <zebra.h>
[zebra] Routemap support on received routes, with 'set src' command (linux) 2007-05-01 David L Stevens <dlstevens@us.ibm.com> * (general) These changes collectively add route-map and prefix-list support to zebra and fix a bug in "show route-map" (with no argument). * doc/main.texi: added route-map, prefix-list, ip protocol and set src documentation * lib/command.h: added PROTOCOL_NODE type * lib/log.c: (proto_name2num) new function, protocol name to number translation. * lib/routemap.c: (vty_show_route_map) fixed "show route-map" without route-map name * lib/routemap.h: added RMAP_ZEBRA type * lib/zebra.h: added proto_name2num() prototype * vtysh/extract.pl.in: added VTYSH_ZEBRA flag for route-map and plist * vtysh/Makefile.am: added zebra_routemap.c * vtysh/vtysh.h: added VTYSH_ZEBRA flag to VTYSH_RMAP * zebra/connected.c: (connected_up_ipv4) added src preference argument to rib_add_ipv4() * zebra/kernel_socket.c: (rtm_read) ditto * zebra/main.c: added prefix list initialization * zebra/Makefile.am: added zebra_routemap.c source file * zebra/rib.h: added generic address union "g_addr" and use in existing places that had an explicit union. Added "src" to struct nexthop. Added preferred src arg to nexthop_ipv4_add and rib_add_ipv4. * zebra/rt_netlink.c: (netlink_routing_table) set preferred source on netlink messages. (netlink_route_change) ditto (netlink_route_multipath) ditto. * zebra/rtread_getmsg.c: (handle_route_entry) added (NULL) src to rib_add_ipv4() call. * zebra/rtread_proc.c: (proc_route_read) ditto * zebra/zebra_rib.c: (nexthop_ipv4_add) add src argument. (nexthop_ipv4_ifindex_add) ditto (rib_add_ipv4) ditto (nexthop_active_check) Add route-map processing. * zebra/zebra_routemap.c: new file for zebra route-map commands. * zebra/zebra_vty.c: (ip_protocol_cmd) Apply route-map to protocol (vty_show_ip_route_detail) added "src" printing (vty_show_ip_route) ditto (show_ip_protocol_cmd) new command, list routemaps. (config_write_protocol) write out routemap protocl config. (zebra_vty_init) Install the new routemap protocol commands. * zebra/zserv.c: (zread_ipv4_add) added (NULL) src arg (zebra_init) init zebra route-maps. * zebra/zserv.h: add zebra_route_map_init
2007-05-02 18:05:35 +02:00
#include "memory.h"
2002-12-13 21:15:29 +01:00
#include "if.h"
#include "prefix.h"
#include "command.h"
#include "table.h"
#include "rib.h"
#include "nexthop.h"
lib, zebra: move "struct vrf" to be a lib module Previously "struct vrf" is defined locally in zebra. Now it is moved to be a lib module. This is the first step to support multi-VRF in quagga. The implementation is splitted into small patches for the purpose of easy review. * lib: "struct vrf" with basic members is defined in vrf.c. The member "void *info" is for user data. Some basic functions are defined in vrf.c for adding/deleting/ looking up a VRF, scanning the VRF table and initializing the VRF module. The type "vrf_id_t" is defined specificly for VRF ID. * zebra: The previous "struct vrf" is re-defined as "struct zebra_vrf"; and previous "vrf" variables are renamed to "zvrf". The previous "struct vrf" related functions are removed from zbera_rib.c. New functions are defined to maintain the new "struct zebra_vrf". The names vrf_xxx are reserved for the functions in VRF module. So: - the previous vrf_table() are renamed to zebra_vrf_table(); - the previous vrf_static_table() are renamed to zebra_vrf_static_table(). The main logic is not changed. BTW: Add a statement to zebra_snmp.c telling that the SNMP is running only for the MIBs in the default VRF. Signed-off-by: Feng Lu <lu.feng@6wind.com> Reviewed-by: Alain Ritoux <alain.ritoux@6wind.com> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Acked-by: Vincent JARDIN <vincent.jardin@6wind.com> Signed-off-by: David Lamparter <equinox@opensourcerouting.org> Conflicts: lib/Makefile.am zebra/zebra_rib.c zebra/zebra_vty.c Conflicts: lib/Makefile.am lib/memtypes.c zebra/rib.h zebra/zebra_rib.c zebra/zebra_rnh.c zebra/zebra_rnh.h zebra/zebra_vty.c
2015-05-22 11:39:56 +02:00
#include "vrf.h"
2002-12-13 21:15:29 +01:00
#include "zebra/zserv.h"
#include "zebra/zebra_vrf.h"
#include "zebra/zebra_rnh.h"
#include "zebra/redistribute.h"
#include "zebra/zebra_routemap.h"
extern int allow_delete;
static int do_show_ip_route(struct vty *vty, const char *vrf_name, safi_t safi);
static void vty_show_ip_route_detail (struct vty *vty, struct route_node *rn,
int mcast);
/* General function for static route. */
static int
zebra_static_ipv4 (struct vty *vty, safi_t safi, int add_cmd,
const char *dest_str, const char *mask_str,
const char *gate_str, const char *flag_str,
const char *tag_str, const char *distance_str,
const char *vrf_id_str)
2002-12-13 21:15:29 +01:00
{
int ret;
u_char distance;
struct prefix p;
struct in_addr gate;
struct in_addr mask;
u_char flag = 0;
u_short tag = 0;
struct zebra_vrf *zvrf = NULL;
unsigned int ifindex = 0;
const char *ifname = NULL;
2002-12-13 21:15:29 +01:00
ret = str2prefix (dest_str, &p);
if (ret <= 0)
{
vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
return CMD_WARNING;
}
/* Cisco like mask notation. */
if (mask_str)
{
ret = inet_aton (mask_str, &mask);
if (ret == 0)
{
vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
return CMD_WARNING;
}
2002-12-13 21:15:29 +01:00
p.prefixlen = ip_masklen (mask);
}
/* Apply mask for given prefix. */
apply_mask (&p);
/* Administrative distance. */
if (distance_str)
distance = atoi (distance_str);
else
distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
/* tag */
if (tag_str)
tag = atoi(tag_str);
/* VRF id */
zvrf = zebra_vrf_list_lookup_by_name (vrf_id_str);
if (!zvrf)
{
vty_out (vty, "%% vrf %s is not defined%s", vrf_id_str, 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_ipv4 (safi, &p, NULL, ifindex, ifname, ZEBRA_FLAG_BLACKHOLE, tag, distance, zvrf);
else
static_delete_ipv4 (safi, &p, NULL, ifindex, tag, distance, zvrf);
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 (gate_str == NULL)
{
if (add_cmd)
static_add_ipv4 (safi, &p, NULL, ifindex, ifname, flag, tag, distance, zvrf);
else
static_delete_ipv4 (safi, &p, NULL, ifindex, tag, distance, zvrf);
return CMD_SUCCESS;
}
2002-12-13 21:15:29 +01:00
/* When gateway is A.B.C.D format, gate is treated as nexthop
address other case gate is treated as interface name. */
ret = inet_aton (gate_str, &gate);
if (!ret)
{
struct interface *ifp = if_lookup_by_name_vrf (gate_str, zvrf->vrf_id);
if (!ifp)
{
vty_out (vty, "%% Unknown interface: %s%s", gate_str, VTY_NEWLINE);
ifindex = IFINDEX_DELETED;
}
else
ifindex = ifp->ifindex;
ifname = gate_str;
}
2002-12-13 21:15:29 +01:00
if (add_cmd)
static_add_ipv4 (safi, &p, ifindex ? NULL : &gate, ifindex, ifname, flag, tag, distance, zvrf);
2002-12-13 21:15:29 +01:00
else
static_delete_ipv4 (safi, &p, ifindex ? NULL : &gate, ifindex, tag, distance, zvrf);
2002-12-13 21:15:29 +01:00
return CMD_SUCCESS;
}
/* Static unicast routes for multicast RPF lookup. */
DEFUN (ip_mroute_dist,
ip_mroute_dist_cmd,
"ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
IP_STR
"Configure static unicast route into MRIB for multicast RPF lookup\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Nexthop address\n"
"Nexthop interface name\n"
"Distance\n")
{
VTY_WARN_EXPERIMENTAL();
return zebra_static_ipv4 (vty, SAFI_MULTICAST, 1, argv[0], NULL, argv[1], NULL, NULL, argc > 2 ? argv[2] : NULL, NULL);
}
ALIAS (ip_mroute_dist,
ip_mroute_cmd,
"ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
IP_STR
"Configure static unicast route into MRIB for multicast RPF lookup\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Nexthop address\n"
"Nexthop interface name\n")
DEFUN (no_ip_mroute_dist,
no_ip_mroute_dist_cmd,
"no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE) <1-255>",
IP_STR
"Configure static unicast route into MRIB for multicast RPF lookup\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Nexthop address\n"
"Nexthop interface name\n"
"Distance\n")
{
VTY_WARN_EXPERIMENTAL();
return zebra_static_ipv4 (vty, SAFI_MULTICAST, 0, argv[0], NULL, argv[1], NULL, NULL, argc > 2 ? argv[2] : NULL, NULL);
}
ALIAS (no_ip_mroute_dist,
no_ip_mroute_cmd,
"no ip mroute A.B.C.D/M (A.B.C.D|INTERFACE)",
NO_STR
IP_STR
"Configure static unicast route into MRIB for multicast RPF lookup\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Nexthop address\n"
"Nexthop interface name\n")
DEFUN (ip_multicast_mode,
ip_multicast_mode_cmd,
"ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
IP_STR
"Multicast options\n"
"RPF lookup behavior\n"
"Lookup in unicast RIB only\n"
"Lookup in multicast RIB only\n"
"Try multicast RIB first, fall back to unicast RIB\n"
"Lookup both, use entry with lower distance\n"
"Lookup both, use entry with longer prefix\n")
{
VTY_WARN_EXPERIMENTAL();
if (!strncmp (argv[0], "u", 1))
multicast_mode_ipv4_set (MCAST_URIB_ONLY);
else if (!strncmp (argv[0], "mrib-o", 6))
multicast_mode_ipv4_set (MCAST_MRIB_ONLY);
else if (!strncmp (argv[0], "mrib-t", 6))
multicast_mode_ipv4_set (MCAST_MIX_MRIB_FIRST);
else if (!strncmp (argv[0], "low", 3))
multicast_mode_ipv4_set (MCAST_MIX_DISTANCE);
else if (!strncmp (argv[0], "lon", 3))
multicast_mode_ipv4_set (MCAST_MIX_PFXLEN);
else
{
vty_out (vty, "Invalid mode specified%s", VTY_NEWLINE);
return CMD_WARNING;
}
return CMD_SUCCESS;
}
DEFUN (no_ip_multicast_mode,
no_ip_multicast_mode_cmd,
"no ip multicast rpf-lookup-mode (urib-only|mrib-only|mrib-then-urib|lower-distance|longer-prefix)",
NO_STR
IP_STR
"Multicast options\n"
"RPF lookup behavior\n"
"Lookup in unicast RIB only\n"
"Lookup in multicast RIB only\n"
"Try multicast RIB first, fall back to unicast RIB\n"
"Lookup both, use entry with lower distance\n"
"Lookup both, use entry with longer prefix\n")
{
multicast_mode_ipv4_set (MCAST_NO_CONFIG);
return CMD_SUCCESS;
}
ALIAS (no_ip_multicast_mode,
no_ip_multicast_mode_noarg_cmd,
"no ip multicast rpf-lookup-mode",
NO_STR
IP_STR
"Multicast options\n"
"RPF lookup behavior\n")
DEFUN (show_ip_rpf,
show_ip_rpf_cmd,
"show ip rpf",
SHOW_STR
IP_STR
"Display RPF information for multicast source\n")
{
VTY_WARN_EXPERIMENTAL();
return do_show_ip_route(vty, VRF_DEFAULT_NAME, SAFI_MULTICAST);
}
DEFUN (show_ip_rpf_addr,
show_ip_rpf_addr_cmd,
"show ip rpf A.B.C.D",
SHOW_STR
IP_STR
"Display RPF information for multicast source\n"
"IP multicast source address (e.g. 10.0.0.0)\n")
{
struct in_addr addr;
struct route_node *rn;
struct rib *rib;
int ret;
VTY_WARN_EXPERIMENTAL();
ret = inet_aton (argv[0], &addr);
if (ret == 0)
{
vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
return CMD_WARNING;
}
rib = rib_match_ipv4_multicast (addr, &rn);
if (rib)
vty_show_ip_route_detail (vty, rn, 1);
else
vty_out (vty, "%% No match for RPF lookup%s", VTY_NEWLINE);
return CMD_SUCCESS;
}
2002-12-13 21:15:29 +01:00
/* Static route configuration. */
DEFUN (ip_route,
ip_route_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, NULL,
NULL, NULL);
}
DEFUN (ip_route_tag,
ip_route_tag_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, argv[2],
NULL, NULL);
}
DEFUN (ip_route_flags,
ip_route_flags_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], NULL,
NULL, NULL);
}
DEFUN (ip_route_flags_tag,
ip_route_flags_tag_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP 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 zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], argv[3],
NULL, NULL);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_flags2,
ip_route_flags2_cmd,
"ip route A.B.C.D/M (reject|blackhole)",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], NULL,
NULL, NULL);
}
DEFUN (ip_route_flags2_tag,
ip_route_flags2_tag_cmd,
"ip route A.B.C.D/M (reject|blackhole) tag <1-65535>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Set tag for this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], argv[2],
NULL, NULL);
}
2002-12-13 21:15:29 +01:00
/* Mask as A.B.C.D format. */
DEFUN (ip_route_mask,
ip_route_mask_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, NULL,
NULL, NULL);
}
DEFUN (ip_route_mask_tag,
ip_route_mask_tag_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, argv[3],
NULL, NULL);
}
DEFUN (ip_route_mask_flags,
ip_route_mask_flags_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], NULL,
NULL, NULL);
}
DEFUN (ip_route_mask_flags_tag,
ip_route_mask_flags_tag_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP 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 zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
NULL, NULL);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags2,
ip_route_mask_flags2_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole)",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], NULL,
NULL, NULL);
}
DEFUN (ip_route_mask_flags2_tag,
ip_route_mask_flags2_tag_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Set tag for this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], argv[3],
NULL, NULL);
}
2002-12-13 21:15:29 +01:00
/* Distance option value. */
DEFUN (ip_route_distance,
ip_route_distance_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, NULL,
argv[2], NULL);
}
DEFUN (ip_route_tag_distance,
ip_route_tag_distance_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, argv[2],
argv[3], NULL);
}
DEFUN (ip_route_flags_distance,
ip_route_flags_distance_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
2002-12-13 21:15:29 +01:00
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], NULL,
argv[3], NULL);
}
DEFUN (ip_route_flags_tag_distance,
ip_route_flags_tag_distance_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP 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 route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], argv[3],
argv[4], NULL);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_flags_distance2,
ip_route_flags_distance2_cmd,
"ip route A.B.C.D/M (reject|blackhole) <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], NULL,
argv[2], NULL);
}
DEFUN (ip_route_flags_tag_distance2,
ip_route_flags_tag_distance2_cmd,
"ip route A.B.C.D/M (reject|blackhole) tag <1-65535> <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\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 route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], argv[2],
argv[3], NULL);
}
2002-12-13 21:15:29 +01:00
DEFUN (ip_route_mask_distance,
ip_route_mask_distance_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
2002-12-13 21:15:29 +01:00
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, NULL,
argv[3], NULL);
}
DEFUN (ip_route_mask_tag_distance,
ip_route_mask_tag_distance_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, argv[3],
argv[4], NULL);
}
DEFUN (ip_route_mask_flags_tag_distance,
ip_route_mask_flags_tag_distance_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], NULL);
}
DEFUN (ip_route_mask_flags_distance,
ip_route_mask_flags_distance_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], NULL,
argv[4], NULL);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags_distance2,
ip_route_mask_flags_distance2_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], NULL,
argv[3], NULL);
}
DEFUN (ip_route_mask_flags_tag_distance2,
ip_route_mask_flags_tag_distance2_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535> <1-255>",
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], argv[3],
argv[4], NULL);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route,
no_ip_route_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0)",
2002-12-13 21:15:29 +01:00
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n")
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, NULL,
NULL, NULL);
}
DEFUN (no_ip_route_tag,
no_ip_route_tag_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, argv[2],
NULL, NULL);
2002-12-13 21:15:29 +01:00
}
ALIAS (no_ip_route,
no_ip_route_flags_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole)",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
ALIAS (no_ip_route_tag,
no_ip_route_flags_tag_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n")
DEFUN (no_ip_route_flags2,
no_ip_route_flags2_cmd,
"no ip route A.B.C.D/M (reject|blackhole)",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, NULL, NULL,
NULL, NULL);
}
DEFUN (no_ip_route_flags2_tag,
no_ip_route_flags2_tag_cmd,
"no ip route A.B.C.D/M (reject|blackhole) tag <1-65535>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, NULL, argv[1],
NULL, NULL);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_mask,
no_ip_route_mask_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0)",
2002-12-13 21:15:29 +01:00
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n")
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, NULL,
NULL, NULL);
}
DEFUN (no_ip_route_mask_tag,
no_ip_route_mask_tag_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, argv[3],
NULL, NULL);
2002-12-13 21:15:29 +01:00
}
ALIAS (no_ip_route_mask,
no_ip_route_mask_flags_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole)",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
ALIAS (no_ip_route_mask_tag,
no_ip_route_mask_flags_tag_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n")
DEFUN (no_ip_route_mask_flags2,
no_ip_route_mask_flags2_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole)",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, NULL, NULL,
NULL, NULL);
}
DEFUN (no_ip_route_mask_flags2_tag,
no_ip_route_mask_flags2_tag_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, NULL, argv[2],
NULL, NULL);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_distance,
no_ip_route_distance_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, NULL,
argv[2], NULL);
}
DEFUN (no_ip_route_tag_distance,
no_ip_route_tag_distance_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, argv[2],
argv[3], NULL);
}
DEFUN (no_ip_route_flags_distance,
no_ip_route_flags_distance_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
2002-12-13 21:15:29 +01:00
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
2002-12-13 21:15:29 +01:00
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], NULL,
argv[3], NULL);
}
DEFUN (no_ip_route_flags_tag_distance,
no_ip_route_flags_tag_distance_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], argv[3],
argv[4], NULL);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_flags_distance2,
no_ip_route_flags_distance2_cmd,
"no ip route A.B.C.D/M (reject|blackhole) <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], NULL,
argv[2], NULL);
}
DEFUN (no_ip_route_flags_tag_distance2,
no_ip_route_flags_tag_distance2_cmd,
"no ip route A.B.C.D/M (reject|blackhole) tag <1-65535> <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], argv[2],
argv[3], NULL);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_mask_distance,
no_ip_route_mask_distance_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, NULL,
argv[3], NULL);
}
DEFUN (no_ip_route_mask_tag_distance,
no_ip_route_mask_tag_distance_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, argv[3],
argv[4], NULL);
}
DEFUN (no_ip_route_mask_flags_distance,
no_ip_route_mask_flags_distance_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255>",
2002-12-13 21:15:29 +01:00
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
2002-12-13 21:15:29 +01:00
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], NULL,
argv[4], NULL);
}
DEFUN (no_ip_route_mask_flags_tag_distance,
no_ip_route_mask_flags_tag_distance_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], NULL);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_mask_flags_distance2,
no_ip_route_mask_flags_distance2_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], NULL,
argv[3], NULL);
}
DEFUN (no_ip_route_mask_flags_tag_distance2,
no_ip_route_mask_flags_tag_distance2_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535> <1-255>",
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n")
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], argv[3],
argv[4], NULL);
}
/* Static route configuration. */
DEFUN (ip_route_vrf,
ip_route_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, NULL, NULL, argv[2]);
}
2002-12-13 21:15:29 +01:00
DEFUN (ip_route_tag_vrf,
ip_route_tag_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, argv[2], NULL, argv[3]);
}
2002-12-13 21:15:29 +01:00
DEFUN (ip_route_flags_vrf,
ip_route_flags_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], NULL, NULL, argv[3]);
}
2002-12-13 21:15:29 +01:00
DEFUN (ip_route_flags_tag_vrf,
ip_route_flags_tag_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP 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)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], argv[3], NULL, argv[4]);
}
2002-12-13 21:15:29 +01:00
DEFUN (ip_route_flags2_vrf,
ip_route_flags2_vrf_cmd,
"ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], NULL, NULL, argv[2]);
}
[zebra] Routemap support on received routes, with 'set src' command (linux) 2007-05-01 David L Stevens <dlstevens@us.ibm.com> * (general) These changes collectively add route-map and prefix-list support to zebra and fix a bug in "show route-map" (with no argument). * doc/main.texi: added route-map, prefix-list, ip protocol and set src documentation * lib/command.h: added PROTOCOL_NODE type * lib/log.c: (proto_name2num) new function, protocol name to number translation. * lib/routemap.c: (vty_show_route_map) fixed "show route-map" without route-map name * lib/routemap.h: added RMAP_ZEBRA type * lib/zebra.h: added proto_name2num() prototype * vtysh/extract.pl.in: added VTYSH_ZEBRA flag for route-map and plist * vtysh/Makefile.am: added zebra_routemap.c * vtysh/vtysh.h: added VTYSH_ZEBRA flag to VTYSH_RMAP * zebra/connected.c: (connected_up_ipv4) added src preference argument to rib_add_ipv4() * zebra/kernel_socket.c: (rtm_read) ditto * zebra/main.c: added prefix list initialization * zebra/Makefile.am: added zebra_routemap.c source file * zebra/rib.h: added generic address union "g_addr" and use in existing places that had an explicit union. Added "src" to struct nexthop. Added preferred src arg to nexthop_ipv4_add and rib_add_ipv4. * zebra/rt_netlink.c: (netlink_routing_table) set preferred source on netlink messages. (netlink_route_change) ditto (netlink_route_multipath) ditto. * zebra/rtread_getmsg.c: (handle_route_entry) added (NULL) src to rib_add_ipv4() call. * zebra/rtread_proc.c: (proc_route_read) ditto * zebra/zebra_rib.c: (nexthop_ipv4_add) add src argument. (nexthop_ipv4_ifindex_add) ditto (rib_add_ipv4) ditto (nexthop_active_check) Add route-map processing. * zebra/zebra_routemap.c: new file for zebra route-map commands. * zebra/zebra_vty.c: (ip_protocol_cmd) Apply route-map to protocol (vty_show_ip_route_detail) added "src" printing (vty_show_ip_route) ditto (show_ip_protocol_cmd) new command, list routemaps. (config_write_protocol) write out routemap protocl config. (zebra_vty_init) Install the new routemap protocol commands. * zebra/zserv.c: (zread_ipv4_add) added (NULL) src arg (zebra_init) init zebra route-maps. * zebra/zserv.h: add zebra_route_map_init
2007-05-02 18:05:35 +02:00
DEFUN (ip_route_flags2_tag_vrf,
ip_route_flags2_tag_vrf_cmd,
"ip route A.B.C.D/M (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\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)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], argv[2], NULL, argv[3]);
}
2002-12-13 21:15:29 +01:00
/* Mask as A.B.C.D format. */
DEFUN (ip_route_mask_vrf,
ip_route_mask_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3]);
}
DEFUN (ip_route_mask_tag_vrf,
ip_route_mask_tag_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, argv[3], NULL, argv[4]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags_vrf,
ip_route_mask_flags_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], NULL, NULL, argv[4]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags_tag_vrf,
ip_route_mask_flags_tag_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP 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)
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, argv[5]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags2_vrf,
ip_route_mask_flags2_vrf_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], NULL, NULL, argv[3]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags2_tag_vrf,
ip_route_mask_flags2_tag_vrf_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\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 zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], argv[3], NULL, argv[4]);
}
/* Distance option value. */
DEFUN (ip_route_distance_vrf,
ip_route_distance_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, NULL, argv[2], argv[3]);
}
DEFUN (ip_route_tag_distance_vrf,
ip_route_tag_distance_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], NULL, argv[2], argv[3], argv[4]);
}
DEFUN (ip_route_flags_distance_vrf,
ip_route_flags_distance_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], NULL, argv[3], argv[4]);
}
DEFUN (ip_route_flags_tag_distance_vrf,
ip_route_flags_tag_distance_vrf_cmd,
"ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP 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 route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, argv[1], argv[2], argv[3], argv[4],argv[5]);
}
DEFUN (ip_route_flags_distance2_vrf,
ip_route_flags_distance2_vrf_cmd,
"ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], NULL, argv[2], argv[3]);
}
DEFUN (ip_route_flags_tag_distance2_vrf,
ip_route_flags_tag_distance2_vrf_cmd,
"ip route A.B.C.D/M (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\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 route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], NULL, NULL, argv[1], argv[2], argv[3], argv[4]);
}
DEFUN (ip_route_mask_distance_vrf,
ip_route_mask_distance_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, NULL, argv[3], argv[4]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_tag_distance_vrf,
ip_route_mask_tag_distance_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255> " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], argv[5]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags_tag_distance_vrf,
ip_route_mask_flags_tag_distance_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
}
2002-12-13 21:15:29 +01:00
DEFUN (ip_route_mask_flags_distance_vrf,
ip_route_mask_flags_distance_vrf_cmd,
"ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], argv[5]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ip_route_mask_flags_distance2_vrf,
ip_route_mask_flags_distance2_vrf_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], NULL, argv[3], argv[4]);
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
}
DEFUN (ip_route_mask_flags_tag_distance2_vrf,
ip_route_mask_flags_tag_distance2_vrf_cmd,
"ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this route\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 1, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], argv[5]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_vrf,
no_ip_route_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
NO_STR
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, NULL, NULL, argv[2]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_flags_vrf,
no_ip_route_flags_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
NO_STR
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], NULL, NULL, argv[3]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_tag_vrf,
no_ip_route_tag_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, argv[2], NULL, argv[3]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_flags_tag_vrf,
no_ip_route_flags_tag_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
NO_STR
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], argv[3], NULL, argv[4]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_flags2_vrf,
no_ip_route_flags2_vrf_cmd,
"no ip route A.B.C.D/M (reject|blackhole) " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], NULL, NULL, argv[2]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_flags2_tag_vrf,
no_ip_route_flags2_tag_vrf_cmd,
"no ip route A.B.C.D/M (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], argv[2], NULL, argv[3]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_mask_vrf,
no_ip_route_mask_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) " VRF_CMD_STR,
NO_STR
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3]);
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
}
DEFUN (no_ip_route_mask_flags_vrf,
no_ip_route_mask_flags_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) " VRF_CMD_STR,
NO_STR
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], NULL, NULL, argv[4]);
}
DEFUN (no_ip_route_mask_tag_vrf,
no_ip_route_mask_tag_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, argv[3], NULL, argv[4]);
}
DEFUN (no_ip_route_mask_flags_tag_vrf,
no_ip_route_mask_flags_tag_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], argv[4], NULL, argv[5]);
}
DEFUN (no_ip_route_mask_flags2_vrf,
no_ip_route_mask_flags2_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole) " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], NULL, NULL, argv[3]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_mask_flags2_tag_vrf,
no_ip_route_mask_flags2_tag_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], argv[3], NULL, argv[4]);
}
DEFUN (no_ip_route_distance_vrf,
no_ip_route_distance_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, NULL, argv[2], argv[3]);
}
DEFUN (no_ip_route_tag_distance_vrf,
no_ip_route_tag_distance_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], NULL, argv[2], argv[3], argv[4]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_flags_distance_vrf,
no_ip_route_flags_distance_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], NULL, argv[3], argv[4]);
}
DEFUN (no_ip_route_flags_tag_distance_vrf,
no_ip_route_flags_tag_distance_vrf_cmd,
"no ip route A.B.C.D/M (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
NO_STR
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, argv[1], argv[2], argv[3], argv[4],argv[5]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_flags_distance2_vrf,
no_ip_route_flags_distance2_vrf_cmd,
"no ip route A.B.C.D/M (reject|blackhole) <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], NULL, argv[2], argv[3]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_flags_tag_distance2_vrf,
no_ip_route_flags_tag_distance2_vrf_cmd,
"no ip route A.B.C.D/M (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix (e.g. 10.0.0.0/8)\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], NULL, NULL, argv[1], argv[2] , argv[3], argv[4]);
}
DEFUN (no_ip_route_mask_distance_vrf,
no_ip_route_mask_distance_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, NULL, argv[3], argv[4]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_mask_tag_distance_vrf,
no_ip_route_mask_tag_distance_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE|null0) tag <1-65535> <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Null interface\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], argv[5]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_mask_flags_distance_vrf,
no_ip_route_mask_flags_distance_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], argv[5]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_mask_flags_tag_distance_vrf,
no_ip_route_mask_flags_tag_distance_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (A.B.C.D|INTERFACE) (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"IP gateway address\n"
"IP gateway interface name\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ip_route_mask_flags_distance2_vrf,
no_ip_route_mask_flags_distance2_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole) <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], NULL, argv[3], argv[4]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ip_route_mask_flags_tag_distance2_vrf,
no_ip_route_mask_flags_tag_distance2_vrf_cmd,
"no ip route A.B.C.D A.B.C.D (reject|blackhole) tag <1-65535> <1-255> " VRF_CMD_STR,
NO_STR
IP_STR
"Establish static routes\n"
"IP destination prefix\n"
"IP destination prefix mask\n"
"Emit an ICMP unreachable when matched\n"
"Silently discard pkts when matched\n"
"Tag of this route\n"
"Tag value\n"
"Distance value for this route\n"
VRF_CMD_HELP_STR)
{
return zebra_static_ipv4 (vty, SAFI_UNICAST, 0, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], argv[5]);
}
/* New RIB. Detailed information for IPv4 route. */
static void
vty_show_ip_route_detail (struct vty *vty, struct route_node *rn, int mcast)
2002-12-13 21:15:29 +01:00
{
struct rib *rib;
struct nexthop *nexthop, *tnexthop;
int recursing;
char buf[BUFSIZ];
struct zebra_vrf *zvrf;
RNODE_FOREACH_RIB (rn, rib)
{
const char *mcast_info;
if (mcast)
{
rib_table_info_t *info = rn->table->info;
mcast_info = (info->safi == SAFI_MULTICAST)
? " using Multicast RIB"
: " using Unicast RIB";
}
else
mcast_info = "";
vty_out (vty, "Routing entry for %s/%d%s%s",
inet_ntoa (rn->p.u.prefix4), rn->p.prefixlen, mcast_info,
VTY_NEWLINE);
vty_out (vty, " Known via \"%s", zebra_route_string (rib->type));
if (rib->instance)
vty_out (vty, "[%d]", rib->instance);
vty_out (vty, "\"");
vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
if (rib->tag)
vty_out (vty, ", tag %d", rib->tag);
if (rib->vrf_id != VRF_DEFAULT)
{
zvrf = vrf_info_lookup(rib->vrf_id);
vty_out (vty, ", vrf %s", zvrf->name);
}
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
vty_out (vty, ", best");
if (rib->refcnt)
vty_out (vty, ", refcnt %ld", rib->refcnt);
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
vty_out (vty, ", blackhole");
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
vty_out (vty, ", reject");
vty_out (vty, "%s", VTY_NEWLINE);
#define ONE_DAY_SECOND 60*60*24
#define ONE_WEEK_SECOND 60*60*24*7
if (rib->type == ZEBRA_ROUTE_RIP
|| rib->type == ZEBRA_ROUTE_OSPF
|| rib->type == ZEBRA_ROUTE_ISIS
|| rib->type == ZEBRA_ROUTE_TABLE
|| rib->type == ZEBRA_ROUTE_BGP)
{
time_t uptime;
struct tm *tm;
2002-12-13 21:15:29 +01:00
uptime = time (NULL);
uptime -= rib->uptime;
tm = gmtime (&uptime);
vty_out (vty, " Last update ");
if (uptime < ONE_DAY_SECOND)
vty_out (vty, "%02d:%02d:%02d",
tm->tm_hour, tm->tm_min, tm->tm_sec);
else if (uptime < ONE_WEEK_SECOND)
vty_out (vty, "%dd%02dh%02dm",
tm->tm_yday, tm->tm_hour, tm->tm_min);
else
vty_out (vty, "%02dw%dd%02dh",
tm->tm_yday/7,
tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
vty_out (vty, " ago%s", VTY_NEWLINE);
}
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
{
char addrstr[32];
vty_out (vty, " %c%s",
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
recursing ? " " : "");
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
vty_out (vty, " %s", inet_ntoa (nexthop->gate.ipv4));
if (nexthop->ifindex)
vty_out (vty, ", via %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
break;
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
vty_out (vty, " %s",
inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
if (nexthop->ifindex)
vty_out (vty, ", via %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
break;
case NEXTHOP_TYPE_IFINDEX:
vty_out (vty, " directly connected, %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
break;
case NEXTHOP_TYPE_BLACKHOLE:
vty_out (vty, " directly connected, Null0");
break;
default:
break;
}
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
vty_out (vty, " inactive");
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
vty_out (vty, " onlink");
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
vty_out (vty, " (recursive)");
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
if (nexthop->src.ipv4.s_addr)
{
if (inet_ntop(AF_INET, &nexthop->src.ipv4, addrstr,
sizeof addrstr))
vty_out (vty, ", src %s", addrstr);
}
break;
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
{
if (inet_ntop(AF_INET6, &nexthop->src.ipv6, addrstr,
sizeof addrstr))
vty_out (vty, ", src %s", addrstr);
}
break;
default:
break;
}
vty_out (vty, "%s", VTY_NEWLINE);
}
vty_out (vty, "%s", VTY_NEWLINE);
}
}
static void
vty_show_ip_route (struct vty *vty, struct route_node *rn, struct rib *rib)
{
struct nexthop *nexthop, *tnexthop;
int recursing;
int len = 0;
char buf[BUFSIZ];
/* Nexthop information. */
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
{
if (nexthop == rib->nexthop)
{
/* Prefix information. */
len = vty_out (vty, "%c", zebra_route_char (rib->type));
if (rib->instance)
len += vty_out (vty, "[%d]", rib->instance);
len += vty_out (vty, "%c%c %s/%d",
CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
? '>' : ' ',
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
? '*' : ' ',
inet_ntop (AF_INET, &rn->p.u.prefix, buf, BUFSIZ),
rn->p.prefixlen);
/* Distance and metric display. */
if (rib->type != ZEBRA_ROUTE_CONNECT
&& rib->type != ZEBRA_ROUTE_KERNEL)
len += vty_out (vty, " [%d/%d]", rib->distance,
rib->metric);
}
else
vty_out (vty, " %c%*c",
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
? '*' : ' ',
len - 3 + (2 * recursing), ' ');
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
vty_out (vty, " via %s", inet_ntoa (nexthop->gate.ipv4));
if (nexthop->ifindex)
vty_out (vty, ", %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
break;
#ifdef HAVE_IPV6
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
vty_out (vty, " via %s",
inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
if (nexthop->ifindex)
vty_out (vty, ", %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
break;
#endif /* HAVE_IPV6 */
case NEXTHOP_TYPE_IFINDEX:
vty_out (vty, " is directly connected, %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
break;
case NEXTHOP_TYPE_BLACKHOLE:
vty_out (vty, " is directly connected, Null0");
break;
default:
break;
}
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
vty_out (vty, " inactive");
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
vty_out (vty, " onlink");
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
vty_out (vty, " (recursive)");
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV4:
case NEXTHOP_TYPE_IPV4_IFINDEX:
if (nexthop->src.ipv4.s_addr)
{
if (inet_ntop(AF_INET, &nexthop->src.ipv4, buf, sizeof buf))
vty_out (vty, ", src %s", buf);
}
break;
#ifdef HAVE_IPV6
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
if (!IPV6_ADDR_SAME(&nexthop->src.ipv6, &in6addr_any))
{
if (inet_ntop(AF_INET6, &nexthop->src.ipv6, buf, sizeof buf))
vty_out (vty, ", src %s", buf);
}
break;
#endif /* HAVE_IPV6 */
default:
break;
}
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
vty_out (vty, ", bh");
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
vty_out (vty, ", rej");
if (rib->type == ZEBRA_ROUTE_RIP
|| rib->type == ZEBRA_ROUTE_OSPF
|| rib->type == ZEBRA_ROUTE_ISIS
|| rib->type == ZEBRA_ROUTE_TABLE
|| rib->type == ZEBRA_ROUTE_BGP)
{
time_t uptime;
struct tm *tm;
uptime = time (NULL);
uptime -= rib->uptime;
tm = gmtime (&uptime);
#define ONE_DAY_SECOND 60*60*24
#define ONE_WEEK_SECOND 60*60*24*7
if (uptime < ONE_DAY_SECOND)
vty_out (vty, ", %02d:%02d:%02d",
tm->tm_hour, tm->tm_min, tm->tm_sec);
else if (uptime < ONE_WEEK_SECOND)
vty_out (vty, ", %dd%02dh%02dm",
tm->tm_yday, tm->tm_hour, tm->tm_min);
else
vty_out (vty, ", %02dw%dd%02dh",
tm->tm_yday/7,
tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
}
vty_out (vty, "%s", VTY_NEWLINE);
}
}
DEFUN (show_ip_route,
show_ip_route_cmd,
"show ip route",
SHOW_STR
IP_STR
"IP routing table\n")
{
return do_show_ip_route (vty, VRF_DEFAULT_NAME, SAFI_UNICAST);
}
static int
do_show_ip_route(struct vty *vty, const char *vrf_name, safi_t safi)
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
struct zebra_vrf *zvrf = NULL;
if (!(zvrf = zebra_vrf_list_lookup_by_name (vrf_name)))
{
vty_out (vty, "vrf %s not defined%s", vrf_name, VTY_NEWLINE);
return CMD_SUCCESS;
}
if (zvrf->vrf_id == VRF_UNKNOWN)
{
vty_out (vty, "vrf %s inactive%s", vrf_name, VTY_NEWLINE);
return CMD_SUCCESS;
}
table = zebra_vrf_table (AFI_IP, safi, zvrf->vrf_id);
if (! table)
return CMD_SUCCESS;
/* 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;
}
vty_show_ip_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ip_route,
show_ip_route_vrf_cmd,
"show ip route " VRF_CMD_STR,
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR)
DEFUN (show_ip_nht,
show_ip_nht_cmd,
"show ip nht",
SHOW_STR
IP_STR
"IP nexthop tracking table\n")
{
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc)
VRF_GET_ID (vrf_id, argv[0]);
zebra_print_rnh_table(vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE);
return CMD_SUCCESS;
}
ALIAS (show_ip_nht,
show_ip_nht_vrf_cmd,
"show ip nht " VRF_CMD_STR,
SHOW_STR
IP_STR
"IP nexthop tracking table\n"
VRF_CMD_HELP_STR)
DEFUN (show_ip_nht_vrf_all,
show_ip_nht_vrf_all_cmd,
"show ip nht " VRF_ALL_CMD_STR,
SHOW_STR
IP_STR
"IP nexthop tracking table\n"
VRF_ALL_CMD_HELP_STR)
{
struct zebra_vrf *zvrf;
vrf_iter_t iter;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
if ((zvrf = vrf_iter2info (iter)) != NULL)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
zebra_print_rnh_table(zvrf->vrf_id, AF_INET, vty, RNH_NEXTHOP_TYPE);
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_nht,
show_ipv6_nht_cmd,
"show ipv6 nht",
SHOW_STR
IPV6_STR
"IPv6 nexthop tracking table\n")
{
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc)
VRF_GET_ID (vrf_id, argv[0]);
zebra_print_rnh_table(vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE);
return CMD_SUCCESS;
}
ALIAS (show_ipv6_nht,
show_ipv6_nht_vrf_cmd,
"show ipv6 nht " VRF_CMD_STR,
SHOW_STR
IPV6_STR
"IPv6 nexthop tracking table\n"
VRF_CMD_HELP_STR)
DEFUN (show_ipv6_nht_vrf_all,
show_ipv6_nht_vrf_all_cmd,
"show ipv6 nht " VRF_ALL_CMD_STR,
SHOW_STR
IP_STR
"IPv6 nexthop tracking table\n"
VRF_ALL_CMD_HELP_STR)
{
struct zebra_vrf *zvrf;
vrf_iter_t iter;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
if ((zvrf = vrf_iter2info (iter)) != NULL)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
zebra_print_rnh_table(zvrf->vrf_id, AF_INET6, vty, RNH_NEXTHOP_TYPE);
}
return CMD_SUCCESS;
}
DEFUN (ip_nht_default_route,
ip_nht_default_route_cmd,
"ip nht resolve-via-default",
IP_STR
"Filter Next Hop tracking route resolution\n"
"Resolve via default route\n")
{
if (zebra_rnh_ip_default_route)
return CMD_SUCCESS;
zebra_rnh_ip_default_route = 1;
zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
return CMD_SUCCESS;
}
DEFUN (no_ip_nht_default_route,
no_ip_nht_default_route_cmd,
"no ip nht resolve-via-default",
NO_STR
IP_STR
"Filter Next Hop tracking route resolution\n"
"Resolve via default route\n")
{
if (!zebra_rnh_ip_default_route)
return CMD_SUCCESS;
zebra_rnh_ip_default_route = 0;
zebra_evaluate_rnh(0, AF_INET, 1, RNH_NEXTHOP_TYPE, NULL);
return CMD_SUCCESS;
}
DEFUN (ipv6_nht_default_route,
ipv6_nht_default_route_cmd,
"ipv6 nht resolve-via-default",
IP6_STR
"Filter Next Hop tracking route resolution\n"
"Resolve via default route\n")
{
if (zebra_rnh_ipv6_default_route)
return CMD_SUCCESS;
zebra_rnh_ipv6_default_route = 1;
zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
return CMD_SUCCESS;
}
DEFUN (no_ipv6_nht_default_route,
no_ipv6_nht_default_route_cmd,
"no ipv6 nht resolve-via-default",
NO_STR
IP6_STR
"Filter Next Hop tracking route resolution\n"
"Resolve via default route\n")
{
if (!zebra_rnh_ipv6_default_route)
return CMD_SUCCESS;
zebra_rnh_ipv6_default_route = 0;
zebra_evaluate_rnh(0, AF_INET6, 1, RNH_NEXTHOP_TYPE, NULL);
return CMD_SUCCESS;
}
DEFUN (show_ip_route_tag,
show_ip_route_tag_cmd,
"show ip route tag <1-65535>",
SHOW_STR
IP_STR
"IP routing table\n"
"Show only routes with tag\n"
"Tag value\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
u_short tag = 0;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 1)
{
tag = atoi(argv[1]);
VRF_GET_ID (vrf_id, argv[0]);
}
else
tag = atoi(argv[0]);
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
/* 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;
}
vty_show_ip_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ip_route_tag,
show_ip_route_vrf_tag_cmd,
"show ip route " VRF_CMD_STR " tag <1-65535>",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
"Show only routes with tag\n"
"Tag value\n")
DEFUN (show_ip_route_prefix_longer,
show_ip_route_prefix_longer_cmd,
"show ip route A.B.C.D/M longer-prefixes",
SHOW_STR
IP_STR
"IP routing table\n"
"IP prefix <network>/<length>, e.g., 35.0.0.0/8\n"
"Show route matching the specified Network/Mask pair only\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct prefix p;
int ret;
int first = 1;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 1)
{
ret = str2prefix (argv[1], &p);
VRF_GET_ID (vrf_id, argv[0]);
}
else
ret = str2prefix (argv[0], &p);
if (! ret)
{
vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
/* 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;
}
vty_show_ip_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ip_route_prefix_longer,
show_ip_route_vrf_prefix_longer_cmd,
"show ip route " VRF_CMD_STR " A.B.C.D/M longer-prefixes",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_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")
DEFUN (show_ip_route_supernets,
show_ip_route_supernets_cmd,
"show ip route supernets-only",
SHOW_STR
IP_STR
"IP routing table\n"
"Show supernet entries only\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
u_int32_t addr;
int first = 1;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 0)
VRF_GET_ID (vrf_id, argv[0]);
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
/* 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;
}
vty_show_ip_route (vty, rn, rib);
}
}
return CMD_SUCCESS;
}
ALIAS (show_ip_route_supernets,
show_ip_route_vrf_supernets_cmd,
"show ip route " VRF_CMD_STR " supernets-only",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
"Show supernet entries only\n")
DEFUN (show_ip_route_protocol,
show_ip_route_protocol_cmd,
"show ip route " QUAGGA_IP_REDIST_STR_ZEBRA,
SHOW_STR
IP_STR
"IP routing table\n"
QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
{
int type;
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 1)
{
type = proto_redistnum (AFI_IP, argv[1]);
VRF_GET_ID (vrf_id, argv[0]);
}
else
type = proto_redistnum (AFI_IP, argv[0]);
if (type < 0)
{
vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
/* 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;
}
vty_show_ip_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ip_route_protocol,
show_ip_route_vrf_protocol_cmd,
"show ip route " VRF_CMD_STR " " QUAGGA_IP_REDIST_STR_ZEBRA,
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
QUAGGA_IP_REDIST_HELP_STR_ZEBRA)
DEFUN (show_ip_route_ospf_instance,
show_ip_route_ospf_instance_cmd,
"show ip route ospf <1-65535>",
SHOW_STR
IP_STR
"IP routing table\n"
"Open Shortest Path First (OSPFv2)\n"
"Instance ID\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
u_short instance = 0;
VTY_GET_INTEGER ("Instance", instance, argv[0]);
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, VRF_DEFAULT);
if (! table)
return CMD_SUCCESS;
/* Show matched type IPv4 routes. */
for (rn = route_top (table); rn; rn = route_next (rn))
RNODE_FOREACH_RIB (rn, rib)
if (rib->type == ZEBRA_ROUTE_OSPF && rib->instance == instance)
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V4_HEADER);
first = 0;
}
vty_show_ip_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_addr,
show_ip_route_addr_cmd,
"show ip route A.B.C.D",
SHOW_STR
IP_STR
"IP routing table\n"
"Network in the IP routing table to display\n")
{
int ret;
struct prefix_ipv4 p;
struct route_table *table;
struct route_node *rn;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 1)
{
VRF_GET_ID (vrf_id, argv[0]);
ret = str2prefix_ipv4 (argv[1], &p);
}
else
ret = str2prefix_ipv4 (argv[0], &p);
if (ret <= 0)
{
vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
rn = route_node_match (table, (struct prefix *) &p);
if (! rn)
{
vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
return CMD_WARNING;
}
vty_show_ip_route_detail (vty, rn, 0);
route_unlock_node (rn);
return CMD_SUCCESS;
}
ALIAS (show_ip_route_addr,
show_ip_route_vrf_addr_cmd,
"show ip route " VRF_CMD_STR " A.B.C.D",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
"Network in the IP routing table to display\n")
DEFUN (show_ip_route_prefix,
show_ip_route_prefix_cmd,
"show ip route A.B.C.D/M",
SHOW_STR
IP_STR
"IP routing table\n"
"IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
{
int ret;
struct prefix_ipv4 p;
struct route_table *table;
struct route_node *rn;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 1)
{
VRF_GET_ID (vrf_id, argv[0]);
ret = str2prefix_ipv4 (argv[1], &p);
}
else
ret = str2prefix_ipv4 (argv[0], &p);
if (ret <= 0)
{
vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
rn = route_node_match (table, (struct prefix *) &p);
if (! rn || rn->p.prefixlen != p.prefixlen)
{
vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
return CMD_WARNING;
}
vty_show_ip_route_detail (vty, rn, 0);
route_unlock_node (rn);
return CMD_SUCCESS;
}
ALIAS (show_ip_route_prefix,
show_ip_route_vrf_prefix_cmd,
"show ip route " VRF_CMD_STR " A.B.C.D/M",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
"IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
static void
vty_show_ip_route_summary (struct vty *vty, struct route_table *table)
{
struct route_node *rn;
struct rib *rib;
#define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX
#define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
u_int32_t i;
u_int32_t is_ibgp;
memset (&rib_cnt, 0, sizeof(rib_cnt));
memset (&fib_cnt, 0, sizeof(fib_cnt));
for (rn = route_top (table); rn; rn = route_next (rn))
RNODE_FOREACH_RIB (rn, rib)
{
is_ibgp = (rib->type == ZEBRA_ROUTE_BGP &&
CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP));
rib_cnt[ZEBRA_ROUTE_TOTAL]++;
if (is_ibgp)
rib_cnt[ZEBRA_ROUTE_IBGP]++;
else
rib_cnt[rib->type]++;
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
{
fib_cnt[ZEBRA_ROUTE_TOTAL]++;
if (is_ibgp)
fib_cnt[ZEBRA_ROUTE_IBGP]++;
else
fib_cnt[rib->type]++;
}
}
vty_out (vty, "%-20s %-20s %s (vrf %s)%s",
"Route Source", "Routes", "FIB",
((rib_table_info_t *)table->info)->zvrf->name,
VTY_NEWLINE);
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
{
if ((rib_cnt[i] > 0) ||
(i == ZEBRA_ROUTE_BGP && rib_cnt[ZEBRA_ROUTE_IBGP] > 0))
{
if (i == ZEBRA_ROUTE_BGP)
{
vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
rib_cnt[ZEBRA_ROUTE_BGP], fib_cnt[ZEBRA_ROUTE_BGP],
VTY_NEWLINE);
vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
VTY_NEWLINE);
}
else
vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
}
}
vty_out (vty, "------%s", VTY_NEWLINE);
vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
vty_out (vty, "%s", VTY_NEWLINE);
}
/*
* Implementation of the ip route summary prefix command.
*
* This command prints the primary prefixes that have been installed by various
* protocols on the box.
*
*/
static void
vty_show_ip_route_summary_prefix (struct vty *vty, struct route_table *table)
{
struct route_node *rn;
struct rib *rib;
struct nexthop *nexthop;
#define ZEBRA_ROUTE_IBGP ZEBRA_ROUTE_MAX
#define ZEBRA_ROUTE_TOTAL (ZEBRA_ROUTE_IBGP + 1)
u_int32_t rib_cnt[ZEBRA_ROUTE_TOTAL + 1];
u_int32_t fib_cnt[ZEBRA_ROUTE_TOTAL + 1];
u_int32_t i;
int cnt;
memset (&rib_cnt, 0, sizeof(rib_cnt));
memset (&fib_cnt, 0, sizeof(fib_cnt));
for (rn = route_top (table); rn; rn = route_next (rn))
RNODE_FOREACH_RIB (rn, rib)
{
/*
* In case of ECMP, count only once.
*/
cnt = 0;
for (nexthop = rib->nexthop; (!cnt && nexthop); nexthop = nexthop->next)
{
cnt++;
rib_cnt[ZEBRA_ROUTE_TOTAL]++;
rib_cnt[rib->type]++;
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
{
fib_cnt[ZEBRA_ROUTE_TOTAL]++;
fib_cnt[rib->type]++;
}
if (rib->type == ZEBRA_ROUTE_BGP &&
CHECK_FLAG (rib->flags, ZEBRA_FLAG_IBGP))
{
rib_cnt[ZEBRA_ROUTE_IBGP]++;
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB))
fib_cnt[ZEBRA_ROUTE_IBGP]++;
}
}
}
vty_out (vty, "%-20s %-20s %s (vrf %s)%s",
"Route Source", "Prefix Routes", "FIB",
((rib_table_info_t *)table->info)->zvrf->name,
VTY_NEWLINE);
for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
{
if (rib_cnt[i] > 0)
{
if (i == ZEBRA_ROUTE_BGP)
{
vty_out (vty, "%-20s %-20d %-20d %s", "ebgp",
rib_cnt[ZEBRA_ROUTE_BGP] - rib_cnt[ZEBRA_ROUTE_IBGP],
fib_cnt[ZEBRA_ROUTE_BGP] - fib_cnt[ZEBRA_ROUTE_IBGP],
VTY_NEWLINE);
vty_out (vty, "%-20s %-20d %-20d %s", "ibgp",
rib_cnt[ZEBRA_ROUTE_IBGP], fib_cnt[ZEBRA_ROUTE_IBGP],
VTY_NEWLINE);
}
else
vty_out (vty, "%-20s %-20d %-20d %s", zebra_route_string(i),
rib_cnt[i], fib_cnt[i], VTY_NEWLINE);
}
}
vty_out (vty, "------%s", VTY_NEWLINE);
vty_out (vty, "%-20s %-20d %-20d %s", "Totals", rib_cnt[ZEBRA_ROUTE_TOTAL],
fib_cnt[ZEBRA_ROUTE_TOTAL], VTY_NEWLINE);
vty_out (vty, "%s", VTY_NEWLINE);
}
2002-12-13 21:15:29 +01:00
/* Show route summary. */
DEFUN (show_ip_route_summary,
show_ip_route_summary_cmd,
"show ip route summary",
SHOW_STR
IP_STR
"IP routing table\n"
"Summary of all routes\n")
{
struct route_table *table;
vrf_id_t vrf_id = VRF_DEFAULT;
2002-12-13 21:15:29 +01:00
if (argc > 0)
VRF_GET_ID (vrf_id, argv[0]);
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
2002-12-13 21:15:29 +01:00
vty_show_ip_route_summary (vty, table);
2002-12-13 21:15:29 +01:00
return CMD_SUCCESS;
}
ALIAS (show_ip_route_summary,
show_ip_route_vrf_summary_cmd,
"show ip route " VRF_CMD_STR " summary",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
"Summary of all routes\n")
/* Show route summary prefix. */
DEFUN (show_ip_route_summary_prefix,
show_ip_route_summary_prefix_cmd,
"show ip route summary prefix",
SHOW_STR
IP_STR
"IP routing table\n"
"Summary of all routes\n"
"Prefix routes\n")
{
struct route_table *table;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 0)
VRF_GET_ID (vrf_id, argv[0]);
table = zebra_vrf_table (AFI_IP, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
vty_show_ip_route_summary_prefix (vty, table);
return CMD_SUCCESS;
}
ALIAS (show_ip_route_summary_prefix,
show_ip_route_vrf_summary_prefix_cmd,
"show ip route " VRF_CMD_STR " summary prefix",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
"Summary of all routes\n"
"Prefix routes\n")
DEFUN (show_ip_route_vrf_all,
show_ip_route_vrf_all_cmd,
"show ip route " VRF_ALL_CMD_STR,
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR)
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int first = 1;
int vrf_header = 1;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
continue;
/* 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;
}
if (vrf_header)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ip_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_tag,
show_ip_route_vrf_all_tag_cmd,
"show ip route " VRF_ALL_CMD_STR " tag <1-65535>",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
"Show only routes with tag\n"
"Tag value\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int first = 1;
int vrf_header = 1;
u_short tag = 0;
if (argv[0])
tag = atoi(argv[0]);
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == 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, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ip_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_prefix_longer,
show_ip_route_vrf_all_prefix_longer_cmd,
"show ip route " VRF_ALL_CMD_STR " A.B.C.D/M longer-prefixes",
SHOW_STR
IP_STR
"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")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct prefix p;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int ret;
int first = 1;
int vrf_header = 1;
ret = str2prefix (argv[0], &p);
if (! ret)
{
vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == 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, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ip_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_supernets,
show_ip_route_vrf_all_supernets_cmd,
"show ip route " VRF_ALL_CMD_STR " supernets-only",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
"Show supernet entries only\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
u_int32_t addr;
int first = 1;
int vrf_header = 1;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == 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, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ip_route (vty, rn, rib);
}
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_protocol,
show_ip_route_vrf_all_protocol_cmd,
"show ip route " VRF_ALL_CMD_STR " " QUAGGA_IP_REDIST_STR_ZEBRA,
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
QUAGGA_IP_REDIST_HELP_STR_ZEBRA"\n")
{
int type;
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int first = 1;
int vrf_header = 1;
type = proto_redistnum (AFI_IP, argv[0]);
if (type < 0)
{
vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == 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 (rib->type == type)
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V4_HEADER);
first = 0;
}
if (vrf_header)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ip_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_addr,
show_ip_route_vrf_all_addr_cmd,
"show ip route " VRF_ALL_CMD_STR " A.B.C.D",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
"Network in the IP routing table to display\n")
{
int ret;
struct prefix_ipv4 p;
struct route_table *table;
struct route_node *rn;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
ret = str2prefix_ipv4 (argv[0], &p);
if (ret <= 0)
{
vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
continue;
rn = route_node_match (table, (struct prefix *) &p);
if (! rn)
continue;
vty_show_ip_route_detail (vty, rn, 0);
route_unlock_node (rn);
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_prefix,
show_ip_route_vrf_all_prefix_cmd,
"show ip route " VRF_ALL_CMD_STR " A.B.C.D/M",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
"IP prefix <network>/<length>, e.g., 35.0.0.0/8\n")
{
int ret;
struct prefix_ipv4 p;
struct route_table *table;
struct route_node *rn;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
ret = str2prefix_ipv4 (argv[0], &p);
if (ret <= 0)
{
vty_out (vty, "%% Malformed IPv4 address%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == 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);
}
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_summary,
show_ip_route_vrf_all_summary_cmd,
"show ip route " VRF_ALL_CMD_STR " summary ",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
"Summary of all routes\n")
{
struct zebra_vrf *zvrf;
vrf_iter_t iter;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
if ((zvrf = vrf_iter2info (iter)) != NULL)
vty_show_ip_route_summary (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
return CMD_SUCCESS;
}
DEFUN (show_ip_route_vrf_all_summary_prefix,
show_ip_route_vrf_all_summary_prefix_cmd,
"show ip route " VRF_ALL_CMD_STR " summary prefix",
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
"Summary of all routes\n"
"Prefix routes\n")
{
struct zebra_vrf *zvrf;
vrf_iter_t iter;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
if ((zvrf = vrf_iter2info (iter)) != NULL)
vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP][SAFI_UNICAST]);
return CMD_SUCCESS;
}
/* Write IPv4 static route configuration. */
static int
static_config_ipv4 (struct vty *vty, safi_t safi, const char *cmd)
{
struct route_node *rn;
struct static_route *si;
struct route_table *stable;
struct zebra_vrf *zvrf;
int write =0;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO (zvrf_list, node, zvrf))
{
if ((stable = zvrf->stable[AFI_IP][safi]) == NULL)
continue;
for (rn = route_top (stable); rn; rn = route_next (rn))
for (si = rn->info; si; si = si->next)
{
vty_out (vty, "%s %s/%d", cmd, inet_ntoa (rn->p.u.prefix4),
rn->p.prefixlen);
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_IPV4_BLACKHOLE:
vty_out (vty, " Null0");
break;
}
/* flags are incompatible with STATIC_IPV4_BLACKHOLE */
if (si->type != STATIC_IPV4_BLACKHOLE)
{
if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
vty_out (vty, " %s", "reject");
if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
vty_out (vty, " %s", "blackhole");
}
if (si->tag)
vty_out (vty, " tag %d", si->tag);
if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
vty_out (vty, " %d", si->distance);
if (si->vrf_id != VRF_DEFAULT)
vty_out (vty, " vrf %s", zvrf ? zvrf->name : "");
vty_out (vty, "%s", VTY_NEWLINE);
write = 1;
}
}
return write;
}
#ifdef HAVE_IPV6
/* General fucntion for IPv6 static route. */
static 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)
{
int ret;
u_char distance;
struct prefix p;
struct in6_addr *gate = NULL;
struct in6_addr gate_addr;
u_char type = 0;
u_char flag = 0;
u_short tag = 0;
unsigned int ifindex = 0;
struct interface *ifp = NULL;
struct zebra_vrf *zvrf;
ret = str2prefix (dest_str, &p);
if (ret <= 0)
{
vty_out (vty, "%% Malformed address%s", VTY_NEWLINE);
return CMD_WARNING;
}
/* Apply mask for given prefix. */
apply_mask (&p);
/* 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;
}
}
/* Administrative distance. */
if (distance_str)
distance = atoi (distance_str);
else
distance = ZEBRA_STATIC_DISTANCE_DEFAULT;
/* tag */
if (tag_str)
tag = atoi(tag_str);
/* 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);
/* VRF id */
zvrf = zebra_vrf_list_lookup_by_name (vrf_id_str);
if (!zvrf)
{
vty_out (vty, "%% vrf %s is not defined%s", vrf_id_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->vrf_id);
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->vrf_id);
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_ipv6 (&p, type, gate, ifindex, ifname, flag, tag, distance, zvrf);
else
static_delete_ipv6 (&p, type, gate, ifindex, tag, distance, zvrf);
return CMD_SUCCESS;
}
DEFUN (ipv6_route,
ipv6_route_cmd,
"ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE)",
2002-12-13 21:15:29 +01:00
IP_STR
"Establish static routes\n"
"IPv6 destination prefix (e.g. 3ffe:506::/32)\n"
"IPv6 gateway address\n"
"IPv6 gateway interface name\n")
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, NULL, NULL);
}
2002-12-13 21:15:29 +01:00
DEFUN (ipv6_route_tag,
ipv6_route_tag_cmd,
"ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) tag <1-65535>",
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, 1, argv[0], argv[1], NULL, NULL, argv[2], NULL, NULL);
}
2002-12-13 21:15:29 +01:00
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);
}
2002-12-13 21:15:29 +01:00
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-65535>",
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);
}
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);
}
DEFUN (ipv6_route_ifname_tag,
ipv6_route_ifname_tag_cmd,
"ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-65535>",
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, 1, argv[0], argv[1], argv[2], NULL, argv[3], NULL, NULL);
}
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);
}
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-65535>",
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], argv[2], argv[3], argv[4], NULL, NULL);
}
DEFUN (ipv6_route_pref,
ipv6_route_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], NULL, NULL, NULL, argv[2], NULL);
}
DEFUN (ipv6_route_pref_tag,
ipv6_route_pref_tag_cmd,
"ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) tag <1-65535> <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], NULL, NULL, argv[2], argv[3], NULL);
}
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>",
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")
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, argv[2], NULL, argv[3], NULL);
}
2002-12-13 21:15:29 +01:00
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-65535> <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);
}
2002-12-13 21:15:29 +01:00
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);
}
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-65535> <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);
2002-12-13 21:15:29 +01:00
}
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);
}
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-65535> <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")
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], NULL);
}
DEFUN (no_ipv6_route,
no_ipv6_route_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], NULL, NULL, NULL, NULL, NULL);
}
DEFUN (no_ipv6_route_tag,
no_ipv6_route_tag_cmd,
"no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) tag <1-65535>",
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], NULL, NULL, argv[2], NULL, NULL);
}
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);
}
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-65535>",
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);
}
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);
2002-12-13 21:15:29 +01:00
}
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-65535>",
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);
}
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);
}
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-65535>",
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], argv[2], argv[3], argv[4], NULL, NULL);
}
2002-12-13 21:15:29 +01:00
DEFUN (no_ipv6_route_pref,
no_ipv6_route_pref_cmd,
"no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <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"
"Distance value for this prefix\n")
{
return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, argv[2], NULL);
}
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) tag <1-65535> <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], NULL, NULL, argv[2], argv[3], NULL);
}
2002-12-13 21:15:29 +01:00
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);
}
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-65535> <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")
2002-12-13 21:15:29 +01:00
{
/* 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);
}
2002-12-13 21:15:29 +01:00
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
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, 0, argv[0], argv[1], argv[2], NULL, NULL, argv[3], NULL);
}
2002-12-13 21:15:29 +01:00
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-65535> <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);
}
2002-12-13 21:15:29 +01:00
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);
2002-12-13 21:15:29 +01:00
}
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-65535> <1-255>",
NO_STR
2002-12-13 21:15:29 +01:00
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")
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], NULL);
}
DEFUN (ipv6_route_vrf,
ipv6_route_vrf_cmd,
"ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
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)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, NULL, argv[2]);
}
DEFUN (ipv6_route_tag_vrf,
ipv6_route_tag_vrf_cmd,
"ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) tag <1-65535> " 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], NULL, NULL, argv[2], NULL, argv[3]);
}
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]);
}
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-65535> " 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]);
2002-12-13 21:15:29 +01:00
}
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,
2002-12-13 21:15:29 +01:00
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)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3]);
}
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-65535> " 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]);
}
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]);
}
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-65535> " 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]);
2002-12-13 21:15:29 +01:00
}
DEFUN (ipv6_route_pref_vrf,
ipv6_route_pref_vrf_cmd,
"ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255> " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
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)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 1, argv[0], argv[1], NULL, NULL, NULL, argv[2], argv[3]);
}
DEFUN (ipv6_route_pref_tag_vrf,
ipv6_route_pref_tag_vrf_cmd,
"ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) tag <1-65535> <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], NULL, NULL, argv[2], argv[3], argv[4]);
}
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]);
}
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-65535> <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]);
2002-12-13 21:15:29 +01:00
}
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,
2002-12-13 21:15:29 +01:00
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)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 1, argv[0], argv[1], argv[2], NULL, NULL, argv[3], argv[4]);
}
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-65535> <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]);
}
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]);
}
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-65535> <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]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ipv6_route_vrf,
no_ipv6_route_vrf_cmd,
"no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
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)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, NULL, argv[2]);
}
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) tag <1-65535> " 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"
"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]);
2002-12-13 21:15:29 +01:00
}
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]);
}
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-65535> " 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]);
}
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,
2002-12-13 21:15:29 +01:00
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)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, NULL, argv[3]);
}
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-65535> " 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"
"Set tag for this route\n"
"Tag value\n"
VRF_CMD_HELP_STR)
{
return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], NULL, argv[4]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ipv6_route_ifname_flags_vrf,
no_ipv6_route_ifname_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], argv[2], argv[3], NULL, NULL, argv[4]);
}
DEFUN (no_ipv6_route_ifname_flags_tag_vrf,
no_ipv6_route_ifname_flags_tag_vrf_cmd,
"no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-65535> " 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], argv[2], argv[3], argv[4], NULL, argv[5]);
}
DEFUN (no_ipv6_route_pref_vrf,
no_ipv6_route_pref_vrf_cmd,
"no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) <1-255> " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
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"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, NULL, argv[2], argv[3]);
}
DEFUN (no_ipv6_route_pref_tag_vrf,
no_ipv6_route_pref_tag_vrf_cmd,
"no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) tag <1-65535> <1-255> " 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"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
{
return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, NULL, argv[2], argv[3], argv[4]);
}
DEFUN (no_ipv6_route_flags_pref_vrf,
no_ipv6_route_flags_pref_vrf_cmd,
"no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) <1-255> " 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"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
{
/* We do not care about argv[2] */
return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], NULL, argv[3], argv[4]);
}
DEFUN (no_ipv6_route_flags_pref_tag_vrf,
no_ipv6_route_flags_pref_tag_vrf_cmd,
"no ipv6 route X:X::X:X/M (X:X::X:X|INTERFACE) (reject|blackhole) tag <1-65535> <1-255> " 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"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
{
/* We do not care about argv[2] */
return static_ipv6_func (vty, 0, argv[0], argv[1], NULL, argv[2], argv[3], argv[4], argv[5]);
2002-12-13 21:15:29 +01:00
}
DEFUN (no_ipv6_route_ifname_pref_vrf,
no_ipv6_route_ifname_pref_vrf_cmd,
"no ipv6 route X:X::X:X/M X:X::X:X INTERFACE <1-255> " VRF_CMD_STR,
2002-12-13 21:15:29 +01:00
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"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
2002-12-13 21:15:29 +01:00
{
return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, NULL, argv[3], argv[4]);
}
DEFUN (no_ipv6_route_ifname_pref_tag_vrf,
no_ipv6_route_ifname_pref_tag_vrf_cmd,
"no ipv6 route X:X::X:X/M X:X::X:X INTERFACE tag <1-65535> <1-255> " 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"
"Set tag for this route\n"
"Tag value\n"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
{
return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], NULL, argv[3], argv[4], argv[5]);
}
DEFUN (no_ipv6_route_ifname_flags_pref_vrf,
no_ipv6_route_ifname_flags_pref_vrf_cmd,
"no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) <1-255> " 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"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
{
return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], NULL, argv[4], argv[5]);
}
DEFUN (no_ipv6_route_ifname_flags_pref_tag_vrf,
no_ipv6_route_ifname_flags_pref_tag_vrf_cmd,
"no ipv6 route X:X::X:X/M X:X::X:X INTERFACE (reject|blackhole) tag <1-65535> <1-255> " 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"
"Distance value for this prefix\n"
VRF_CMD_HELP_STR)
{
return static_ipv6_func (vty, 0, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]);
2002-12-13 21:15:29 +01:00
}
/* New RIB. Detailed information for IPv6 route. */
static void
2002-12-13 21:15:29 +01:00
vty_show_ipv6_route_detail (struct vty *vty, struct route_node *rn)
{
struct rib *rib;
struct nexthop *nexthop, *tnexthop;
int recursing;
2002-12-13 21:15:29 +01:00
char buf[BUFSIZ];
struct zebra_vrf *zvrf;
2002-12-13 21:15:29 +01:00
zebra: add structure to hold per-prefix state in RIB Add the rib_dest_t structure to hold per-prefix state in the routing information base. This gives us an appropriate place to maintain the queueing state of a route_node. Queuing state was previously being stored on the first rib in the list of ribs hanging off the route_node. * zebra/rib.h - Add new structure rib_dest_t. - Remove the rn_status field from 'struct rib', it is no longer required. - Add macros (RNODE_FOREACH_RIB, RNODE_FOREACH_RIB_SAFE) for walking all 'struct ribs' corresponding to a route_node. These hide the fact that there is an intermediate rib_dest_t structure. - Add a few utility inlines to go between a rib_dest_t and associated structures. * zebra/zebra_rib.c - rib_link()/rib_unlink() Tweak for new behavior, where the 'info' pointer of a route_node points to a rib_dest_t. The list of ribs for a prefix now hangs off of the dest. Change the way we ref count route_nodes. We now hold a single ref count on a route_node if there is a corresponding rib_dest_t. - Maintain the queuing state of a route_node on the flags field of the rib_dest_t. - Add the rib_gc_dest() function, which deletes a rib_dest_t if it is no longer required. A rib_dest_t can be deleted iff there are no struct ribs hanging off of it. - Call rib_gc_dest() any time we unlink a rib from the rib_dest_t. Currently we only need to call it once, just before we return from rib_process(). * zebra/{redistribute,zebra_rib,zebra_snmp,zebra_vty}.c Use new macros to walk over route_node ribs. * lib/memtypes.c Add memory type for rib_dest_t. Signed-off-by: Avneesh Sachdev <avneesh@opensourcerouting.org> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-13 23:48:53 +01:00
RNODE_FOREACH_RIB (rn, rib)
2002-12-13 21:15:29 +01:00
{
vty_out (vty, "Routing entry for %s/%d%s",
inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
rn->p.prefixlen,
VTY_NEWLINE);
2005-10-01 Andrew J. Schorr <ajschorr@alumni.princeton.edu> * zebra.h: Declare new functions zebra_route_string() and zebra_route_char(). * log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New functions to map zebra route numbers to strings. * zebra_vty.c: (route_type_str) Remove obsolete function: use new library function zebra_route_string() instead. Note that there are a few differences: for IPv6 routes, we now get "ripng" and "ospf6" instead of the old behavior ("rip" and "ospf"). (route_type_char) Remove obsolete function: ues new library function zebra_route_char() instead. Note that there is one difference: the old function returned 'S' for a ZEBRA_ROUTE_SYSTEM route, whereas the new one returns 'X'. (vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace route_type_str() with zebra_route_string(). (vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char() with zebra_route_char(). * bgp_vty.c: (bgp_config_write_redistribute) Use new library function zebra_route_string instead of a local hard-coded table. * ospf6_asbr.c: Remove local hard-coded tables zroute_name and zroute_abname. Change the ZROUTE_NAME macro to use new library function zebra_route_string(). Remove the ZROUTE_ABNAME macro. (ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with a call to zebra_route_char(), and be sure to fix the format string, since we now have a char instead of a char *. * ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and zebra_route_abname. Note that the zebra_route_name[] table contained mixed-case strings, whereas the zebra_route_string() function returns lower-case strings. (ospf6_zebra_read_ipv6): Change debug message to use new library function zebra_route_string() instead of zebra_route_name[]. (show_zebra): Use new library function zebra_route_string() instead of zebra_route_name[]. * ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto. (ospf_redist_string) New function implemented using new library function zebra_route_string(). Note that there are a few differences in the output that will result: the new function returns strings that are lower-case, whereas the old table was mixed case. Also, the old table mapped ZEBRA_ROUTE_OSPF6 to "OSPFv3", whereas the new function returns "ospf6". * ospfd.h: Remove extern struct message ospf_redistributed_proto[], and add extern const char *ospf_redist_string(u_int route_type) instead. * ospf_asbr.c: (ospf_external_info_add) In two messages, use ospf_redist_string instead of LOOKUP(ospf_redistributed_proto). * ospf_vty.c: Remove local hard-coded table distribute_str. (config_write_ospf_redistribute,config_write_ospf_distribute): Use new library function zebra_route_string() instead of distribute_str[]. * ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset, ospf_redistribute_default_set,ospf_redistribute_check) In debug messages, use ospf_redist_string() instead of LOOKUP(ospf_redistributed_proto). * rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded table str[]. Replace str[] with calls to new library function zebra_route_string(). * ripd.c: Remove local hard-coded table route_info[]. (show_ip_rip) Replace uses of str[] with calls to new library functions zebra_route_char and zebra_route_string. * ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded table str[]. Replace str[i] with new library function zebra_route_string(i). * ripngd.c: Remove local hard-coded table route_info[]. (show_ipv6_ripng) Use new library function zebra_route_char() instead of table route_info[].
2005-10-01 19:38:06 +02:00
vty_out (vty, " Known via \"%s\"", zebra_route_string (rib->type));
vty_out (vty, ", distance %u, metric %u", rib->distance, rib->metric);
if (rib->tag)
vty_out (vty, ", tag %d", rib->tag);
if (rib->vrf_id != VRF_DEFAULT)
{
zvrf = vrf_info_lookup(rib->vrf_id);
vty_out (vty, ", vrf %s", zvrf->name);
}
2002-12-13 21:15:29 +01:00
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED))
vty_out (vty, ", best");
if (rib->refcnt)
vty_out (vty, ", refcnt %ld", rib->refcnt);
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
vty_out (vty, ", blackhole");
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
vty_out (vty, ", reject");
2002-12-13 21:15:29 +01:00
vty_out (vty, "%s", VTY_NEWLINE);
#define ONE_DAY_SECOND 60*60*24
#define ONE_WEEK_SECOND 60*60*24*7
if (rib->type == ZEBRA_ROUTE_RIPNG
|| rib->type == ZEBRA_ROUTE_OSPF6
|| rib->type == ZEBRA_ROUTE_ISIS
2002-12-13 21:15:29 +01:00
|| rib->type == ZEBRA_ROUTE_BGP)
{
time_t uptime;
struct tm *tm;
uptime = time (NULL);
uptime -= rib->uptime;
tm = gmtime (&uptime);
vty_out (vty, " Last update ");
if (uptime < ONE_DAY_SECOND)
vty_out (vty, "%02d:%02d:%02d",
tm->tm_hour, tm->tm_min, tm->tm_sec);
else if (uptime < ONE_WEEK_SECOND)
vty_out (vty, "%dd%02dh%02dm",
tm->tm_yday, tm->tm_hour, tm->tm_min);
else
vty_out (vty, "%02dw%dd%02dh",
tm->tm_yday/7,
tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
vty_out (vty, " ago%s", VTY_NEWLINE);
}
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
2002-12-13 21:15:29 +01:00
{
vty_out (vty, " %c%s",
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB) ? '*' : ' ',
recursing ? " " : "");
2002-12-13 21:15:29 +01:00
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
vty_out (vty, " %s",
inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
if (nexthop->ifindex)
vty_out (vty, ", via %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
2002-12-13 21:15:29 +01:00
break;
case NEXTHOP_TYPE_IFINDEX:
vty_out (vty, " directly connected, %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
2002-12-13 21:15:29 +01:00
break;
default:
break;
}
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
vty_out (vty, " inactive");
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ONLINK))
vty_out (vty, " onlink");
2002-12-13 21:15:29 +01:00
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
vty_out (vty, " (recursive)");
2002-12-13 21:15:29 +01:00
vty_out (vty, "%s", VTY_NEWLINE);
}
vty_out (vty, "%s", VTY_NEWLINE);
}
}
static void
2002-12-13 21:15:29 +01:00
vty_show_ipv6_route (struct vty *vty, struct route_node *rn,
struct rib *rib)
{
struct nexthop *nexthop, *tnexthop;
int recursing;
2002-12-13 21:15:29 +01:00
int len = 0;
char buf[BUFSIZ];
/* Nexthop information. */
for (ALL_NEXTHOPS_RO(rib->nexthop, nexthop, tnexthop, recursing))
2002-12-13 21:15:29 +01:00
{
if (nexthop == rib->nexthop)
{
/* Prefix information. */
len = vty_out (vty, "%c%c%c %s/%d",
2005-10-01 Andrew J. Schorr <ajschorr@alumni.princeton.edu> * zebra.h: Declare new functions zebra_route_string() and zebra_route_char(). * log.c: (zroute_lookup,zebra_route_string,zebra_route_char) New functions to map zebra route numbers to strings. * zebra_vty.c: (route_type_str) Remove obsolete function: use new library function zebra_route_string() instead. Note that there are a few differences: for IPv6 routes, we now get "ripng" and "ospf6" instead of the old behavior ("rip" and "ospf"). (route_type_char) Remove obsolete function: ues new library function zebra_route_char() instead. Note that there is one difference: the old function returned 'S' for a ZEBRA_ROUTE_SYSTEM route, whereas the new one returns 'X'. (vty_show_ip_route_detail,vty_show_ipv6_route_detail) Replace route_type_str() with zebra_route_string(). (vty_show_ip_route,vty_show_ipv6_route) Replace route_type_char() with zebra_route_char(). * bgp_vty.c: (bgp_config_write_redistribute) Use new library function zebra_route_string instead of a local hard-coded table. * ospf6_asbr.c: Remove local hard-coded tables zroute_name and zroute_abname. Change the ZROUTE_NAME macro to use new library function zebra_route_string(). Remove the ZROUTE_ABNAME macro. (ospf6_asbr_external_route_show): Replace ZROUTE_ABNAME() with a call to zebra_route_char(), and be sure to fix the format string, since we now have a char instead of a char *. * ospf6_zebra.c: Remove local hard-coded tables zebra_route_name and zebra_route_abname. Note that the zebra_route_name[] table contained mixed-case strings, whereas the zebra_route_string() function returns lower-case strings. (ospf6_zebra_read_ipv6): Change debug message to use new library function zebra_route_string() instead of zebra_route_name[]. (show_zebra): Use new library function zebra_route_string() instead of zebra_route_name[]. * ospf_dump.c: Remove local hard-coded table ospf_redistributed_proto. (ospf_redist_string) New function implemented using new library function zebra_route_string(). Note that there are a few differences in the output that will result: the new function returns strings that are lower-case, whereas the old table was mixed case. Also, the old table mapped ZEBRA_ROUTE_OSPF6 to "OSPFv3", whereas the new function returns "ospf6". * ospfd.h: Remove extern struct message ospf_redistributed_proto[], and add extern const char *ospf_redist_string(u_int route_type) instead. * ospf_asbr.c: (ospf_external_info_add) In two messages, use ospf_redist_string instead of LOOKUP(ospf_redistributed_proto). * ospf_vty.c: Remove local hard-coded table distribute_str. (config_write_ospf_redistribute,config_write_ospf_distribute): Use new library function zebra_route_string() instead of distribute_str[]. * ospf_zebra.c: (ospf_redistribute_set,ospf_redistribute_unset, ospf_redistribute_default_set,ospf_redistribute_check) In debug messages, use ospf_redist_string() instead of LOOKUP(ospf_redistributed_proto). * rip_zebra.c: (config_write_rip_redistribute): Remove local hard-coded table str[]. Replace str[] with calls to new library function zebra_route_string(). * ripd.c: Remove local hard-coded table route_info[]. (show_ip_rip) Replace uses of str[] with calls to new library functions zebra_route_char and zebra_route_string. * ripng_zebra.c: (ripng_redistribute_write) Remove local hard-coded table str[]. Replace str[i] with new library function zebra_route_string(i). * ripngd.c: Remove local hard-coded table route_info[]. (show_ipv6_ripng) Use new library function zebra_route_char() instead of table route_info[].
2005-10-01 19:38:06 +02:00
zebra_route_char (rib->type),
2002-12-13 21:15:29 +01:00
CHECK_FLAG (rib->flags, ZEBRA_FLAG_SELECTED)
? '>' : ' ',
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
? '*' : ' ',
inet_ntop (AF_INET6, &rn->p.u.prefix6, buf, BUFSIZ),
rn->p.prefixlen);
/* Distance and metric display. */
if (rib->type != ZEBRA_ROUTE_CONNECT
&& rib->type != ZEBRA_ROUTE_KERNEL)
len += vty_out (vty, " [%d/%d]", rib->distance,
rib->metric);
}
else
vty_out (vty, " %c%*c",
CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_FIB)
? '*' : ' ',
len - 3 + (2 * recursing), ' ');
2002-12-13 21:15:29 +01:00
switch (nexthop->type)
{
case NEXTHOP_TYPE_IPV6:
case NEXTHOP_TYPE_IPV6_IFINDEX:
vty_out (vty, " via %s",
inet_ntop (AF_INET6, &nexthop->gate.ipv6, buf, BUFSIZ));
if (nexthop->ifindex)
vty_out (vty, ", %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
2002-12-13 21:15:29 +01:00
break;
case NEXTHOP_TYPE_IFINDEX:
vty_out (vty, " is directly connected, %s",
ifindex2ifname_vrf (nexthop->ifindex, rib->vrf_id));
2002-12-13 21:15:29 +01:00
break;
default:
break;
}
if (! CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_ACTIVE))
vty_out (vty, " inactive");
if (CHECK_FLAG (nexthop->flags, NEXTHOP_FLAG_RECURSIVE))
vty_out (vty, " (recursive)");
2002-12-13 21:15:29 +01:00
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_BLACKHOLE))
vty_out (vty, ", bh");
if (CHECK_FLAG (rib->flags, ZEBRA_FLAG_REJECT))
vty_out (vty, ", rej");
2002-12-13 21:15:29 +01:00
if (rib->type == ZEBRA_ROUTE_RIPNG
|| rib->type == ZEBRA_ROUTE_OSPF6
|| rib->type == ZEBRA_ROUTE_ISIS
2002-12-13 21:15:29 +01:00
|| rib->type == ZEBRA_ROUTE_BGP)
{
time_t uptime;
struct tm *tm;
uptime = time (NULL);
uptime -= rib->uptime;
tm = gmtime (&uptime);
#define ONE_DAY_SECOND 60*60*24
#define ONE_WEEK_SECOND 60*60*24*7
if (uptime < ONE_DAY_SECOND)
vty_out (vty, ", %02d:%02d:%02d",
tm->tm_hour, tm->tm_min, tm->tm_sec);
else if (uptime < ONE_WEEK_SECOND)
vty_out (vty, ", %dd%02dh%02dm",
tm->tm_yday, tm->tm_hour, tm->tm_min);
else
vty_out (vty, ", %02dw%dd%02dh",
tm->tm_yday/7,
tm->tm_yday - ((tm->tm_yday/7) * 7), tm->tm_hour);
}
vty_out (vty, "%s", VTY_NEWLINE);
}
}
DEFUN (show_ipv6_route,
show_ipv6_route_cmd,
"show ipv6 route",
SHOW_STR
IP_STR
"IPv6 routing table\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
vrf_id_t vrf_id = VRF_DEFAULT;
struct zebra_vrf *zvrf = NULL;
2002-12-13 21:15:29 +01:00
if (argc > 0)
{
if (!(zvrf = zebra_vrf_list_lookup_by_name (argv[0])))
{
vty_out (vty, "vrf %s not defined%s", argv[0], VTY_NEWLINE);
return CMD_SUCCESS;
}
if (zvrf->vrf_id == VRF_UNKNOWN)
{
vty_out (vty, "vrf %s inactive%s", argv[0], VTY_NEWLINE);
return CMD_SUCCESS;
}
else
vrf_id = zvrf->vrf_id;
}
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
2002-12-13 21:15:29 +01:00
if (! table)
return CMD_SUCCESS;
/* Show all IPv6 route. */
for (rn = route_top (table); rn; rn = route_next (rn))
zebra: add structure to hold per-prefix state in RIB Add the rib_dest_t structure to hold per-prefix state in the routing information base. This gives us an appropriate place to maintain the queueing state of a route_node. Queuing state was previously being stored on the first rib in the list of ribs hanging off the route_node. * zebra/rib.h - Add new structure rib_dest_t. - Remove the rn_status field from 'struct rib', it is no longer required. - Add macros (RNODE_FOREACH_RIB, RNODE_FOREACH_RIB_SAFE) for walking all 'struct ribs' corresponding to a route_node. These hide the fact that there is an intermediate rib_dest_t structure. - Add a few utility inlines to go between a rib_dest_t and associated structures. * zebra/zebra_rib.c - rib_link()/rib_unlink() Tweak for new behavior, where the 'info' pointer of a route_node points to a rib_dest_t. The list of ribs for a prefix now hangs off of the dest. Change the way we ref count route_nodes. We now hold a single ref count on a route_node if there is a corresponding rib_dest_t. - Maintain the queuing state of a route_node on the flags field of the rib_dest_t. - Add the rib_gc_dest() function, which deletes a rib_dest_t if it is no longer required. A rib_dest_t can be deleted iff there are no struct ribs hanging off of it. - Call rib_gc_dest() any time we unlink a rib from the rib_dest_t. Currently we only need to call it once, just before we return from rib_process(). * zebra/{redistribute,zebra_rib,zebra_snmp,zebra_vty}.c Use new macros to walk over route_node ribs. * lib/memtypes.c Add memory type for rib_dest_t. Signed-off-by: Avneesh Sachdev <avneesh@opensourcerouting.org> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-13 23:48:53 +01:00
RNODE_FOREACH_RIB (rn, rib)
2002-12-13 21:15:29 +01:00
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V6_HEADER);
2002-12-13 21:15:29 +01:00
first = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route,
show_ipv6_route_vrf_cmd,
"show ipv6 route " VRF_CMD_STR,
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_CMD_HELP_STR)
DEFUN (show_ipv6_route_tag,
show_ipv6_route_tag_cmd,
"show ipv6 route tag <1-65535>",
SHOW_STR
IP_STR
"IPv6 routing table\n"
"Show only routes with tag\n"
"Tag value\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
u_short tag = 0;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 1)
{
VRF_GET_ID (vrf_id, argv[0]);
tag = atoi(argv[1]);
}
else
tag = atoi(argv[0]);
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
/* Show all IPv6 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_V6_HEADER);
first = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route_tag,
show_ipv6_route_vrf_tag_cmd,
"show ipv6 route " VRF_CMD_STR " tag <1-65535>",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_CMD_HELP_STR
"Show only routes with tag\n"
"Tag value\n")
2002-12-13 21:15:29 +01:00
DEFUN (show_ipv6_route_prefix_longer,
show_ipv6_route_prefix_longer_cmd,
"show ipv6 route X:X::X:X/M longer-prefixes",
SHOW_STR
IP_STR
"IPv6 routing table\n"
"IPv6 prefix\n"
"Show route matching the specified Network/Mask pair only\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct prefix p;
int ret;
int first = 1;
vrf_id_t vrf_id = VRF_DEFAULT;
2002-12-13 21:15:29 +01:00
if (argc > 1)
{
VRF_GET_ID (vrf_id, argv[0]);
ret = str2prefix (argv[1], &p);
}
else
ret = str2prefix (argv[0], &p);
2002-12-13 21:15:29 +01:00
if (! ret)
{
vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
2002-12-13 21:15:29 +01:00
/* Show matched type IPv6 routes. */
for (rn = route_top (table); rn; rn = route_next (rn))
zebra: add structure to hold per-prefix state in RIB Add the rib_dest_t structure to hold per-prefix state in the routing information base. This gives us an appropriate place to maintain the queueing state of a route_node. Queuing state was previously being stored on the first rib in the list of ribs hanging off the route_node. * zebra/rib.h - Add new structure rib_dest_t. - Remove the rn_status field from 'struct rib', it is no longer required. - Add macros (RNODE_FOREACH_RIB, RNODE_FOREACH_RIB_SAFE) for walking all 'struct ribs' corresponding to a route_node. These hide the fact that there is an intermediate rib_dest_t structure. - Add a few utility inlines to go between a rib_dest_t and associated structures. * zebra/zebra_rib.c - rib_link()/rib_unlink() Tweak for new behavior, where the 'info' pointer of a route_node points to a rib_dest_t. The list of ribs for a prefix now hangs off of the dest. Change the way we ref count route_nodes. We now hold a single ref count on a route_node if there is a corresponding rib_dest_t. - Maintain the queuing state of a route_node on the flags field of the rib_dest_t. - Add the rib_gc_dest() function, which deletes a rib_dest_t if it is no longer required. A rib_dest_t can be deleted iff there are no struct ribs hanging off of it. - Call rib_gc_dest() any time we unlink a rib from the rib_dest_t. Currently we only need to call it once, just before we return from rib_process(). * zebra/{redistribute,zebra_rib,zebra_snmp,zebra_vty}.c Use new macros to walk over route_node ribs. * lib/memtypes.c Add memory type for rib_dest_t. Signed-off-by: Avneesh Sachdev <avneesh@opensourcerouting.org> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-13 23:48:53 +01:00
RNODE_FOREACH_RIB (rn, rib)
2002-12-13 21:15:29 +01:00
if (prefix_match (&p, &rn->p))
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V6_HEADER);
2002-12-13 21:15:29 +01:00
first = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route_prefix_longer,
show_ipv6_route_vrf_prefix_longer_cmd,
"show ipv6 route " VRF_CMD_STR " X:X::X:X/M longer-prefixes",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_CMD_HELP_STR
"IPv6 prefix\n"
"Show route matching the specified Network/Mask pair only\n")
2002-12-13 21:15:29 +01:00
DEFUN (show_ipv6_route_protocol,
show_ipv6_route_protocol_cmd,
"show ipv6 route " QUAGGA_IP6_REDIST_STR_ZEBRA,
2002-12-13 21:15:29 +01:00
SHOW_STR
IP_STR
"IP routing table\n"
QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
2002-12-13 21:15:29 +01:00
{
int type;
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
vrf_id_t vrf_id = VRF_DEFAULT;
2002-12-13 21:15:29 +01:00
if ( argc >1 )
{
VRF_GET_ID (vrf_id, argv[0]);
type = proto_redistnum (AFI_IP6, argv[1]);
}
else
type = proto_redistnum (AFI_IP6, argv[0]);
if (type < 0)
2002-12-13 21:15:29 +01:00
{
vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
2002-12-13 21:15:29 +01:00
if (! table)
return CMD_SUCCESS;
/* Show matched type IPv6 routes. */
for (rn = route_top (table); rn; rn = route_next (rn))
zebra: add structure to hold per-prefix state in RIB Add the rib_dest_t structure to hold per-prefix state in the routing information base. This gives us an appropriate place to maintain the queueing state of a route_node. Queuing state was previously being stored on the first rib in the list of ribs hanging off the route_node. * zebra/rib.h - Add new structure rib_dest_t. - Remove the rn_status field from 'struct rib', it is no longer required. - Add macros (RNODE_FOREACH_RIB, RNODE_FOREACH_RIB_SAFE) for walking all 'struct ribs' corresponding to a route_node. These hide the fact that there is an intermediate rib_dest_t structure. - Add a few utility inlines to go between a rib_dest_t and associated structures. * zebra/zebra_rib.c - rib_link()/rib_unlink() Tweak for new behavior, where the 'info' pointer of a route_node points to a rib_dest_t. The list of ribs for a prefix now hangs off of the dest. Change the way we ref count route_nodes. We now hold a single ref count on a route_node if there is a corresponding rib_dest_t. - Maintain the queuing state of a route_node on the flags field of the rib_dest_t. - Add the rib_gc_dest() function, which deletes a rib_dest_t if it is no longer required. A rib_dest_t can be deleted iff there are no struct ribs hanging off of it. - Call rib_gc_dest() any time we unlink a rib from the rib_dest_t. Currently we only need to call it once, just before we return from rib_process(). * zebra/{redistribute,zebra_rib,zebra_snmp,zebra_vty}.c Use new macros to walk over route_node ribs. * lib/memtypes.c Add memory type for rib_dest_t. Signed-off-by: Avneesh Sachdev <avneesh@opensourcerouting.org> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-13 23:48:53 +01:00
RNODE_FOREACH_RIB (rn, rib)
2002-12-13 21:15:29 +01:00
if (rib->type == type)
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V6_HEADER);
2002-12-13 21:15:29 +01:00
first = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route_protocol,
show_ipv6_route_vrf_protocol_cmd,
"show ipv6 route " VRF_CMD_STR " " QUAGGA_IP6_REDIST_STR_ZEBRA,
SHOW_STR
IP_STR
"IP routing table\n"
VRF_CMD_HELP_STR
QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
2002-12-13 21:15:29 +01:00
DEFUN (show_ipv6_route_addr,
show_ipv6_route_addr_cmd,
"show ipv6 route X:X::X:X",
SHOW_STR
IP_STR
"IPv6 routing table\n"
"IPv6 Address\n")
{
int ret;
struct prefix_ipv6 p;
struct route_table *table;
struct route_node *rn;
vrf_id_t vrf_id = VRF_DEFAULT;
2002-12-13 21:15:29 +01:00
if (argc > 1 )
{
VRF_GET_ID (vrf_id, argv[0]);
ret = str2prefix_ipv6 (argv[1], &p);
}
else
ret = str2prefix_ipv6 (argv[0], &p);
2002-12-13 21:15:29 +01:00
if (ret <= 0)
{
vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
2002-12-13 21:15:29 +01:00
if (! table)
return CMD_SUCCESS;
rn = route_node_match (table, (struct prefix *) &p);
if (! rn)
{
vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
return CMD_WARNING;
}
vty_show_ipv6_route_detail (vty, rn);
route_unlock_node (rn);
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route_addr,
show_ipv6_route_vrf_addr_cmd,
"show ipv6 route " VRF_CMD_STR " X:X::X:X",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_CMD_HELP_STR
"IPv6 Address\n")
2002-12-13 21:15:29 +01:00
DEFUN (show_ipv6_route_prefix,
show_ipv6_route_prefix_cmd,
"show ipv6 route X:X::X:X/M",
SHOW_STR
IP_STR
"IPv6 routing table\n"
"IPv6 prefix\n")
{
int ret;
struct prefix_ipv6 p;
struct route_table *table;
struct route_node *rn;
vrf_id_t vrf_id = VRF_DEFAULT;
2002-12-13 21:15:29 +01:00
if (argc > 1)
{
VRF_GET_ID (vrf_id, argv[0]);
ret = str2prefix_ipv6 (argv[1], &p);
}
else
ret = str2prefix_ipv6 (argv[0], &p);
2002-12-13 21:15:29 +01:00
if (ret <= 0)
{
vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
2002-12-13 21:15:29 +01:00
if (! table)
return CMD_SUCCESS;
rn = route_node_match (table, (struct prefix *) &p);
if (! rn || rn->p.prefixlen != p.prefixlen)
{
vty_out (vty, "%% Network not in table%s", VTY_NEWLINE);
return CMD_WARNING;
}
vty_show_ipv6_route_detail (vty, rn);
route_unlock_node (rn);
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route_prefix,
show_ipv6_route_vrf_prefix_cmd,
"show ipv6 route " VRF_CMD_STR " X:X::X:X/M ",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_CMD_HELP_STR
"IPv6 prefix\n")
/* Show route summary. */
DEFUN (show_ipv6_route_summary,
show_ipv6_route_summary_cmd,
"show ipv6 route summary",
SHOW_STR
IP_STR
"IPv6 routing table\n"
"Summary of all IPv6 routes\n")
{
struct route_table *table;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 0)
VRF_GET_ID (vrf_id, argv[0]);
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
vty_show_ip_route_summary (vty, table);
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route_summary,
show_ipv6_route_vrf_summary_cmd,
"show ipv6 route " VRF_CMD_STR " summary",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_CMD_HELP_STR
"Summary of all IPv6 routes\n")
/* Show ipv6 route summary prefix. */
DEFUN (show_ipv6_route_summary_prefix,
show_ipv6_route_summary_prefix_cmd,
"show ipv6 route summary prefix",
SHOW_STR
IP_STR
"IPv6 routing table\n"
"Summary of all IPv6 routes\n"
"Prefix routes\n")
{
struct route_table *table;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 0)
VRF_GET_ID (vrf_id, argv[0]);
table = zebra_vrf_table (AFI_IP6, SAFI_UNICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
vty_show_ip_route_summary_prefix (vty, table);
return CMD_SUCCESS;
}
ALIAS (show_ipv6_route_summary_prefix,
show_ipv6_route_vrf_summary_prefix_cmd,
"show ipv6 route " VRF_CMD_STR " summary prefix",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_CMD_HELP_STR
"Summary of all IPv6 routes\n"
"Prefix routes\n")
/*
* Show IPv6 mroute command.Used to dump
* the Multicast routing table.
*/
DEFUN (show_ipv6_mroute,
show_ipv6_mroute_cmd,
"show ipv6 mroute",
SHOW_STR
IP_STR
"IPv6 Multicast routing table\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
int first = 1;
vrf_id_t vrf_id = VRF_DEFAULT;
if (argc > 0)
VRF_GET_ID (vrf_id, argv[0]);
table = zebra_vrf_table (AFI_IP6, SAFI_MULTICAST, vrf_id);
if (! table)
return CMD_SUCCESS;
/* Show all IPv6 route. */
for (rn = route_top (table); rn; rn = route_next (rn))
zebra: add structure to hold per-prefix state in RIB Add the rib_dest_t structure to hold per-prefix state in the routing information base. This gives us an appropriate place to maintain the queueing state of a route_node. Queuing state was previously being stored on the first rib in the list of ribs hanging off the route_node. * zebra/rib.h - Add new structure rib_dest_t. - Remove the rn_status field from 'struct rib', it is no longer required. - Add macros (RNODE_FOREACH_RIB, RNODE_FOREACH_RIB_SAFE) for walking all 'struct ribs' corresponding to a route_node. These hide the fact that there is an intermediate rib_dest_t structure. - Add a few utility inlines to go between a rib_dest_t and associated structures. * zebra/zebra_rib.c - rib_link()/rib_unlink() Tweak for new behavior, where the 'info' pointer of a route_node points to a rib_dest_t. The list of ribs for a prefix now hangs off of the dest. Change the way we ref count route_nodes. We now hold a single ref count on a route_node if there is a corresponding rib_dest_t. - Maintain the queuing state of a route_node on the flags field of the rib_dest_t. - Add the rib_gc_dest() function, which deletes a rib_dest_t if it is no longer required. A rib_dest_t can be deleted iff there are no struct ribs hanging off of it. - Call rib_gc_dest() any time we unlink a rib from the rib_dest_t. Currently we only need to call it once, just before we return from rib_process(). * zebra/{redistribute,zebra_rib,zebra_snmp,zebra_vty}.c Use new macros to walk over route_node ribs. * lib/memtypes.c Add memory type for rib_dest_t. Signed-off-by: Avneesh Sachdev <avneesh@opensourcerouting.org> Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
2012-11-13 23:48:53 +01:00
RNODE_FOREACH_RIB (rn, rib)
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V6_HEADER);
first = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
return CMD_SUCCESS;
}
ALIAS (show_ipv6_mroute,
show_ipv6_mroute_vrf_cmd,
"show ipv6 mroute " VRF_CMD_STR,
SHOW_STR
IP_STR
"IPv6 Multicast routing table\n"
VRF_CMD_HELP_STR)
DEFUN (show_ipv6_route_vrf_all,
show_ipv6_route_vrf_all_cmd,
"show ipv6 route " VRF_ALL_CMD_STR,
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_ALL_CMD_HELP_STR)
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int first = 1;
int vrf_header = 1;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
continue;
/* Show all IPv6 route. */
for (rn = route_top (table); rn; rn = route_next (rn))
RNODE_FOREACH_RIB (rn, rib)
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V6_HEADER);
first = 0;
}
if (vrf_header)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_route_vrf_all_tag,
show_ipv6_route_vrf_all_tag_cmd,
"show ipv6 route " VRF_ALL_CMD_STR " tag <1-65535>",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_ALL_CMD_HELP_STR
"Show only routes with tag\n"
"Tag value\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int first = 1;
int vrf_header = 1;
u_short tag = 0;
if (argv[0])
tag = atoi(argv[0]);
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP][SAFI_UNICAST]) == NULL)
continue;
/* Show all IPv6 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_V6_HEADER);
first = 0;
}
if (vrf_header)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_route_vrf_all_prefix_longer,
show_ipv6_route_vrf_all_prefix_longer_cmd,
"show ipv6 route " VRF_ALL_CMD_STR " X:X::X:X/M longer-prefixes",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_ALL_CMD_HELP_STR
"IPv6 prefix\n"
"Show route matching the specified Network/Mask pair only\n")
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct prefix p;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int ret;
int first = 1;
int vrf_header = 1;
ret = str2prefix (argv[0], &p);
if (! ret)
{
vty_out (vty, "%% Malformed Prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
continue;
/* Show matched type IPv6 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_V6_HEADER);
first = 0;
}
if (vrf_header)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_route_vrf_all_protocol,
show_ipv6_route_vrf_all_protocol_cmd,
"show ipv6 route " VRF_ALL_CMD_STR " " QUAGGA_IP6_REDIST_STR_ZEBRA,
SHOW_STR
IP_STR
"IP routing table\n"
VRF_ALL_CMD_HELP_STR
QUAGGA_IP6_REDIST_HELP_STR_ZEBRA)
{
int type;
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int first = 1;
int vrf_header = 1;
type = proto_redistnum (AFI_IP6, argv[0]);
if (type < 0)
{
vty_out (vty, "Unknown route type%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
continue;
/* Show matched type IPv6 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_V6_HEADER);
first = 0;
}
if (vrf_header)
{
vty_out (vty, "%sVRF %s:%s", VTY_NEWLINE, zvrf->name, VTY_NEWLINE);
vrf_header = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
vrf_header = 1;
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_route_vrf_all_addr,
show_ipv6_route_vrf_all_addr_cmd,
"show ipv6 route " VRF_ALL_CMD_STR " X:X::X:X",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_ALL_CMD_HELP_STR
"IPv6 Address\n")
{
int ret;
struct prefix_ipv6 p;
struct route_table *table;
struct route_node *rn;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
ret = str2prefix_ipv6 (argv[0], &p);
if (ret <= 0)
{
vty_out (vty, "Malformed IPv6 address%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
continue;
rn = route_node_match (table, (struct prefix *) &p);
if (! rn)
continue;
vty_show_ipv6_route_detail (vty, rn);
route_unlock_node (rn);
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_route_vrf_all_prefix,
show_ipv6_route_vrf_all_prefix_cmd,
"show ipv6 route " VRF_ALL_CMD_STR " X:X::X:X/M",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_ALL_CMD_HELP_STR
"IPv6 prefix\n")
{
int ret;
struct prefix_ipv6 p;
struct route_table *table;
struct route_node *rn;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
ret = str2prefix_ipv6 (argv[0], &p);
if (ret <= 0)
{
vty_out (vty, "Malformed IPv6 prefix%s", VTY_NEWLINE);
return CMD_WARNING;
}
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP6][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_ipv6_route_detail (vty, rn);
route_unlock_node (rn);
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_route_vrf_all_summary,
show_ipv6_route_vrf_all_summary_cmd,
"show ipv6 route " VRF_ALL_CMD_STR " summary",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_ALL_CMD_HELP_STR
"Summary of all IPv6 routes\n")
{
struct zebra_vrf *zvrf;
vrf_iter_t iter;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
if ((zvrf = vrf_iter2info (iter)) != NULL)
vty_show_ip_route_summary (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
return CMD_SUCCESS;
}
DEFUN (show_ipv6_mroute_vrf_all,
show_ipv6_mroute_vrf_all_cmd,
"show ipv6 mroute " VRF_ALL_CMD_STR,
SHOW_STR
IP_STR
"IPv6 Multicast routing table\n"
VRF_ALL_CMD_HELP_STR)
{
struct route_table *table;
struct route_node *rn;
struct rib *rib;
struct zebra_vrf *zvrf;
vrf_iter_t iter;
int first = 1;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
{
if ((zvrf = vrf_iter2info (iter)) == NULL ||
(table = zvrf->table[AFI_IP6][SAFI_UNICAST]) == NULL)
continue;
/* Show all IPv6 route. */
for (rn = route_top (table); rn; rn = route_next (rn))
RNODE_FOREACH_RIB (rn, rib)
{
if (first)
{
vty_out (vty, SHOW_ROUTE_V6_HEADER);
first = 0;
}
vty_show_ipv6_route (vty, rn, rib);
}
}
return CMD_SUCCESS;
}
DEFUN (show_ipv6_route_vrf_all_summary_prefix,
show_ipv6_route_vrf_all_summary_prefix_cmd,
"show ipv6 route " VRF_ALL_CMD_STR " summary prefix",
SHOW_STR
IP_STR
"IPv6 routing table\n"
VRF_ALL_CMD_HELP_STR
"Summary of all IPv6 routes\n"
"Prefix routes\n")
{
struct zebra_vrf *zvrf;
vrf_iter_t iter;
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
if ((zvrf = vrf_iter2info (iter)) != NULL)
vty_show_ip_route_summary_prefix (vty, zvrf->table[AFI_IP6][SAFI_UNICAST]);
return CMD_SUCCESS;
}
2002-12-13 21:15:29 +01:00
/* Write IPv6 static route configuration. */
static int
2002-12-13 21:15:29 +01:00
static_config_ipv6 (struct vty *vty)
{
struct route_node *rn;
struct static_route *si;
int write = 0;
char buf[PREFIX2STR_BUFFER];
2002-12-13 21:15:29 +01:00
struct route_table *stable;
struct zebra_vrf *zvrf;
struct listnode *node;
2002-12-13 21:15:29 +01:00
for (ALL_LIST_ELEMENTS_RO (zvrf_list, node, zvrf))
{
if ((stable = zvrf->stable[AFI_IP6][SAFI_UNICAST]) == NULL)
continue;
2002-12-13 21:15:29 +01:00
for (rn = route_top (stable); rn; rn = route_next (rn))
for (si = rn->info; si; si = si->next)
{
vty_out (vty, "ipv6 route %s", prefix2str (&rn->p, buf, sizeof buf));
2002-12-13 21:15:29 +01:00
switch (si->type)
{
case STATIC_IPV6_GATEWAY:
vty_out (vty, " %s", inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ));
break;
case STATIC_IFINDEX:
vty_out (vty, " %s", si->ifname);
break;
case STATIC_IPV6_GATEWAY_IFINDEX:
vty_out (vty, " %s %s",
inet_ntop (AF_INET6, &si->addr.ipv6, buf, BUFSIZ),
ifindex2ifname_vrf (si->ifindex, si->vrf_id));
break;
}
2002-12-13 21:15:29 +01:00
if (CHECK_FLAG(si->flags, ZEBRA_FLAG_REJECT))
vty_out (vty, " %s", "reject");
if (CHECK_FLAG(si->flags, ZEBRA_FLAG_BLACKHOLE))
vty_out (vty, " %s", "blackhole");
if (si->tag)
vty_out (vty, " tag %d", si->tag);
if (si->distance != ZEBRA_STATIC_DISTANCE_DEFAULT)
vty_out (vty, " %d", si->distance);
2002-12-13 21:15:29 +01:00
if (si->vrf_id != VRF_DEFAULT)
{
vty_out (vty, " vrf %s", zvrf->name);
}
vty_out (vty, "%s", VTY_NEWLINE);
2002-12-13 21:15:29 +01:00
write = 1;
}
}
2002-12-13 21:15:29 +01:00
return write;
}
#endif /* HAVE_IPV6 */
DEFUN (allow_external_route_update,
allow_external_route_update_cmd,
"allow-external-route-update",
"Allow Quagga routes to be overwritten by external processes")
{
allow_delete = 1;
return CMD_SUCCESS;
}
DEFUN (no_allow_external_route_update,
no_allow_external_route_update_cmd,
"no allow-external-route-update",
"Allow Quagga routes to be overwritten by external processes")
{
allow_delete = 0;
return CMD_SUCCESS;
}
/* show vrf */
DEFUN (show_vrf,
show_vrf_cmd,
"show vrf",
SHOW_STR
"VRF\n")
{
struct zebra_vrf *zvrf;
struct listnode *node;
for (ALL_LIST_ELEMENTS_RO (zvrf_list, node, zvrf))
{
if (!zvrf->vrf_id)
continue;
vty_out (vty, "vrf %s ", zvrf->name);
if (zvrf->vrf_id == VRF_UNKNOWN)
vty_out (vty, "inactive");
else
vty_out (vty, "id %u table %u", zvrf->vrf_id, zvrf->table_id);
vty_out (vty, "%s", VTY_NEWLINE);
}
return CMD_SUCCESS;
}
2002-12-13 21:15:29 +01:00
/* Static ip route configuration write function. */
static int
2002-12-13 21:15:29 +01:00
zebra_ip_config (struct vty *vty)
{
int write = 0;
write += static_config_ipv4 (vty, SAFI_UNICAST, "ip route");
write += static_config_ipv4 (vty, SAFI_MULTICAST, "ip mroute");
2002-12-13 21:15:29 +01:00
#ifdef HAVE_IPV6
write += static_config_ipv6 (vty);
#endif /* HAVE_IPV6 */
write += zebra_import_table_config (vty);
2002-12-13 21:15:29 +01:00
return write;
}
DEFUN (ip_zebra_import_table_distance,
ip_zebra_import_table_distance_cmd,
"ip import-table <1-252> distance <1-255>",
IP_STR
"import routes from non-main kernel table\n"
"kernel routing table id\n"
"Distance for imported routes\n"
"Default distance value\n")
{
u_int32_t table_id = 0;
int distance = ZEBRA_TABLE_DISTANCE_DEFAULT;
if (argc)
VTY_GET_INTEGER("table", table_id, argv[0]);
if (!is_zebra_valid_kernel_table(table_id))
{
vty_out(vty, "Invalid routing table ID, %d. Must be in range 1-252%s",
table_id, VTY_NEWLINE);
return CMD_WARNING;
}
if (is_zebra_main_routing_table(table_id))
{
vty_out(vty, "Invalid routing table ID, %d. Must be non-default table%s",
table_id, VTY_NEWLINE);
return CMD_WARNING;
}
if (argc > 1)
VTY_GET_INTEGER_RANGE("distance", distance, argv[1], 1, 255);
return (zebra_import_table(AFI_IP, table_id, distance, NULL, 1));
}
ALIAS (ip_zebra_import_table_distance,
ip_zebra_import_table_cmd,
"ip import-table <1-252>",
IP_STR
"import routes from non-main kernel table\n"
"kernel routing table id\n")
DEFUN (ip_zebra_import_table_distance_routemap,
ip_zebra_import_table_distance_routemap_cmd,
"ip import-table <1-252> distance <1-255> route-map WORD",
IP_STR
"import routes from non-main kernel table\n"
"kernel routing table id\n"
"Distance for imported routes\n"
"Default distance value\n"
"route-map for filtering\n"
"route-map name\n")
{
u_int32_t table_id = 0;
int distance = ZEBRA_TABLE_DISTANCE_DEFAULT;
const char *rmap_name;
if (argc)
VTY_GET_INTEGER("table", table_id, argv[0]);
if (!is_zebra_valid_kernel_table(table_id))
{
vty_out(vty, "Invalid routing table ID, %d. Must be in range 1-252%s",
table_id, VTY_NEWLINE);
return CMD_WARNING;
}
if (is_zebra_main_routing_table(table_id))
{
vty_out(vty, "Invalid routing table ID, %d. Must be non-default table%s",
table_id, VTY_NEWLINE);
return CMD_WARNING;
}
if (argc > 2)
{
VTY_GET_INTEGER_RANGE("distance", distance, argv[1], 1, 255);
rmap_name = XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[2]);
}
else
rmap_name = XSTRDUP (MTYPE_ROUTE_MAP_NAME, argv[1]);
return (zebra_import_table(AFI_IP, table_id, distance, rmap_name, 1));
}
ALIAS (ip_zebra_import_table_distance_routemap,
ip_zebra_import_table_routemap_cmd,
"ip import-table <1-252> route-map WORD",
IP_STR
"import routes from non-main kernel table\n"
"kernel routing table id\n"
"route-map for filtering\n"
"route-map name\n")
DEFUN (no_ip_zebra_import_table,
no_ip_zebra_import_table_cmd,
"no ip import-table <1-252> {route-map NAME}",
NO_STR
IP_STR
"import routes from non-main kernel table\n"
"kernel routing table id\n")
{
u_int32_t table_id = 0;
if (argc)
VTY_GET_INTEGER("table", table_id, argv[0]);
if (!is_zebra_valid_kernel_table(table_id))
{
vty_out(vty, "Invalid routing table ID. Must be in range 1-252%s",
VTY_NEWLINE);
return CMD_WARNING;
}
if (is_zebra_main_routing_table(table_id))
{
vty_out(vty, "Invalid routing table ID, %d. Must be non-default table%s",
table_id, VTY_NEWLINE);
return CMD_WARNING;
}
if (!is_zebra_import_table_enabled(AFI_IP, table_id))
return CMD_SUCCESS;
return (zebra_import_table(AFI_IP, table_id, 0, NULL, 0));
}
ALIAS (no_ip_zebra_import_table,
no_ip_zebra_import_table_distance_cmd,
"no ip import-table <1-252> distance <1-255> {route-map NAME}",
IP_STR
"import routes from non-main kernel table to main table"
"kernel routing table id\n"
"distance to be used\n")
static int
config_write_protocol (struct vty *vty)
{
if (allow_delete)
vty_out(vty, "allow-external-route-update%s", VTY_NEWLINE);
if (zebra_rnh_ip_default_route)
vty_out(vty, "ip nht resolve-via-default%s", VTY_NEWLINE);
if (zebra_rnh_ipv6_default_route)
vty_out(vty, "ipv6 nht resolve-via-default%s", VTY_NEWLINE);
enum multicast_mode ipv4_multicast_mode = multicast_mode_ipv4_get ();
if (ipv4_multicast_mode != MCAST_NO_CONFIG)
vty_out (vty, "ip multicast rpf-lookup-mode %s%s",
ipv4_multicast_mode == MCAST_URIB_ONLY ? "urib-only" :
ipv4_multicast_mode == MCAST_MRIB_ONLY ? "mrib-only" :
ipv4_multicast_mode == MCAST_MIX_MRIB_FIRST ? "mrib-then-urib" :
ipv4_multicast_mode == MCAST_MIX_DISTANCE ? "lower-distance" :
"longer-prefix",
VTY_NEWLINE);
zebra_routemap_config_write_protocol(vty);
return 1;
}
2002-12-13 21:15:29 +01:00
/* IP node for static routes. */
static struct cmd_node ip_node = { IP_NODE, "", 1 };
static struct cmd_node protocol_node = { PROTOCOL_NODE, "", 1 };
2002-12-13 21:15:29 +01:00
/* Route VTY. */
void
zebra_vty_init (void)
2002-12-13 21:15:29 +01:00
{
install_node (&ip_node, zebra_ip_config);
install_node (&protocol_node, config_write_protocol);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &allow_external_route_update_cmd);
install_element (CONFIG_NODE, &no_allow_external_route_update_cmd);
install_element (CONFIG_NODE, &ip_mroute_cmd);
install_element (CONFIG_NODE, &ip_mroute_dist_cmd);
install_element (CONFIG_NODE, &no_ip_mroute_cmd);
install_element (CONFIG_NODE, &no_ip_mroute_dist_cmd);
install_element (CONFIG_NODE, &ip_multicast_mode_cmd);
install_element (CONFIG_NODE, &no_ip_multicast_mode_cmd);
install_element (CONFIG_NODE, &no_ip_multicast_mode_noarg_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &ip_route_cmd);
install_element (CONFIG_NODE, &ip_route_tag_cmd);
install_element (CONFIG_NODE, &ip_route_flags_cmd);
install_element (CONFIG_NODE, &ip_route_flags_tag_cmd);
install_element (CONFIG_NODE, &ip_route_flags2_cmd);
install_element (CONFIG_NODE, &ip_route_flags2_tag_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &ip_route_mask_cmd);
install_element (CONFIG_NODE, &ip_route_mask_tag_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_tag_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags2_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags2_tag_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &no_ip_route_cmd);
install_element (CONFIG_NODE, &no_ip_route_tag_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_tag_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags2_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags2_tag_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &no_ip_route_mask_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_tag_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags2_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags2_tag_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &ip_route_distance_cmd);
install_element (CONFIG_NODE, &ip_route_tag_distance_cmd);
install_element (CONFIG_NODE, &ip_route_flags_distance_cmd);
install_element (CONFIG_NODE, &ip_route_flags_tag_distance_cmd);
install_element (CONFIG_NODE, &ip_route_flags_distance2_cmd);
install_element (CONFIG_NODE, &ip_route_flags_tag_distance2_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &ip_route_mask_distance_cmd);
install_element (CONFIG_NODE, &ip_route_mask_tag_distance_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_distance_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance2_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &no_ip_route_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_tag_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_distance2_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance2_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_tag_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance2_cmd);
install_element (CONFIG_NODE, &ip_zebra_import_table_cmd);
install_element (CONFIG_NODE, &ip_zebra_import_table_distance_cmd);
install_element (CONFIG_NODE, &ip_zebra_import_table_routemap_cmd);
install_element (CONFIG_NODE, &ip_zebra_import_table_distance_routemap_cmd);
install_element (CONFIG_NODE, &no_ip_zebra_import_table_cmd);
install_element (CONFIG_NODE, &no_ip_zebra_import_table_distance_cmd);
2002-12-13 21:15:29 +01:00
install_element (VIEW_NODE, &show_vrf_cmd);
2002-12-13 21:15:29 +01:00
install_element (VIEW_NODE, &show_ip_route_cmd);
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
install_element (VIEW_NODE, &show_ip_route_ospf_instance_cmd);
install_element (VIEW_NODE, &show_ip_route_tag_cmd);
install_element (VIEW_NODE, &show_ip_nht_cmd);
install_element (VIEW_NODE, &show_ip_nht_vrf_cmd);
install_element (VIEW_NODE, &show_ip_nht_vrf_all_cmd);
install_element (VIEW_NODE, &show_ipv6_nht_cmd);
install_element (VIEW_NODE, &show_ipv6_nht_vrf_cmd);
install_element (VIEW_NODE, &show_ipv6_nht_vrf_all_cmd);
2002-12-13 21:15:29 +01:00
install_element (VIEW_NODE, &show_ip_route_addr_cmd);
install_element (VIEW_NODE, &show_ip_route_prefix_cmd);
install_element (VIEW_NODE, &show_ip_route_prefix_longer_cmd);
install_element (VIEW_NODE, &show_ip_route_protocol_cmd);
install_element (VIEW_NODE, &show_ip_route_supernets_cmd);
install_element (VIEW_NODE, &show_ip_route_summary_cmd);
install_element (VIEW_NODE, &show_ip_route_summary_prefix_cmd);
install_element (ENABLE_NODE, &show_vrf_cmd);
2002-12-13 21:15:29 +01:00
install_element (ENABLE_NODE, &show_ip_route_cmd);
Multi-Instance OSPF Summary ——————————————------------- - etc/init.d/quagga is modified to support creating separate ospf daemon process for each instance. Each individual instance is monitored by watchquagga just like any protocol daemons.(requires initd-mi.patch). - Vtysh is modified to able to connect to multiple daemons of the same protocol (supported for OSPF only for now). - ospfd is modified to remember the Instance-ID that its invoked with. For the entire life of the process it caters to any command request that matches that instance-ID (unless its a non instance specific command). Routes/messages to zebra are tagged with instance-ID. - zebra route/redistribute mechanisms are modified to work with [protocol type + instance-id] - bgpd now has ability to have multiple instance specific redistribution for a protocol (OSPF only supported/tested for now). - zlog ability to display instance-id besides the protocol/daemon name. - Changes in other daemons are to because of the needed integration with some of the modified APIs/routines. (Didn’t prefer replicating too many separate instance specific APIs.) - config/show/debug commands are modified to take instance-id argument as appropriate. Guidelines to start using multi-instance ospf --------------------------------------------- The patch is backward compatible, i.e for any previous way of single ospf deamon(router ospf <cr>) will continue to work as is, including all the show commands etc. To enable multiple instances, do the following: 1. service quagga stop 2. Modify /etc/quagga/daemons to add instance-ids of each desired instance in the following format: ospfd=“yes" ospfd_instances="1,2,3" assuming you want to enable 3 instances with those instance ids. 3. Create corresponding ospfd config files as ospfd-1.conf, ospfd-2.conf and ospfd-3.conf. 4. service quagga start/restart 5. Verify that the deamons are started as expected. You should see ospfd started with -n <instance-id> option. ps –ef | grep quagga With that /var/run/quagga/ should have ospfd-<instance-id>.pid and ospfd-<instance-id>/vty to each instance. 6. vtysh to work with instances as you would with any other deamons. 7. Overall most quagga semantics are the same working with the instance deamon, like it is for any other daemon. NOTE: To safeguard against errors leading to too many processes getting invoked, a hard limit on number of instance-ids is in place, currently its 5. Allowed instance-id range is <1-65535> Once daemons are up, show running from vtysh should show the instance-id of each daemon as 'router ospf <instance-id>’ (without needing explicit configuration) Instance-id can not be changed via vtysh, other router ospf configuration is allowed as before. Signed-off-by: Vipin Kumar <vipin@cumulusnetworks.com> Reviewed-by: Daniel Walton <dwalton@cumulusnetworks.com> Reviewed-by: Dinesh G Dutt <ddutt@cumulusnetworks.com>
2015-05-20 03:03:42 +02:00
install_element (ENABLE_NODE, &show_ip_route_ospf_instance_cmd);
install_element (ENABLE_NODE, &show_ip_route_tag_cmd);
install_element (ENABLE_NODE, &show_ip_nht_cmd);
install_element (ENABLE_NODE, &show_ip_nht_vrf_cmd);
install_element (ENABLE_NODE, &show_ip_nht_vrf_all_cmd);
install_element (ENABLE_NODE, &show_ipv6_nht_cmd);
install_element (ENABLE_NODE, &show_ipv6_nht_vrf_cmd);
install_element (ENABLE_NODE, &show_ipv6_nht_vrf_all_cmd);
2002-12-13 21:15:29 +01:00
install_element (ENABLE_NODE, &show_ip_route_addr_cmd);
install_element (ENABLE_NODE, &show_ip_route_prefix_cmd);
install_element (ENABLE_NODE, &show_ip_route_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ip_route_protocol_cmd);
install_element (ENABLE_NODE, &show_ip_route_supernets_cmd);
install_element (ENABLE_NODE, &show_ip_route_summary_cmd);
install_element (ENABLE_NODE, &show_ip_route_summary_prefix_cmd);
2002-12-13 21:15:29 +01:00
install_element (VIEW_NODE, &show_ip_rpf_cmd);
install_element (ENABLE_NODE, &show_ip_rpf_cmd);
install_element (VIEW_NODE, &show_ip_rpf_addr_cmd);
install_element (ENABLE_NODE, &show_ip_rpf_addr_cmd);
/* Commands for VRF */
install_element (CONFIG_NODE, &ip_route_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_tag_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags2_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags2_tag_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_tag_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags2_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags2_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags2_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags2_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags2_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags2_tag_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags_distance2_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_flags_tag_distance2_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_distance2_vrf_cmd);
install_element (CONFIG_NODE, &ip_route_mask_flags_tag_distance2_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_distance2_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_flags_tag_distance2_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_distance2_vrf_cmd);
install_element (CONFIG_NODE, &no_ip_route_mask_flags_tag_distance2_vrf_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_addr_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_tag_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_prefix_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_prefix_longer_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_protocol_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_supernets_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_summary_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_summary_prefix_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_addr_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_tag_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_prefix_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_protocol_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_supernets_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_summary_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_summary_prefix_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_tag_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_addr_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_prefix_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_prefix_longer_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_protocol_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_supernets_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_summary_cmd);
install_element (VIEW_NODE, &show_ip_route_vrf_all_summary_prefix_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_tag_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_addr_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_prefix_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_protocol_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_supernets_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_summary_cmd);
install_element (ENABLE_NODE, &show_ip_route_vrf_all_summary_prefix_cmd);
2002-12-13 21:15:29 +01:00
#ifdef HAVE_IPV6
install_element (CONFIG_NODE, &ipv6_route_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &ipv6_route_ifname_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &no_ipv6_route_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &no_ipv6_route_ifname_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &ipv6_route_pref_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_pref_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &ipv6_route_ifname_pref_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &no_ipv6_route_pref_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_cmd);
2002-12-13 21:15:29 +01:00
install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_cmd);
install_element (CONFIG_NODE, &ipv6_route_tag_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_tag_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_tag_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_tag_cmd);
install_element (CONFIG_NODE, &ipv6_route_pref_tag_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_pref_tag_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_pref_tag_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_pref_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_tag_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_tag_cmd);
install_element (CONFIG_NODE, &ip_nht_default_route_cmd);
install_element (CONFIG_NODE, &no_ip_nht_default_route_cmd);
install_element (CONFIG_NODE, &ipv6_nht_default_route_cmd);
install_element (CONFIG_NODE, &no_ipv6_nht_default_route_cmd);
2002-12-13 21:15:29 +01:00
install_element (VIEW_NODE, &show_ipv6_route_cmd);
install_element (VIEW_NODE, &show_ipv6_route_tag_cmd);
install_element (VIEW_NODE, &show_ipv6_route_summary_cmd);
install_element (VIEW_NODE, &show_ipv6_route_summary_prefix_cmd);
2002-12-13 21:15:29 +01:00
install_element (VIEW_NODE, &show_ipv6_route_protocol_cmd);
install_element (VIEW_NODE, &show_ipv6_route_addr_cmd);
install_element (VIEW_NODE, &show_ipv6_route_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_route_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_tag_cmd);
2002-12-13 21:15:29 +01:00
install_element (ENABLE_NODE, &show_ipv6_route_protocol_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_addr_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_prefix_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_summary_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_summary_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_mroute_cmd);
install_element (ENABLE_NODE, &show_ipv6_mroute_cmd);
/* Commands for VRF */
install_element (CONFIG_NODE, &ipv6_route_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_pref_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_pref_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_pref_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_pref_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_tag_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_tag_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_pref_tag_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_flags_pref_tag_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_pref_tag_vrf_cmd);
install_element (CONFIG_NODE, &ipv6_route_ifname_flags_pref_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_pref_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_flags_pref_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_pref_tag_vrf_cmd);
install_element (CONFIG_NODE, &no_ipv6_route_ifname_flags_pref_tag_vrf_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_tag_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_summary_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_summary_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_protocol_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_addr_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_tag_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_protocol_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_addr_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_prefix_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_summary_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_summary_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_tag_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_summary_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_summary_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_protocol_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_addr_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_route_vrf_all_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_tag_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_protocol_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_addr_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_prefix_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_prefix_longer_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_summary_cmd);
install_element (ENABLE_NODE, &show_ipv6_route_vrf_all_summary_prefix_cmd);
install_element (VIEW_NODE, &show_ipv6_mroute_vrf_cmd);
install_element (ENABLE_NODE, &show_ipv6_mroute_vrf_cmd);
install_element (VIEW_NODE, &show_ipv6_mroute_vrf_all_cmd);
install_element (ENABLE_NODE, &show_ipv6_mroute_vrf_all_cmd);
2002-12-13 21:15:29 +01:00
#endif /* HAVE_IPV6 */
}