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

net/ipv6/raw.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -769,19 +769,16 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
769769

770770
hdrincl = inet_test_bit(HDRINCL, sk);
771771

772+
ipcm6_init_sk(&ipc6, sk);
773+
772774
/*
773775
* Get and verify the address.
774776
*/
775777
memset(&fl6, 0, sizeof(fl6));
776778

777-
fl6.flowi6_mark = READ_ONCE(sk->sk_mark);
779+
fl6.flowi6_mark = ipc6.sockc.mark;
778780
fl6.flowi6_uid = sk->sk_uid;
779781

780-
ipcm6_init(&ipc6);
781-
ipc6.sockc.tsflags = READ_ONCE(sk->sk_tsflags);
782-
ipc6.sockc.mark = fl6.flowi6_mark;
783-
ipc6.sockc.priority = READ_ONCE(sk->sk_priority);
784-
785782
if (sin6) {
786783
if (addr_len < SIN6_LEN_RFC2133)
787784
return -EINVAL;
@@ -891,9 +888,6 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
891888
if (hdrincl)
892889
fl6.flowi6_flags |= FLOWI_FLAG_KNOWN_NH;
893890

894-
if (ipc6.tclass < 0)
895-
ipc6.tclass = np->tclass;
896-
897891
fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
898892

899893
dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
@@ -904,9 +898,6 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
904898
if (ipc6.hlimit < 0)
905899
ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
906900

907-
if (ipc6.dontfrag < 0)
908-
ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk);
909-
910901
if (msg->msg_flags&MSG_CONFIRM)
911902
goto do_confirm;
912903

net/ipv6/udp.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,11 +1494,8 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
14941494
int is_udplite = IS_UDPLITE(sk);
14951495
int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
14961496

1497-
ipcm6_init(&ipc6);
1497+
ipcm6_init_sk(&ipc6, sk);
14981498
ipc6.gso_size = READ_ONCE(up->gso_size);
1499-
ipc6.sockc.tsflags = READ_ONCE(sk->sk_tsflags);
1500-
ipc6.sockc.mark = READ_ONCE(sk->sk_mark);
1501-
ipc6.sockc.priority = READ_ONCE(sk->sk_priority);
15021499

15031500
/* destination address check */
15041501
if (sin6) {
@@ -1704,9 +1701,6 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
17041701

17051702
security_sk_classify_flow(sk, flowi6_to_flowi_common(fl6));
17061703

1707-
if (ipc6.tclass < 0)
1708-
ipc6.tclass = np->tclass;
1709-
17101704
fl6->flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6->flowlabel);
17111705

17121706
dst = ip6_sk_dst_lookup_flow(sk, fl6, final_p, connected);
@@ -1752,8 +1746,6 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
17521746
WRITE_ONCE(up->pending, AF_INET6);
17531747

17541748
do_append_data:
1755-
if (ipc6.dontfrag < 0)
1756-
ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk);
17571749
up->len += ulen;
17581750
err = ip6_append_data(sk, getfrag, msg, ulen, sizeof(struct udphdr),
17591751
&ipc6, fl6, dst_rt6_info(dst),

net/l2tp/l2tp_ip6.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
547547
fl6.flowi6_mark = READ_ONCE(sk->sk_mark);
548548
fl6.flowi6_uid = sk->sk_uid;
549549

550-
ipcm6_init(&ipc6);
550+
ipcm6_init_sk(&ipc6, sk);
551551

552552
if (lsa) {
553553
if (addr_len < SIN6_LEN_RFC2133)
@@ -634,9 +634,6 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
634634

635635
security_sk_classify_flow(sk, flowi6_to_flowi_common(&fl6));
636636

637-
if (ipc6.tclass < 0)
638-
ipc6.tclass = np->tclass;
639-
640637
fl6.flowlabel = ip6_make_flowinfo(ipc6.tclass, fl6.flowlabel);
641638

642639
dst = ip6_dst_lookup_flow(sock_net(sk), sk, &fl6, final_p);
@@ -648,9 +645,6 @@ static int l2tp_ip6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
648645
if (ipc6.hlimit < 0)
649646
ipc6.hlimit = ip6_sk_dst_hoplimit(np, &fl6, dst);
650647

651-
if (ipc6.dontfrag < 0)
652-
ipc6.dontfrag = inet6_test_bit(DONTFRAG, sk);
653-
654648
if (msg->msg_flags & MSG_CONFIRM)
655649
goto do_confirm;
656650

net/packet/af_packet.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2102,8 +2102,8 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg,
21022102

21032103
skb->protocol = proto;
21042104
skb->dev = dev;
2105-
skb->priority = READ_ONCE(sk->sk_priority);
2106-
skb->mark = READ_ONCE(sk->sk_mark);
2105+
skb->priority = sockc.priority;
2106+
skb->mark = sockc.mark;
21072107
skb_set_delivery_type_by_clockid(skb, sockc.transmit_time, sk->sk_clockid);
21082108
skb_setup_tx_timestamp(skb, &sockc);
21092109

@@ -2634,8 +2634,8 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
26342634

26352635
skb->protocol = proto;
26362636
skb->dev = dev;
2637-
skb->priority = READ_ONCE(po->sk.sk_priority);
2638-
skb->mark = READ_ONCE(po->sk.sk_mark);
2637+
skb->priority = sockc->priority;
2638+
skb->mark = sockc->mark;
26392639
skb_set_delivery_type_by_clockid(skb, sockc->transmit_time, po->sk.sk_clockid);
26402640
skb_setup_tx_timestamp(skb, sockc);
26412641
skb_zcopy_set_nouarg(skb, ph.raw);
@@ -3039,7 +3039,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
30393039
goto out_unlock;
30403040

30413041
sockcm_init(&sockc, sk);
3042-
sockc.mark = READ_ONCE(sk->sk_mark);
30433042
if (msg->msg_controllen) {
30443043
err = sock_cmsg_send(sk, msg, &sockc);
30453044
if (unlikely(err))

0 commit comments

Comments
 (0)