Blame view

net/netfilter/nf_conntrack_standalone.c 31.2 KB
a0ae2562c   Florian Westphal   netfilter: conntr...
1
  // SPDX-License-Identifier: GPL-2.0
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
2
3
  #include <linux/types.h>
  #include <linux/netfilter.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
4
  #include <linux/slab.h>
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
5
6
7
8
9
10
  #include <linux/module.h>
  #include <linux/skbuff.h>
  #include <linux/proc_fs.h>
  #include <linux/seq_file.h>
  #include <linux/percpu.h>
  #include <linux/netdevice.h>
1ae4de0cd   Eric Paris   secmark: export s...
11
  #include <linux/security.h>
457c4cbc5   Eric W. Biederman   [NET]: Make /proc...
12
  #include <net/net_namespace.h>
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
13
14
15
  #ifdef CONFIG_SYSCTL
  #include <linux/sysctl.h>
  #endif
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
16
  #include <net/netfilter/nf_conntrack.h>
f61801218   Martin Josefsson   [NETFILTER]: nf_c...
17
  #include <net/netfilter/nf_conntrack_core.h>
605dcad6c   Martin Josefsson   [NETFILTER]: nf_c...
18
  #include <net/netfilter/nf_conntrack_l4proto.h>
77ab9cff0   Martin Josefsson   [NETFILTER]: nf_c...
19
  #include <net/netfilter/nf_conntrack_expect.h>
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
20
  #include <net/netfilter/nf_conntrack_helper.h>
584015727   Krzysztof Piotr Oledzki   netfilter: accoun...
21
  #include <net/netfilter/nf_conntrack_acct.h>
5d0aa2ccd   Patrick McHardy   netfilter: nf_con...
22
  #include <net/netfilter/nf_conntrack_zones.h>
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
23
  #include <net/netfilter/nf_conntrack_timestamp.h>
0e60ebe04   Eric Dumazet   netfilter: add __...
24
  #include <linux/rculist_nulls.h>
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
25

ba3fbe663   Pablo Neira Ayuso   netfilter: nf_con...
26
27
28
  static bool enable_hooks __read_mostly;
  MODULE_PARM_DESC(enable_hooks, "Always enable conntrack hooks");
  module_param(enable_hooks, bool, 0000);
a0ae2562c   Florian Westphal   netfilter: conntr...
29
  unsigned int nf_conntrack_net_id __read_mostly;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
30

54b07dca6   Jan Engelhardt   netfilter: provid...
31
  #ifdef CONFIG_NF_CONNTRACK_PROCFS
824f1fbee   Joe Perches   netfilter: Conver...
32
  void
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
33
  print_tuple(struct seq_file *s, const struct nf_conntrack_tuple *tuple,
32948588a   Jan Engelhardt   [NETFILTER]: nf_c...
34
              const struct nf_conntrack_l4proto *l4proto)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
35
  {
f957be9d3   Florian Westphal   netfilter: conntr...
36
  	switch (tuple->src.l3num) {
91950833d   Florian Westphal   netfilter: conntr...
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  	case NFPROTO_IPV4:
  		seq_printf(s, "src=%pI4 dst=%pI4 ",
  			   &tuple->src.u3.ip, &tuple->dst.u3.ip);
  		break;
  	case NFPROTO_IPV6:
  		seq_printf(s, "src=%pI6 dst=%pI6 ",
  			   tuple->src.u3.ip6, tuple->dst.u3.ip6);
  		break;
  	default:
  		break;
  	}
  
  	switch (l4proto->l4proto) {
  	case IPPROTO_ICMP:
  		seq_printf(s, "type=%u code=%u id=%u ",
  			   tuple->dst.u.icmp.type,
  			   tuple->dst.u.icmp.code,
  			   ntohs(tuple->src.u.icmp.id));
  		break;
  	case IPPROTO_TCP:
  		seq_printf(s, "sport=%hu dport=%hu ",
  			   ntohs(tuple->src.u.tcp.port),
  			   ntohs(tuple->dst.u.tcp.port));
  		break;
  	case IPPROTO_UDPLITE: /* fallthrough */
  	case IPPROTO_UDP:
  		seq_printf(s, "sport=%hu dport=%hu ",
  			   ntohs(tuple->src.u.udp.port),
  			   ntohs(tuple->dst.u.udp.port));
  
  		break;
  	case IPPROTO_DCCP:
  		seq_printf(s, "sport=%hu dport=%hu ",
  			   ntohs(tuple->src.u.dccp.port),
  			   ntohs(tuple->dst.u.dccp.port));
  		break;
  	case IPPROTO_SCTP:
  		seq_printf(s, "sport=%hu dport=%hu ",
  			   ntohs(tuple->src.u.sctp.port),
  			   ntohs(tuple->dst.u.sctp.port));
  		break;
  	case IPPROTO_ICMPV6:
  		seq_printf(s, "type=%u code=%u id=%u ",
  			   tuple->dst.u.icmp.type,
  			   tuple->dst.u.icmp.code,
  			   ntohs(tuple->src.u.icmp.id));
  		break;
  	case IPPROTO_GRE:
  		seq_printf(s, "srckey=0x%x dstkey=0x%x ",
  			   ntohs(tuple->src.u.gre.key),
  			   ntohs(tuple->dst.u.gre.key));
  		break;
  	default:
  		break;
  	}
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
92
  }
e4bd8bce3   Patrick McHardy   [NETFILTER]: nf_c...
93
  EXPORT_SYMBOL_GPL(print_tuple);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
94

9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
95
  struct ct_iter_state {
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
96
  	struct seq_net_private p;
64b87639c   Liping Zhang   netfilter: conntr...
97
98
  	struct hlist_nulls_head *hash;
  	unsigned int htable_size;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
99
  	unsigned int bucket;
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
100
  	u_int64_t time_now;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
101
  };
ea781f197   Eric Dumazet   netfilter: nf_con...
102
  static struct hlist_nulls_node *ct_get_first(struct seq_file *seq)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
103
104
  {
  	struct ct_iter_state *st = seq->private;
ea781f197   Eric Dumazet   netfilter: nf_con...
105
  	struct hlist_nulls_node *n;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
106
107
  
  	for (st->bucket = 0;
64b87639c   Liping Zhang   netfilter: conntr...
108
  	     st->bucket < st->htable_size;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
109
  	     st->bucket++) {
64b87639c   Liping Zhang   netfilter: conntr...
110
111
  		n = rcu_dereference(
  			hlist_nulls_first_rcu(&st->hash[st->bucket]));
ea781f197   Eric Dumazet   netfilter: nf_con...
112
  		if (!is_a_nulls(n))
76507f69c   Patrick McHardy   [NETFILTER]: nf_c...
113
  			return n;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
114
115
116
  	}
  	return NULL;
  }
ea781f197   Eric Dumazet   netfilter: nf_con...
117
118
  static struct hlist_nulls_node *ct_get_next(struct seq_file *seq,
  				      struct hlist_nulls_node *head)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
119
120
  {
  	struct ct_iter_state *st = seq->private;
0e60ebe04   Eric Dumazet   netfilter: add __...
121
  	head = rcu_dereference(hlist_nulls_next_rcu(head));
ea781f197   Eric Dumazet   netfilter: nf_con...
122
123
  	while (is_a_nulls(head)) {
  		if (likely(get_nulls_value(head) == st->bucket)) {
64b87639c   Liping Zhang   netfilter: conntr...
124
  			if (++st->bucket >= st->htable_size)
ea781f197   Eric Dumazet   netfilter: nf_con...
125
126
  				return NULL;
  		}
0e60ebe04   Eric Dumazet   netfilter: add __...
127
  		head = rcu_dereference(
64b87639c   Liping Zhang   netfilter: conntr...
128
  			hlist_nulls_first_rcu(&st->hash[st->bucket]));
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
129
130
131
  	}
  	return head;
  }
ea781f197   Eric Dumazet   netfilter: nf_con...
132
  static struct hlist_nulls_node *ct_get_idx(struct seq_file *seq, loff_t pos)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
133
  {
ea781f197   Eric Dumazet   netfilter: nf_con...
134
  	struct hlist_nulls_node *head = ct_get_first(seq);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
135
136
137
138
139
140
141
142
  
  	if (head)
  		while (pos && (head = ct_get_next(seq, head)))
  			pos--;
  	return pos ? NULL : head;
  }
  
  static void *ct_seq_start(struct seq_file *seq, loff_t *pos)
76507f69c   Patrick McHardy   [NETFILTER]: nf_c...
143
  	__acquires(RCU)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
144
  {
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
145
  	struct ct_iter_state *st = seq->private;
d2de875c6   Eric Dumazet   net: use ktime_ge...
146
  	st->time_now = ktime_get_real_ns();
76507f69c   Patrick McHardy   [NETFILTER]: nf_c...
147
  	rcu_read_lock();
64b87639c   Liping Zhang   netfilter: conntr...
148
149
  
  	nf_conntrack_get_ht(&st->hash, &st->htable_size);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
150
151
152
153
154
155
156
157
158
159
  	return ct_get_idx(seq, *pos);
  }
  
  static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
  {
  	(*pos)++;
  	return ct_get_next(s, v);
  }
  
  static void ct_seq_stop(struct seq_file *s, void *v)
76507f69c   Patrick McHardy   [NETFILTER]: nf_c...
160
  	__releases(RCU)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
161
  {
76507f69c   Patrick McHardy   [NETFILTER]: nf_c...
162
  	rcu_read_unlock();
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
163
  }
1ae4de0cd   Eric Paris   secmark: export s...
164
  #ifdef CONFIG_NF_CONNTRACK_SECMARK
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
165
  static void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
1ae4de0cd   Eric Paris   secmark: export s...
166
167
168
169
170
171
172
  {
  	int ret;
  	u32 len;
  	char *secctx;
  
  	ret = security_secid_to_secctx(ct->secmark, &secctx, &len);
  	if (ret)
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
173
  		return;
1ae4de0cd   Eric Paris   secmark: export s...
174

e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
175
  	seq_printf(s, "secctx=%s ", secctx);
1ae4de0cd   Eric Paris   secmark: export s...
176
177
  
  	security_release_secctx(secctx, len);
1ae4de0cd   Eric Paris   secmark: export s...
178
179
  }
  #else
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
180
  static inline void ct_show_secctx(struct seq_file *s, const struct nf_conn *ct)
1ae4de0cd   Eric Paris   secmark: export s...
181
  {
1ae4de0cd   Eric Paris   secmark: export s...
182
183
  }
  #endif
308ac9143   Daniel Borkmann   netfilter: nf_con...
184
  #ifdef CONFIG_NF_CONNTRACK_ZONES
deedb5903   Daniel Borkmann   netfilter: nf_con...
185
186
  static void ct_show_zone(struct seq_file *s, const struct nf_conn *ct,
  			 int dir)
308ac9143   Daniel Borkmann   netfilter: nf_con...
187
  {
deedb5903   Daniel Borkmann   netfilter: nf_con...
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
  	const struct nf_conntrack_zone *zone = nf_ct_zone(ct);
  
  	if (zone->dir != dir)
  		return;
  	switch (zone->dir) {
  	case NF_CT_DEFAULT_ZONE_DIR:
  		seq_printf(s, "zone=%u ", zone->id);
  		break;
  	case NF_CT_ZONE_DIR_ORIG:
  		seq_printf(s, "zone-orig=%u ", zone->id);
  		break;
  	case NF_CT_ZONE_DIR_REPL:
  		seq_printf(s, "zone-reply=%u ", zone->id);
  		break;
  	default:
  		break;
  	}
308ac9143   Daniel Borkmann   netfilter: nf_con...
205
206
  }
  #else
deedb5903   Daniel Borkmann   netfilter: nf_con...
207
208
  static inline void ct_show_zone(struct seq_file *s, const struct nf_conn *ct,
  				int dir)
308ac9143   Daniel Borkmann   netfilter: nf_con...
209
210
211
  {
  }
  #endif
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
212
  #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
213
  static void ct_show_delta_time(struct seq_file *s, const struct nf_conn *ct)
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
214
  {
f5c88f56b   Patrick McHardy   netfilter: nf_con...
215
  	struct ct_iter_state *st = s->private;
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
216
  	struct nf_conn_tstamp *tstamp;
f5c88f56b   Patrick McHardy   netfilter: nf_con...
217
  	s64 delta_time;
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
218
219
220
  
  	tstamp = nf_conn_tstamp_find(ct);
  	if (tstamp) {
f5c88f56b   Patrick McHardy   netfilter: nf_con...
221
222
223
224
225
  		delta_time = st->time_now - tstamp->start;
  		if (delta_time > 0)
  			delta_time = div_s64(delta_time, NSEC_PER_SEC);
  		else
  			delta_time = 0;
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
226
227
  		seq_printf(s, "delta-time=%llu ",
  			   (unsigned long long)delta_time);
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
228
  	}
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
229
  	return;
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
230
231
  }
  #else
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
232
  static inline void
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
233
234
  ct_show_delta_time(struct seq_file *s, const struct nf_conn *ct)
  {
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
235
236
  }
  #endif
a3134d537   Florian Westphal   netfilter: conntr...
237
238
239
240
241
242
243
244
245
  static const char* l3proto_name(u16 proto)
  {
  	switch (proto) {
  	case AF_INET: return "ipv4";
  	case AF_INET6: return "ipv6";
  	}
  
  	return "unknown";
  }
09ec82f5a   Florian Westphal   netfilter: conntr...
246
247
248
249
250
251
252
253
254
255
256
257
258
259
  static const char* l4proto_name(u16 proto)
  {
  	switch (proto) {
  	case IPPROTO_ICMP: return "icmp";
  	case IPPROTO_TCP: return "tcp";
  	case IPPROTO_UDP: return "udp";
  	case IPPROTO_DCCP: return "dccp";
  	case IPPROTO_GRE: return "gre";
  	case IPPROTO_SCTP: return "sctp";
  	case IPPROTO_UDPLITE: return "udplite";
  	}
  
  	return "unknown";
  }
4b216e21c   Florian Westphal   netfilter: conntr...
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
  static unsigned int
  seq_print_acct(struct seq_file *s, const struct nf_conn *ct, int dir)
  {
  	struct nf_conn_acct *acct;
  	struct nf_conn_counter *counter;
  
  	acct = nf_conn_acct_find(ct);
  	if (!acct)
  		return 0;
  
  	counter = acct->counter;
  	seq_printf(s, "packets=%llu bytes=%llu ",
  		   (unsigned long long)atomic64_read(&counter[dir].packets),
  		   (unsigned long long)atomic64_read(&counter[dir].bytes));
  
  	return 0;
  }
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
277
278
279
  /* return 0 on success, 1 in case of error */
  static int ct_seq_show(struct seq_file *s, void *v)
  {
ea781f197   Eric Dumazet   netfilter: nf_con...
280
281
  	struct nf_conntrack_tuple_hash *hash = v;
  	struct nf_conn *ct = nf_ct_tuplehash_to_ctrack(hash);
32948588a   Jan Engelhardt   [NETFILTER]: nf_c...
282
  	const struct nf_conntrack_l4proto *l4proto;
e77e6ff50   Liping Zhang   netfilter: conntr...
283
  	struct net *net = seq_file_net(s);
ea781f197   Eric Dumazet   netfilter: nf_con...
284
  	int ret = 0;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
285

44d6e2f27   Varsha Rao   net: Replace NF_C...
286
  	WARN_ON(!ct);
ea781f197   Eric Dumazet   netfilter: nf_con...
287
288
  	if (unlikely(!atomic_inc_not_zero(&ct->ct_general.use)))
  		return 0;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
289

58e207e49   Florian Westphal   netfilter: evict ...
290
291
292
293
  	if (nf_ct_should_gc(ct)) {
  		nf_ct_kill(ct);
  		goto release;
  	}
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
294
295
  	/* we only want to print DIR_ORIGINAL */
  	if (NF_CT_DIRECTION(hash))
ea781f197   Eric Dumazet   netfilter: nf_con...
296
  		goto release;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
297

e77e6ff50   Liping Zhang   netfilter: conntr...
298
299
  	if (!net_eq(nf_ct_net(ct), net))
  		goto release;
4a60dc748   Florian Westphal   netfilter: conntr...
300
  	l4proto = nf_ct_l4proto_find(nf_ct_protonum(ct));
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
301

ea781f197   Eric Dumazet   netfilter: nf_con...
302
  	ret = -ENOSPC;
90964016e   Pablo Neira Ayuso   netfilter: nf_con...
303
  	seq_printf(s, "%-8s %u %-8s %u ",
f957be9d3   Florian Westphal   netfilter: conntr...
304
  		   l3proto_name(nf_ct_l3num(ct)), nf_ct_l3num(ct),
90964016e   Pablo Neira Ayuso   netfilter: nf_con...
305
306
307
308
  		   l4proto_name(l4proto->l4proto), nf_ct_protonum(ct));
  
  	if (!test_bit(IPS_OFFLOAD_BIT, &ct->status))
  		seq_printf(s, "%ld ", nf_ct_expires(ct)  / HZ);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
309

37246a583   Steven Rostedt (Red Hat)   netfilter: Remove...
310
311
  	if (l4proto->print_conntrack)
  		l4proto->print_conntrack(s, ct);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
312

824f1fbee   Joe Perches   netfilter: Conver...
313
  	print_tuple(s, &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
f957be9d3   Florian Westphal   netfilter: conntr...
314
  		    l4proto);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
315

deedb5903   Daniel Borkmann   netfilter: nf_con...
316
  	ct_show_zone(s, ct, NF_CT_ZONE_DIR_ORIG);
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
317
318
  	if (seq_has_overflowed(s))
  		goto release;
584015727   Krzysztof Piotr Oledzki   netfilter: accoun...
319
  	if (seq_print_acct(s, ct, IP_CT_DIR_ORIGINAL))
ea781f197   Eric Dumazet   netfilter: nf_con...
320
  		goto release;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
321

c88130bcd   Patrick McHardy   [NETFILTER]: nf_c...
322
  	if (!(test_bit(IPS_SEEN_REPLY_BIT, &ct->status)))
cdec26858   simran singhal   netfilter: Use se...
323
  		seq_puts(s, "[UNREPLIED] ");
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
324

f957be9d3   Florian Westphal   netfilter: conntr...
325
  	print_tuple(s, &ct->tuplehash[IP_CT_DIR_REPLY].tuple, l4proto);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
326

deedb5903   Daniel Borkmann   netfilter: nf_con...
327
  	ct_show_zone(s, ct, NF_CT_ZONE_DIR_REPL);
584015727   Krzysztof Piotr Oledzki   netfilter: accoun...
328
  	if (seq_print_acct(s, ct, IP_CT_DIR_REPLY))
ea781f197   Eric Dumazet   netfilter: nf_con...
329
  		goto release;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
330

90964016e   Pablo Neira Ayuso   netfilter: nf_con...
331
332
333
  	if (test_bit(IPS_OFFLOAD_BIT, &ct->status))
  		seq_puts(s, "[OFFLOAD] ");
  	else if (test_bit(IPS_ASSURED_BIT, &ct->status))
cdec26858   simran singhal   netfilter: Use se...
334
  		seq_puts(s, "[ASSURED] ");
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
335

e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
336
  	if (seq_has_overflowed(s))
ea781f197   Eric Dumazet   netfilter: nf_con...
337
  		goto release;
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
338
339
340
  
  #if defined(CONFIG_NF_CONNTRACK_MARK)
  	seq_printf(s, "mark=%u ", ct->mark);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
341
  #endif
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
342
  	ct_show_secctx(s, ct);
deedb5903   Daniel Borkmann   netfilter: nf_con...
343
  	ct_show_zone(s, ct, NF_CT_DEFAULT_ZONE_DIR);
e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
344
345
346
347
  	ct_show_delta_time(s, ct);
  
  	seq_printf(s, "use=%u
  ", atomic_read(&ct->ct_general.use));
a992ca2a0   Pablo Neira Ayuso   netfilter: nf_con...
348

e71456ae9   Steven Rostedt (Red Hat)   netfilter: Remove...
349
  	if (seq_has_overflowed(s))
ea781f197   Eric Dumazet   netfilter: nf_con...
350
  		goto release;
a5d292646   YOSHIFUJI Hideaki   [NET] NETFILTER: ...
351

ea781f197   Eric Dumazet   netfilter: nf_con...
352
353
354
  	ret = 0;
  release:
  	nf_ct_put(ct);
d88d7de09   David S. Miller   netfilter: nf_con...
355
  	return ret;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
356
  }
56b3d975b   Philippe De Muyter   [NET]: Make all i...
357
  static const struct seq_operations ct_seq_ops = {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
358
359
360
361
362
  	.start = ct_seq_start,
  	.next  = ct_seq_next,
  	.stop  = ct_seq_stop,
  	.show  = ct_seq_show
  };
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
363
364
  static void *ct_cpu_seq_start(struct seq_file *seq, loff_t *pos)
  {
8e9df8018   Alexey Dobriyan   netfilter: netns ...
365
  	struct net *net = seq_file_net(seq);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
366
367
368
369
  	int cpu;
  
  	if (*pos == 0)
  		return SEQ_START_TOKEN;
0f23174aa   Rusty Russell   cpumask: prepare ...
370
  	for (cpu = *pos-1; cpu < nr_cpu_ids; ++cpu) {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
371
372
373
  		if (!cpu_possible(cpu))
  			continue;
  		*pos = cpu + 1;
8e9df8018   Alexey Dobriyan   netfilter: netns ...
374
  		return per_cpu_ptr(net->ct.stat, cpu);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
375
376
377
378
379
380
381
  	}
  
  	return NULL;
  }
  
  static void *ct_cpu_seq_next(struct seq_file *seq, void *v, loff_t *pos)
  {
8e9df8018   Alexey Dobriyan   netfilter: netns ...
382
  	struct net *net = seq_file_net(seq);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
383
  	int cpu;
0f23174aa   Rusty Russell   cpumask: prepare ...
384
  	for (cpu = *pos; cpu < nr_cpu_ids; ++cpu) {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
385
386
387
  		if (!cpu_possible(cpu))
  			continue;
  		*pos = cpu + 1;
8e9df8018   Alexey Dobriyan   netfilter: netns ...
388
  		return per_cpu_ptr(net->ct.stat, cpu);
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
389
  	}
1c6e75702   Vasily Averin   netfilter: nf_con...
390
  	(*pos)++;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
391
392
393
394
395
396
397
398
399
  	return NULL;
  }
  
  static void ct_cpu_seq_stop(struct seq_file *seq, void *v)
  {
  }
  
  static int ct_cpu_seq_show(struct seq_file *seq, void *v)
  {
8e9df8018   Alexey Dobriyan   netfilter: netns ...
400
401
  	struct net *net = seq_file_net(seq);
  	unsigned int nr_conntracks = atomic_read(&net->ct.count);
32948588a   Jan Engelhardt   [NETFILTER]: nf_c...
402
  	const struct ip_conntrack_stat *st = v;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
403
404
  
  	if (v == SEQ_START_TOKEN) {
cdec26858   simran singhal   netfilter: Use se...
405
406
  		seq_puts(seq, "entries  searched found new invalid ignore delete delete_list insert insert_failed drop early_drop icmp_error  expect_new expect_create expect_delete search_restart
  ");
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
407
408
409
410
  		return 0;
  	}
  
  	seq_printf(seq, "%08x  %08x %08x %08x %08x %08x %08x %08x "
af740b2c8   Jesper Dangaard Brouer   netfilter: nf_con...
411
412
  			"%08x %08x %08x %08x %08x  %08x %08x %08x %08x
  ",
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
413
  		   nr_conntracks,
8e8118f89   Florian Westphal   netfilter: conntr...
414
  		   0,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
415
  		   st->found,
8e8118f89   Florian Westphal   netfilter: conntr...
416
  		   0,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
417
418
  		   st->invalid,
  		   st->ignore,
8e8118f89   Florian Westphal   netfilter: conntr...
419
420
  		   0,
  		   0,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
421
422
423
424
425
426
427
428
  		   st->insert,
  		   st->insert_failed,
  		   st->drop,
  		   st->early_drop,
  		   st->error,
  
  		   st->expect_new,
  		   st->expect_create,
af740b2c8   Jesper Dangaard Brouer   netfilter: nf_con...
429
430
  		   st->expect_delete,
  		   st->search_restart
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
431
432
433
  		);
  	return 0;
  }
56b3d975b   Philippe De Muyter   [NET]: Make all i...
434
  static const struct seq_operations ct_cpu_seq_ops = {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
435
436
437
438
439
  	.start	= ct_cpu_seq_start,
  	.next	= ct_cpu_seq_next,
  	.stop	= ct_cpu_seq_stop,
  	.show	= ct_cpu_seq_show,
  };
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
440
  static int nf_conntrack_standalone_init_proc(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
441
442
  {
  	struct proc_dir_entry *pde;
f13f2aeed   Philip Whineray   netfilter: Set /p...
443
444
  	kuid_t root_uid;
  	kgid_t root_gid;
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
445

c35063722   Christoph Hellwig   proc: introduce p...
446
447
  	pde = proc_create_net("nf_conntrack", 0440, net->proc_net, &ct_seq_ops,
  			sizeof(struct ct_iter_state));
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
448
449
  	if (!pde)
  		goto out_nf_conntrack;
52c0e111f   Denis V. Lunev   netfilter: assign...
450

f13f2aeed   Philip Whineray   netfilter: Set /p...
451
452
453
454
  	root_uid = make_kuid(net->user_ns, 0);
  	root_gid = make_kgid(net->user_ns, 0);
  	if (uid_valid(root_uid) && gid_valid(root_gid))
  		proc_set_user(pde, root_uid, root_gid);
c35063722   Christoph Hellwig   proc: introduce p...
455
456
  	pde = proc_create_net("nf_conntrack", 0444, net->proc_net_stat,
  			&ct_cpu_seq_ops, sizeof(struct seq_net_private));
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
457
458
  	if (!pde)
  		goto out_stat_nf_conntrack;
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
459
460
461
  	return 0;
  
  out_stat_nf_conntrack:
ece31ffd5   Gao feng   net: proc: change...
462
  	remove_proc_entry("nf_conntrack", net->proc_net);
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
463
464
465
  out_nf_conntrack:
  	return -ENOMEM;
  }
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
466
  static void nf_conntrack_standalone_fini_proc(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
467
  {
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
468
  	remove_proc_entry("nf_conntrack", net->proc_net_stat);
ece31ffd5   Gao feng   net: proc: change...
469
  	remove_proc_entry("nf_conntrack", net->proc_net);
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
470
471
  }
  #else
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
472
  static int nf_conntrack_standalone_init_proc(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
473
474
475
  {
  	return 0;
  }
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
476
  static void nf_conntrack_standalone_fini_proc(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
477
478
  {
  }
54b07dca6   Jan Engelhardt   netfilter: provid...
479
  #endif /* CONFIG_NF_CONNTRACK_PROCFS */
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
480
481
482
483
  
  /* Sysctl support */
  
  #ifdef CONFIG_SYSCTL
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
484
  /* Log invalid packets of a given protocol */
3183ab899   Florian Westphal   netfilter: conntr...
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
  static int log_invalid_proto_min __read_mostly;
  static int log_invalid_proto_max __read_mostly = 255;
  
  /* size the user *wants to set */
  static unsigned int nf_conntrack_htable_size_user __read_mostly;
  
  static int
  nf_conntrack_hash_sysctl(struct ctl_table *table, int write,
  			 void __user *buffer, size_t *lenp, loff_t *ppos)
  {
  	int ret;
  
  	ret = proc_dointvec(table, write, buffer, lenp, ppos);
  	if (ret < 0 || !write)
  		return ret;
  
  	/* update ret, we might not be able to satisfy request */
  	ret = nf_conntrack_hash_resize(nf_conntrack_htable_size_user);
  
  	/* update it to the actual value used by conntrack */
  	nf_conntrack_htable_size_user = nf_conntrack_htable_size;
  	return ret;
  }
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
508

9714be7da   Krzysztof Piotr Oledzki   netfilter: fix tw...
509
  static struct ctl_table_header *nf_ct_netfilter_header;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
510

4a65798a9   Florian Westphal   netfilter: conntr...
511
512
513
514
515
516
517
  enum nf_ct_sysctl_index {
  	NF_SYSCTL_CT_MAX,
  	NF_SYSCTL_CT_COUNT,
  	NF_SYSCTL_CT_BUCKETS,
  	NF_SYSCTL_CT_CHECKSUM,
  	NF_SYSCTL_CT_LOG_INVALID,
  	NF_SYSCTL_CT_EXPECT_MAX,
d912dec12   Florian Westphal   netfilter: conntr...
518
519
  	NF_SYSCTL_CT_ACCT,
  	NF_SYSCTL_CT_HELPER,
cb2833ed0   Florian Westphal   netfilter: conntr...
520
521
522
523
524
525
  #ifdef CONFIG_NF_CONNTRACK_EVENTS
  	NF_SYSCTL_CT_EVENTS,
  #endif
  #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
  	NF_SYSCTL_CT_TIMESTAMP,
  #endif
b884fa461   Florian Westphal   netfilter: conntr...
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
  	NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_SENT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_RECV,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_ESTABLISHED,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_FIN_WAIT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE_WAIT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_LAST_ACK,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_TIME_WAIT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_RETRANS,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK,
  	NF_SYSCTL_CT_PROTO_TCP_LOOSE,
  	NF_SYSCTL_CT_PROTO_TCP_LIBERAL,
  	NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_UDP,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6,
  #ifdef CONFIG_NF_CT_PROTO_SCTP
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_CLOSED,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_WAIT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_ECHOED,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_ESTABLISHED,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_SENT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_RECD,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_ACK_SENT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_SENT,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_ACKED,
  #endif
  #ifdef CONFIG_NF_CT_PROTO_DCCP
  	NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_REQUEST,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_RESPOND,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_PARTOPEN,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_OPEN,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSEREQ,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSING,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_TIMEWAIT,
  	NF_SYSCTL_CT_PROTO_DCCP_LOOSE,
  #endif
  #ifdef CONFIG_NF_CT_PROTO_GRE
  	NF_SYSCTL_CT_PROTO_TIMEOUT_GRE,
  	NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM,
  #endif
  
  	__NF_SYSCTL_CT_LAST_SYSCTL,
4a65798a9   Florian Westphal   netfilter: conntr...
571
  };
b884fa461   Florian Westphal   netfilter: conntr...
572
  #define NF_SYSCTL_CT_LAST_SYSCTL (__NF_SYSCTL_CT_LAST_SYSCTL + 1)
fe2c6338f   Joe Perches   net: Convert uses...
573
  static struct ctl_table nf_ct_sysctl_table[] = {
4a65798a9   Florian Westphal   netfilter: conntr...
574
  	[NF_SYSCTL_CT_MAX] = {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
575
576
577
578
  		.procname	= "nf_conntrack_max",
  		.data		= &nf_conntrack_max,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
579
  		.proc_handler	= proc_dointvec,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
580
  	},
4a65798a9   Florian Westphal   netfilter: conntr...
581
  	[NF_SYSCTL_CT_COUNT] = {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
582
  		.procname	= "nf_conntrack_count",
49ac8713b   Alexey Dobriyan   netfilter: netns ...
583
  		.data		= &init_net.ct.count,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
584
585
  		.maxlen		= sizeof(int),
  		.mode		= 0444,
6d9f239a1   Alexey Dobriyan   net: '&' redux
586
  		.proc_handler	= proc_dointvec,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
587
  	},
4a65798a9   Florian Westphal   netfilter: conntr...
588
  	[NF_SYSCTL_CT_BUCKETS] = {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
589
  		.procname       = "nf_conntrack_buckets",
3183ab899   Florian Westphal   netfilter: conntr...
590
  		.data           = &nf_conntrack_htable_size_user,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
591
  		.maxlen         = sizeof(unsigned int),
3183ab899   Florian Westphal   netfilter: conntr...
592
593
  		.mode           = 0644,
  		.proc_handler   = nf_conntrack_hash_sysctl,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
594
  	},
4a65798a9   Florian Westphal   netfilter: conntr...
595
  	[NF_SYSCTL_CT_CHECKSUM] = {
39a27a35c   Patrick McHardy   [NETFILTER]: conn...
596
  		.procname	= "nf_conntrack_checksum",
c04d05529   Alexey Dobriyan   netfilter: netns ...
597
  		.data		= &init_net.ct.sysctl_checksum,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
598
  		.maxlen		= sizeof(int),
39a27a35c   Patrick McHardy   [NETFILTER]: conn...
599
  		.mode		= 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
600
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
601
602
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
39a27a35c   Patrick McHardy   [NETFILTER]: conn...
603
  	},
4a65798a9   Florian Westphal   netfilter: conntr...
604
  	[NF_SYSCTL_CT_LOG_INVALID] = {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
605
  		.procname	= "nf_conntrack_log_invalid",
c2a2c7e0c   Alexey Dobriyan   netfilter: netns ...
606
  		.data		= &init_net.ct.sysctl_log_invalid,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
607
608
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
609
  		.proc_handler	= proc_dointvec_minmax,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
610
611
612
  		.extra1		= &log_invalid_proto_min,
  		.extra2		= &log_invalid_proto_max,
  	},
4a65798a9   Florian Westphal   netfilter: conntr...
613
  	[NF_SYSCTL_CT_EXPECT_MAX] = {
f264a7df0   Patrick McHardy   [NETFILTER]: nf_c...
614
615
616
617
  		.procname	= "nf_conntrack_expect_max",
  		.data		= &nf_ct_expect_max,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
618
  		.proc_handler	= proc_dointvec,
f264a7df0   Patrick McHardy   [NETFILTER]: nf_c...
619
  	},
d912dec12   Florian Westphal   netfilter: conntr...
620
621
622
  	[NF_SYSCTL_CT_ACCT] = {
  		.procname	= "nf_conntrack_acct",
  		.data		= &init_net.ct.sysctl_acct,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
623
  		.maxlen		= sizeof(int),
d912dec12   Florian Westphal   netfilter: conntr...
624
  		.mode		= 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
625
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
626
627
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
d912dec12   Florian Westphal   netfilter: conntr...
628
629
630
631
  	},
  	[NF_SYSCTL_CT_HELPER] = {
  		.procname	= "nf_conntrack_helper",
  		.data		= &init_net.ct.sysctl_auto_assign_helper,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
632
  		.maxlen		= sizeof(int),
d912dec12   Florian Westphal   netfilter: conntr...
633
  		.mode		= 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
634
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
635
636
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
d912dec12   Florian Westphal   netfilter: conntr...
637
  	},
cb2833ed0   Florian Westphal   netfilter: conntr...
638
639
640
641
  #ifdef CONFIG_NF_CONNTRACK_EVENTS
  	[NF_SYSCTL_CT_EVENTS] = {
  		.procname	= "nf_conntrack_events",
  		.data		= &init_net.ct.sysctl_events,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
642
  		.maxlen		= sizeof(int),
cb2833ed0   Florian Westphal   netfilter: conntr...
643
  		.mode		= 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
644
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
645
646
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
cb2833ed0   Florian Westphal   netfilter: conntr...
647
648
649
650
651
652
  	},
  #endif
  #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
  	[NF_SYSCTL_CT_TIMESTAMP] = {
  		.procname	= "nf_conntrack_timestamp",
  		.data		= &init_net.ct.sysctl_tstamp,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
653
  		.maxlen		= sizeof(int),
cb2833ed0   Florian Westphal   netfilter: conntr...
654
  		.mode		= 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
655
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
656
657
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
cb2833ed0   Florian Westphal   netfilter: conntr...
658
659
  	},
  #endif
b884fa461   Florian Westphal   netfilter: conntr...
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC] = {
  		.procname	= "nf_conntrack_generic_timeout",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_SENT] = {
  		.procname	= "nf_conntrack_tcp_timeout_syn_sent",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_SYN_RECV] = {
  		.procname	= "nf_conntrack_tcp_timeout_syn_recv",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_ESTABLISHED] = {
  		.procname	= "nf_conntrack_tcp_timeout_established",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_FIN_WAIT] = {
  		.procname	= "nf_conntrack_tcp_timeout_fin_wait",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE_WAIT] = {
  		.procname	= "nf_conntrack_tcp_timeout_close_wait",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_LAST_ACK] = {
  		.procname	= "nf_conntrack_tcp_timeout_last_ack",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_TIME_WAIT] = {
  		.procname	= "nf_conntrack_tcp_timeout_time_wait",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_CLOSE] = {
  		.procname	= "nf_conntrack_tcp_timeout_close",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_RETRANS] = {
  		.procname	= "nf_conntrack_tcp_timeout_max_retrans",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_UNACK] = {
  		.procname	= "nf_conntrack_tcp_timeout_unacknowledged",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TCP_LOOSE] = {
  		.procname	= "nf_conntrack_tcp_loose",
8f14c99c7   Tonghao Zhang   netfilter: conntr...
728
  		.maxlen		= sizeof(int),
b884fa461   Florian Westphal   netfilter: conntr...
729
  		.mode		= 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
730
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
731
732
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
b884fa461   Florian Westphal   netfilter: conntr...
733
734
735
  	},
  	[NF_SYSCTL_CT_PROTO_TCP_LIBERAL] = {
  		.procname       = "nf_conntrack_tcp_be_liberal",
8f14c99c7   Tonghao Zhang   netfilter: conntr...
736
  		.maxlen         = sizeof(int),
b884fa461   Florian Westphal   netfilter: conntr...
737
  		.mode           = 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
738
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
739
740
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
b884fa461   Florian Westphal   netfilter: conntr...
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
  	},
  	[NF_SYSCTL_CT_PROTO_TCP_MAX_RETRANS] = {
  		.procname	= "nf_conntrack_tcp_max_retrans",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP] = {
  		.procname	= "nf_conntrack_udp_timeout",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM] = {
  		.procname	= "nf_conntrack_udp_timeout_stream",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP] = {
  		.procname	= "nf_conntrack_icmp_timeout",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6] = {
  		.procname	= "nf_conntrack_icmpv6_timeout",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  #ifdef CONFIG_NF_CT_PROTO_SCTP
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_CLOSED] = {
  		.procname	= "nf_conntrack_sctp_timeout_closed",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_WAIT] = {
  		.procname	= "nf_conntrack_sctp_timeout_cookie_wait",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_COOKIE_ECHOED] = {
  		.procname	= "nf_conntrack_sctp_timeout_cookie_echoed",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_ESTABLISHED] = {
  		.procname	= "nf_conntrack_sctp_timeout_established",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_SENT] = {
  		.procname	= "nf_conntrack_sctp_timeout_shutdown_sent",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_RECD] = {
  		.procname	= "nf_conntrack_sctp_timeout_shutdown_recd",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_SHUTDOWN_ACK_SENT] = {
  		.procname	= "nf_conntrack_sctp_timeout_shutdown_ack_sent",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_SENT] = {
  		.procname	= "nf_conntrack_sctp_timeout_heartbeat_sent",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_HEARTBEAT_ACKED] = {
  		.procname       = "nf_conntrack_sctp_timeout_heartbeat_acked",
  		.maxlen         = sizeof(unsigned int),
  		.mode           = 0644,
  		.proc_handler   = proc_dointvec_jiffies,
  	},
  #endif
  #ifdef CONFIG_NF_CT_PROTO_DCCP
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_REQUEST] = {
  		.procname	= "nf_conntrack_dccp_timeout_request",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_RESPOND] = {
  		.procname	= "nf_conntrack_dccp_timeout_respond",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_PARTOPEN] = {
  		.procname	= "nf_conntrack_dccp_timeout_partopen",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_OPEN] = {
  		.procname	= "nf_conntrack_dccp_timeout_open",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSEREQ] = {
  		.procname	= "nf_conntrack_dccp_timeout_closereq",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_CLOSING] = {
  		.procname	= "nf_conntrack_dccp_timeout_closing",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_TIMEWAIT] = {
  		.procname	= "nf_conntrack_dccp_timeout_timewait",
  		.maxlen		= sizeof(unsigned int),
  		.mode		= 0644,
  		.proc_handler	= proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_DCCP_LOOSE] = {
  		.procname	= "nf_conntrack_dccp_loose",
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
8f14c99c7   Tonghao Zhang   netfilter: conntr...
875
  		.proc_handler	= proc_dointvec_minmax,
e84fb4b36   Matteo Croce   netfilter: conntr...
876
877
  		.extra1 	= SYSCTL_ZERO,
  		.extra2 	= SYSCTL_ONE,
b884fa461   Florian Westphal   netfilter: conntr...
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
  	},
  #endif
  #ifdef CONFIG_NF_CT_PROTO_GRE
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_GRE] = {
  		.procname       = "nf_conntrack_gre_timeout",
  		.maxlen         = sizeof(unsigned int),
  		.mode           = 0644,
  		.proc_handler   = proc_dointvec_jiffies,
  	},
  	[NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM] = {
  		.procname       = "nf_conntrack_gre_timeout_stream",
  		.maxlen         = sizeof(unsigned int),
  		.mode           = 0644,
  		.proc_handler   = proc_dointvec_jiffies,
  	},
  #endif
  	{}
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
895
  };
fe2c6338f   Joe Perches   net: Convert uses...
896
  static struct ctl_table nf_ct_netfilter_table[] = {
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
897
  	{
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
898
899
900
901
  		.procname	= "nf_conntrack_max",
  		.data		= &nf_conntrack_max,
  		.maxlen		= sizeof(int),
  		.mode		= 0644,
6d9f239a1   Alexey Dobriyan   net: '&' redux
902
  		.proc_handler	= proc_dointvec,
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
903
  	},
f8572d8f2   Eric W. Biederman   sysctl net: Remov...
904
  	{ }
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
905
  };
b884fa461   Florian Westphal   netfilter: conntr...
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
  static void nf_conntrack_standalone_init_tcp_sysctl(struct net *net,
  						    struct ctl_table *table)
  {
  	struct nf_tcp_net *tn = nf_tcp_pernet(net);
  
  #define XASSIGN(XNAME, tn) \
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_TCP_ ## XNAME].data = \
  			&(tn)->timeouts[TCP_CONNTRACK_ ## XNAME]
  
  	XASSIGN(SYN_SENT, tn);
  	XASSIGN(SYN_RECV, tn);
  	XASSIGN(ESTABLISHED, tn);
  	XASSIGN(FIN_WAIT, tn);
  	XASSIGN(CLOSE_WAIT, tn);
  	XASSIGN(LAST_ACK, tn);
  	XASSIGN(TIME_WAIT, tn);
  	XASSIGN(CLOSE, tn);
  	XASSIGN(RETRANS, tn);
  	XASSIGN(UNACK, tn);
  #undef XASSIGN
  #define XASSIGN(XNAME, rval) \
  	table[NF_SYSCTL_CT_PROTO_TCP_ ## XNAME].data = (rval)
  
  	XASSIGN(LOOSE, &tn->tcp_loose);
  	XASSIGN(LIBERAL, &tn->tcp_be_liberal);
  	XASSIGN(MAX_RETRANS, &tn->tcp_max_retrans);
  #undef XASSIGN
  }
  
  static void nf_conntrack_standalone_init_sctp_sysctl(struct net *net,
  						     struct ctl_table *table)
  {
  #ifdef CONFIG_NF_CT_PROTO_SCTP
  	struct nf_sctp_net *sn = nf_sctp_pernet(net);
  
  #define XASSIGN(XNAME, sn) \
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_SCTP_ ## XNAME].data = \
  			&(sn)->timeouts[SCTP_CONNTRACK_ ## XNAME]
  
  	XASSIGN(CLOSED, sn);
  	XASSIGN(COOKIE_WAIT, sn);
  	XASSIGN(COOKIE_ECHOED, sn);
  	XASSIGN(ESTABLISHED, sn);
  	XASSIGN(SHUTDOWN_SENT, sn);
  	XASSIGN(SHUTDOWN_RECD, sn);
  	XASSIGN(SHUTDOWN_ACK_SENT, sn);
  	XASSIGN(HEARTBEAT_SENT, sn);
  	XASSIGN(HEARTBEAT_ACKED, sn);
  #undef XASSIGN
  #endif
  }
  
  static void nf_conntrack_standalone_init_dccp_sysctl(struct net *net,
  						     struct ctl_table *table)
  {
  #ifdef CONFIG_NF_CT_PROTO_DCCP
  	struct nf_dccp_net *dn = nf_dccp_pernet(net);
  
  #define XASSIGN(XNAME, dn) \
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_DCCP_ ## XNAME].data = \
  			&(dn)->dccp_timeout[CT_DCCP_ ## XNAME]
  
  	XASSIGN(REQUEST, dn);
  	XASSIGN(RESPOND, dn);
  	XASSIGN(PARTOPEN, dn);
  	XASSIGN(OPEN, dn);
  	XASSIGN(CLOSEREQ, dn);
  	XASSIGN(CLOSING, dn);
  	XASSIGN(TIMEWAIT, dn);
  #undef XASSIGN
  
  	table[NF_SYSCTL_CT_PROTO_DCCP_LOOSE].data = &dn->dccp_loose;
  #endif
  }
  
  static void nf_conntrack_standalone_init_gre_sysctl(struct net *net,
  						    struct ctl_table *table)
  {
  #ifdef CONFIG_NF_CT_PROTO_GRE
  	struct nf_gre_net *gn = nf_gre_pernet(net);
  
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_GRE].data = &gn->timeouts[GRE_CT_UNREPLIED];
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_GRE_STREAM].data = &gn->timeouts[GRE_CT_REPLIED];
  #endif
  }
802507071   Alexey Dobriyan   netfilter: netns ...
991
  static int nf_conntrack_standalone_init_sysctl(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
992
  {
b884fa461   Florian Westphal   netfilter: conntr...
993
  	struct nf_udp_net *un = nf_udp_pernet(net);
802507071   Alexey Dobriyan   netfilter: netns ...
994
  	struct ctl_table *table;
b884fa461   Florian Westphal   netfilter: conntr...
995
  	BUILD_BUG_ON(ARRAY_SIZE(nf_ct_sysctl_table) != NF_SYSCTL_CT_LAST_SYSCTL);
802507071   Alexey Dobriyan   netfilter: netns ...
996
997
998
  	table = kmemdup(nf_ct_sysctl_table, sizeof(nf_ct_sysctl_table),
  			GFP_KERNEL);
  	if (!table)
b884fa461   Florian Westphal   netfilter: conntr...
999
  		return -ENOMEM;
802507071   Alexey Dobriyan   netfilter: netns ...
1000

4a65798a9   Florian Westphal   netfilter: conntr...
1001
1002
1003
  	table[NF_SYSCTL_CT_COUNT].data = &net->ct.count;
  	table[NF_SYSCTL_CT_CHECKSUM].data = &net->ct.sysctl_checksum;
  	table[NF_SYSCTL_CT_LOG_INVALID].data = &net->ct.sysctl_log_invalid;
478553fd1   Florian Westphal   netfilter: conntr...
1004
1005
  	table[NF_SYSCTL_CT_ACCT].data = &net->ct.sysctl_acct;
  	table[NF_SYSCTL_CT_HELPER].data = &net->ct.sysctl_auto_assign_helper;
cb2833ed0   Florian Westphal   netfilter: conntr...
1006
1007
1008
  #ifdef CONFIG_NF_CONNTRACK_EVENTS
  	table[NF_SYSCTL_CT_EVENTS].data = &net->ct.sysctl_events;
  #endif
478553fd1   Florian Westphal   netfilter: conntr...
1009
1010
1011
  #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
  	table[NF_SYSCTL_CT_TIMESTAMP].data = &net->ct.sysctl_tstamp;
  #endif
b884fa461   Florian Westphal   netfilter: conntr...
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_GENERIC].data = &nf_generic_pernet(net)->timeout;
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMP].data = &nf_icmp_pernet(net)->timeout;
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_ICMPV6].data = &nf_icmpv6_pernet(net)->timeout;
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP].data = &un->timeouts[UDP_CT_UNREPLIED];
  	table[NF_SYSCTL_CT_PROTO_TIMEOUT_UDP_STREAM].data = &un->timeouts[UDP_CT_REPLIED];
  
  	nf_conntrack_standalone_init_tcp_sysctl(net, table);
  	nf_conntrack_standalone_init_sctp_sysctl(net, table);
  	nf_conntrack_standalone_init_dccp_sysctl(net, table);
  	nf_conntrack_standalone_init_gre_sysctl(net, table);
802507071   Alexey Dobriyan   netfilter: netns ...
1022

464dc801c   Eric W. Biederman   net: Don't export...
1023
  	/* Don't export sysctls to unprivileged users */
d912dec12   Florian Westphal   netfilter: conntr...
1024
  	if (net->user_ns != &init_user_ns) {
4a65798a9   Florian Westphal   netfilter: conntr...
1025
  		table[NF_SYSCTL_CT_MAX].procname = NULL;
d912dec12   Florian Westphal   netfilter: conntr...
1026
1027
  		table[NF_SYSCTL_CT_ACCT].procname = NULL;
  		table[NF_SYSCTL_CT_HELPER].procname = NULL;
cb2833ed0   Florian Westphal   netfilter: conntr...
1028
1029
1030
1031
1032
1033
  #ifdef CONFIG_NF_CONNTRACK_TIMESTAMP
  		table[NF_SYSCTL_CT_TIMESTAMP].procname = NULL;
  #endif
  #ifdef CONFIG_NF_CONNTRACK_EVENTS
  		table[NF_SYSCTL_CT_EVENTS].procname = NULL;
  #endif
d912dec12   Florian Westphal   netfilter: conntr...
1034
  	}
464dc801c   Eric W. Biederman   net: Don't export...
1035

3183ab899   Florian Westphal   netfilter: conntr...
1036
  	if (!net_eq(&init_net, net))
4a65798a9   Florian Westphal   netfilter: conntr...
1037
  		table[NF_SYSCTL_CT_BUCKETS].mode = 0444;
3183ab899   Florian Westphal   netfilter: conntr...
1038

ec8f23ce0   Eric W. Biederman   net: Convert all ...
1039
  	net->ct.sysctl_header = register_net_sysctl(net, "net/netfilter", table);
802507071   Alexey Dobriyan   netfilter: netns ...
1040
  	if (!net->ct.sysctl_header)
9714be7da   Krzysztof Piotr Oledzki   netfilter: fix tw...
1041
  		goto out_unregister_netfilter;
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
1042
  	return 0;
9714be7da   Krzysztof Piotr Oledzki   netfilter: fix tw...
1043
  out_unregister_netfilter:
802507071   Alexey Dobriyan   netfilter: netns ...
1044
  	kfree(table);
9714be7da   Krzysztof Piotr Oledzki   netfilter: fix tw...
1045
  	return -ENOMEM;
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
1046
  }
802507071   Alexey Dobriyan   netfilter: netns ...
1047
  static void nf_conntrack_standalone_fini_sysctl(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
1048
  {
802507071   Alexey Dobriyan   netfilter: netns ...
1049
  	struct ctl_table *table;
802507071   Alexey Dobriyan   netfilter: netns ...
1050
1051
1052
  	table = net->ct.sysctl_header->ctl_table_arg;
  	unregister_net_sysctl_table(net->ct.sysctl_header);
  	kfree(table);
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
1053
1054
  }
  #else
802507071   Alexey Dobriyan   netfilter: netns ...
1055
  static int nf_conntrack_standalone_init_sysctl(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
1056
1057
1058
  {
  	return 0;
  }
802507071   Alexey Dobriyan   netfilter: netns ...
1059
  static void nf_conntrack_standalone_fini_sysctl(struct net *net)
b916f7d4b   Alexey Dobriyan   [NETFILTER]: nf_c...
1060
1061
  {
  }
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
1062
  #endif /* CONFIG_SYSCTL */
ba3fbe663   Pablo Neira Ayuso   netfilter: nf_con...
1063
1064
1065
1066
1067
1068
1069
1070
  static void nf_conntrack_fini_net(struct net *net)
  {
  	if (enable_hooks)
  		nf_ct_netns_put(net, NFPROTO_INET);
  
  	nf_conntrack_standalone_fini_proc(net);
  	nf_conntrack_standalone_fini_sysctl(net);
  }
f94161c1b   Gao feng   netfilter: nf_con...
1071
  static int nf_conntrack_pernet_init(struct net *net)
dfdb8d791   Alexey Dobriyan   netfilter: netns ...
1072
  {
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
1073
  	int ret;
b884fa461   Florian Westphal   netfilter: conntr...
1074
1075
1076
  	net->ct.sysctl_checksum = 1;
  
  	ret = nf_conntrack_standalone_init_sysctl(net);
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
1077
  	if (ret < 0)
b884fa461   Florian Westphal   netfilter: conntr...
1078
  		return ret;
f94161c1b   Gao feng   netfilter: nf_con...
1079

b2ce2c747   Alexey Dobriyan   netfilter: netns ...
1080
1081
1082
  	ret = nf_conntrack_standalone_init_proc(net);
  	if (ret < 0)
  		goto out_proc;
f94161c1b   Gao feng   netfilter: nf_con...
1083

b884fa461   Florian Westphal   netfilter: conntr...
1084
  	ret = nf_conntrack_init_net(net);
802507071   Alexey Dobriyan   netfilter: netns ...
1085
  	if (ret < 0)
b884fa461   Florian Westphal   netfilter: conntr...
1086
  		goto out_init_net;
f94161c1b   Gao feng   netfilter: nf_con...
1087

ba3fbe663   Pablo Neira Ayuso   netfilter: nf_con...
1088
1089
1090
1091
1092
  	if (enable_hooks) {
  		ret = nf_ct_netns_get(net, NFPROTO_INET);
  		if (ret < 0)
  			goto out_hooks;
  	}
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
1093
  	return 0;
ba3fbe663   Pablo Neira Ayuso   netfilter: nf_con...
1094
  out_hooks:
ac088a88b   Cong Wang   netfilter: conntr...
1095
  	nf_conntrack_cleanup_net(net);
b884fa461   Florian Westphal   netfilter: conntr...
1096
  out_init_net:
802507071   Alexey Dobriyan   netfilter: netns ...
1097
  	nf_conntrack_standalone_fini_proc(net);
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
1098
  out_proc:
ac088a88b   Cong Wang   netfilter: conntr...
1099
  	nf_conntrack_standalone_fini_sysctl(net);
b2ce2c747   Alexey Dobriyan   netfilter: netns ...
1100
  	return ret;
dfdb8d791   Alexey Dobriyan   netfilter: netns ...
1101
  }
dece40e84   Vladimir Davydov   netfilter: nf_con...
1102
  static void nf_conntrack_pernet_exit(struct list_head *net_exit_list)
dfdb8d791   Alexey Dobriyan   netfilter: netns ...
1103
  {
dece40e84   Vladimir Davydov   netfilter: nf_con...
1104
  	struct net *net;
ba3fbe663   Pablo Neira Ayuso   netfilter: nf_con...
1105
1106
  	list_for_each_entry(net, net_exit_list, exit_list)
  		nf_conntrack_fini_net(net);
dece40e84   Vladimir Davydov   netfilter: nf_con...
1107
  	nf_conntrack_cleanup_net_list(net_exit_list);
dfdb8d791   Alexey Dobriyan   netfilter: netns ...
1108
1109
1110
  }
  
  static struct pernet_operations nf_conntrack_net_ops = {
dece40e84   Vladimir Davydov   netfilter: nf_con...
1111
1112
  	.init		= nf_conntrack_pernet_init,
  	.exit_batch	= nf_conntrack_pernet_exit,
a0ae2562c   Florian Westphal   netfilter: conntr...
1113
1114
  	.id		= &nf_conntrack_net_id,
  	.size = sizeof(struct nf_conntrack_net),
dfdb8d791   Alexey Dobriyan   netfilter: netns ...
1115
  };
65b4b4e81   Andrew Morton   [NETFILTER]: Rena...
1116
  static int __init nf_conntrack_standalone_init(void)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
1117
  {
f94161c1b   Gao feng   netfilter: nf_con...
1118
1119
1120
  	int ret = nf_conntrack_init_start();
  	if (ret < 0)
  		goto out_start;
a9e419dc7   Florian Westphal   netfilter: merge ...
1121
  	BUILD_BUG_ON(NFCT_INFOMASK <= IP_CT_NUMBER);
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1122
  #ifdef CONFIG_SYSCTL
f94161c1b   Gao feng   netfilter: nf_con...
1123
1124
  	nf_ct_netfilter_header =
  		register_net_sysctl(&init_net, "net", nf_ct_netfilter_table);
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1125
1126
1127
  	if (!nf_ct_netfilter_header) {
  		pr_err("nf_conntrack: can't register to sysctl.
  ");
5389090b5   Wei Yongjun   netfilter: nf_con...
1128
  		ret = -ENOMEM;
f94161c1b   Gao feng   netfilter: nf_con...
1129
  		goto out_sysctl;
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1130
  	}
3183ab899   Florian Westphal   netfilter: conntr...
1131
1132
  
  	nf_conntrack_htable_size_user = nf_conntrack_htable_size;
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1133
  #endif
f94161c1b   Gao feng   netfilter: nf_con...
1134
1135
1136
1137
1138
1139
1140
1141
1142
  
  	ret = register_pernet_subsys(&nf_conntrack_net_ops);
  	if (ret < 0)
  		goto out_pernet;
  
  	nf_conntrack_init_end();
  	return 0;
  
  out_pernet:
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1143
  #ifdef CONFIG_SYSCTL
f94161c1b   Gao feng   netfilter: nf_con...
1144
1145
  	unregister_net_sysctl_table(nf_ct_netfilter_header);
  out_sysctl:
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1146
  #endif
f94161c1b   Gao feng   netfilter: nf_con...
1147
1148
1149
  	nf_conntrack_cleanup_end();
  out_start:
  	return ret;
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
1150
  }
65b4b4e81   Andrew Morton   [NETFILTER]: Rena...
1151
  static void __exit nf_conntrack_standalone_fini(void)
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
1152
  {
f94161c1b   Gao feng   netfilter: nf_con...
1153
  	nf_conntrack_cleanup_start();
dfdb8d791   Alexey Dobriyan   netfilter: netns ...
1154
  	unregister_pernet_subsys(&nf_conntrack_net_ops);
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1155
  #ifdef CONFIG_SYSCTL
f94161c1b   Gao feng   netfilter: nf_con...
1156
  	unregister_net_sysctl_table(nf_ct_netfilter_header);
5f9f946b3   Pablo Neira Ayuso   netfilter: nf_con...
1157
  #endif
1e47ee836   Pablo Neira Ayuso   netfilter: nf_con...
1158
  	nf_conntrack_cleanup_end();
9fb9cbb10   Yasuyuki Kozakai   [NETFILTER]: Add ...
1159
  }
65b4b4e81   Andrew Morton   [NETFILTER]: Rena...
1160
1161
  module_init(nf_conntrack_standalone_init);
  module_exit(nf_conntrack_standalone_fini);