zebra: fix "show interface IFNAME" for netns

With netns VRF backend, we may have multiple interfaces with the same
name. Currently, the function output is not deterministic in this case,
it returns the first interface that it finds in the list. Be more
explicit and tell the user that we need the VRF name.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
Igor Ryzhov 2021-10-14 21:06:38 +03:00
parent 4ff97453d0
commit 31eab818f6

View File

@ -2485,12 +2485,24 @@ DEFPY (show_interface_name_vrf_all,
VRF_ALL_CMD_HELP_STR
JSON_STR)
{
struct interface *ifp;
struct interface *ifp = NULL;
struct interface *ifptmp;
struct vrf *vrf;
json_object *json = NULL;
int count = 0;
interface_update_stats();
ifp = if_lookup_by_name_all_vrf(ifname);
RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) {
ifptmp = if_lookup_by_name_vrf(ifname, vrf);
if (ifptmp) {
ifp = ifptmp;
count++;
if (!vrf_is_backend_netns())
break;
}
}
if (ifp == NULL) {
if (uj)
vty_out(vty, "{}\n");
@ -2498,6 +2510,17 @@ DEFPY (show_interface_name_vrf_all,
vty_out(vty, "%% Can't find interface %s\n", ifname);
return CMD_WARNING;
}
if (count > 1) {
if (uj) {
vty_out(vty, "{}\n");
} else {
vty_out(vty,
"%% There are multiple interfaces with name %s\n",
ifname);
vty_out(vty, "%% You must specify the VRF name\n");
}
return CMD_WARNING;
}
if (uj)
json = json_object_new_object();