[Devel] [PATCH RHEL9 COMMIT] net/ipv4: fib_semantics: omit excess rtm_flags
Konstantin Khorenko
khorenko at virtuozzo.com
Fri Jun 10 15:44:50 MSK 2022
The commit is pushed to "branch-rh9-5.14.0-70.13.1.vz9.16.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh9-5.14.0-70.13.1.vz9.16.3
------>
commit cfbb472ec2ed95c40f417fc50f0caed4a40d587c
Author: Alexander Mikhalitsyn <alexander.mikhalitsyn at virtuozzo.com>
Date: Fri Jun 10 13:19:59 2022 +0300
net/ipv4: fib_semantics: omit excess rtm_flags
During ip route save we may get flags
RTNH_F_DEAD and RTNH_F_LINKDOWN in final dump image.
But we can't set these flags back during restore, because
these flags calculated dynamically in the kernel. It's
an inconsistency between NLM_F_DUMP and NLM_F_CREATE.
It's fully safe to workaround it just by ignoring such flags
in the kernel during RTM_NEWROUTE request processing.
Later, once my patches will be merged to mainstream we
can drop this commit.
Reproducer:
$ ip link add type veth
$ ip addr add 10.0.0.1/24 dev veth0
$ ip link set veth0 up
$ ip route add default via 10.0.0.1
$ ip route save > route_dump
$ ip route restore < route_dump
Error: Invalid rtm_flags - can not contain DEAD or LINKDOWN.
Reference:
[RFC PATCH net-next] rtnetlink: add RTNH_F_REJECT_MASK
[RFC PATCH iproute2] ip route: save: exclude rtnh_flags which can't be set
https://lore.kernel.org/netdev/20211111160240.739294-1-alexander.mikhalitsyn@virtuozzo.com/T/#t
https://jira.sw.ru/browse/PSBM-135303
https://jira.sw.ru/browse/PSBM-140280
Signed-off-by: Alexander Mikhalitsyn <alexander.mikhalitsyn at virtuozzo.com>
Feature: fix net
---
net/ipv4/fib_semantics.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index e20c16aad81a..c200a2643ef4 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c
@@ -683,11 +683,24 @@ static int fib_get_nhs(struct fib_info *fi, struct rtnexthop *rtnh,
return -EINVAL;
}
+#if 0
if (rtnh->rtnh_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) {
NL_SET_ERR_MSG(extack,
"Invalid flags for nexthop - can not contain DEAD or LINKDOWN");
return -EINVAL;
}
+#else
+ /* We just want to workaround inconsistency between dump and restore.
+ * During dump the userspace requests:
+ * nlmsg_type=RTM_GETROUTE, nlmsg_flags=NLM_F_REQUEST|NLM_F_DUMP
+ * it may get RTNH_F_DEAD and RTNH_F_LINKDOWN bits set on rtnh_flags.
+ * But during the restore process:
+ * nlmsg_type=RTM_NEWROUTE, nlmsg_flags=NLM_F_REQUEST|..|NLM_F_CREATE
+ * the userspace can't set this flags back. It's obvious inconsistency,
+ * let's temporarily workaround it just by ignoring excess flags.
+ */
+ rtnh->rtnh_flags &= ~(RTNH_F_DEAD | RTNH_F_LINKDOWN);
+#endif
fib_cfg.fc_flags = (cfg->fc_flags & ~0xFF) | rtnh->rtnh_flags;
fib_cfg.fc_oif = rtnh->rtnh_ifindex;
@@ -1361,11 +1374,15 @@ struct fib_info *fib_create_info(struct fib_config *cfg,
goto err_inval;
}
+#if 0
if (cfg->fc_flags & (RTNH_F_DEAD | RTNH_F_LINKDOWN)) {
NL_SET_ERR_MSG(extack,
"Invalid rtm_flags - can not contain DEAD or LINKDOWN");
goto err_inval;
}
+#else
+ cfg->fc_flags &= ~(RTNH_F_DEAD | RTNH_F_LINKDOWN);
+#endif
if (cfg->fc_nh_id) {
if (!cfg->fc_mx) {
More information about the Devel
mailing list