lib, zebra, vtysh: configure an interface in non-default VRF
Introduce a new command "interface IFNAME vrf N" to configure an
interface in the non-default VRF.
Till now, only zebra uses this command. Other daemons will install
the command when they support multiple VRFs.
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>
diff --git a/lib/if.c b/lib/if.c
index 30da8a9..4d4b656 100644
--- a/lib/if.c
+++ b/lib/if.c
@@ -645,6 +645,9 @@
return CMD_WARNING;
}
+ if (argc > 1)
+ VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
+
#ifdef SUNOS_5
ifp = if_sunwzebra_get (argv[0], sl, vrf_id);
#else
@@ -657,6 +660,13 @@
return CMD_SUCCESS;
}
+ALIAS (interface,
+ interface_vrf_cmd,
+ "interface IFNAME " VRF_CMD_STR,
+ "Select an interface to configure\n"
+ "Interface's name\n"
+ VRF_CMD_HELP_STR)
+
DEFUN_NOSH (no_interface,
no_interface_cmd,
"no interface IFNAME",
@@ -668,6 +678,9 @@
struct interface *ifp;
vrf_id_t vrf_id = VRF_DEFAULT;
+ if (argc > 1)
+ VTY_GET_INTEGER ("VRF ID", vrf_id, argv[1]);
+
ifp = if_lookup_by_name_vrf (argv[0], vrf_id);
if (ifp == NULL)
@@ -688,6 +701,14 @@
return CMD_SUCCESS;
}
+ALIAS (no_interface,
+ no_interface_vrf_cmd,
+ "no interface IFNAME " VRF_CMD_STR,
+ NO_STR
+ "Delete a pseudo interface's configuration\n"
+ "Interface's name\n"
+ VRF_CMD_HELP_STR)
+
/* For debug purpose. */
DEFUN (show_address,
show_address_cmd,
diff --git a/lib/if.h b/lib/if.h
index 03bd521..ad85dca 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -342,6 +342,8 @@
extern struct cmd_element no_interface_desc_cmd;
extern struct cmd_element interface_cmd;
extern struct cmd_element no_interface_cmd;
+extern struct cmd_element interface_vrf_cmd;
+extern struct cmd_element no_interface_vrf_cmd;
extern struct cmd_element interface_pseudo_cmd;
extern struct cmd_element no_interface_pseudo_cmd;
extern struct cmd_element show_address_cmd;
diff --git a/vtysh/extract.pl.in b/vtysh/extract.pl.in
index 99d80ed..f057e24 100755
--- a/vtysh/extract.pl.in
+++ b/vtysh/extract.pl.in
@@ -31,6 +31,7 @@
EOF
$ignore{'"interface IFNAME"'} = "ignore";
+$ignore{'"interface IFNAME " "vrf <0-65535>"'} = "ignore";
$ignore{'"ip vrf NAME"'} = "ignore";
$ignore{'"router rip"'} = "ignore";
$ignore{'"router ripng"'} = "ignore";
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index b33ac90..04ac550 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -35,6 +35,7 @@
#include "vtysh/vtysh.h"
#include "log.h"
#include "bgpd/bgp_vty.h"
+#include "vrf.h"
/* Struct VTY. */
struct vty *vty;
@@ -1296,6 +1297,14 @@
return CMD_SUCCESS;
}
+ALIAS_SH (VTYSH_ZEBRA,
+ vtysh_interface,
+ vtysh_interface_vrf_cmd,
+ "interface IFNAME " VRF_CMD_STR,
+ "Select an interface to configure\n"
+ "Interface's name\n"
+ VRF_CMD_HELP_STR)
+
/* TODO Implement "no interface command in isisd. */
DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_RIPNGD|VTYSH_OSPFD|VTYSH_OSPF6D,
vtysh_no_interface_cmd,
@@ -1304,6 +1313,14 @@
"Delete a pseudo interface's configuration\n"
"Interface's name\n")
+DEFSH (VTYSH_ZEBRA,
+ vtysh_no_interface_vrf_cmd,
+ "no interface IFNAME " VRF_CMD_STR,
+ NO_STR
+ "Delete a pseudo interface's configuration\n"
+ "Interface's name\n"
+ VRF_CMD_HELP_STR)
+
/* TODO Implement interface description commands in ripngd, ospf6d
* and isisd. */
DEFSH (VTYSH_ZEBRA|VTYSH_RIPD|VTYSH_OSPFD,
@@ -2381,6 +2398,8 @@
install_element (KEYCHAIN_KEY_NODE, &key_chain_cmd);
install_element (CONFIG_NODE, &vtysh_interface_cmd);
install_element (CONFIG_NODE, &vtysh_no_interface_cmd);
+ install_element (CONFIG_NODE, &vtysh_interface_vrf_cmd);
+ install_element (CONFIG_NODE, &vtysh_no_interface_vrf_cmd);
install_element (ENABLE_NODE, &vtysh_show_running_config_cmd);
install_element (ENABLE_NODE, &vtysh_copy_runningconfig_startupconfig_cmd);
install_element (ENABLE_NODE, &vtysh_write_file_cmd);
diff --git a/zebra/interface.c b/zebra/interface.c
index 3063dad..527893b 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -32,6 +32,7 @@
#include "connected.h"
#include "log.h"
#include "zclient.h"
+#include "vrf.h"
#include "zebra/interface.h"
#include "zebra/rtadv.h"
@@ -914,6 +915,13 @@
return ret;
}
+ALIAS (zebra_interface,
+ zebra_interface_vrf_cmd,
+ "interface IFNAME " VRF_CMD_STR,
+ "Select an interface to configure\n"
+ "Interface's name\n"
+ VRF_CMD_HELP_STR)
+
struct cmd_node interface_node =
{
INTERFACE_NODE,
@@ -1558,8 +1566,10 @@
{
struct listnode *node;
struct interface *ifp;
+ vrf_iter_t iter;
- for (ALL_LIST_ELEMENTS_RO (iflist, node, ifp))
+ for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
+ for (ALL_LIST_ELEMENTS_RO (vrf_iter2iflist (iter), node, ifp))
{
struct zebra_if *if_data;
struct listnode *addrnode;
@@ -1567,9 +1577,12 @@
struct prefix *p;
if_data = ifp->info;
-
- vty_out (vty, "interface %s%s", ifp->name,
- VTY_NEWLINE);
+
+ if (ifp->vrf_id == VRF_DEFAULT)
+ vty_out (vty, "interface %s%s", ifp->name, VTY_NEWLINE);
+ else
+ vty_out (vty, "interface %s vrf %u%s", ifp->name, ifp->vrf_id,
+ VTY_NEWLINE);
if (if_data)
{
@@ -1644,7 +1657,9 @@
install_element (ENABLE_NODE, &show_interface_cmd);
install_element (ENABLE_NODE, &show_interface_desc_cmd);
install_element (CONFIG_NODE, &zebra_interface_cmd);
+ install_element (CONFIG_NODE, &zebra_interface_vrf_cmd);
install_element (CONFIG_NODE, &no_interface_cmd);
+ install_element (CONFIG_NODE, &no_interface_vrf_cmd);
install_default (INTERFACE_NODE);
install_element (INTERFACE_NODE, &interface_desc_cmd);
install_element (INTERFACE_NODE, &no_interface_desc_cmd);