0ed23e961449439e8e5fa92beac8b00f25c02fdc
[openwrt/staging/jow.git] /
1 From 4592ee7f525c4683ec9e290381601fdee50ae110 Mon Sep 17 00:00:00 2001
2 From: Florian Westphal <fw@strlen.de>
3 Date: Wed, 4 Aug 2021 15:02:15 +0200
4 Subject: [PATCH] netfilter: conntrack: remove offload_pickup sysctl again
5
6 These two sysctls were added because the hardcoded defaults (2 minutes,
7 tcp, 30 seconds, udp) turned out to be too low for some setups.
8
9 They appeared in 5.14-rc1 so it should be fine to remove it again.
10
11 Marcelo convinced me that there should be no difference between a flow
12 that was offloaded vs. a flow that was not wrt. timeout handling.
13 Thus the default is changed to those for TCP established and UDP stream,
14 5 days and 120 seconds, respectively.
15
16 Marcelo also suggested to account for the timeout value used for the
17 offloading, this avoids increase beyond the value in the conntrack-sysctl
18 and will also instantly expire the conntrack entry with altered sysctls.
19
20 Example:
21 nf_conntrack_udp_timeout_stream=60
22 nf_flowtable_udp_timeout=60
23
24 This will remove offloaded udp flows after one minute, rather than two.
25
26 An earlier version of this patch also cleared the ASSURED bit to
27 allow nf_conntrack to evict the entry via early_drop (i.e., table full).
28 However, it looks like we can safely assume that connection timed out
29 via HW is still in established state, so this isn't needed.
30
31 Quoting Oz:
32 [..] the hardware sends all packets with a set FIN flags to sw.
33 [..] Connections that are aged in hardware are expected to be in the
34 established state.
35
36 In case it turns out that back-to-sw-path transition can occur for
37 'dodgy' connections too (e.g., one side disappeared while software-path
38 would have been in RETRANS timeout), we can adjust this later.
39
40 Cc: Oz Shlomo <ozsh@nvidia.com>
41 Cc: Paul Blakey <paulb@nvidia.com>
42 Suggested-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
43 Signed-off-by: Florian Westphal <fw@strlen.de>
44 Reviewed-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
45 Reviewed-by: Oz Shlomo <ozsh@nvidia.com>
46 Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
47 ---
48 Documentation/networking/nf_conntrack-sysctl.rst | 10 ----------
49 include/net/netns/conntrack.h | 2 --
50 net/netfilter/nf_conntrack_proto_tcp.c | 1 -
51 net/netfilter/nf_conntrack_proto_udp.c | 1 -
52 net/netfilter/nf_conntrack_standalone.c | 16 ----------------
53 net/netfilter/nf_flow_table_core.c | 11 ++++++++---
54 6 files changed, 8 insertions(+), 33 deletions(-)
55
56 --- a/include/net/netns/conntrack.h
57 +++ b/include/net/netns/conntrack.h
58 @@ -29,7 +29,6 @@ struct nf_tcp_net {
59 int tcp_max_retrans;
60 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
61 unsigned int offload_timeout;
62 - unsigned int offload_pickup;
63 #endif
64 };
65
66 @@ -43,7 +42,6 @@ struct nf_udp_net {
67 unsigned int timeouts[UDP_CT_MAX];
68 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
69 unsigned int offload_timeout;
70 - unsigned int offload_pickup;
71 #endif
72 };
73
74 --- a/net/netfilter/nf_conntrack_proto_tcp.c
75 +++ b/net/netfilter/nf_conntrack_proto_tcp.c
76 @@ -1450,7 +1450,6 @@ void nf_conntrack_tcp_init_net(struct ne
77
78 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
79 tn->offload_timeout = 30 * HZ;
80 - tn->offload_pickup = 120 * HZ;
81 #endif
82 }
83
84 --- a/net/netfilter/nf_conntrack_proto_udp.c
85 +++ b/net/netfilter/nf_conntrack_proto_udp.c
86 @@ -276,7 +276,6 @@ void nf_conntrack_udp_init_net(struct ne
87
88 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
89 un->offload_timeout = 30 * HZ;
90 - un->offload_pickup = 30 * HZ;
91 #endif
92 }
93
94 --- a/net/netfilter/nf_conntrack_standalone.c
95 +++ b/net/netfilter/nf_conntrack_standalone.c
96 @@ -569,7 +569,6 @@ enum nf_ct_sysctl_index {
97 NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK,
98 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
99 NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD,
100 - NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP,
101 #endif
102 NF_SYSCTL_CT_PROTO_TCP_LOOSE,
103 NF_SYSCTL_CT_PROTO_TCP_LIBERAL,
104 @@ -578,7 +577,6 @@ enum nf_ct_sysctl_index {
105 NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM,
106 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
107 NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD,
108 - NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP,
109 #endif
110 NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP,
111 NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6,
112 @@ -773,12 +771,6 @@ static struct ctl_table nf_ct_sysctl_tab
113 .mode = 0644,
114 .proc_handler = proc_dointvec_jiffies,
115 },
116 - [NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP] = {
117 - .procname = "nf_flowtable_tcp_pickup",
118 - .maxlen = sizeof(unsigned int),
119 - .mode = 0644,
120 - .proc_handler = proc_dointvec_jiffies,
121 - },
122 #endif
123 [NF_SYSCTL_CT_PROTO_TCP_LOOSE] = {
124 .procname = "nf_conntrack_tcp_loose",
125 @@ -821,12 +813,6 @@ static struct ctl_table nf_ct_sysctl_tab
126 .mode = 0644,
127 .proc_handler = proc_dointvec_jiffies,
128 },
129 - [NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP] = {
130 - .procname = "nf_flowtable_udp_pickup",
131 - .maxlen = sizeof(unsigned int),
132 - .mode = 0644,
133 - .proc_handler = proc_dointvec_jiffies,
134 - },
135 #endif
136 [NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP] = {
137 .procname = "nf_conntrack_icmp_timeout",
138 @@ -1006,7 +992,6 @@ static void nf_conntrack_standalone_init
139
140 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
141 table[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD].data = &tn->offload_timeout;
142 - table[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_OFFLOAD_PICKUP].data = &tn->offload_pickup;
143 #endif
144
145 }
146 @@ -1098,7 +1083,6 @@ static int nf_conntrack_standalone_init_
147 table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM].data = &un->timeouts[UDP_CT_REPLIED];
148 #if IS_ENABLED(CONFIG_NF_FLOW_TABLE)
149 table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD].data = &un->offload_timeout;
150 - table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_OFFLOAD_PICKUP].data = &un->offload_pickup;
151 #endif
152
153 nf_conntrack_standalone_init_tcp_sysctl(net, table);
154 --- a/net/netfilter/nf_flow_table_core.c
155 +++ b/net/netfilter/nf_flow_table_core.c
156 @@ -182,20 +182,25 @@ static void flow_offload_fixup_ct_timeou
157 {
158 struct net *net = nf_ct_net(ct);
159 int l4num = nf_ct_protonum(ct);
160 - unsigned int timeout;
161 + s32 timeout;
162
163 if (l4num == IPPROTO_TCP) {
164 struct nf_tcp_net *tn = nf_tcp_pernet(net);
165
166 - timeout = tn->offload_pickup;
167 + timeout = tn->timeouts[TCP_CONNTRACK_ESTABLISHED];
168 + timeout -= tn->offload_timeout;
169 } else if (l4num == IPPROTO_UDP) {
170 struct nf_udp_net *tn = nf_udp_pernet(net);
171
172 - timeout = tn->offload_pickup;
173 + timeout = tn->timeouts[UDP_CT_REPLIED];
174 + timeout -= tn->offload_timeout;
175 } else {
176 return;
177 }
178
179 + if (timeout < 0)
180 + timeout = 0;
181 +
182 if (nf_flow_timeout_delta(READ_ONCE(ct->timeout)) > (__s32)timeout)
183 WRITE_ONCE(ct->timeout, nfct_time_stamp + timeout);
184 }