net: refactor bind_bucket fastreuse into helper
commit 62ffc589abb176821662efc4525ee4ac0b9c3894 upstream. Refactor the fastreuse update code in inet_csk_get_port into a small helper function that can be called from other places. Acked-by: Matthieu Baerts <matthieu.baerts@tessares.net> Signed-off-by: Tim Froidcoeur <tim.froidcoeur@tessares.net> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Tim Froidcoeur <tim.froidcoeur@tessares.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0696d08a50
commit
f4461490c3
@ -319,5 +319,9 @@ int inet_csk_compat_getsockopt(struct sock *sk, int level, int optname,
|
||||
int inet_csk_compat_setsockopt(struct sock *sk, int level, int optname,
|
||||
char __user *optval, unsigned int optlen);
|
||||
|
||||
/* update the fast reuse flag when adding a socket */
|
||||
void inet_csk_update_fastreuse(struct inet_bind_bucket *tb,
|
||||
struct sock *sk);
|
||||
|
||||
struct dst_entry *inet_csk_update_pmtu(struct sock *sk, u32 mtu);
|
||||
#endif /* _INET_CONNECTION_SOCK_H */
|
||||
|
@ -89,6 +89,28 @@ int inet_csk_bind_conflict(const struct sock *sk,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet_csk_bind_conflict);
|
||||
|
||||
void inet_csk_update_fastreuse(struct inet_bind_bucket *tb,
|
||||
struct sock *sk)
|
||||
{
|
||||
kuid_t uid = sock_i_uid(sk);
|
||||
bool reuse = sk->sk_reuse && sk->sk_state != TCP_LISTEN;
|
||||
|
||||
if (!hlist_empty(&tb->owners)) {
|
||||
if (!reuse)
|
||||
tb->fastreuse = 0;
|
||||
if (!sk->sk_reuseport || !uid_eq(tb->fastuid, uid))
|
||||
tb->fastreuseport = 0;
|
||||
} else {
|
||||
tb->fastreuse = reuse;
|
||||
if (sk->sk_reuseport) {
|
||||
tb->fastreuseport = 1;
|
||||
tb->fastuid = uid;
|
||||
} else {
|
||||
tb->fastreuseport = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Obtain a reference to a local port for the given sock,
|
||||
* if snum is zero it means select any available local port.
|
||||
* We try to allocate an odd port (and leave even ports for connect())
|
||||
@ -218,19 +240,10 @@ tb_found:
|
||||
}
|
||||
goto fail_unlock;
|
||||
}
|
||||
if (!reuse)
|
||||
tb->fastreuse = 0;
|
||||
if (!sk->sk_reuseport || !uid_eq(tb->fastuid, uid))
|
||||
tb->fastreuseport = 0;
|
||||
} else {
|
||||
tb->fastreuse = reuse;
|
||||
if (sk->sk_reuseport) {
|
||||
tb->fastreuseport = 1;
|
||||
tb->fastuid = uid;
|
||||
} else {
|
||||
tb->fastreuseport = 0;
|
||||
}
|
||||
}
|
||||
|
||||
inet_csk_update_fastreuse(tb, sk);
|
||||
|
||||
success:
|
||||
if (!inet_csk(sk)->icsk_bind_hash)
|
||||
inet_bind_hash(sk, tb, port);
|
||||
|
Loading…
x
Reference in New Issue
Block a user