162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  net/dccp/sysctl.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  An implementation of the DCCP protocol
662306a36Sopenharmony_ci *  Arnaldo Carvalho de Melo <acme@mandriva.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/mm.h>
1062306a36Sopenharmony_ci#include <linux/sysctl.h>
1162306a36Sopenharmony_ci#include "dccp.h"
1262306a36Sopenharmony_ci#include "feat.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifndef CONFIG_SYSCTL
1562306a36Sopenharmony_ci#error This file should not be compiled without CONFIG_SYSCTL defined
1662306a36Sopenharmony_ci#endif
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* Boundary values */
1962306a36Sopenharmony_cistatic int		u8_max   = 0xFF;
2062306a36Sopenharmony_cistatic unsigned long	seqw_min = DCCPF_SEQ_WMIN,
2162306a36Sopenharmony_ci			seqw_max = 0xFFFFFFFF;		/* maximum on 32 bit */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistatic struct ctl_table dccp_default_table[] = {
2462306a36Sopenharmony_ci	{
2562306a36Sopenharmony_ci		.procname	= "seq_window",
2662306a36Sopenharmony_ci		.data		= &sysctl_dccp_sequence_window,
2762306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_sequence_window),
2862306a36Sopenharmony_ci		.mode		= 0644,
2962306a36Sopenharmony_ci		.proc_handler	= proc_doulongvec_minmax,
3062306a36Sopenharmony_ci		.extra1		= &seqw_min,		/* RFC 4340, 7.5.2 */
3162306a36Sopenharmony_ci		.extra2		= &seqw_max,
3262306a36Sopenharmony_ci	},
3362306a36Sopenharmony_ci	{
3462306a36Sopenharmony_ci		.procname	= "rx_ccid",
3562306a36Sopenharmony_ci		.data		= &sysctl_dccp_rx_ccid,
3662306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_rx_ccid),
3762306a36Sopenharmony_ci		.mode		= 0644,
3862306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
3962306a36Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
4062306a36Sopenharmony_ci		.extra2		= &u8_max,		/* RFC 4340, 10. */
4162306a36Sopenharmony_ci	},
4262306a36Sopenharmony_ci	{
4362306a36Sopenharmony_ci		.procname	= "tx_ccid",
4462306a36Sopenharmony_ci		.data		= &sysctl_dccp_tx_ccid,
4562306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_tx_ccid),
4662306a36Sopenharmony_ci		.mode		= 0644,
4762306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
4862306a36Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
4962306a36Sopenharmony_ci		.extra2		= &u8_max,		/* RFC 4340, 10. */
5062306a36Sopenharmony_ci	},
5162306a36Sopenharmony_ci	{
5262306a36Sopenharmony_ci		.procname	= "request_retries",
5362306a36Sopenharmony_ci		.data		= &sysctl_dccp_request_retries,
5462306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_request_retries),
5562306a36Sopenharmony_ci		.mode		= 0644,
5662306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
5762306a36Sopenharmony_ci		.extra1		= SYSCTL_ONE,
5862306a36Sopenharmony_ci		.extra2		= &u8_max,
5962306a36Sopenharmony_ci	},
6062306a36Sopenharmony_ci	{
6162306a36Sopenharmony_ci		.procname	= "retries1",
6262306a36Sopenharmony_ci		.data		= &sysctl_dccp_retries1,
6362306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_retries1),
6462306a36Sopenharmony_ci		.mode		= 0644,
6562306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
6662306a36Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
6762306a36Sopenharmony_ci		.extra2		= &u8_max,
6862306a36Sopenharmony_ci	},
6962306a36Sopenharmony_ci	{
7062306a36Sopenharmony_ci		.procname	= "retries2",
7162306a36Sopenharmony_ci		.data		= &sysctl_dccp_retries2,
7262306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_retries2),
7362306a36Sopenharmony_ci		.mode		= 0644,
7462306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
7562306a36Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
7662306a36Sopenharmony_ci		.extra2		= &u8_max,
7762306a36Sopenharmony_ci	},
7862306a36Sopenharmony_ci	{
7962306a36Sopenharmony_ci		.procname	= "tx_qlen",
8062306a36Sopenharmony_ci		.data		= &sysctl_dccp_tx_qlen,
8162306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_tx_qlen),
8262306a36Sopenharmony_ci		.mode		= 0644,
8362306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
8462306a36Sopenharmony_ci		.extra1		= SYSCTL_ZERO,
8562306a36Sopenharmony_ci	},
8662306a36Sopenharmony_ci	{
8762306a36Sopenharmony_ci		.procname	= "sync_ratelimit",
8862306a36Sopenharmony_ci		.data		= &sysctl_dccp_sync_ratelimit,
8962306a36Sopenharmony_ci		.maxlen		= sizeof(sysctl_dccp_sync_ratelimit),
9062306a36Sopenharmony_ci		.mode		= 0644,
9162306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_ms_jiffies,
9262306a36Sopenharmony_ci	},
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	{ }
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistatic struct ctl_table_header *dccp_table_header;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ciint __init dccp_sysctl_init(void)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	dccp_table_header = register_net_sysctl(&init_net, "net/dccp/default",
10262306a36Sopenharmony_ci			dccp_default_table);
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	return dccp_table_header != NULL ? 0 : -ENOMEM;
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_civoid dccp_sysctl_exit(void)
10862306a36Sopenharmony_ci{
10962306a36Sopenharmony_ci	if (dccp_table_header != NULL) {
11062306a36Sopenharmony_ci		unregister_net_sysctl_table(dccp_table_header);
11162306a36Sopenharmony_ci		dccp_table_header = NULL;
11262306a36Sopenharmony_ci	}
11362306a36Sopenharmony_ci}
114