From: Pat Ruddy Date: Thu, 1 Oct 2020 11:06:50 +0000 (+0100) Subject: lib: add utility to get the next index in a vrf X-Git-Tag: base_8.0~405^2~12 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=0760a74d2fc29a89d1d0d252af98d674323b210a;p=matthieu%2Ffrr.git lib: add utility to get the next index in a vrf Add if_vrf_lookup_by_index_next to get the next ifindex in a vrf given the previous ifindex or 0 for the first. Signed-off-by: Pat Ruddy --- diff --git a/lib/if.c b/lib/if.c index fa0b1d0195..7ec53d356d 100644 --- a/lib/if.c +++ b/lib/if.c @@ -351,6 +351,40 @@ struct interface *if_lookup_by_index(ifindex_t ifindex, vrf_id_t vrf_id) return NULL; } +/* Interface existance check by index. */ +struct interface *if_vrf_lookup_by_index_next(ifindex_t ifindex, + vrf_id_t vrf_id) +{ + struct vrf *vrf = vrf_lookup_by_id(vrf_id); + struct interface *tmp_ifp; + bool found = false; + + if (!vrf) + return NULL; + + 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)) + ifindex = tmp_ifp->ifindex; + else + return tmp_ifp; + } + + 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)) + continue; + else + return tmp_ifp; + } + if (tmp_ifp->ifindex == ifindex) + found = true; + } + return NULL; +} + const char *ifindex2ifname(ifindex_t ifindex, vrf_id_t vrf_id) { struct interface *ifp; diff --git a/lib/if.h b/lib/if.h index a2a40d0957..5bf52936ae 100644 --- a/lib/if.h +++ b/lib/if.h @@ -513,6 +513,8 @@ extern struct interface *if_create_name(const char *name, vrf_id_t vrf_id); /* Create new interface, adds to index list only */ extern struct interface *if_create_ifindex(ifindex_t ifindex, vrf_id_t vrf_id); extern struct interface *if_lookup_by_index(ifindex_t, vrf_id_t vrf_id); +extern struct interface *if_vrf_lookup_by_index_next(ifindex_t ifindex, + vrf_id_t vrf_id); extern struct interface *if_lookup_by_index_all_vrf(ifindex_t); extern struct interface *if_lookup_exact_address(const void *matchaddr, int family, vrf_id_t vrf_id);