From: Donald Sharp Date: Wed, 23 Mar 2016 19:38:30 +0000 (-0700) Subject: bgpd, lib, zebra: Add ability to retrieve ifp without specifying a vrf X-Git-Tag: frr-2.0-rc1~1042 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=f8962871283672835ee121737b67cb689fa3823b;p=mirror%2Ffrr.git 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 Reviewed-by: Radhicak Mahankali Reviewed-by: Vivek Venkatraman --- diff --git a/bgpd/bgp_routemap.c b/bgpd/bgp_routemap.c index 311ebb3635..9833e4e86b 100644 --- a/bgpd/bgp_routemap.c +++ b/bgpd/bgp_routemap.c @@ -949,7 +949,7 @@ route_match_interface (void *rule, struct prefix *prefix, if (!info || !info->attr) 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) return RMAP_NOMATCH; diff --git a/lib/if.c b/lib/if.c index cf88b031b3..443cd419be 100644 --- a/lib/if.c +++ b/lib/if.c @@ -290,6 +290,24 @@ if_lookup_by_name_vrf (const char *name, vrf_id_t vrf_id) 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 * if_lookup_by_name (const char *name) { diff --git a/lib/if.h b/lib/if.h index 797a68bf82..f9c4cd5063 100644 --- a/lib/if.h +++ b/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_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, vrf_id_t vrf_id); extern struct interface *if_get_by_name_vrf (const char *ifname, diff --git a/zebra/zebra_ptm.c b/zebra/zebra_ptm.c index f32fedd9f6..bd4c03d1d1 100644 --- a/zebra/zebra_ptm.c +++ b/zebra/zebra_ptm.c @@ -492,7 +492,7 @@ zebra_ptm_handle_msg_cb(void *arg, void *in_ctxt) } 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) { zlog_err("%s: %s not found in interface list", __func__, port_str);