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 vrf *vrf;
|
||||||
struct interface if_tmp;
|
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);
|
vrf = vrf_lookup_by_id(vrf_id);
|
||||||
if (!vrf)
|
if (!vrf)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
7
lib/if.h
7
lib/if.h
|
@ -452,6 +452,13 @@ struct nbr_connected {
|
||||||
/* Prototypes. */
|
/* Prototypes. */
|
||||||
extern int if_cmp_name_func(char *, char *);
|
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 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_create(const char *name, vrf_id_t vrf_id);
|
||||||
extern struct interface *if_lookup_by_index(ifindex_t, 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