[PATCH net-next 07/11] udp/ipv6: clean up udpv6_sendmsg's saddr init

From: Pavel Begunkov
Date: Thu Apr 28 2022 - 06:58:08 EST


We initialise fl6 in udpv6_sendmsg() to zeroes, that sets saddr to any
addr, then it might be changed in by cmsg but only to a non-any addr.
After we check again for it left set to "any", which is likely to be so,
and try to initialise it from socket saddr.

The result of it is that fl6->saddr is set to cmsg's saddr if specified
and inet6_sk(sk)->saddr otherwise. We can achieve the same by
pre-setting it to the sockets saddr and potentially overriding by cmsg
after.

This looks a bit cleaner comparing to conditional init and also removes
extra checks from the way.

Signed-off-by: Pavel Begunkov <asml.silence@xxxxxxxxx>
---
net/ipv6/udp.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 34c5919afa3e..ae774766c116 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1431,14 +1431,15 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
connected = true;
}

+ fl6->flowi6_uid = sk->sk_uid;
+ fl6->saddr = np->saddr;
+ fl6->daddr = *daddr;
+
if (!fl6->flowi6_oif)
fl6->flowi6_oif = sk->sk_bound_dev_if;
-
if (!fl6->flowi6_oif)
fl6->flowi6_oif = np->sticky_pktinfo.ipi6_ifindex;

- fl6->flowi6_uid = sk->sk_uid;
-
if (msg->msg_controllen) {
opt = &opt_space;
memset(opt, 0, sizeof(struct ipv6_txoptions));
@@ -1473,9 +1474,6 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)

fl6->flowi6_proto = sk->sk_protocol;
fl6->flowi6_mark = ipc6.sockc.mark;
- fl6->daddr = *daddr;
- if (ipv6_addr_any(&fl6->saddr) && !ipv6_addr_any(&np->saddr))
- fl6->saddr = np->saddr;
fl6->fl6_sport = inet->inet_sport;

if (cgroup_bpf_enabled(CGROUP_UDP6_SENDMSG) && !connected) {
--
2.36.0