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