ipv4: remove get_rttos
authorWillem de Bruijn <willemb@google.com>
Fri, 14 Feb 2025 22:27:01 +0000 (17:27 -0500)
committerJakub Kicinski <kuba@kernel.org>
Wed, 19 Feb 2025 02:27:19 +0000 (18:27 -0800)
Initialize the ip cookie tos field when initializing the cookie, in
ipcm_init_sk.

The existing code inverts the standard pattern for initializing cookie
fields. Default is to initialize the field from the sk, then possibly
overwrite that when parsing cmsgs (the unlikely case).

This field inverts that, setting the field to an illegal value and
after cmsg parsing checking whether the value is still illegal and
thus should be overridden.

Be careful to always apply mask INET_DSCP_MASK, as before.

Signed-off-by: Willem de Bruijn <willemb@google.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Link: https://patch.msgid.link/20250214222720.3205500-5-willemdebruijn.kernel@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/ip.h
net/ipv4/ping.c
net/ipv4/raw.c
net/ipv4/udp.c

index 3c4ef5ddad83a4c594daa4e6b0e557a883f42d11..ce5e59957dd553697536ddf111bb1406d9d99408 100644 (file)
@@ -92,7 +92,9 @@ static inline void ipcm_init(struct ipcm_cookie *ipcm)
 static inline void ipcm_init_sk(struct ipcm_cookie *ipcm,
                                const struct inet_sock *inet)
 {
-       ipcm_init(ipcm);
+       *ipcm = (struct ipcm_cookie) {
+               .tos = READ_ONCE(inet->tos),
+       };
 
        sockcm_init(&ipcm->sockc, &inet->sk);
 
@@ -256,13 +258,6 @@ static inline u8 ip_sendmsg_scope(const struct inet_sock *inet,
        return RT_SCOPE_UNIVERSE;
 }
 
-static inline __u8 get_rttos(struct ipcm_cookie* ipc, struct inet_sock *inet)
-{
-       u8 dsfield = ipc->tos != -1 ? ipc->tos : READ_ONCE(inet->tos);
-
-       return dsfield & INET_DSCP_MASK;
-}
-
 /* datagram.c */
 int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
 int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
index 619ddc087957fa7939195f410852b1d6c051d7ae..85d09f2ecadcb690f01985771afa37ce2cd0befc 100644 (file)
@@ -705,7 +705,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        struct ip_options_data opt_copy;
        int free = 0;
        __be32 saddr, daddr, faddr;
-       u8 tos, scope;
+       u8 scope;
        int err;
 
        pr_debug("ping_v4_sendmsg(sk=%p,sk->num=%u)\n", inet, inet->inet_num);
@@ -768,7 +768,6 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                }
                faddr = ipc.opt->opt.faddr;
        }
-       tos = get_rttos(&ipc, inet);
        scope = ip_sendmsg_scope(inet, &ipc, msg);
 
        if (ipv4_is_multicast(daddr)) {
@@ -779,7 +778,8 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        } else if (!ipc.oif)
                ipc.oif = READ_ONCE(inet->uc_index);
 
-       flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos, scope,
+       flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark,
+                          ipc.tos & INET_DSCP_MASK, scope,
                           sk->sk_protocol, inet_sk_flowi_flags(sk), faddr,
                           saddr, 0, 0, sk->sk_uid);
 
index 4304a68d1db058f87fe0672049e06a86e1962454..6aace4d55733e233c932db6f3e644eaf86b40411 100644 (file)
@@ -486,7 +486,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        struct ipcm_cookie ipc;
        struct rtable *rt = NULL;
        struct flowi4 fl4;
-       u8 tos, scope;
+       u8 scope;
        int free = 0;
        __be32 daddr;
        __be32 saddr;
@@ -581,7 +581,6 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                        daddr = ipc.opt->opt.faddr;
                }
        }
-       tos = get_rttos(&ipc, inet);
        scope = ip_sendmsg_scope(inet, &ipc, msg);
 
        uc_index = READ_ONCE(inet->uc_index);
@@ -606,7 +605,8 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                }
        }
 
-       flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos, scope,
+       flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark,
+                          ipc.tos & INET_DSCP_MASK, scope,
                           hdrincl ? ipc.protocol : sk->sk_protocol,
                           inet_sk_flowi_flags(sk) |
                            (hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),
index 3485989cd4bdec96e8cb7ecb28b68a25c3444a96..17c7736d8349433ad2d4cbcc9414b2f8112610af 100644 (file)
@@ -1280,7 +1280,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
        int free = 0;
        int connected = 0;
        __be32 daddr, faddr, saddr;
-       u8 tos, scope;
+       u8 scope;
        __be16 dport;
        int err, is_udplite = IS_UDPLITE(sk);
        int corkreq = udp_test_bit(CORK, sk) || msg->msg_flags & MSG_MORE;
@@ -1404,7 +1404,6 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
                faddr = ipc.opt->opt.faddr;
                connected = 0;
        }
-       tos = get_rttos(&ipc, inet);
        scope = ip_sendmsg_scope(inet, &ipc, msg);
        if (scope == RT_SCOPE_LINK)
                connected = 0;
@@ -1441,7 +1440,8 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
 
                fl4 = &fl4_stack;
 
-               flowi4_init_output(fl4, ipc.oif, ipc.sockc.mark, tos, scope,
+               flowi4_init_output(fl4, ipc.oif, ipc.sockc.mark,
+                                  ipc.tos & INET_DSCP_MASK, scope,
                                   sk->sk_protocol, flow_flags, faddr, saddr,
                                   dport, inet->inet_sport, sk->sk_uid);