diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2023-08-23 15:55:31 +0200 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2023-08-23 16:08:40 +0200 |
commit | e3c0eca95642a846ab65261424a51dd99d954017 (patch) | |
tree | e108f29222cd8b62a40f7b05360c05b9f34d3b9a /proto | |
parent | 5121101136cb80151a9361c63dc4822afeb44eef (diff) |
Nest: Treat VRF interfaces as inside respective VRFs
Despite not having defined 'master interface', VRF interfaces should be
treated as being inside respective VRFs. They behave as a loopback for
respective VRFs. Treating the VRF interface as inside the VRF allows
e.g. OSPF to pick up IP addresses defined on the VRF interface.
For this, we also need to tell apart VRF interfaces and regular interfaces.
Extend Netlink code to parse interface type and mark VRF interfaces with
IF_VRF flag.
Based on the patch from Erin Shepherd, thanks!
Diffstat (limited to 'proto')
-rw-r--r-- | proto/babel/babel.c | 2 | ||||
-rw-r--r-- | proto/bgp/packets.c | 2 | ||||
-rw-r--r-- | proto/ospf/iface.c | 4 | ||||
-rw-r--r-- | proto/radv/radv.c | 2 | ||||
-rw-r--r-- | proto/rip/rip.c | 2 |
5 files changed, 6 insertions, 6 deletions
diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 7f0cca73..4187d258 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -2062,7 +2062,7 @@ babel_reconfigure_ifaces(struct babel_proto *p, struct babel_config *cf) WALK_LIST(iface, iface_list) { - if (p->p.vrf_set && p->p.vrf != iface->master) + if (p->p.vrf_set && !if_in_vrf(iface, p->p.vrf)) continue; if (!(iface->flags & IF_UP)) diff --git a/proto/bgp/packets.c b/proto/bgp/packets.c index ee98115d..dc52e805 100644 --- a/proto/bgp/packets.c +++ b/proto/bgp/packets.c @@ -1179,7 +1179,7 @@ bgp_use_gateway(struct bgp_export_state *s) return 0; /* Do not use gateway from different VRF */ - if (p->p.vrf_set && ra->nh.iface && (p->p.vrf != ra->nh.iface->master)) + if (p->p.vrf_set && ra->nh.iface && !if_in_vrf(ra->nh.iface, p->p.vrf)) return 0; /* Use it when exported to internal peers */ diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c index 87e3d95e..dd922b00 100644 --- a/proto/ospf/iface.c +++ b/proto/ospf/iface.c @@ -1227,7 +1227,7 @@ ospf_reconfigure_ifaces2(struct ospf_proto *p) WALK_LIST(iface, iface_list) { - if (p->p.vrf_set && p->p.vrf != iface->master) + if (p->p.vrf_set && !if_in_vrf(iface, p->p.vrf)) continue; if (! (iface->flags & IF_UP)) @@ -1276,7 +1276,7 @@ ospf_reconfigure_ifaces3(struct ospf_proto *p) WALK_LIST(iface, iface_list) { - if (p->p.vrf_set && p->p.vrf != iface->master) + if (p->p.vrf_set && !if_in_vrf(iface, p->p.vrf)) continue; if (! (iface->flags & IF_UP)) diff --git a/proto/radv/radv.c b/proto/radv/radv.c index 119a8dc4..ba31e1a8 100644 --- a/proto/radv/radv.c +++ b/proto/radv/radv.c @@ -663,7 +663,7 @@ radv_reconfigure(struct proto *P, struct proto_config *CF) struct iface *iface; WALK_LIST(iface, iface_list) { - if (p->p.vrf_set && p->p.vrf != iface->master) + if (p->p.vrf_set && !if_in_vrf(iface, p->p.vrf)) continue; if (!(iface->flags & IF_UP)) diff --git a/proto/rip/rip.c b/proto/rip/rip.c index 8c2d5aeb..1c3509e4 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -797,7 +797,7 @@ rip_reconfigure_ifaces(struct rip_proto *p, struct rip_config *cf) WALK_LIST(iface, iface_list) { - if (p->p.vrf_set && p->p.vrf != iface->master) + if (p->p.vrf_set && !if_in_vrf(iface, p->p.vrf)) continue; if (!(iface->flags & IF_UP)) |