xref: /openbmc/linux/net/ax25/sysctl_net_ax25.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *
41da177e4SLinus Torvalds  * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com)
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds #include <linux/mm.h>
75a0e3ad6STejun Heo #include <linux/slab.h>
81da177e4SLinus Torvalds #include <linux/sysctl.h>
91da177e4SLinus Torvalds #include <linux/spinlock.h>
101da177e4SLinus Torvalds #include <net/ax25.h>
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds static int min_ipdefmode[1],    	max_ipdefmode[] = {1};
131da177e4SLinus Torvalds static int min_axdefmode[1],            max_axdefmode[] = {1};
141da177e4SLinus Torvalds static int min_backoff[1],		max_backoff[] = {2};
151da177e4SLinus Torvalds static int min_conmode[1],		max_conmode[] = {2};
161da177e4SLinus Torvalds static int min_window[] = {1},		max_window[] = {7};
171da177e4SLinus Torvalds static int min_ewindow[] = {1},		max_ewindow[] = {63};
18e1fdb5b3SRalf Baechle static int min_t1[] = {1},		max_t1[] = {30000};
19e1fdb5b3SRalf Baechle static int min_t2[] = {1},		max_t2[] = {20000};
20e1fdb5b3SRalf Baechle static int min_t3[1],			max_t3[] = {3600000};
21e1fdb5b3SRalf Baechle static int min_idle[1],			max_idle[] = {65535000};
221da177e4SLinus Torvalds static int min_n2[] = {1},		max_n2[] = {31};
231da177e4SLinus Torvalds static int min_paclen[] = {1},		max_paclen[] = {512};
24c7c694d1SRalf Baechle DL5RB static int min_proto[1],		max_proto[] = { AX25_PROTO_MAX };
25e14bec2eSIngo Molnar #ifdef CONFIG_AX25_DAMA_SLAVE
26e1fdb5b3SRalf Baechle static int min_ds_timeout[1],		max_ds_timeout[] = {65535000};
27e14bec2eSIngo Molnar #endif
281da177e4SLinus Torvalds 
29fe2c6338SJoe Perches static const struct ctl_table ax25_param_table[] = {
301da177e4SLinus Torvalds 	{
311da177e4SLinus Torvalds 		.procname	= "ip_default_mode",
321da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
331da177e4SLinus Torvalds 		.mode		= 0644,
346d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
351da177e4SLinus Torvalds 		.extra1		= &min_ipdefmode,
361da177e4SLinus Torvalds 		.extra2		= &max_ipdefmode
371da177e4SLinus Torvalds 	},
381da177e4SLinus Torvalds 	{
391da177e4SLinus Torvalds 		.procname	= "ax25_default_mode",
401da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
411da177e4SLinus Torvalds 		.mode		= 0644,
426d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
431da177e4SLinus Torvalds 		.extra1		= &min_axdefmode,
441da177e4SLinus Torvalds 		.extra2		= &max_axdefmode
451da177e4SLinus Torvalds 	},
461da177e4SLinus Torvalds 	{
471da177e4SLinus Torvalds 		.procname	= "backoff_type",
481da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
491da177e4SLinus Torvalds 		.mode		= 0644,
506d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
511da177e4SLinus Torvalds 		.extra1		= &min_backoff,
521da177e4SLinus Torvalds 		.extra2		= &max_backoff
531da177e4SLinus Torvalds 	},
541da177e4SLinus Torvalds 	{
551da177e4SLinus Torvalds 		.procname	= "connect_mode",
561da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
571da177e4SLinus Torvalds 		.mode		= 0644,
586d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
591da177e4SLinus Torvalds 		.extra1		= &min_conmode,
601da177e4SLinus Torvalds 		.extra2		= &max_conmode
611da177e4SLinus Torvalds 	},
621da177e4SLinus Torvalds 	{
631da177e4SLinus Torvalds 		.procname	= "standard_window_size",
641da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
651da177e4SLinus Torvalds 		.mode		= 0644,
666d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
671da177e4SLinus Torvalds 		.extra1		= &min_window,
681da177e4SLinus Torvalds 		.extra2		= &max_window
691da177e4SLinus Torvalds 	},
701da177e4SLinus Torvalds 	{
711da177e4SLinus Torvalds 		.procname	= "extended_window_size",
721da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
731da177e4SLinus Torvalds 		.mode		= 0644,
746d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
751da177e4SLinus Torvalds 		.extra1		= &min_ewindow,
761da177e4SLinus Torvalds 		.extra2		= &max_ewindow
771da177e4SLinus Torvalds 	},
781da177e4SLinus Torvalds 	{
791da177e4SLinus Torvalds 		.procname	= "t1_timeout",
801da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
811da177e4SLinus Torvalds 		.mode		= 0644,
826d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
831da177e4SLinus Torvalds 		.extra1		= &min_t1,
841da177e4SLinus Torvalds 		.extra2		= &max_t1
851da177e4SLinus Torvalds 	},
861da177e4SLinus Torvalds 	{
871da177e4SLinus Torvalds 		.procname	= "t2_timeout",
881da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
891da177e4SLinus Torvalds 		.mode		= 0644,
906d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
911da177e4SLinus Torvalds 		.extra1		= &min_t2,
921da177e4SLinus Torvalds 		.extra2		= &max_t2
931da177e4SLinus Torvalds 	},
941da177e4SLinus Torvalds 	{
951da177e4SLinus Torvalds 		.procname	= "t3_timeout",
961da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
971da177e4SLinus Torvalds 		.mode		= 0644,
986d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
991da177e4SLinus Torvalds 		.extra1		= &min_t3,
1001da177e4SLinus Torvalds 		.extra2		= &max_t3
1011da177e4SLinus Torvalds 	},
1021da177e4SLinus Torvalds 	{
1031da177e4SLinus Torvalds 		.procname	= "idle_timeout",
1041da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1051da177e4SLinus Torvalds 		.mode		= 0644,
1066d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1071da177e4SLinus Torvalds 		.extra1		= &min_idle,
1081da177e4SLinus Torvalds 		.extra2		= &max_idle
1091da177e4SLinus Torvalds 	},
1101da177e4SLinus Torvalds 	{
1111da177e4SLinus Torvalds 		.procname	= "maximum_retry_count",
1121da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1131da177e4SLinus Torvalds 		.mode		= 0644,
1146d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1151da177e4SLinus Torvalds 		.extra1		= &min_n2,
1161da177e4SLinus Torvalds 		.extra2		= &max_n2
1171da177e4SLinus Torvalds 	},
1181da177e4SLinus Torvalds 	{
1191da177e4SLinus Torvalds 		.procname	= "maximum_packet_length",
1201da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1211da177e4SLinus Torvalds 		.mode		= 0644,
1226d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1231da177e4SLinus Torvalds 		.extra1		= &min_paclen,
1241da177e4SLinus Torvalds 		.extra2		= &max_paclen
1251da177e4SLinus Torvalds 	},
1261da177e4SLinus Torvalds 	{
1271da177e4SLinus Torvalds 		.procname	= "protocol",
1281da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1291da177e4SLinus Torvalds 		.mode		= 0644,
1306d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1311da177e4SLinus Torvalds 		.extra1		= &min_proto,
1321da177e4SLinus Torvalds 		.extra2		= &max_proto
1331da177e4SLinus Torvalds 	},
134ffb20847SRalf Baechle #ifdef CONFIG_AX25_DAMA_SLAVE
1351da177e4SLinus Torvalds 	{
1361da177e4SLinus Torvalds 		.procname	= "dama_slave_timeout",
1371da177e4SLinus Torvalds 		.maxlen		= sizeof(int),
1381da177e4SLinus Torvalds 		.mode		= 0644,
1396d9f239aSAlexey Dobriyan 		.proc_handler	= proc_dointvec_minmax,
1401da177e4SLinus Torvalds 		.extra1		= &min_ds_timeout,
1411da177e4SLinus Torvalds 		.extra2		= &max_ds_timeout
1421da177e4SLinus Torvalds 	},
143ffb20847SRalf Baechle #endif
144ffb20847SRalf Baechle 
145f8572d8fSEric W. Biederman 	{ }	/* that's all, folks! */
1461da177e4SLinus Torvalds };
1471da177e4SLinus Torvalds 
ax25_register_dev_sysctl(ax25_dev * ax25_dev)1480ca7a4c8SEric W. Biederman int ax25_register_dev_sysctl(ax25_dev *ax25_dev)
1491da177e4SLinus Torvalds {
1500ca7a4c8SEric W. Biederman 	char path[sizeof("net/ax25/") + IFNAMSIZ];
1510ca7a4c8SEric W. Biederman 	int k;
1520ca7a4c8SEric W. Biederman 	struct ctl_table *table;
1531da177e4SLinus Torvalds 
1540ca7a4c8SEric W. Biederman 	table = kmemdup(ax25_param_table, sizeof(ax25_param_table), GFP_KERNEL);
1550ca7a4c8SEric W. Biederman 	if (!table)
1560ca7a4c8SEric W. Biederman 		return -ENOMEM;
1571da177e4SLinus Torvalds 
1581da177e4SLinus Torvalds 	for (k = 0; k < AX25_MAX_VALUES; k++)
1590ca7a4c8SEric W. Biederman 		table[k].data = &ax25_dev->values[k];
1601da177e4SLinus Torvalds 
1610ca7a4c8SEric W. Biederman 	snprintf(path, sizeof(path), "net/ax25/%s", ax25_dev->dev->name);
162*7737e46dSJoel Granados 	ax25_dev->sysheader = register_net_sysctl_sz(&init_net, path, table,
163*7737e46dSJoel Granados 						     ARRAY_SIZE(ax25_param_table));
1640ca7a4c8SEric W. Biederman 	if (!ax25_dev->sysheader) {
1650ca7a4c8SEric W. Biederman 		kfree(table);
1660ca7a4c8SEric W. Biederman 		return -ENOMEM;
1671da177e4SLinus Torvalds 	}
1680ca7a4c8SEric W. Biederman 	return 0;
1691da177e4SLinus Torvalds }
1701da177e4SLinus Torvalds 
ax25_unregister_dev_sysctl(ax25_dev * ax25_dev)1710ca7a4c8SEric W. Biederman void ax25_unregister_dev_sysctl(ax25_dev *ax25_dev)
1721da177e4SLinus Torvalds {
1730ca7a4c8SEric W. Biederman 	struct ctl_table_header *header = ax25_dev->sysheader;
1740ca7a4c8SEric W. Biederman 	struct ctl_table *table;
1751da177e4SLinus Torvalds 
1760ca7a4c8SEric W. Biederman 	if (header) {
1770ca7a4c8SEric W. Biederman 		ax25_dev->sysheader = NULL;
1780ca7a4c8SEric W. Biederman 		table = header->ctl_table_arg;
1790ca7a4c8SEric W. Biederman 		unregister_net_sysctl_table(header);
1800ca7a4c8SEric W. Biederman 		kfree(table);
1810ca7a4c8SEric W. Biederman 	}
1821da177e4SLinus Torvalds }
183