forked from Mirror/frr
lib: Allow interface lookup by VRF_UNKNOWN
Modify if_lookup_by_index to accept a VRF_UNKNOWN as a vrf_id. This will cause it to look in all vrf's for the interface pointer. Subsequently all if_XXXX functions that call this function will also get this behavior. VRF_UNKNOWN *should* not be used for interface creation as that this will break some core assumptions. This work is part of allowing vrf route leaking. Currently it is possible to create a route in the linux kernel that has a nexthop across vrf boundaries. Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
This commit is contained in:
parent
0cb76b9d8d
commit
14fcc65cbb
12
lib/if.c
12
lib/if.c
|
@ -219,6 +219,18 @@ struct interface *if_lookup_by_index(ifindex_t ifindex, vrf_id_t vrf_id)
|
|||
struct vrf *vrf;
|
||||
struct interface if_tmp;
|
||||
|
||||
if (vrf_id == VRF_UNKNOWN) {
|
||||
struct interface *ifp;
|
||||
|
||||
RB_FOREACH(vrf, vrf_id_head, &vrfs_by_id) {
|
||||
ifp = if_lookup_by_index(ifindex, vrf->vrf_id);
|
||||
if (ifp)
|
||||
return ifp;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vrf = vrf_lookup_by_id(vrf_id);
|
||||
if (!vrf)
|
||||
return NULL;
|
||||
|
|
7
lib/if.h
7
lib/if.h
|
@ -452,6 +452,13 @@ struct nbr_connected {
|
|||
/* Prototypes. */
|
||||
extern int if_cmp_name_func(char *, char *);
|
||||
|
||||
/*
|
||||
* Passing in VRF_UNKNOWN is a valid thing to do, unless we
|
||||
* are creating a new interface.
|
||||
*
|
||||
* This is useful for vrf route-leaking. So more than anything
|
||||
* else think before you use VRF_UNKNOWN
|
||||
*/
|
||||
extern void if_update_to_new_vrf(struct interface *, vrf_id_t vrf_id);
|
||||
extern struct interface *if_create(const char *name, vrf_id_t vrf_id);
|
||||
extern struct interface *if_lookup_by_index(ifindex_t, vrf_id_t vrf_id);
|
||||
|
|
Loading…
Reference in a new issue