From 830c8f751ce4eb9efd563b624009ef1acafa79eb Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Wed, 7 Jun 2023 13:42:23 +0200 Subject: [PATCH] lib: fix next vrf interface lookup avoid loopback interface When the default vrf is submitted, the returned interface may be the loopback interface, which may not be valid. Actually, on vrfs, the vrf interface is bypassed. When being on default vrf, the 'lo' interface should be bypassed too. Fix this by avoiding returning the lo interface too. Fixes: 0760a74d2fc2 ("lib: add utility to get the next index in a vrf") Signed-off-by: Philippe Guibert --- lib/if.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/if.c b/lib/if.c index 6f567861d19c..30618c53b965 100644 --- a/lib/if.c +++ b/lib/if.c @@ -322,8 +322,8 @@ struct interface *if_vrf_lookup_by_index_next(ifindex_t ifindex, if (ifindex == 0) { tmp_ifp = RB_MIN(if_index_head, &vrf->ifaces_by_index); - /* skip the vrf interface */ - if (tmp_ifp && if_is_vrf(tmp_ifp)) + /* skip the vrf interface or the lo interface */ + if (tmp_ifp && if_is_loopback(tmp_ifp)) ifindex = tmp_ifp->ifindex; else return tmp_ifp; @@ -331,8 +331,8 @@ struct interface *if_vrf_lookup_by_index_next(ifindex_t ifindex, RB_FOREACH (tmp_ifp, if_index_head, &vrf->ifaces_by_index) { if (found) { - /* skip the vrf interface */ - if (tmp_ifp && if_is_vrf(tmp_ifp)) + /* skip the vrf interface or the lo interface */ + if (tmp_ifp && if_is_loopback(tmp_ifp)) continue; else return tmp_ifp;