Skip to content

Commit aefd232

Browse files
committed
Merge branch 'net-deduplicate-cookie-logic'
Willem de Bruijn says: ==================== net: deduplicate cookie logic Reuse standard sk, ip and ipv6 cookie init handlers where possible. Avoid repeated open coding of the same logic. Harmonize feature sets across protocols. Make IPv4 and IPv6 logic more alike. Simplify adding future new fields with a single init point. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 3a03f9e + 5cd2f78 commit aefd232

File tree

14 files changed

+30
-71
lines changed

14 files changed

+30
-71
lines changed

include/net/ip.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,11 +92,12 @@ 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+
};
98+
99+
sockcm_init(&ipcm->sockc, &inet->sk);
96100

97-
ipcm->sockc.mark = READ_ONCE(inet->sk.sk_mark);
98-
ipcm->sockc.priority = READ_ONCE(inet->sk.sk_priority);
99-
ipcm->sockc.tsflags = READ_ONCE(inet->sk.sk_tsflags);
100101
ipcm->oif = READ_ONCE(inet->sk.sk_bound_dev_if);
101102
ipcm->addr = inet->inet_saddr;
102103
ipcm->protocol = inet->inet_num;
@@ -257,13 +258,6 @@ static inline u8 ip_sendmsg_scope(const struct inet_sock *inet,
257258
return RT_SCOPE_UNIVERSE;
258259
}
259260

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

include/net/ipv6.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -363,15 +363,6 @@ struct ipcm6_cookie {
363363
struct ipv6_txoptions *opt;
364364
};
365365

366-
static inline void ipcm6_init(struct ipcm6_cookie *ipc6)
367-
{
368-
*ipc6 = (struct ipcm6_cookie) {
369-
.hlimit = -1,
370-
.tclass = -1,
371-
.dontfrag = -1,
372-
};
373-
}
374-
375366
static inline void ipcm6_init_sk(struct ipcm6_cookie *ipc6,
376367
const struct sock *sk)
377368
{
@@ -380,6 +371,8 @@ static inline void ipcm6_init_sk(struct ipcm6_cookie *ipc6,
380371
.tclass = inet6_sk(sk)->tclass,
381372
.dontfrag = inet6_test_bit(DONTFRAG, sk),
382373
};
374+
375+
sockcm_init(&ipc6->sockc, sk);
383376
}
384377

385378
static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)

include/net/sock.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,7 @@ static inline void sockcm_init(struct sockcm_cookie *sockc,
18291829
const struct sock *sk)
18301830
{
18311831
*sockc = (struct sockcm_cookie) {
1832+
.mark = READ_ONCE(sk->sk_mark),
18321833
.tsflags = READ_ONCE(sk->sk_tsflags),
18331834
.priority = READ_ONCE(sk->sk_priority),
18341835
};

net/can/raw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -963,7 +963,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
963963

964964
skb->dev = dev;
965965
skb->priority = sockc.priority;
966-
skb->mark = READ_ONCE(sk->sk_mark);
966+
skb->mark = sockc.mark;
967967
skb->tstamp = sockc.transmit_time;
968968

969969
skb_setup_tx_timestamp(skb, &sockc);

net/ipv4/icmp.c

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,6 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
405405
struct ipcm_cookie ipc;
406406
struct flowi4 fl4;
407407
struct sock *sk;
408-
struct inet_sock *inet;
409408
__be32 daddr, saddr;
410409
u32 mark = IP4_REPLY_MARK(net, skb->mark);
411410
int type = icmp_param->data.icmph.type;
@@ -424,12 +423,11 @@ static void icmp_reply(struct icmp_bxm *icmp_param, struct sk_buff *skb)
424423
sk = icmp_xmit_lock(net);
425424
if (!sk)
426425
goto out_bh_enable;
427-
inet = inet_sk(sk);
428426

429427
icmp_param->data.icmph.checksum = 0;
430428

431429
ipcm_init(&ipc);
432-
inet->tos = ip_hdr(skb)->tos;
430+
ipc.tos = ip_hdr(skb)->tos;
433431
ipc.sockc.mark = mark;
434432
daddr = ipc.addr = ip_hdr(skb)->saddr;
435433
saddr = fib_compute_spec_dst(skb);
@@ -737,8 +735,8 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
737735
icmp_param.data.icmph.checksum = 0;
738736
icmp_param.skb = skb_in;
739737
icmp_param.offset = skb_network_offset(skb_in);
740-
inet_sk(sk)->tos = tos;
741738
ipcm_init(&ipc);
739+
ipc.tos = tos;
742740
ipc.addr = iph->saddr;
743741
ipc.opt = &icmp_param.replyopts.opt;
744742
ipc.sockc.mark = mark;

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/tcp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1127,7 +1127,7 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size)
11271127
/* 'common' sending to sendq */
11281128
}
11291129

1130-
sockcm_init(&sockc, sk);
1130+
sockc = (struct sockcm_cookie) { .tsflags = READ_ONCE(sk->sk_tsflags)};
11311131
if (msg->msg_controllen) {
11321132
err = sock_cmsg_send(sk, msg, &sockc);
11331133
if (unlikely(err)) {

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

net/ipv6/ping.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,6 @@ static int ping_v6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
119119
return -EINVAL;
120120

121121
ipcm6_init_sk(&ipc6, sk);
122-
ipc6.sockc.priority = READ_ONCE(sk->sk_priority);
123-
ipc6.sockc.tsflags = READ_ONCE(sk->sk_tsflags);
124-
ipc6.sockc.mark = READ_ONCE(sk->sk_mark);
125122

126123
fl6.flowi6_oif = oif;
127124

0 commit comments

Comments
 (0)