Skip to content

Commit 9329b58

Browse files
wdebruijkuba-moo
authored andcommitted
ipv4: remove get_rttos
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 <[email protected]> Reviewed-by: David Ahern <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 9478879 commit 9329b58

File tree

4 files changed

+12
-17
lines changed

4 files changed

+12
-17
lines changed

include/net/ip.h

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ static inline void ipcm_init(struct ipcm_cookie *ipcm)
9292
static inline void ipcm_init_sk(struct ipcm_cookie *ipcm,
9393
const struct inet_sock *inet)
9494
{
95-
ipcm_init(ipcm);
95+
*ipcm = (struct ipcm_cookie) {
96+
.tos = READ_ONCE(inet->tos),
97+
};
9698

9799
sockcm_init(&ipcm->sockc, &inet->sk);
98100

@@ -256,13 +258,6 @@ static inline u8 ip_sendmsg_scope(const struct inet_sock *inet,
256258
return RT_SCOPE_UNIVERSE;
257259
}
258260

259-
static inline __u8 get_rttos(struct ipcm_cookie* ipc, struct inet_sock *inet)
260-
{
261-
u8 dsfield = ipc->tos != -1 ? ipc->tos : READ_ONCE(inet->tos);
262-
263-
return dsfield & INET_DSCP_MASK;
264-
}
265-
266261
/* datagram.c */
267262
int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);
268263
int ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len);

net/ipv4/ping.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
705705
struct ip_options_data opt_copy;
706706
int free = 0;
707707
__be32 saddr, daddr, faddr;
708-
u8 tos, scope;
708+
u8 scope;
709709
int err;
710710

711711
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)
768768
}
769769
faddr = ipc.opt->opt.faddr;
770770
}
771-
tos = get_rttos(&ipc, inet);
772771
scope = ip_sendmsg_scope(inet, &ipc, msg);
773772

774773
if (ipv4_is_multicast(daddr)) {
@@ -779,7 +778,8 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
779778
} else if (!ipc.oif)
780779
ipc.oif = READ_ONCE(inet->uc_index);
781780

782-
flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos, scope,
781+
flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark,
782+
ipc.tos & INET_DSCP_MASK, scope,
783783
sk->sk_protocol, inet_sk_flowi_flags(sk), faddr,
784784
saddr, 0, 0, sk->sk_uid);
785785

net/ipv4/raw.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
486486
struct ipcm_cookie ipc;
487487
struct rtable *rt = NULL;
488488
struct flowi4 fl4;
489-
u8 tos, scope;
489+
u8 scope;
490490
int free = 0;
491491
__be32 daddr;
492492
__be32 saddr;
@@ -581,7 +581,6 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
581581
daddr = ipc.opt->opt.faddr;
582582
}
583583
}
584-
tos = get_rttos(&ipc, inet);
585584
scope = ip_sendmsg_scope(inet, &ipc, msg);
586585

587586
uc_index = READ_ONCE(inet->uc_index);
@@ -606,7 +605,8 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
606605
}
607606
}
608607

609-
flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark, tos, scope,
608+
flowi4_init_output(&fl4, ipc.oif, ipc.sockc.mark,
609+
ipc.tos & INET_DSCP_MASK, scope,
610610
hdrincl ? ipc.protocol : sk->sk_protocol,
611611
inet_sk_flowi_flags(sk) |
612612
(hdrincl ? FLOWI_FLAG_KNOWN_NH : 0),

net/ipv4/udp.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,7 +1280,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
12801280
int free = 0;
12811281
int connected = 0;
12821282
__be32 daddr, faddr, saddr;
1283-
u8 tos, scope;
1283+
u8 scope;
12841284
__be16 dport;
12851285
int err, is_udplite = IS_UDPLITE(sk);
12861286
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)
14041404
faddr = ipc.opt->opt.faddr;
14051405
connected = 0;
14061406
}
1407-
tos = get_rttos(&ipc, inet);
14081407
scope = ip_sendmsg_scope(inet, &ipc, msg);
14091408
if (scope == RT_SCOPE_LINK)
14101409
connected = 0;
@@ -1441,7 +1440,8 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
14411440

14421441
fl4 = &fl4_stack;
14431442

1444-
flowi4_init_output(fl4, ipc.oif, ipc.sockc.mark, tos, scope,
1443+
flowi4_init_output(fl4, ipc.oif, ipc.sockc.mark,
1444+
ipc.tos & INET_DSCP_MASK, scope,
14451445
sk->sk_protocol, flow_flags, faddr, saddr,
14461446
dport, inet->inet_sport, sk->sk_uid);
14471447

0 commit comments

Comments
 (0)