From: Ondrej Zajicek Date: Sun, 22 Jan 2023 17:12:04 +0000 (+0100) Subject: VRF: Fix issues with reconfiguration X-Git-Tag: v2.0.12~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a82683694da23799f247b3392a00efdd342afdfc;p=thirdparty%2Fbird.git 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. --- diff --git a/proto/babel/babel.c b/proto/babel/babel.c index ecde07b3f..ff8b6b52e 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 4cd450331..87e3d95eb 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 541c39861..119a8dc41 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 5f3161ee0..8c2d5aebd 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;