mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-08 05:27:47 +00:00
bgpd, lib, zebra: Add ability to retrieve ifp without specifying a vrf
There are cases where we get an interface name but do not have a corresponding vrf. We care about getting an interface pointer so just provide a function that searches all vrf's for the ifp. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com> Reviewed-by: Radhicak Mahankali <radhika@cumulusnetworks.com> Reviewed-by: Vivek Venkatraman <vivek@cumulusnetworks.com>
This commit is contained in:
parent
b359768d22
commit
f896287128
@ -949,7 +949,7 @@ route_match_interface (void *rule, struct prefix *prefix,
|
|||||||
if (!info || !info->attr)
|
if (!info || !info->attr)
|
||||||
return RMAP_NOMATCH;
|
return RMAP_NOMATCH;
|
||||||
|
|
||||||
ifp = if_lookup_by_name ((char *)rule);
|
ifp = if_lookup_by_name_all_vrf ((char *)rule);
|
||||||
|
|
||||||
if (ifp == NULL || ifp->ifindex != info->attr->nh_ifindex)
|
if (ifp == NULL || ifp->ifindex != info->attr->nh_ifindex)
|
||||||
return RMAP_NOMATCH;
|
return RMAP_NOMATCH;
|
||||||
|
18
lib/if.c
18
lib/if.c
@ -290,6 +290,24 @@ if_lookup_by_name_vrf (const char *name, vrf_id_t vrf_id)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct interface *
|
||||||
|
if_lookup_by_name_all_vrf (const char *name)
|
||||||
|
{
|
||||||
|
struct interface *ifp;
|
||||||
|
struct vrf *vrf = NULL;
|
||||||
|
vrf_iter_t iter;
|
||||||
|
|
||||||
|
for (iter = vrf_first (); iter != VRF_ITER_INVALID; iter = vrf_next (iter))
|
||||||
|
{
|
||||||
|
vrf = vrf_iter2vrf (iter);
|
||||||
|
ifp = if_lookup_by_name_vrf (name, vrf->vrf_id);
|
||||||
|
if (ifp)
|
||||||
|
return ifp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
struct interface *
|
struct interface *
|
||||||
if_lookup_by_name (const char *name)
|
if_lookup_by_name (const char *name)
|
||||||
{
|
{
|
||||||
|
1
lib/if.h
1
lib/if.h
@ -287,6 +287,7 @@ extern struct interface *if_lookup_prefix_vrf (struct prefix *prefix,
|
|||||||
extern struct interface *if_lookup_by_name (const char *ifname);
|
extern struct interface *if_lookup_by_name (const char *ifname);
|
||||||
extern struct interface *if_get_by_name (const char *ifname);
|
extern struct interface *if_get_by_name (const char *ifname);
|
||||||
|
|
||||||
|
extern struct interface *if_lookup_by_name_all_vrf (const char *ifname);
|
||||||
extern struct interface *if_lookup_by_name_vrf (const char *ifname,
|
extern struct interface *if_lookup_by_name_vrf (const char *ifname,
|
||||||
vrf_id_t vrf_id);
|
vrf_id_t vrf_id);
|
||||||
extern struct interface *if_get_by_name_vrf (const char *ifname,
|
extern struct interface *if_get_by_name_vrf (const char *ifname,
|
||||||
|
@ -492,7 +492,7 @@ zebra_ptm_handle_msg_cb(void *arg, void *in_ctxt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(ZEBRA_PTM_INVALID_PORT_NAME, port_str)) {
|
if (strcmp(ZEBRA_PTM_INVALID_PORT_NAME, port_str)) {
|
||||||
ifp = if_lookup_by_name(port_str);
|
ifp = if_lookup_by_name_all_vrf(port_str);
|
||||||
|
|
||||||
if (!ifp) {
|
if (!ifp) {
|
||||||
zlog_err("%s: %s not found in interface list", __func__, port_str);
|
zlog_err("%s: %s not found in interface list", __func__, port_str);
|
||||||
|
Loading…
Reference in New Issue
Block a user