diff options
author | Alexey Kodanev <alexey.kodanev@oracle.com> | 2019-01-16 11:17:45 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2019-01-17 18:01:08 -0500 |
commit | f7c46156f4a9d6ba5c6bcc5c48945e87b0f08c65 (patch) | |
tree | e7bbbab79031f9e37fd7473a8db98fe73be118b5 | |
parent | 8f6b5392856a4b74224e257f3e0874a163b04603 (diff) |
udp6: add missing rehash callback to udplite
After commit 23b0269e58ae ("net: udp6: prefer listeners bound to an
address"), UDP-Lite only works when specifying a local address for
the sockets.
This is related to the problem addressed in the commit 719f835853a9
("udp: add rehash on connect()"). Moreover, __udp6_lib_lookup() now
looks for a socket immediately in the secondary hash table.
And this issue was found with LTP/network tests as well.
Fixes: 23b0269e58ae ("net: udp6: prefer listeners bound to an address")
Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv6/udp.c | 2 | ||||
-rw-r--r-- | net/ipv6/udp_impl.h | 1 | ||||
-rw-r--r-- | net/ipv6/udplite.c | 1 |
3 files changed, 3 insertions, 1 deletions
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e1f2b9660666..2596ffdeebea 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -102,7 +102,7 @@ int udp_v6_get_port(struct sock *sk, unsigned short snum) | |||
102 | return udp_lib_get_port(sk, snum, hash2_nulladdr); | 102 | return udp_lib_get_port(sk, snum, hash2_nulladdr); |
103 | } | 103 | } |
104 | 104 | ||
105 | static void udp_v6_rehash(struct sock *sk) | 105 | void udp_v6_rehash(struct sock *sk) |
106 | { | 106 | { |
107 | u16 new_hash = ipv6_portaddr_hash(sock_net(sk), | 107 | u16 new_hash = ipv6_portaddr_hash(sock_net(sk), |
108 | &sk->sk_v6_rcv_saddr, | 108 | &sk->sk_v6_rcv_saddr, |
diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h index 5730e6503cb4..20e324b6f358 100644 --- a/net/ipv6/udp_impl.h +++ b/net/ipv6/udp_impl.h | |||
@@ -13,6 +13,7 @@ int __udp6_lib_err(struct sk_buff *, struct inet6_skb_parm *, u8, u8, int, | |||
13 | __be32, struct udp_table *); | 13 | __be32, struct udp_table *); |
14 | 14 | ||
15 | int udp_v6_get_port(struct sock *sk, unsigned short snum); | 15 | int udp_v6_get_port(struct sock *sk, unsigned short snum); |
16 | void udp_v6_rehash(struct sock *sk); | ||
16 | 17 | ||
17 | int udpv6_getsockopt(struct sock *sk, int level, int optname, | 18 | int udpv6_getsockopt(struct sock *sk, int level, int optname, |
18 | char __user *optval, int __user *optlen); | 19 | char __user *optval, int __user *optlen); |
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c index a125aebc29e5..f35907836444 100644 --- a/net/ipv6/udplite.c +++ b/net/ipv6/udplite.c | |||
@@ -49,6 +49,7 @@ struct proto udplitev6_prot = { | |||
49 | .recvmsg = udpv6_recvmsg, | 49 | .recvmsg = udpv6_recvmsg, |
50 | .hash = udp_lib_hash, | 50 | .hash = udp_lib_hash, |
51 | .unhash = udp_lib_unhash, | 51 | .unhash = udp_lib_unhash, |
52 | .rehash = udp_v6_rehash, | ||
52 | .get_port = udp_v6_get_port, | 53 | .get_port = udp_v6_get_port, |
53 | .memory_allocated = &udp_memory_allocated, | 54 | .memory_allocated = &udp_memory_allocated, |
54 | .sysctl_mem = sysctl_udp_mem, | 55 | .sysctl_mem = sysctl_udp_mem, |