18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *  net/dccp/sysctl.c
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *  An implementation of the DCCP protocol
68c2ecf20Sopenharmony_ci *  Arnaldo Carvalho de Melo <acme@mandriva.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#include <linux/mm.h>
108c2ecf20Sopenharmony_ci#include <linux/sysctl.h>
118c2ecf20Sopenharmony_ci#include "dccp.h"
128c2ecf20Sopenharmony_ci#include "feat.h"
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#ifndef CONFIG_SYSCTL
158c2ecf20Sopenharmony_ci#error This file should not be compiled without CONFIG_SYSCTL defined
168c2ecf20Sopenharmony_ci#endif
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci/* Boundary values */
198c2ecf20Sopenharmony_cistatic int		u8_max   = 0xFF;
208c2ecf20Sopenharmony_cistatic unsigned long	seqw_min = DCCPF_SEQ_WMIN,
218c2ecf20Sopenharmony_ci			seqw_max = 0xFFFFFFFF;		/* maximum on 32 bit */
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cistatic struct ctl_table dccp_default_table[] = {
248c2ecf20Sopenharmony_ci	{
258c2ecf20Sopenharmony_ci		.procname	= "seq_window",
268c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_sequence_window,
278c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_sequence_window),
288c2ecf20Sopenharmony_ci		.mode		= 0644,
298c2ecf20Sopenharmony_ci		.proc_handler	= proc_doulongvec_minmax,
308c2ecf20Sopenharmony_ci		.extra1		= &seqw_min,		/* RFC 4340, 7.5.2 */
318c2ecf20Sopenharmony_ci		.extra2		= &seqw_max,
328c2ecf20Sopenharmony_ci	},
338c2ecf20Sopenharmony_ci	{
348c2ecf20Sopenharmony_ci		.procname	= "rx_ccid",
358c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_rx_ccid,
368c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_rx_ccid),
378c2ecf20Sopenharmony_ci		.mode		= 0644,
388c2ecf20Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
398c2ecf20Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
408c2ecf20Sopenharmony_ci		.extra2		= &u8_max,		/* RFC 4340, 10. */
418c2ecf20Sopenharmony_ci	},
428c2ecf20Sopenharmony_ci	{
438c2ecf20Sopenharmony_ci		.procname	= "tx_ccid",
448c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_tx_ccid,
458c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_tx_ccid),
468c2ecf20Sopenharmony_ci		.mode		= 0644,
478c2ecf20Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
488c2ecf20Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
498c2ecf20Sopenharmony_ci		.extra2		= &u8_max,		/* RFC 4340, 10. */
508c2ecf20Sopenharmony_ci	},
518c2ecf20Sopenharmony_ci	{
528c2ecf20Sopenharmony_ci		.procname	= "request_retries",
538c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_request_retries,
548c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_request_retries),
558c2ecf20Sopenharmony_ci		.mode		= 0644,
568c2ecf20Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
578c2ecf20Sopenharmony_ci		.extra1		= SYSCTL_ONE,
588c2ecf20Sopenharmony_ci		.extra2		= &u8_max,
598c2ecf20Sopenharmony_ci	},
608c2ecf20Sopenharmony_ci	{
618c2ecf20Sopenharmony_ci		.procname	= "retries1",
628c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_retries1,
638c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_retries1),
648c2ecf20Sopenharmony_ci		.mode		= 0644,
658c2ecf20Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
668c2ecf20Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
678c2ecf20Sopenharmony_ci		.extra2		= &u8_max,
688c2ecf20Sopenharmony_ci	},
698c2ecf20Sopenharmony_ci	{
708c2ecf20Sopenharmony_ci		.procname	= "retries2",
718c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_retries2,
728c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_retries2),
738c2ecf20Sopenharmony_ci		.mode		= 0644,
748c2ecf20Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
758c2ecf20Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
768c2ecf20Sopenharmony_ci		.extra2		= &u8_max,
778c2ecf20Sopenharmony_ci	},
788c2ecf20Sopenharmony_ci	{
798c2ecf20Sopenharmony_ci		.procname	= "tx_qlen",
808c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_tx_qlen,
818c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_tx_qlen),
828c2ecf20Sopenharmony_ci		.mode		= 0644,
838c2ecf20Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
848c2ecf20Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
858c2ecf20Sopenharmony_ci	},
868c2ecf20Sopenharmony_ci	{
878c2ecf20Sopenharmony_ci		.procname	= "sync_ratelimit",
888c2ecf20Sopenharmony_ci		.data		= &sysctl_dccp_sync_ratelimit,
898c2ecf20Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_sync_ratelimit),
908c2ecf20Sopenharmony_ci		.mode		= 0644,
918c2ecf20Sopenharmony_ci		.proc_handler	= proc_dointvec_ms_jiffies,
928c2ecf20Sopenharmony_ci	},
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci	{ }
958c2ecf20Sopenharmony_ci};
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_cistatic struct ctl_table_header *dccp_table_header;
988c2ecf20Sopenharmony_ci
998c2ecf20Sopenharmony_ciint __init dccp_sysctl_init(void)
1008c2ecf20Sopenharmony_ci{
1018c2ecf20Sopenharmony_ci	dccp_table_header = register_net_sysctl(&init_net, "net/dccp/default",
1028c2ecf20Sopenharmony_ci			dccp_default_table);
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci	return dccp_table_header != NULL ? 0 : -ENOMEM;
1058c2ecf20Sopenharmony_ci}
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_civoid dccp_sysctl_exit(void)
1088c2ecf20Sopenharmony_ci{
1098c2ecf20Sopenharmony_ci	if (dccp_table_header != NULL) {
1108c2ecf20Sopenharmony_ci		unregister_net_sysctl_table(dccp_table_header);
1118c2ecf20Sopenharmony_ci		dccp_table_header = NULL;
1128c2ecf20Sopenharmony_ci	}
1138c2ecf20Sopenharmony_ci}
114