162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com)
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci#include <linux/mm.h>
762306a36Sopenharmony_ci#include <linux/sysctl.h>
862306a36Sopenharmony_ci#include <linux/init.h>
962306a36Sopenharmony_ci#include <net/ax25.h>
1062306a36Sopenharmony_ci#include <net/netrom.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/*
1362306a36Sopenharmony_ci *	Values taken from NET/ROM documentation.
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_cistatic int min_quality[] = {0}, max_quality[] = {255};
1662306a36Sopenharmony_cistatic int min_obs[]     = {0}, max_obs[]     = {255};
1762306a36Sopenharmony_cistatic int min_ttl[]     = {0}, max_ttl[]     = {255};
1862306a36Sopenharmony_cistatic int min_t1[]      = {5 * HZ};
1962306a36Sopenharmony_cistatic int max_t1[]      = {600 * HZ};
2062306a36Sopenharmony_cistatic int min_n2[]      = {2}, max_n2[]      = {127};
2162306a36Sopenharmony_cistatic int min_t2[]      = {1 * HZ};
2262306a36Sopenharmony_cistatic int max_t2[]      = {60 * HZ};
2362306a36Sopenharmony_cistatic int min_t4[]      = {1 * HZ};
2462306a36Sopenharmony_cistatic int max_t4[]      = {1000 * HZ};
2562306a36Sopenharmony_cistatic int min_window[]  = {1}, max_window[]  = {127};
2662306a36Sopenharmony_cistatic int min_idle[]    = {0 * HZ};
2762306a36Sopenharmony_cistatic int max_idle[]    = {65535 * HZ};
2862306a36Sopenharmony_cistatic int min_route[]   = {0}, max_route[]   = {1};
2962306a36Sopenharmony_cistatic int min_fails[]   = {1}, max_fails[]   = {10};
3062306a36Sopenharmony_cistatic int min_reset[]   = {0}, max_reset[]   = {1};
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic struct ctl_table_header *nr_table_header;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic struct ctl_table nr_table[] = {
3562306a36Sopenharmony_ci	{
3662306a36Sopenharmony_ci		.procname	= "default_path_quality",
3762306a36Sopenharmony_ci		.data		= &sysctl_netrom_default_path_quality,
3862306a36Sopenharmony_ci		.maxlen		= sizeof(int),
3962306a36Sopenharmony_ci		.mode		= 0644,
4062306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
4162306a36Sopenharmony_ci		.extra1		= &min_quality,
4262306a36Sopenharmony_ci		.extra2		= &max_quality
4362306a36Sopenharmony_ci	},
4462306a36Sopenharmony_ci	{
4562306a36Sopenharmony_ci		.procname	= "obsolescence_count_initialiser",
4662306a36Sopenharmony_ci		.data		= &sysctl_netrom_obsolescence_count_initialiser,
4762306a36Sopenharmony_ci		.maxlen		= sizeof(int),
4862306a36Sopenharmony_ci		.mode		= 0644,
4962306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
5062306a36Sopenharmony_ci		.extra1		= &min_obs,
5162306a36Sopenharmony_ci		.extra2		= &max_obs
5262306a36Sopenharmony_ci	},
5362306a36Sopenharmony_ci	{
5462306a36Sopenharmony_ci		.procname	= "network_ttl_initialiser",
5562306a36Sopenharmony_ci		.data		= &sysctl_netrom_network_ttl_initialiser,
5662306a36Sopenharmony_ci		.maxlen		= sizeof(int),
5762306a36Sopenharmony_ci		.mode		= 0644,
5862306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
5962306a36Sopenharmony_ci		.extra1		= &min_ttl,
6062306a36Sopenharmony_ci		.extra2		= &max_ttl
6162306a36Sopenharmony_ci	},
6262306a36Sopenharmony_ci	{
6362306a36Sopenharmony_ci		.procname	= "transport_timeout",
6462306a36Sopenharmony_ci		.data		= &sysctl_netrom_transport_timeout,
6562306a36Sopenharmony_ci		.maxlen		= sizeof(int),
6662306a36Sopenharmony_ci		.mode		= 0644,
6762306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
6862306a36Sopenharmony_ci		.extra1		= &min_t1,
6962306a36Sopenharmony_ci		.extra2		= &max_t1
7062306a36Sopenharmony_ci	},
7162306a36Sopenharmony_ci	{
7262306a36Sopenharmony_ci		.procname	= "transport_maximum_tries",
7362306a36Sopenharmony_ci		.data		= &sysctl_netrom_transport_maximum_tries,
7462306a36Sopenharmony_ci		.maxlen		= sizeof(int),
7562306a36Sopenharmony_ci		.mode		= 0644,
7662306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
7762306a36Sopenharmony_ci		.extra1		= &min_n2,
7862306a36Sopenharmony_ci		.extra2		= &max_n2
7962306a36Sopenharmony_ci	},
8062306a36Sopenharmony_ci	{
8162306a36Sopenharmony_ci		.procname	= "transport_acknowledge_delay",
8262306a36Sopenharmony_ci		.data		= &sysctl_netrom_transport_acknowledge_delay,
8362306a36Sopenharmony_ci		.maxlen		= sizeof(int),
8462306a36Sopenharmony_ci		.mode		= 0644,
8562306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
8662306a36Sopenharmony_ci		.extra1		= &min_t2,
8762306a36Sopenharmony_ci		.extra2		= &max_t2
8862306a36Sopenharmony_ci	},
8962306a36Sopenharmony_ci	{
9062306a36Sopenharmony_ci		.procname	= "transport_busy_delay",
9162306a36Sopenharmony_ci		.data		= &sysctl_netrom_transport_busy_delay,
9262306a36Sopenharmony_ci		.maxlen		= sizeof(int),
9362306a36Sopenharmony_ci		.mode		= 0644,
9462306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
9562306a36Sopenharmony_ci		.extra1		= &min_t4,
9662306a36Sopenharmony_ci		.extra2		= &max_t4
9762306a36Sopenharmony_ci	},
9862306a36Sopenharmony_ci	{
9962306a36Sopenharmony_ci		.procname	= "transport_requested_window_size",
10062306a36Sopenharmony_ci		.data		= &sysctl_netrom_transport_requested_window_size,
10162306a36Sopenharmony_ci		.maxlen		= sizeof(int),
10262306a36Sopenharmony_ci		.mode		= 0644,
10362306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
10462306a36Sopenharmony_ci		.extra1		= &min_window,
10562306a36Sopenharmony_ci		.extra2		= &max_window
10662306a36Sopenharmony_ci	},
10762306a36Sopenharmony_ci	{
10862306a36Sopenharmony_ci		.procname	= "transport_no_activity_timeout",
10962306a36Sopenharmony_ci		.data		= &sysctl_netrom_transport_no_activity_timeout,
11062306a36Sopenharmony_ci		.maxlen		= sizeof(int),
11162306a36Sopenharmony_ci		.mode		= 0644,
11262306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
11362306a36Sopenharmony_ci		.extra1		= &min_idle,
11462306a36Sopenharmony_ci		.extra2		= &max_idle
11562306a36Sopenharmony_ci	},
11662306a36Sopenharmony_ci	{
11762306a36Sopenharmony_ci		.procname	= "routing_control",
11862306a36Sopenharmony_ci		.data		= &sysctl_netrom_routing_control,
11962306a36Sopenharmony_ci		.maxlen		= sizeof(int),
12062306a36Sopenharmony_ci		.mode		= 0644,
12162306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
12262306a36Sopenharmony_ci		.extra1		= &min_route,
12362306a36Sopenharmony_ci		.extra2		= &max_route
12462306a36Sopenharmony_ci	},
12562306a36Sopenharmony_ci	{
12662306a36Sopenharmony_ci		.procname	= "link_fails_count",
12762306a36Sopenharmony_ci		.data		= &sysctl_netrom_link_fails_count,
12862306a36Sopenharmony_ci		.maxlen		= sizeof(int),
12962306a36Sopenharmony_ci		.mode		= 0644,
13062306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
13162306a36Sopenharmony_ci		.extra1		= &min_fails,
13262306a36Sopenharmony_ci		.extra2		= &max_fails
13362306a36Sopenharmony_ci	},
13462306a36Sopenharmony_ci	{
13562306a36Sopenharmony_ci		.procname	= "reset",
13662306a36Sopenharmony_ci		.data		= &sysctl_netrom_reset_circuit,
13762306a36Sopenharmony_ci		.maxlen		= sizeof(int),
13862306a36Sopenharmony_ci		.mode		= 0644,
13962306a36Sopenharmony_ci		.proc_handler	= proc_dointvec_minmax,
14062306a36Sopenharmony_ci		.extra1		= &min_reset,
14162306a36Sopenharmony_ci		.extra2		= &max_reset
14262306a36Sopenharmony_ci	},
14362306a36Sopenharmony_ci	{ }
14462306a36Sopenharmony_ci};
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ciint __init nr_register_sysctl(void)
14762306a36Sopenharmony_ci{
14862306a36Sopenharmony_ci	nr_table_header = register_net_sysctl(&init_net, "net/netrom", nr_table);
14962306a36Sopenharmony_ci	if (!nr_table_header)
15062306a36Sopenharmony_ci		return -ENOMEM;
15162306a36Sopenharmony_ci	return 0;
15262306a36Sopenharmony_ci}
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_civoid nr_unregister_sysctl(void)
15562306a36Sopenharmony_ci{
15662306a36Sopenharmony_ci	unregister_net_sysctl_table(nr_table_header);
15762306a36Sopenharmony_ci}
158