Thread (13 messages) 13 messages, 2 authors, 2025-02-08

Re: [PATCH net-next 4/7] ipv4: remove get_rttos

From: Willem de Bruijn <willemdebruijn.kernel@gmail.com>
Date: 2025-02-07 17:33:02

Willem de Bruijn wrote:
Willem de Bruijn wrote:
quoted
From: Willem de Bruijn <willemb@google.com>

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>
---
 include/net/ip.h       | 11 +++--------
 net/ipv4/ip_sockglue.c |  4 ++--
 net/ipv4/ping.c        |  1 -
 net/ipv4/raw.c         |  1 -
 net/ipv4/udp.c         |  1 -
 5 files changed, 5 insertions(+), 13 deletions(-)
diff --git a/include/net/ip.h b/include/net/ip.h
index 6af16545b3e3..6819704e2642 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -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) & INET_DSCP_MASK,
+	};
 
 	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);
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index 6d9c5c20b1c4..98b1e4a8b72e 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -314,8 +314,8 @@ int ip_cmsg_send(struct sock *sk, struct msghdr *msg, struct ipcm_cookie *ipc,
 				return -EINVAL;
 			if (val < 0 || val > 255)
 				return -EINVAL;
-			ipc->tos = val;
-			ipc->sockc.priority = rt_tos2priority(ipc->tos);
+			ipc->sockc.priority = rt_tos2priority(val);
+			ipc->tos = val & INET_DSCP_MASK;
 			break;
 		case IP_PROTOCOL:
 			if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)))
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index 619ddc087957..0215885c6df5 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -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);
Here and elsewhere, subsequent code needs to use ipc.tos directly.
Actually I misunderstood the purpose of get_rttos.

It only masks the dsfield when passed to the routing layer, with
flowi4_init_output().

The other purpose of ipc->tos, to initialize iph->tos, takes the
unmasked version including ECN bits.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help