diff options
author | Ondrej Zajicek <santiago@crfreenet.org> | 2023-01-22 18:12:04 +0100 |
---|---|---|
committer | Ondrej Zajicek <santiago@crfreenet.org> | 2023-01-22 18:21:08 +0100 |
commit | a82683694da23799f247b3392a00efdd342afdfc (patch) | |
tree | 0dab0d2f8d39a56f14bd989912d2364db124e4d9 | |
parent | 3186ffe79714a48542d5ad61a94c81216b522fd0 (diff) |
VRF: Fix issues with reconfiguration
Protocols receive if_notify() announcements that are filtered according
to their VRF setting, but during reconfiguration, they access iface_list
directly and forgot to check VRF setting here, which leads to all
interfaces be addedd.
Fix this issue for Babel, OSPF, RAdv and RIP protocols.
Thanks to Marcel Menzel for the bugreport.
-rw-r--r-- | proto/babel/babel.c | 3 | ||||
-rw-r--r-- | proto/ospf/iface.c | 6 | ||||
-rw-r--r-- | proto/radv/radv.c | 3 | ||||
-rw-r--r-- | proto/rip/rip.c | 3 |
4 files changed, 15 insertions, 0 deletions
diff --git a/proto/babel/babel.c b/proto/babel/babel.c index ecde07b3..ff8b6b52 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -1946,6 +1946,9 @@ 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) + continue; + if (!(iface->flags & IF_UP)) continue; diff --git a/proto/ospf/iface.c b/proto/ospf/iface.c index 4cd45033..87e3d95e 100644 --- a/proto/ospf/iface.c +++ b/proto/ospf/iface.c @@ -1227,6 +1227,9 @@ ospf_reconfigure_ifaces2(struct ospf_proto *p) WALK_LIST(iface, iface_list) { + if (p->p.vrf_set && p->p.vrf != iface->master) + continue; + if (! (iface->flags & IF_UP)) continue; @@ -1273,6 +1276,9 @@ ospf_reconfigure_ifaces3(struct ospf_proto *p) WALK_LIST(iface, iface_list) { + if (p->p.vrf_set && p->p.vrf != iface->master) + continue; + if (! (iface->flags & IF_UP)) continue; diff --git a/proto/radv/radv.c b/proto/radv/radv.c index 541c3986..119a8dc4 100644 --- a/proto/radv/radv.c +++ b/proto/radv/radv.c @@ -663,6 +663,9 @@ 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) + continue; + if (!(iface->flags & IF_UP)) continue; diff --git a/proto/rip/rip.c b/proto/rip/rip.c index 5f3161ee..8c2d5aeb 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -797,6 +797,9 @@ 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) + continue; + if (!(iface->flags & IF_UP)) continue; |