xref: /linux/net/dccp/sysctl.c (revision a94f0f97)
1 /*
2  *  net/dccp/sysctl.c
3  *
4  *  An implementation of the DCCP protocol
5  *  Arnaldo Carvalho de Melo <acme@mandriva.com>
6  *
7  *	This program is free software; you can redistribute it and/or
8  *	modify it under the terms of the GNU General Public License v2
9  *	as published by the Free Software Foundation.
10  */
11 
12 #include <linux/mm.h>
13 #include <linux/sysctl.h>
14 #include "dccp.h"
15 #include "feat.h"
16 
17 #ifndef CONFIG_SYSCTL
18 #error This file should not be compiled without CONFIG_SYSCTL defined
19 #endif
20 
21 /* rate-limit for syncs in reply to sequence-invalid packets; RFC 4340, 7.5.4 */
22 int sysctl_dccp_sync_ratelimit	__read_mostly = HZ / 8;
23 
24 static struct ctl_table dccp_default_table[] = {
25 	{
26 		.procname	= "seq_window",
27 		.data		= &sysctl_dccp_feat_sequence_window,
28 		.maxlen		= sizeof(sysctl_dccp_feat_sequence_window),
29 		.mode		= 0644,
30 		.proc_handler	= proc_dointvec,
31 	},
32 	{
33 		.procname	= "rx_ccid",
34 		.data		= &sysctl_dccp_feat_rx_ccid,
35 		.maxlen		= sizeof(sysctl_dccp_feat_rx_ccid),
36 		.mode		= 0644,
37 		.proc_handler	= proc_dointvec,
38 	},
39 	{
40 		.procname	= "tx_ccid",
41 		.data		= &sysctl_dccp_feat_tx_ccid,
42 		.maxlen		= sizeof(sysctl_dccp_feat_tx_ccid),
43 		.mode		= 0644,
44 		.proc_handler	= proc_dointvec,
45 	},
46 	{
47 		.procname	= "ack_ratio",
48 		.data		= &sysctl_dccp_feat_ack_ratio,
49 		.maxlen		= sizeof(sysctl_dccp_feat_ack_ratio),
50 		.mode		= 0644,
51 		.proc_handler	= proc_dointvec,
52 	},
53 	{
54 		.procname	= "send_ackvec",
55 		.data		= &sysctl_dccp_feat_send_ack_vector,
56 		.maxlen		= sizeof(sysctl_dccp_feat_send_ack_vector),
57 		.mode		= 0644,
58 		.proc_handler	= proc_dointvec,
59 	},
60 	{
61 		.procname	= "send_ndp",
62 		.data		= &sysctl_dccp_feat_send_ndp_count,
63 		.maxlen		= sizeof(sysctl_dccp_feat_send_ndp_count),
64 		.mode		= 0644,
65 		.proc_handler	= proc_dointvec,
66 	},
67 	{
68 		.procname	= "request_retries",
69 		.data		= &sysctl_dccp_request_retries,
70 		.maxlen		= sizeof(sysctl_dccp_request_retries),
71 		.mode		= 0644,
72 		.proc_handler	= proc_dointvec,
73 	},
74 	{
75 		.procname	= "retries1",
76 		.data		= &sysctl_dccp_retries1,
77 		.maxlen		= sizeof(sysctl_dccp_retries1),
78 		.mode		= 0644,
79 		.proc_handler	= proc_dointvec,
80 	},
81 	{
82 		.procname	= "retries2",
83 		.data		= &sysctl_dccp_retries2,
84 		.maxlen		= sizeof(sysctl_dccp_retries2),
85 		.mode		= 0644,
86 		.proc_handler	= proc_dointvec,
87 	},
88 	{
89 		.procname	= "tx_qlen",
90 		.data		= &sysctl_dccp_tx_qlen,
91 		.maxlen		= sizeof(sysctl_dccp_tx_qlen),
92 		.mode		= 0644,
93 		.proc_handler	= proc_dointvec,
94 	},
95 	{
96 		.procname	= "sync_ratelimit",
97 		.data		= &sysctl_dccp_sync_ratelimit,
98 		.maxlen		= sizeof(sysctl_dccp_sync_ratelimit),
99 		.mode		= 0644,
100 		.proc_handler	= proc_dointvec_ms_jiffies,
101 	},
102 
103 	{ .ctl_name = 0, }
104 };
105 
106 static struct ctl_table dccp_table[] = {
107 	{
108 		.ctl_name	= NET_DCCP_DEFAULT,
109 		.procname	= "default",
110 		.mode		= 0555,
111 		.child		= dccp_default_table,
112 	},
113 	{ .ctl_name = 0, },
114 };
115 
116 static struct ctl_table dccp_dir_table[] = {
117 	{
118 		.ctl_name	= NET_DCCP,
119 		.procname	= "dccp",
120 		.mode		= 0555,
121 		.child		= dccp_table,
122 	},
123 	{ .ctl_name = 0, },
124 };
125 
126 static struct ctl_table dccp_root_table[] = {
127 	{
128 		.ctl_name	= CTL_NET,
129 		.procname	= "net",
130 		.mode		= 0555,
131 		.child		= dccp_dir_table,
132 	},
133 	{ .ctl_name = 0, },
134 };
135 
136 static struct ctl_table_header *dccp_table_header;
137 
138 int __init dccp_sysctl_init(void)
139 {
140 	dccp_table_header = register_sysctl_table(dccp_root_table);
141 
142 	return dccp_table_header != NULL ? 0 : -ENOMEM;
143 }
144 
145 void dccp_sysctl_exit(void)
146 {
147 	if (dccp_table_header != NULL) {
148 		unregister_sysctl_table(dccp_table_header);
149 		dccp_table_header = NULL;
150 	}
151 }
152