For UDP, there is only a single socket-hash table, the udptable. We want to prevent incoming segments to match on this socket when SO_DELAYED_BIND is set. Thus, when computing the score for unconnected sockets, we simply prevent the match as long as the flag is set.
Signed-off-by: Christoph Paasch <cpaa...@apple.com> --- net/ipv4/datagram.c | 1 + net/ipv4/udp.c | 3 +++ 2 files changed, 4 insertions(+) diff --git a/net/ipv4/datagram.c b/net/ipv4/datagram.c index 300921417f89..9bf0e0d2ea33 100644 --- a/net/ipv4/datagram.c +++ b/net/ipv4/datagram.c @@ -78,6 +78,7 @@ int __ip4_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len inet->inet_id = jiffies; sk_dst_set(sk, &rt->dst); + sock_reset_flag(sk, SOCK_DELAYED_BIND); err = 0; out: return err; diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index ca3ed931f2a9..fb55f925342b 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -408,6 +408,9 @@ static int compute_score(struct sock *sk, struct net *net, score += 4; } + if (sock_flag(sk, SOCK_DELAYED_BIND)) + return -1; + if (sk->sk_incoming_cpu == raw_smp_processor_id()) score++; return score; -- 2.16.2