]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ipv4: Prepare inet_rtm_getroute() to .flowi4_tos conversion.
authorGuillaume Nault <gnault@redhat.com>
Wed, 15 Jan 2025 12:44:52 +0000 (13:44 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 17 Jan 2025 00:52:29 +0000 (16:52 -0800)
Store rtm->rtm_tos in a dscp_t variable, which can then be used for
setting fl4.flowi4_tos and also be passed as parameter of
ip_route_input_rcu().

The .flowi4_tos field is going to be converted to dscp_t to ensure ECN
bits aren't erroneously taken into account during route lookups. Having
a dscp_t variable available will simplify that conversion, as we'll
just have to drop the inet_dscp_to_dsfield() call.

Note that we can't just convert rtm->rtm_tos to dscp_t because this
structure is exported to user space.

Signed-off-by: Guillaume Nault <gnault@redhat.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/7bc1c7dc47ad1393569095d334521fae59af5bc7.1736944951.git.gnault@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/route.c

index 3a1467f2d553f32b7a2115b7c70a8cf11a184f45..577b88a43293aa801c3ee736d7e5cc4d97917717 100644 (file)
@@ -3270,6 +3270,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
        struct flowi4 fl4 = {};
        __be32 dst = 0;
        __be32 src = 0;
+       dscp_t dscp;
        kuid_t uid;
        u32 iif;
        int err;
@@ -3284,6 +3285,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
        dst = nla_get_in_addr_default(tb[RTA_DST], 0);
        iif = nla_get_u32_default(tb[RTA_IIF], 0);
        mark = nla_get_u32_default(tb[RTA_MARK], 0);
+       dscp = inet_dsfield_to_dscp(rtm->rtm_tos);
        if (tb[RTA_UID])
                uid = make_kuid(current_user_ns(), nla_get_u32(tb[RTA_UID]));
        else
@@ -3308,7 +3310,7 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
 
        fl4.daddr = dst;
        fl4.saddr = src;
-       fl4.flowi4_tos = rtm->rtm_tos & INET_DSCP_MASK;
+       fl4.flowi4_tos = inet_dscp_to_dsfield(dscp);
        fl4.flowi4_oif = nla_get_u32_default(tb[RTA_OIF], 0);
        fl4.flowi4_mark = mark;
        fl4.flowi4_uid = uid;
@@ -3332,9 +3334,8 @@ static int inet_rtm_getroute(struct sk_buff *in_skb, struct nlmsghdr *nlh,
                fl4.flowi4_iif = iif; /* for rt_fill_info */
                skb->dev        = dev;
                skb->mark       = mark;
-               err = ip_route_input_rcu(skb, dst, src,
-                                        inet_dsfield_to_dscp(rtm->rtm_tos),
-                                        dev, &res) ? -EINVAL : 0;
+               err = ip_route_input_rcu(skb, dst, src, dscp, dev,
+                                        &res) ? -EINVAL : 0;
 
                rt = skb_rtable(skb);
                if (err == 0 && rt->dst.error)