hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/net/ipv6/udp.c
....@@ -54,6 +54,19 @@
5454 #include <trace/events/skb.h>
5555 #include "udp_impl.h"
5656
57
+static void udpv6_destruct_sock(struct sock *sk)
58
+{
59
+ udp_destruct_common(sk);
60
+ inet6_sock_destruct(sk);
61
+}
62
+
63
+int udpv6_init_sock(struct sock *sk)
64
+{
65
+ skb_queue_head_init(&udp_sk(sk)->reader_queue);
66
+ sk->sk_destruct = udpv6_destruct_sock;
67
+ return 0;
68
+}
69
+
5770 static u32 udp6_ehashfn(const struct net *net,
5871 const struct in6_addr *laddr,
5972 const u16 lport,
....@@ -74,7 +87,7 @@
7487 fhash = __ipv6_addr_jhash(faddr, udp_ipv6_hash_secret);
7588
7689 return __inet6_ehashfn(lhash, lport, fhash, fport,
77
- udp_ipv6_hash_secret + net_hash_mix(net));
90
+ udp6_ehash_secret + net_hash_mix(net));
7891 }
7992
8093 int udp_v6_get_port(struct sock *sk, unsigned short snum)
....@@ -176,14 +189,23 @@
176189 score = compute_score(sk, net, saddr, sport,
177190 daddr, hnum, dif, sdif);
178191 if (score > badness) {
179
- result = lookup_reuseport(net, sk, skb,
180
- saddr, sport, daddr, hnum);
192
+ badness = score;
193
+ result = lookup_reuseport(net, sk, skb, saddr, sport, daddr, hnum);
194
+ if (!result) {
195
+ result = sk;
196
+ continue;
197
+ }
198
+
181199 /* Fall back to scoring if group has connections */
182
- if (result && !reuseport_has_conns(sk))
200
+ if (!reuseport_has_conns(sk))
183201 return result;
184202
185
- result = result ? : sk;
186
- badness = score;
203
+ /* Reuseport logic returned an error, keep original score. */
204
+ if (IS_ERR(result))
205
+ continue;
206
+
207
+ badness = compute_score(sk, net, saddr, sport,
208
+ daddr, hnum, dif, sdif);
187209 }
188210 }
189211 return result;
....@@ -1340,9 +1362,11 @@
13401362 msg->msg_name = &sin;
13411363 msg->msg_namelen = sizeof(sin);
13421364 do_udp_sendmsg:
1343
- if (__ipv6_only_sock(sk))
1344
- return -ENETUNREACH;
1345
- return udp_sendmsg(sk, msg, len);
1365
+ err = __ipv6_only_sock(sk) ?
1366
+ -ENETUNREACH : udp_sendmsg(sk, msg, len);
1367
+ msg->msg_name = sin6;
1368
+ msg->msg_namelen = addr_len;
1369
+ return err;
13461370 }
13471371 }
13481372
....@@ -1615,8 +1639,6 @@
16151639 udp_encap_disable();
16161640 }
16171641 }
1618
-
1619
- inet6_destroy_sock(sk);
16201642 }
16211643
16221644 /*
....@@ -1700,7 +1722,7 @@
17001722 .connect = ip6_datagram_connect,
17011723 .disconnect = udp_disconnect,
17021724 .ioctl = udp_ioctl,
1703
- .init = udp_init_sock,
1725
+ .init = udpv6_init_sock,
17041726 .destroy = udpv6_destroy_sock,
17051727 .setsockopt = udpv6_setsockopt,
17061728 .getsockopt = udpv6_getsockopt,