diff options
author | David S. Miller <davem@davemloft.net> | 2016-01-10 23:32:09 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-01-10 23:32:09 +0100 |
commit | 4156afafcc4c522adfd59c694126edc30247b7ad (patch) | |
tree | 33189ee2067bbb204c886affcbca9ac764621f94 /include/net | |
parent | Merge branch 'mlxsw-layer2-multicast' (diff) | |
parent | ipv4: Namespecify the tcp_keepalive_intvl sysctl knob (diff) | |
download | linux-4156afafcc4c522adfd59c694126edc30247b7ad.tar.xz linux-4156afafcc4c522adfd59c694126edc30247b7ad.zip |
Merge branch 'tcp-keepalive-namespaceify'
Nikolay Borisov says:
====================
Namespaceify tcp keepalive machinery
The following patch series enables the tcp keepalive mechanism
to be configured per net namespace. This is especially useful
if you have multiple containers hosted on one node and one of
them is under DoS- in such situations one thing which could
be done is to configure the tcp keepalive settings such that
connections for that particular container are being reset
faster.
Another scenario where not being able to control those knob
comes per container is problematic is occurs the value of
net.netfilter.nf_conntrack_tcp_timeout_established is set
below the keepalive interval, in such situations the server won't
send an RST packet resulting in applications not trying to
reconnect and stale connection waiting. Changing the global
keepalive value is a possible solution but it might interfere
with other containers.
The three patches gradually convert each of the affected knobs
to be per netns. I thought it would be easier for review than
put everything in one patch. If people deem it more appropriate
to squash everything in one patch (maybe after review) I'd
be more than happy to do it.
The patches have been compile-tested on 4.4 and functionally
tested on 3.12 and they work as expected.
These are based off 4.4-rc8
====================
Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net')
-rw-r--r-- | include/net/netns/ipv4.h | 4 | ||||
-rw-r--r-- | include/net/tcp.h | 15 |
2 files changed, 13 insertions, 6 deletions
diff --git a/include/net/netns/ipv4.h b/include/net/netns/ipv4.h index d75be32650ba..2b7907a35568 100644 --- a/include/net/netns/ipv4.h +++ b/include/net/netns/ipv4.h @@ -94,6 +94,10 @@ struct netns_ipv4 { int sysctl_tcp_probe_threshold; u32 sysctl_tcp_probe_interval; + int sysctl_tcp_keepalive_time; + int sysctl_tcp_keepalive_probes; + int sysctl_tcp_keepalive_intvl; + struct ping_group_range ping_group_range; atomic_t dev_addr_genid; diff --git a/include/net/tcp.h b/include/net/tcp.h index f33fecf4e282..a80255f4ca33 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -240,9 +240,6 @@ extern int sysctl_tcp_timestamps; extern int sysctl_tcp_window_scaling; extern int sysctl_tcp_sack; extern int sysctl_tcp_fin_timeout; -extern int sysctl_tcp_keepalive_time; -extern int sysctl_tcp_keepalive_probes; -extern int sysctl_tcp_keepalive_intvl; extern int sysctl_tcp_syn_retries; extern int sysctl_tcp_synack_retries; extern int sysctl_tcp_retries1; @@ -1225,17 +1222,23 @@ void tcp_enter_memory_pressure(struct sock *sk); static inline int keepalive_intvl_when(const struct tcp_sock *tp) { - return tp->keepalive_intvl ? : sysctl_tcp_keepalive_intvl; + struct net *net = sock_net((struct sock *)tp); + + return tp->keepalive_intvl ? : net->ipv4.sysctl_tcp_keepalive_intvl; } static inline int keepalive_time_when(const struct tcp_sock *tp) { - return tp->keepalive_time ? : sysctl_tcp_keepalive_time; + struct net *net = sock_net((struct sock *)tp); + + return tp->keepalive_time ? : net->ipv4.sysctl_tcp_keepalive_time; } static inline int keepalive_probes(const struct tcp_sock *tp) { - return tp->keepalive_probes ? : sysctl_tcp_keepalive_probes; + struct net *net = sock_net((struct sock *)tp); + + return tp->keepalive_probes ? : net->ipv4.sysctl_tcp_keepalive_probes; } static inline u32 keepalive_time_elapsed(const struct tcp_sock *tp) |