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