18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 1996 Mike Shaver (shaver@zeroknowledge.com) 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci#include <linux/mm.h> 78c2ecf20Sopenharmony_ci#include <linux/slab.h> 88c2ecf20Sopenharmony_ci#include <linux/sysctl.h> 98c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 108c2ecf20Sopenharmony_ci#include <net/ax25.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistatic int min_ipdefmode[1], max_ipdefmode[] = {1}; 138c2ecf20Sopenharmony_cistatic int min_axdefmode[1], max_axdefmode[] = {1}; 148c2ecf20Sopenharmony_cistatic int min_backoff[1], max_backoff[] = {2}; 158c2ecf20Sopenharmony_cistatic int min_conmode[1], max_conmode[] = {2}; 168c2ecf20Sopenharmony_cistatic int min_window[] = {1}, max_window[] = {7}; 178c2ecf20Sopenharmony_cistatic int min_ewindow[] = {1}, max_ewindow[] = {63}; 188c2ecf20Sopenharmony_cistatic int min_t1[] = {1}, max_t1[] = {30000}; 198c2ecf20Sopenharmony_cistatic int min_t2[] = {1}, max_t2[] = {20000}; 208c2ecf20Sopenharmony_cistatic int min_t3[1], max_t3[] = {3600000}; 218c2ecf20Sopenharmony_cistatic int min_idle[1], max_idle[] = {65535000}; 228c2ecf20Sopenharmony_cistatic int min_n2[] = {1}, max_n2[] = {31}; 238c2ecf20Sopenharmony_cistatic int min_paclen[] = {1}, max_paclen[] = {512}; 248c2ecf20Sopenharmony_cistatic int min_proto[1], max_proto[] = { AX25_PROTO_MAX }; 258c2ecf20Sopenharmony_ci#ifdef CONFIG_AX25_DAMA_SLAVE 268c2ecf20Sopenharmony_cistatic int min_ds_timeout[1], max_ds_timeout[] = {65535000}; 278c2ecf20Sopenharmony_ci#endif 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic const struct ctl_table ax25_param_table[] = { 308c2ecf20Sopenharmony_ci { 318c2ecf20Sopenharmony_ci .procname = "ip_default_mode", 328c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 338c2ecf20Sopenharmony_ci .mode = 0644, 348c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 358c2ecf20Sopenharmony_ci .extra1 = &min_ipdefmode, 368c2ecf20Sopenharmony_ci .extra2 = &max_ipdefmode 378c2ecf20Sopenharmony_ci }, 388c2ecf20Sopenharmony_ci { 398c2ecf20Sopenharmony_ci .procname = "ax25_default_mode", 408c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 418c2ecf20Sopenharmony_ci .mode = 0644, 428c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 438c2ecf20Sopenharmony_ci .extra1 = &min_axdefmode, 448c2ecf20Sopenharmony_ci .extra2 = &max_axdefmode 458c2ecf20Sopenharmony_ci }, 468c2ecf20Sopenharmony_ci { 478c2ecf20Sopenharmony_ci .procname = "backoff_type", 488c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 498c2ecf20Sopenharmony_ci .mode = 0644, 508c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 518c2ecf20Sopenharmony_ci .extra1 = &min_backoff, 528c2ecf20Sopenharmony_ci .extra2 = &max_backoff 538c2ecf20Sopenharmony_ci }, 548c2ecf20Sopenharmony_ci { 558c2ecf20Sopenharmony_ci .procname = "connect_mode", 568c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 578c2ecf20Sopenharmony_ci .mode = 0644, 588c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 598c2ecf20Sopenharmony_ci .extra1 = &min_conmode, 608c2ecf20Sopenharmony_ci .extra2 = &max_conmode 618c2ecf20Sopenharmony_ci }, 628c2ecf20Sopenharmony_ci { 638c2ecf20Sopenharmony_ci .procname = "standard_window_size", 648c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 658c2ecf20Sopenharmony_ci .mode = 0644, 668c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 678c2ecf20Sopenharmony_ci .extra1 = &min_window, 688c2ecf20Sopenharmony_ci .extra2 = &max_window 698c2ecf20Sopenharmony_ci }, 708c2ecf20Sopenharmony_ci { 718c2ecf20Sopenharmony_ci .procname = "extended_window_size", 728c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 738c2ecf20Sopenharmony_ci .mode = 0644, 748c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 758c2ecf20Sopenharmony_ci .extra1 = &min_ewindow, 768c2ecf20Sopenharmony_ci .extra2 = &max_ewindow 778c2ecf20Sopenharmony_ci }, 788c2ecf20Sopenharmony_ci { 798c2ecf20Sopenharmony_ci .procname = "t1_timeout", 808c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 818c2ecf20Sopenharmony_ci .mode = 0644, 828c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 838c2ecf20Sopenharmony_ci .extra1 = &min_t1, 848c2ecf20Sopenharmony_ci .extra2 = &max_t1 858c2ecf20Sopenharmony_ci }, 868c2ecf20Sopenharmony_ci { 878c2ecf20Sopenharmony_ci .procname = "t2_timeout", 888c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 898c2ecf20Sopenharmony_ci .mode = 0644, 908c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 918c2ecf20Sopenharmony_ci .extra1 = &min_t2, 928c2ecf20Sopenharmony_ci .extra2 = &max_t2 938c2ecf20Sopenharmony_ci }, 948c2ecf20Sopenharmony_ci { 958c2ecf20Sopenharmony_ci .procname = "t3_timeout", 968c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 978c2ecf20Sopenharmony_ci .mode = 0644, 988c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 998c2ecf20Sopenharmony_ci .extra1 = &min_t3, 1008c2ecf20Sopenharmony_ci .extra2 = &max_t3 1018c2ecf20Sopenharmony_ci }, 1028c2ecf20Sopenharmony_ci { 1038c2ecf20Sopenharmony_ci .procname = "idle_timeout", 1048c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 1058c2ecf20Sopenharmony_ci .mode = 0644, 1068c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 1078c2ecf20Sopenharmony_ci .extra1 = &min_idle, 1088c2ecf20Sopenharmony_ci .extra2 = &max_idle 1098c2ecf20Sopenharmony_ci }, 1108c2ecf20Sopenharmony_ci { 1118c2ecf20Sopenharmony_ci .procname = "maximum_retry_count", 1128c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 1138c2ecf20Sopenharmony_ci .mode = 0644, 1148c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 1158c2ecf20Sopenharmony_ci .extra1 = &min_n2, 1168c2ecf20Sopenharmony_ci .extra2 = &max_n2 1178c2ecf20Sopenharmony_ci }, 1188c2ecf20Sopenharmony_ci { 1198c2ecf20Sopenharmony_ci .procname = "maximum_packet_length", 1208c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 1218c2ecf20Sopenharmony_ci .mode = 0644, 1228c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 1238c2ecf20Sopenharmony_ci .extra1 = &min_paclen, 1248c2ecf20Sopenharmony_ci .extra2 = &max_paclen 1258c2ecf20Sopenharmony_ci }, 1268c2ecf20Sopenharmony_ci { 1278c2ecf20Sopenharmony_ci .procname = "protocol", 1288c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 1298c2ecf20Sopenharmony_ci .mode = 0644, 1308c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 1318c2ecf20Sopenharmony_ci .extra1 = &min_proto, 1328c2ecf20Sopenharmony_ci .extra2 = &max_proto 1338c2ecf20Sopenharmony_ci }, 1348c2ecf20Sopenharmony_ci#ifdef CONFIG_AX25_DAMA_SLAVE 1358c2ecf20Sopenharmony_ci { 1368c2ecf20Sopenharmony_ci .procname = "dama_slave_timeout", 1378c2ecf20Sopenharmony_ci .maxlen = sizeof(int), 1388c2ecf20Sopenharmony_ci .mode = 0644, 1398c2ecf20Sopenharmony_ci .proc_handler = proc_dointvec_minmax, 1408c2ecf20Sopenharmony_ci .extra1 = &min_ds_timeout, 1418c2ecf20Sopenharmony_ci .extra2 = &max_ds_timeout 1428c2ecf20Sopenharmony_ci }, 1438c2ecf20Sopenharmony_ci#endif 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci { } /* that's all, folks! */ 1468c2ecf20Sopenharmony_ci}; 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ciint ax25_register_dev_sysctl(ax25_dev *ax25_dev) 1498c2ecf20Sopenharmony_ci{ 1508c2ecf20Sopenharmony_ci char path[sizeof("net/ax25/") + IFNAMSIZ]; 1518c2ecf20Sopenharmony_ci int k; 1528c2ecf20Sopenharmony_ci struct ctl_table *table; 1538c2ecf20Sopenharmony_ci 1548c2ecf20Sopenharmony_ci table = kmemdup(ax25_param_table, sizeof(ax25_param_table), GFP_KERNEL); 1558c2ecf20Sopenharmony_ci if (!table) 1568c2ecf20Sopenharmony_ci return -ENOMEM; 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci for (k = 0; k < AX25_MAX_VALUES; k++) 1598c2ecf20Sopenharmony_ci table[k].data = &ax25_dev->values[k]; 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci snprintf(path, sizeof(path), "net/ax25/%s", ax25_dev->dev->name); 1628c2ecf20Sopenharmony_ci ax25_dev->sysheader = register_net_sysctl(&init_net, path, table); 1638c2ecf20Sopenharmony_ci if (!ax25_dev->sysheader) { 1648c2ecf20Sopenharmony_ci kfree(table); 1658c2ecf20Sopenharmony_ci return -ENOMEM; 1668c2ecf20Sopenharmony_ci } 1678c2ecf20Sopenharmony_ci return 0; 1688c2ecf20Sopenharmony_ci} 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_civoid ax25_unregister_dev_sysctl(ax25_dev *ax25_dev) 1718c2ecf20Sopenharmony_ci{ 1728c2ecf20Sopenharmony_ci struct ctl_table_header *header = ax25_dev->sysheader; 1738c2ecf20Sopenharmony_ci struct ctl_table *table; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci if (header) { 1768c2ecf20Sopenharmony_ci ax25_dev->sysheader = NULL; 1778c2ecf20Sopenharmony_ci table = header->ctl_table_arg; 1788c2ecf20Sopenharmony_ci unregister_net_sysctl_table(header); 1798c2ecf20Sopenharmony_ci kfree(table); 1808c2ecf20Sopenharmony_ci } 1818c2ecf20Sopenharmony_ci} 182