Branch data Line data Source code
1 : : /*
2 : : * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem.
3 : : *
4 : : * Begun April 1, 1996, Mike Shaver.
5 : : * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS]
6 : : */
7 : :
8 : : #include <linux/mm.h>
9 : : #include <linux/module.h>
10 : : #include <linux/sysctl.h>
11 : : #include <linux/igmp.h>
12 : : #include <linux/inetdevice.h>
13 : : #include <linux/seqlock.h>
14 : : #include <linux/init.h>
15 : : #include <linux/slab.h>
16 : : #include <linux/nsproxy.h>
17 : : #include <linux/swap.h>
18 : : #include <net/snmp.h>
19 : : #include <net/icmp.h>
20 : : #include <net/ip.h>
21 : : #include <net/route.h>
22 : : #include <net/tcp.h>
23 : : #include <net/udp.h>
24 : : #include <net/cipso_ipv4.h>
25 : : #include <net/inet_frag.h>
26 : : #include <net/ping.h>
27 : : #include <net/tcp_memcontrol.h>
28 : :
29 : : static int zero;
30 : : static int one = 1;
31 : : static int four = 4;
32 : : static int gso_max_segs = GSO_MAX_SEGS;
33 : : static int tcp_retr1_max = 255;
34 : : static int ip_local_port_range_min[] = { 1, 1 };
35 : : static int ip_local_port_range_max[] = { 65535, 65535 };
36 : : static int tcp_adv_win_scale_min = -31;
37 : : static int tcp_adv_win_scale_max = 31;
38 : : static int ip_ttl_min = 1;
39 : : static int ip_ttl_max = 255;
40 : : static int tcp_syn_retries_min = 1;
41 : : static int tcp_syn_retries_max = MAX_TCP_SYNCNT;
42 : : static int ip_ping_group_range_min[] = { 0, 0 };
43 : : static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX };
44 : :
45 : : /* Update system visible IP port range */
46 : 0 : static void set_local_port_range(struct net *net, int range[2])
47 : : {
48 : : write_seqlock(&net->ipv4.sysctl_local_ports.lock);
49 : 0 : net->ipv4.sysctl_local_ports.range[0] = range[0];
50 : 0 : net->ipv4.sysctl_local_ports.range[1] = range[1];
51 : : write_sequnlock(&net->ipv4.sysctl_local_ports.lock);
52 : 0 : }
53 : :
54 : : /* Validate changes from /proc interface. */
55 : 0 : static int ipv4_local_port_range(struct ctl_table *table, int write,
56 : : void __user *buffer,
57 : : size_t *lenp, loff_t *ppos)
58 : : {
59 : 2 : struct net *net =
60 : 2 : container_of(table->data, struct net, ipv4.sysctl_local_ports.range);
61 : : int ret;
62 : : int range[2];
63 : 4 : struct ctl_table tmp = {
64 : : .data = &range,
65 : : .maxlen = sizeof(range),
66 : 2 : .mode = table->mode,
67 : : .extra1 = &ip_local_port_range_min,
68 : : .extra2 = &ip_local_port_range_max,
69 : : };
70 : :
71 : 2 : inet_get_local_port_range(net, &range[0], &range[1]);
72 : :
73 : 2 : ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
74 : :
75 [ - + ]: 2 : if (write && ret == 0) {
76 [ # # ]: 0 : if (range[1] < range[0])
77 : : ret = -EINVAL;
78 : : else
79 : 0 : set_local_port_range(net, range);
80 : : }
81 : :
82 : 0 : return ret;
83 : : }
84 : :
85 : :
86 : : static void inet_get_ping_group_range_table(struct ctl_table *table, kgid_t *low, kgid_t *high)
87 : : {
88 : : kgid_t *data = table->data;
89 : : struct net *net =
90 : : container_of(table->data, struct net, ipv4.sysctl_ping_group_range);
91 : : unsigned int seq;
92 : : do {
93 : : seq = read_seqbegin(&net->ipv4.sysctl_local_ports.lock);
94 : :
95 : 2 : *low = data[0];
96 : 2 : *high = data[1];
97 [ - + ]: 2 : } while (read_seqretry(&net->ipv4.sysctl_local_ports.lock, seq));
98 : : }
99 : :
100 : : /* Update system visible IP port range */
101 : 0 : static void set_ping_group_range(struct ctl_table *table, kgid_t low, kgid_t high)
102 : : {
103 : 0 : kgid_t *data = table->data;
104 : : struct net *net =
105 : : container_of(table->data, struct net, ipv4.sysctl_ping_group_range);
106 : : write_seqlock(&net->ipv4.sysctl_local_ports.lock);
107 : 0 : data[0] = low;
108 : 0 : data[1] = high;
109 : : write_sequnlock(&net->ipv4.sysctl_local_ports.lock);
110 : 0 : }
111 : :
112 : : /* Validate changes from /proc interface. */
113 : 2 : static int ipv4_ping_group_range(struct ctl_table *table, int write,
114 : : void __user *buffer,
115 : : size_t *lenp, loff_t *ppos)
116 : : {
117 : : struct user_namespace *user_ns = current_user_ns();
118 : : int ret;
119 : : gid_t urange[2];
120 : : kgid_t low, high;
121 : 4 : struct ctl_table tmp = {
122 : : .data = &urange,
123 : : .maxlen = sizeof(urange),
124 : 2 : .mode = table->mode,
125 : : .extra1 = &ip_ping_group_range_min,
126 : : .extra2 = &ip_ping_group_range_max,
127 : : };
128 : :
129 : : inet_get_ping_group_range_table(table, &low, &high);
130 : 2 : urange[0] = from_kgid_munged(user_ns, low);
131 : 0 : urange[1] = from_kgid_munged(user_ns, high);
132 : 2 : ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
133 : :
134 [ - + ]: 2 : if (write && ret == 0) {
135 : 0 : low = make_kgid(user_ns, urange[0]);
136 : 0 : high = make_kgid(user_ns, urange[1]);
137 [ # # ][ # # ]: 0 : if (!gid_valid(low) || !gid_valid(high) ||
[ # # ]
138 [ # # ]: 0 : (urange[1] < urange[0]) || gid_lt(high, low)) {
139 : : low = make_kgid(&init_user_ns, 1);
140 : : high = make_kgid(&init_user_ns, 0);
141 : : }
142 : 0 : set_ping_group_range(table, low, high);
143 : : }
144 : :
145 : 2 : return ret;
146 : : }
147 : :
148 : : /* Validate changes from /proc interface. */
149 : 0 : static int proc_tcp_default_init_rwnd(ctl_table *ctl, int write,
150 : : void __user *buffer,
151 : : size_t *lenp, loff_t *ppos)
152 : : {
153 : 2 : int old_value = *(int *)ctl->data;
154 : 2 : int ret = proc_dointvec(ctl, write, buffer, lenp, ppos);
155 : 2 : int new_value = *(int *)ctl->data;
156 : :
157 [ - + ][ # # ]: 2 : if (write && ret == 0 && (new_value < 3 || new_value > 100))
158 : 0 : *(int *)ctl->data = old_value;
159 : :
160 : 0 : return ret;
161 : : }
162 : :
163 : 0 : static int proc_tcp_congestion_control(struct ctl_table *ctl, int write,
164 : : void __user *buffer, size_t *lenp, loff_t *ppos)
165 : : {
166 : : char val[TCP_CA_NAME_MAX];
167 : 2 : struct ctl_table tbl = {
168 : : .data = val,
169 : : .maxlen = TCP_CA_NAME_MAX,
170 : : };
171 : : int ret;
172 : :
173 : 2 : tcp_get_default_congestion_control(val);
174 : :
175 : 2 : ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
176 [ - + ]: 2 : if (write && ret == 0)
177 : 0 : ret = tcp_set_default_congestion_control(val);
178 : 0 : return ret;
179 : : }
180 : :
181 : 0 : static int proc_tcp_available_congestion_control(struct ctl_table *ctl,
182 : : int write,
183 : : void __user *buffer, size_t *lenp,
184 : : loff_t *ppos)
185 : : {
186 : 2 : struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, };
187 : : int ret;
188 : :
189 : 2 : tbl.data = kmalloc(tbl.maxlen, GFP_USER);
190 [ + - ]: 2 : if (!tbl.data)
191 : : return -ENOMEM;
192 : 2 : tcp_get_available_congestion_control(tbl.data, TCP_CA_BUF_MAX);
193 : 2 : ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
194 : 2 : kfree(tbl.data);
195 : 2 : return ret;
196 : : }
197 : :
198 : 0 : static int proc_allowed_congestion_control(struct ctl_table *ctl,
199 : : int write,
200 : : void __user *buffer, size_t *lenp,
201 : : loff_t *ppos)
202 : : {
203 : 2 : struct ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };
204 : : int ret;
205 : :
206 : 2 : tbl.data = kmalloc(tbl.maxlen, GFP_USER);
207 [ + - ]: 2 : if (!tbl.data)
208 : : return -ENOMEM;
209 : :
210 : 2 : tcp_get_allowed_congestion_control(tbl.data, tbl.maxlen);
211 : 2 : ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
212 [ - + ]: 2 : if (write && ret == 0)
213 : 0 : ret = tcp_set_allowed_congestion_control(tbl.data);
214 : 2 : kfree(tbl.data);
215 : 2 : return ret;
216 : : }
217 : :
218 : 0 : static int proc_tcp_fastopen_key(struct ctl_table *ctl, int write,
219 : : void __user *buffer, size_t *lenp,
220 : : loff_t *ppos)
221 : : {
222 : 2 : struct ctl_table tbl = { .maxlen = (TCP_FASTOPEN_KEY_LENGTH * 2 + 10) };
223 : : struct tcp_fastopen_context *ctxt;
224 : : int ret;
225 : : u32 user_key[4]; /* 16 bytes, matching TCP_FASTOPEN_KEY_LENGTH */
226 : :
227 : 2 : tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL);
228 [ + - ]: 2 : if (!tbl.data)
229 : : return -ENOMEM;
230 : :
231 : : rcu_read_lock();
232 : 2 : ctxt = rcu_dereference(tcp_fastopen_ctx);
233 [ - + ]: 2 : if (ctxt)
234 : 0 : memcpy(user_key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH);
235 : : else
236 : 2 : memset(user_key, 0, sizeof(user_key));
237 : : rcu_read_unlock();
238 : :
239 : 2 : snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x",
240 : : user_key[0], user_key[1], user_key[2], user_key[3]);
241 : 2 : ret = proc_dostring(&tbl, write, buffer, lenp, ppos);
242 : :
243 [ - + ]: 2 : if (write && ret == 0) {
244 [ # # ]: 0 : if (sscanf(tbl.data, "%x-%x-%x-%x", user_key, user_key + 1,
245 : : user_key + 2, user_key + 3) != 4) {
246 : : ret = -EINVAL;
247 : : goto bad_key;
248 : : }
249 : : /* Generate a dummy secret but don't publish it. This
250 : : * is needed so we don't regenerate a new key on the
251 : : * first invocation of tcp_fastopen_cookie_gen
252 : : */
253 : 0 : tcp_fastopen_init_key_once(false);
254 : 0 : tcp_fastopen_reset_cipher(user_key, TCP_FASTOPEN_KEY_LENGTH);
255 : : }
256 : :
257 : : bad_key:
258 : : pr_debug("proc FO key set 0x%x-%x-%x-%x <- 0x%s: %u\n",
259 : : user_key[0], user_key[1], user_key[2], user_key[3],
260 : : (char *)tbl.data, ret);
261 : 2 : kfree(tbl.data);
262 : 2 : return ret;
263 : : }
264 : :
265 : : static struct ctl_table ipv4_table[] = {
266 : : {
267 : : .procname = "tcp_timestamps",
268 : : .data = &sysctl_tcp_timestamps,
269 : : .maxlen = sizeof(int),
270 : : .mode = 0644,
271 : : .proc_handler = proc_dointvec
272 : : },
273 : : {
274 : : .procname = "tcp_window_scaling",
275 : : .data = &sysctl_tcp_window_scaling,
276 : : .maxlen = sizeof(int),
277 : : .mode = 0644,
278 : : .proc_handler = proc_dointvec
279 : : },
280 : : {
281 : : .procname = "tcp_sack",
282 : : .data = &sysctl_tcp_sack,
283 : : .maxlen = sizeof(int),
284 : : .mode = 0644,
285 : : .proc_handler = proc_dointvec
286 : : },
287 : : {
288 : : .procname = "tcp_retrans_collapse",
289 : : .data = &sysctl_tcp_retrans_collapse,
290 : : .maxlen = sizeof(int),
291 : : .mode = 0644,
292 : : .proc_handler = proc_dointvec
293 : : },
294 : : {
295 : : .procname = "ip_default_ttl",
296 : : .data = &sysctl_ip_default_ttl,
297 : : .maxlen = sizeof(int),
298 : : .mode = 0644,
299 : : .proc_handler = proc_dointvec_minmax,
300 : : .extra1 = &ip_ttl_min,
301 : : .extra2 = &ip_ttl_max,
302 : : },
303 : : {
304 : : .procname = "ip_nonlocal_bind",
305 : : .data = &sysctl_ip_nonlocal_bind,
306 : : .maxlen = sizeof(int),
307 : : .mode = 0644,
308 : : .proc_handler = proc_dointvec
309 : : },
310 : : {
311 : : .procname = "tcp_syn_retries",
312 : : .data = &sysctl_tcp_syn_retries,
313 : : .maxlen = sizeof(int),
314 : : .mode = 0644,
315 : : .proc_handler = proc_dointvec_minmax,
316 : : .extra1 = &tcp_syn_retries_min,
317 : : .extra2 = &tcp_syn_retries_max
318 : : },
319 : : {
320 : : .procname = "tcp_synack_retries",
321 : : .data = &sysctl_tcp_synack_retries,
322 : : .maxlen = sizeof(int),
323 : : .mode = 0644,
324 : : .proc_handler = proc_dointvec
325 : : },
326 : : {
327 : : .procname = "tcp_max_orphans",
328 : : .data = &sysctl_tcp_max_orphans,
329 : : .maxlen = sizeof(int),
330 : : .mode = 0644,
331 : : .proc_handler = proc_dointvec
332 : : },
333 : : {
334 : : .procname = "tcp_max_tw_buckets",
335 : : .data = &tcp_death_row.sysctl_max_tw_buckets,
336 : : .maxlen = sizeof(int),
337 : : .mode = 0644,
338 : : .proc_handler = proc_dointvec
339 : : },
340 : : {
341 : : .procname = "ip_early_demux",
342 : : .data = &sysctl_ip_early_demux,
343 : : .maxlen = sizeof(int),
344 : : .mode = 0644,
345 : : .proc_handler = proc_dointvec
346 : : },
347 : : {
348 : : .procname = "ip_dynaddr",
349 : : .data = &sysctl_ip_dynaddr,
350 : : .maxlen = sizeof(int),
351 : : .mode = 0644,
352 : : .proc_handler = proc_dointvec
353 : : },
354 : : {
355 : : .procname = "tcp_keepalive_time",
356 : : .data = &sysctl_tcp_keepalive_time,
357 : : .maxlen = sizeof(int),
358 : : .mode = 0644,
359 : : .proc_handler = proc_dointvec_jiffies,
360 : : },
361 : : {
362 : : .procname = "tcp_keepalive_probes",
363 : : .data = &sysctl_tcp_keepalive_probes,
364 : : .maxlen = sizeof(int),
365 : : .mode = 0644,
366 : : .proc_handler = proc_dointvec
367 : : },
368 : : {
369 : : .procname = "tcp_keepalive_intvl",
370 : : .data = &sysctl_tcp_keepalive_intvl,
371 : : .maxlen = sizeof(int),
372 : : .mode = 0644,
373 : : .proc_handler = proc_dointvec_jiffies,
374 : : },
375 : : {
376 : : .procname = "tcp_retries1",
377 : : .data = &sysctl_tcp_retries1,
378 : : .maxlen = sizeof(int),
379 : : .mode = 0644,
380 : : .proc_handler = proc_dointvec_minmax,
381 : : .extra2 = &tcp_retr1_max
382 : : },
383 : : {
384 : : .procname = "tcp_retries2",
385 : : .data = &sysctl_tcp_retries2,
386 : : .maxlen = sizeof(int),
387 : : .mode = 0644,
388 : : .proc_handler = proc_dointvec
389 : : },
390 : : {
391 : : .procname = "tcp_fin_timeout",
392 : : .data = &sysctl_tcp_fin_timeout,
393 : : .maxlen = sizeof(int),
394 : : .mode = 0644,
395 : : .proc_handler = proc_dointvec_jiffies,
396 : : },
397 : : #ifdef CONFIG_SYN_COOKIES
398 : : {
399 : : .procname = "tcp_syncookies",
400 : : .data = &sysctl_tcp_syncookies,
401 : : .maxlen = sizeof(int),
402 : : .mode = 0644,
403 : : .proc_handler = proc_dointvec
404 : : },
405 : : #endif
406 : : {
407 : : .procname = "tcp_fastopen",
408 : : .data = &sysctl_tcp_fastopen,
409 : : .maxlen = sizeof(int),
410 : : .mode = 0644,
411 : : .proc_handler = proc_dointvec,
412 : : },
413 : : {
414 : : .procname = "tcp_fastopen_key",
415 : : .mode = 0600,
416 : : .maxlen = ((TCP_FASTOPEN_KEY_LENGTH * 2) + 10),
417 : : .proc_handler = proc_tcp_fastopen_key,
418 : : },
419 : : {
420 : : .procname = "tcp_tw_recycle",
421 : : .data = &tcp_death_row.sysctl_tw_recycle,
422 : : .maxlen = sizeof(int),
423 : : .mode = 0644,
424 : : .proc_handler = proc_dointvec
425 : : },
426 : : {
427 : : .procname = "tcp_abort_on_overflow",
428 : : .data = &sysctl_tcp_abort_on_overflow,
429 : : .maxlen = sizeof(int),
430 : : .mode = 0644,
431 : : .proc_handler = proc_dointvec
432 : : },
433 : : {
434 : : .procname = "tcp_stdurg",
435 : : .data = &sysctl_tcp_stdurg,
436 : : .maxlen = sizeof(int),
437 : : .mode = 0644,
438 : : .proc_handler = proc_dointvec
439 : : },
440 : : {
441 : : .procname = "tcp_rfc1337",
442 : : .data = &sysctl_tcp_rfc1337,
443 : : .maxlen = sizeof(int),
444 : : .mode = 0644,
445 : : .proc_handler = proc_dointvec
446 : : },
447 : : {
448 : : .procname = "tcp_max_syn_backlog",
449 : : .data = &sysctl_max_syn_backlog,
450 : : .maxlen = sizeof(int),
451 : : .mode = 0644,
452 : : .proc_handler = proc_dointvec
453 : : },
454 : : {
455 : : .procname = "ip_local_reserved_ports",
456 : : .data = NULL, /* initialized in sysctl_ipv4_init */
457 : : .maxlen = 65536,
458 : : .mode = 0644,
459 : : .proc_handler = proc_do_large_bitmap,
460 : : },
461 : : {
462 : : .procname = "igmp_max_memberships",
463 : : .data = &sysctl_igmp_max_memberships,
464 : : .maxlen = sizeof(int),
465 : : .mode = 0644,
466 : : .proc_handler = proc_dointvec
467 : : },
468 : : {
469 : : .procname = "igmp_max_msf",
470 : : .data = &sysctl_igmp_max_msf,
471 : : .maxlen = sizeof(int),
472 : : .mode = 0644,
473 : : .proc_handler = proc_dointvec
474 : : },
475 : : {
476 : : .procname = "inet_peer_threshold",
477 : : .data = &inet_peer_threshold,
478 : : .maxlen = sizeof(int),
479 : : .mode = 0644,
480 : : .proc_handler = proc_dointvec
481 : : },
482 : : {
483 : : .procname = "inet_peer_minttl",
484 : : .data = &inet_peer_minttl,
485 : : .maxlen = sizeof(int),
486 : : .mode = 0644,
487 : : .proc_handler = proc_dointvec_jiffies,
488 : : },
489 : : {
490 : : .procname = "inet_peer_maxttl",
491 : : .data = &inet_peer_maxttl,
492 : : .maxlen = sizeof(int),
493 : : .mode = 0644,
494 : : .proc_handler = proc_dointvec_jiffies,
495 : : },
496 : : {
497 : : .procname = "tcp_orphan_retries",
498 : : .data = &sysctl_tcp_orphan_retries,
499 : : .maxlen = sizeof(int),
500 : : .mode = 0644,
501 : : .proc_handler = proc_dointvec
502 : : },
503 : : {
504 : : .procname = "tcp_fack",
505 : : .data = &sysctl_tcp_fack,
506 : : .maxlen = sizeof(int),
507 : : .mode = 0644,
508 : : .proc_handler = proc_dointvec
509 : : },
510 : : {
511 : : .procname = "tcp_reordering",
512 : : .data = &sysctl_tcp_reordering,
513 : : .maxlen = sizeof(int),
514 : : .mode = 0644,
515 : : .proc_handler = proc_dointvec
516 : : },
517 : : {
518 : : .procname = "tcp_dsack",
519 : : .data = &sysctl_tcp_dsack,
520 : : .maxlen = sizeof(int),
521 : : .mode = 0644,
522 : : .proc_handler = proc_dointvec
523 : : },
524 : : {
525 : : .procname = "tcp_mem",
526 : : .maxlen = sizeof(sysctl_tcp_mem),
527 : : .data = &sysctl_tcp_mem,
528 : : .mode = 0644,
529 : : .proc_handler = proc_doulongvec_minmax,
530 : : },
531 : : {
532 : : .procname = "tcp_wmem",
533 : : .data = &sysctl_tcp_wmem,
534 : : .maxlen = sizeof(sysctl_tcp_wmem),
535 : : .mode = 0644,
536 : : .proc_handler = proc_dointvec_minmax,
537 : : .extra1 = &one,
538 : : },
539 : : {
540 : : .procname = "tcp_notsent_lowat",
541 : : .data = &sysctl_tcp_notsent_lowat,
542 : : .maxlen = sizeof(sysctl_tcp_notsent_lowat),
543 : : .mode = 0644,
544 : : .proc_handler = proc_dointvec,
545 : : },
546 : : {
547 : : .procname = "tcp_rmem",
548 : : .data = &sysctl_tcp_rmem,
549 : : .maxlen = sizeof(sysctl_tcp_rmem),
550 : : .mode = 0644,
551 : : .proc_handler = proc_dointvec_minmax,
552 : : .extra1 = &one,
553 : : },
554 : : {
555 : : .procname = "tcp_app_win",
556 : : .data = &sysctl_tcp_app_win,
557 : : .maxlen = sizeof(int),
558 : : .mode = 0644,
559 : : .proc_handler = proc_dointvec
560 : : },
561 : : {
562 : : .procname = "tcp_adv_win_scale",
563 : : .data = &sysctl_tcp_adv_win_scale,
564 : : .maxlen = sizeof(int),
565 : : .mode = 0644,
566 : : .proc_handler = proc_dointvec_minmax,
567 : : .extra1 = &tcp_adv_win_scale_min,
568 : : .extra2 = &tcp_adv_win_scale_max,
569 : : },
570 : : {
571 : : .procname = "tcp_tw_reuse",
572 : : .data = &sysctl_tcp_tw_reuse,
573 : : .maxlen = sizeof(int),
574 : : .mode = 0644,
575 : : .proc_handler = proc_dointvec
576 : : },
577 : : {
578 : : .procname = "tcp_frto",
579 : : .data = &sysctl_tcp_frto,
580 : : .maxlen = sizeof(int),
581 : : .mode = 0644,
582 : : .proc_handler = proc_dointvec
583 : : },
584 : : {
585 : : .procname = "tcp_low_latency",
586 : : .data = &sysctl_tcp_low_latency,
587 : : .maxlen = sizeof(int),
588 : : .mode = 0644,
589 : : .proc_handler = proc_dointvec
590 : : },
591 : : {
592 : : .procname = "tcp_no_metrics_save",
593 : : .data = &sysctl_tcp_nometrics_save,
594 : : .maxlen = sizeof(int),
595 : : .mode = 0644,
596 : : .proc_handler = proc_dointvec,
597 : : },
598 : : {
599 : : .procname = "tcp_moderate_rcvbuf",
600 : : .data = &sysctl_tcp_moderate_rcvbuf,
601 : : .maxlen = sizeof(int),
602 : : .mode = 0644,
603 : : .proc_handler = proc_dointvec,
604 : : },
605 : : {
606 : : .procname = "tcp_tso_win_divisor",
607 : : .data = &sysctl_tcp_tso_win_divisor,
608 : : .maxlen = sizeof(int),
609 : : .mode = 0644,
610 : : .proc_handler = proc_dointvec,
611 : : },
612 : : {
613 : : .procname = "tcp_congestion_control",
614 : : .mode = 0644,
615 : : .maxlen = TCP_CA_NAME_MAX,
616 : : .proc_handler = proc_tcp_congestion_control,
617 : : },
618 : : {
619 : : .procname = "tcp_mtu_probing",
620 : : .data = &sysctl_tcp_mtu_probing,
621 : : .maxlen = sizeof(int),
622 : : .mode = 0644,
623 : : .proc_handler = proc_dointvec,
624 : : },
625 : : {
626 : : .procname = "tcp_base_mss",
627 : : .data = &sysctl_tcp_base_mss,
628 : : .maxlen = sizeof(int),
629 : : .mode = 0644,
630 : : .proc_handler = proc_dointvec,
631 : : },
632 : : {
633 : : .procname = "tcp_workaround_signed_windows",
634 : : .data = &sysctl_tcp_workaround_signed_windows,
635 : : .maxlen = sizeof(int),
636 : : .mode = 0644,
637 : : .proc_handler = proc_dointvec
638 : : },
639 : : {
640 : : .procname = "tcp_limit_output_bytes",
641 : : .data = &sysctl_tcp_limit_output_bytes,
642 : : .maxlen = sizeof(int),
643 : : .mode = 0644,
644 : : .proc_handler = proc_dointvec
645 : : },
646 : : {
647 : : .procname = "tcp_challenge_ack_limit",
648 : : .data = &sysctl_tcp_challenge_ack_limit,
649 : : .maxlen = sizeof(int),
650 : : .mode = 0644,
651 : : .proc_handler = proc_dointvec
652 : : },
653 : : #ifdef CONFIG_NET_DMA
654 : : {
655 : : .procname = "tcp_dma_copybreak",
656 : : .data = &sysctl_tcp_dma_copybreak,
657 : : .maxlen = sizeof(int),
658 : : .mode = 0644,
659 : : .proc_handler = proc_dointvec
660 : : },
661 : : #endif
662 : : {
663 : : .procname = "tcp_slow_start_after_idle",
664 : : .data = &sysctl_tcp_slow_start_after_idle,
665 : : .maxlen = sizeof(int),
666 : : .mode = 0644,
667 : : .proc_handler = proc_dointvec
668 : : },
669 : : #ifdef CONFIG_NETLABEL
670 : : {
671 : : .procname = "cipso_cache_enable",
672 : : .data = &cipso_v4_cache_enabled,
673 : : .maxlen = sizeof(int),
674 : : .mode = 0644,
675 : : .proc_handler = proc_dointvec,
676 : : },
677 : : {
678 : : .procname = "cipso_cache_bucket_size",
679 : : .data = &cipso_v4_cache_bucketsize,
680 : : .maxlen = sizeof(int),
681 : : .mode = 0644,
682 : : .proc_handler = proc_dointvec,
683 : : },
684 : : {
685 : : .procname = "cipso_rbm_optfmt",
686 : : .data = &cipso_v4_rbm_optfmt,
687 : : .maxlen = sizeof(int),
688 : : .mode = 0644,
689 : : .proc_handler = proc_dointvec,
690 : : },
691 : : {
692 : : .procname = "cipso_rbm_strictvalid",
693 : : .data = &cipso_v4_rbm_strictvalid,
694 : : .maxlen = sizeof(int),
695 : : .mode = 0644,
696 : : .proc_handler = proc_dointvec,
697 : : },
698 : : #endif /* CONFIG_NETLABEL */
699 : : {
700 : : .procname = "tcp_available_congestion_control",
701 : : .maxlen = TCP_CA_BUF_MAX,
702 : : .mode = 0444,
703 : : .proc_handler = proc_tcp_available_congestion_control,
704 : : },
705 : : {
706 : : .procname = "tcp_allowed_congestion_control",
707 : : .maxlen = TCP_CA_BUF_MAX,
708 : : .mode = 0644,
709 : : .proc_handler = proc_allowed_congestion_control,
710 : : },
711 : : {
712 : : .procname = "tcp_thin_linear_timeouts",
713 : : .data = &sysctl_tcp_thin_linear_timeouts,
714 : : .maxlen = sizeof(int),
715 : : .mode = 0644,
716 : : .proc_handler = proc_dointvec
717 : : },
718 : : {
719 : : .procname = "tcp_thin_dupack",
720 : : .data = &sysctl_tcp_thin_dupack,
721 : : .maxlen = sizeof(int),
722 : : .mode = 0644,
723 : : .proc_handler = proc_dointvec
724 : : },
725 : : {
726 : : .procname = "tcp_early_retrans",
727 : : .data = &sysctl_tcp_early_retrans,
728 : : .maxlen = sizeof(int),
729 : : .mode = 0644,
730 : : .proc_handler = proc_dointvec_minmax,
731 : : .extra1 = &zero,
732 : : .extra2 = &four,
733 : : },
734 : : {
735 : : .procname = "tcp_min_tso_segs",
736 : : .data = &sysctl_tcp_min_tso_segs,
737 : : .maxlen = sizeof(int),
738 : : .mode = 0644,
739 : : .proc_handler = proc_dointvec_minmax,
740 : : .extra1 = &zero,
741 : : .extra2 = &gso_max_segs,
742 : : },
743 : : {
744 : : .procname = "tcp_autocorking",
745 : : .data = &sysctl_tcp_autocorking,
746 : : .maxlen = sizeof(int),
747 : : .mode = 0644,
748 : : .proc_handler = proc_dointvec_minmax,
749 : : .extra1 = &zero,
750 : : .extra2 = &one,
751 : : },
752 : : {
753 : : .procname = "tcp_default_init_rwnd",
754 : : .data = &sysctl_tcp_default_init_rwnd,
755 : : .maxlen = sizeof(int),
756 : : .mode = 0644,
757 : : .proc_handler = proc_tcp_default_init_rwnd
758 : : },
759 : : {
760 : : .procname = "udp_mem",
761 : : .data = &sysctl_udp_mem,
762 : : .maxlen = sizeof(sysctl_udp_mem),
763 : : .mode = 0644,
764 : : .proc_handler = proc_doulongvec_minmax,
765 : : },
766 : : {
767 : : .procname = "udp_rmem_min",
768 : : .data = &sysctl_udp_rmem_min,
769 : : .maxlen = sizeof(sysctl_udp_rmem_min),
770 : : .mode = 0644,
771 : : .proc_handler = proc_dointvec_minmax,
772 : : .extra1 = &one
773 : : },
774 : : {
775 : : .procname = "udp_wmem_min",
776 : : .data = &sysctl_udp_wmem_min,
777 : : .maxlen = sizeof(sysctl_udp_wmem_min),
778 : : .mode = 0644,
779 : : .proc_handler = proc_dointvec_minmax,
780 : : .extra1 = &one
781 : : },
782 : : { }
783 : : };
784 : :
785 : : static struct ctl_table ipv4_net_table[] = {
786 : : {
787 : : .procname = "icmp_echo_ignore_all",
788 : : .data = &init_net.ipv4.sysctl_icmp_echo_ignore_all,
789 : : .maxlen = sizeof(int),
790 : : .mode = 0644,
791 : : .proc_handler = proc_dointvec
792 : : },
793 : : {
794 : : .procname = "icmp_echo_ignore_broadcasts",
795 : : .data = &init_net.ipv4.sysctl_icmp_echo_ignore_broadcasts,
796 : : .maxlen = sizeof(int),
797 : : .mode = 0644,
798 : : .proc_handler = proc_dointvec
799 : : },
800 : : {
801 : : .procname = "icmp_ignore_bogus_error_responses",
802 : : .data = &init_net.ipv4.sysctl_icmp_ignore_bogus_error_responses,
803 : : .maxlen = sizeof(int),
804 : : .mode = 0644,
805 : : .proc_handler = proc_dointvec
806 : : },
807 : : {
808 : : .procname = "icmp_errors_use_inbound_ifaddr",
809 : : .data = &init_net.ipv4.sysctl_icmp_errors_use_inbound_ifaddr,
810 : : .maxlen = sizeof(int),
811 : : .mode = 0644,
812 : : .proc_handler = proc_dointvec
813 : : },
814 : : {
815 : : .procname = "icmp_ratelimit",
816 : : .data = &init_net.ipv4.sysctl_icmp_ratelimit,
817 : : .maxlen = sizeof(int),
818 : : .mode = 0644,
819 : : .proc_handler = proc_dointvec_ms_jiffies,
820 : : },
821 : : {
822 : : .procname = "icmp_ratemask",
823 : : .data = &init_net.ipv4.sysctl_icmp_ratemask,
824 : : .maxlen = sizeof(int),
825 : : .mode = 0644,
826 : : .proc_handler = proc_dointvec
827 : : },
828 : : {
829 : : .procname = "ping_group_range",
830 : : .data = &init_net.ipv4.sysctl_ping_group_range,
831 : : .maxlen = sizeof(gid_t)*2,
832 : : .mode = 0644,
833 : : .proc_handler = ipv4_ping_group_range,
834 : : },
835 : : {
836 : : .procname = "tcp_ecn",
837 : : .data = &init_net.ipv4.sysctl_tcp_ecn,
838 : : .maxlen = sizeof(int),
839 : : .mode = 0644,
840 : : .proc_handler = proc_dointvec
841 : : },
842 : : {
843 : : .procname = "ip_local_port_range",
844 : : .maxlen = sizeof(init_net.ipv4.sysctl_local_ports.range),
845 : : .data = &init_net.ipv4.sysctl_local_ports.range,
846 : : .mode = 0644,
847 : : .proc_handler = ipv4_local_port_range,
848 : : },
849 : : {
850 : : .procname = "ip_no_pmtu_disc",
851 : : .data = &init_net.ipv4.sysctl_ip_no_pmtu_disc,
852 : : .maxlen = sizeof(int),
853 : : .mode = 0644,
854 : : .proc_handler = proc_dointvec
855 : : },
856 : : {
857 : : .procname = "ip_forward_use_pmtu",
858 : : .data = &init_net.ipv4.sysctl_ip_fwd_use_pmtu,
859 : : .maxlen = sizeof(int),
860 : : .mode = 0644,
861 : : .proc_handler = proc_dointvec,
862 : : },
863 : : { }
864 : : };
865 : :
866 : 0 : static __net_init int ipv4_sysctl_init_net(struct net *net)
867 : : {
868 : : struct ctl_table *table;
869 : :
870 : : table = ipv4_net_table;
871 : : if (!net_eq(net, &init_net)) {
872 : : int i;
873 : :
874 : : table = kmemdup(table, sizeof(ipv4_net_table), GFP_KERNEL);
875 : : if (table == NULL)
876 : : goto err_alloc;
877 : :
878 : : /* Update the variables to point into the current struct net */
879 : : for (i = 0; i < ARRAY_SIZE(ipv4_net_table) - 1; i++)
880 : : table[i].data += (void *)net - (void *)&init_net;
881 : : }
882 : :
883 : : /*
884 : : * Sane defaults - nobody may create ping sockets.
885 : : * Boot scripts should set this to distro-specific group.
886 : : */
887 : 0 : net->ipv4.sysctl_ping_group_range[0] = make_kgid(&init_user_ns, 1);
888 : 0 : net->ipv4.sysctl_ping_group_range[1] = make_kgid(&init_user_ns, 0);
889 : :
890 : : /*
891 : : * Set defaults for local port range
892 : : */
893 : 0 : seqlock_init(&net->ipv4.sysctl_local_ports.lock);
894 : 0 : net->ipv4.sysctl_local_ports.range[0] = 32768;
895 : 0 : net->ipv4.sysctl_local_ports.range[1] = 61000;
896 : :
897 : 0 : net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table);
898 [ # # ]: 0 : if (net->ipv4.ipv4_hdr == NULL)
899 : : goto err_reg;
900 : :
901 : : return 0;
902 : :
903 : : err_reg:
904 : : if (!net_eq(net, &init_net))
905 : : kfree(table);
906 : : err_alloc:
907 : : return -ENOMEM;
908 : : }
909 : :
910 : 0 : static __net_exit void ipv4_sysctl_exit_net(struct net *net)
911 : : {
912 : : struct ctl_table *table;
913 : :
914 : 0 : table = net->ipv4.ipv4_hdr->ctl_table_arg;
915 : 0 : unregister_net_sysctl_table(net->ipv4.ipv4_hdr);
916 : 0 : kfree(table);
917 : 0 : }
918 : :
919 : : static __net_initdata struct pernet_operations ipv4_sysctl_ops = {
920 : : .init = ipv4_sysctl_init_net,
921 : : .exit = ipv4_sysctl_exit_net,
922 : : };
923 : :
924 : 0 : static __init int sysctl_ipv4_init(void)
925 : : {
926 : : struct ctl_table_header *hdr;
927 : : struct ctl_table *i;
928 : :
929 [ # # ]: 0 : for (i = ipv4_table; i->procname; i++) {
930 [ # # ]: 0 : if (strcmp(i->procname, "ip_local_reserved_ports") == 0) {
931 : 0 : i->data = sysctl_local_reserved_ports;
932 : 0 : break;
933 : : }
934 : : }
935 [ # # ]: 0 : if (!i->procname)
936 : : return -EINVAL;
937 : :
938 : 0 : hdr = register_net_sysctl(&init_net, "net/ipv4", ipv4_table);
939 [ # # ]: 0 : if (hdr == NULL)
940 : : return -ENOMEM;
941 : :
942 [ # # ]: 0 : if (register_pernet_subsys(&ipv4_sysctl_ops)) {
943 : 0 : unregister_net_sysctl_table(hdr);
944 : 0 : return -ENOMEM;
945 : : }
946 : :
947 : : return 0;
948 : : }
949 : :
950 : : __initcall(sysctl_ipv4_init);
|