summaryrefslogtreecommitdiffstats
path: root/zebra
diff options
context:
space:
mode:
authorVolodymyr Huti <volodymyr.huti@gmail.com>2022-04-11 05:58:14 +0200
committerVolodymyr Huti <volodymyr.huti@gmail.com>2022-04-19 21:53:57 +0200
commit7fb9825cf7e762add68f5108df4eddda1247f198 (patch)
tree20a0dd47fc61155a8112e1613a8e458925bc198c /zebra
parentMerge pull request #11050 from opensourcerouting/fix/pathd_missing (diff)
downloadfrr-7fb9825cf7e762add68f5108df4eddda1247f198.tar.xz
frr-7fb9825cf7e762add68f5108df4eddda1247f198.zip
zebra: set ZEBRA_IFC_DOWN on connected routes for inactive interfaces
If you are in a situation where you have multiple addresses on an interface, zebra creates one connected route for them. The issue is that the rib entry is not created if addresses were added before the interface was running. We add the address to a running interface in a typical flow. Therefore, we handle the route & rib creation within a single ADD event. In the opposite case, we create the route entries without activating them. These are considered to be active since ZEBRA_IFC_DOWN is not set. On the following interface UP, we ignore the same ADDR_ADD as it overlaps with the existing prefixes -> rib is never created. The minimal reproducible setup: ----------------------------------------- ip link add name dummy0 type dummy ip addr flush dev dummy0 ip link set dummy0 down ip addr add 192.168.1.7/24 dev dummy0 ip addr add 192.168.1.8/24 dev dummy0 ip link set dummy0 up vtysh -c 'show ip route' | grep dummy0 Signed-off-by: Volodymyr Huti <v.huti@vyos.io>
Diffstat (limited to 'zebra')
-rw-r--r--zebra/connected.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/zebra/connected.c b/zebra/connected.c
index 4f4e8be34..eb2720335 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -327,6 +327,8 @@ void connected_add_ipv4(struct interface *ifp, int flags,
/* If we get a notification from the kernel,
* we can safely assume the address is known to the kernel */
SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
+ if (!if_is_operative(ifp))
+ SET_FLAG(ifc->conf, ZEBRA_IFC_DOWN);
/* Allocate new connected address. */
p = prefix_ipv4_new();
@@ -548,6 +550,8 @@ void connected_add_ipv6(struct interface *ifp, int flags,
/* If we get a notification from the kernel,
* we can safely assume the address is known to the kernel */
SET_FLAG(ifc->conf, ZEBRA_IFC_QUEUED);
+ if (!if_is_operative(ifp))
+ SET_FLAG(ifc->conf, ZEBRA_IFC_DOWN);
/* Allocate new connected address. */
p = prefix_ipv6_new();