/* * sysctl_net_ax25.c: sysctl interface for NEW-AX.25 * * Authors: Jens David (DG1KJD), Matthias Welwarsky (DG2FEF), Mike Shaver * * Comment: Needs cleanup, most parameters are not needed and/or should be au * adjusting. * * Changelog: * * License: This module is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include "ax25_ddi.h" int ax25_proc_dointvec_minmax(ctl_table *table, int write, struct file *filp, void *buffer, size_t *lenp); int ax25_sysctl_intvec(ctl_table *table, int *name, int nlen, void *oldval, size_t *oldlenp, void *newval, size_t newlen, void **context); static int min_ipdefmode[] = {0}, max_ipdefmode[] = {1}; static int min_axdefmode[] = {0}, max_axdefmode[] = {1}; static int min_backoff[] = {0}, max_backoff[] = {2}; static int min_conmode[] = {0}, max_conmode[] = {2}; static int min_window[] = {1}, max_window[] = {7}; static int min_ewindow[] = {1}, max_ewindow[] = {63}; static int min_t1[] = {1}, max_t1[] = {30 * AX25_SLOWHZ * 10}; static int min_t2[] = {0}, max_t2[] = {10 * AX25_SLOWHZ * 10}; static int min_t3[] = {0}, max_t3[] = {3600 * AX25_SLOWHZ * 10}; static int min_idle[] = {0}, max_idle[] = {65535 * AX25_SLOWHZ * 10}; static int min_n2[] = {1}, max_n2[] = {31}; static int min_paclen[] = {1}, max_paclen[] = {512}; static int min_protocol[] = {0}, max_protocol[] = {2}; static int min_dama_slave_timeout[] = {0}, max_dama_slave_timeout[] = {3600 * AX25_SLOWHZ}; static int min_media_duplex[] = {0}, max_media_duplex[] = {2}; static int min_media_txdelay[] = {0}, max_media_txdelay[] = {10000}; static int min_media_txtail[] = {0}, max_media_txtail[] = {10000}; static int min_media_txbitrate[] = {0}, max_media_txbitrate[] = {80000000}; static int min_media_rxbitrate[] = {0}, max_media_rxbitrate[] = {80000000}; static int min_media_slottime[] = {0}, max_media_slottime[] = {1000}; static int min_media_ppersist[] = {0}, max_media_ppersist[] = {255}; static int min_media_autoadj[] = {0}, max_media_autoadj[] = {1}; static struct ctl_table_header *ax25_table_header; static ctl_table ax25_table[AX25_MAX_DEVICES + 1]; static ctl_table ax25_dir_table[] = { {NET_AX25, "ax25", NULL, 0, 0555, ax25_table}, {0} }; static ctl_table ax25_root_table[] = { {CTL_NET, "net", NULL, 0, 0555, ax25_dir_table}, {0} }; static const ctl_table ax25_param_table[] = { {NET_AX25_IP_DEFAULT_MODE, "ip_default_mode", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_ipdefmode, &max_ipdefmode}, {NET_AX25_DEFAULT_MODE, "ax25_default_mode", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_axdefmode, &max_axdefmode}, {NET_AX25_BACKOFF_TYPE, "backoff_type", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_backoff, &max_backoff}, {NET_AX25_CONNECT_MODE, "connect_mode", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_conmode, &max_conmode}, {NET_AX25_STANDARD_WINDOW, "standard_window_size", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_window, &max_window}, {NET_AX25_EXTENDED_WINDOW, "extended_window_size", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_ewindow, &max_ewindow}, {NET_AX25_T1_TIMEOUT, "t1_timeout", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_t1, &max_t1}, {NET_AX25_T2_TIMEOUT, "t2_timeout", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_t2, &max_t2}, {NET_AX25_T3_TIMEOUT, "t3_timeout", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_t3, &max_t3}, {NET_AX25_IDLE_TIMEOUT, "idle_timeout", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_idle, &max_idle}, {NET_AX25_N2, "maximum_retry_count", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_n2, &max_n2}, {NET_AX25_PACLEN, "maximum_packet_length", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_paclen, &max_paclen}, {NET_AX25_PROTOCOL, "protocol", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_protocol, &max_protocol}, {NET_AX25_DAMA_SLAVE_TIMEOUT, "dama_slave_timeout", NULL, sizeof(int), 0644, NULL, &proc_dointvec_minmax, &sysctl_intvec, NULL, &min_dama_slave_timeout, &max_dama_slave_timeout}, {NET_AX25_MEDIA_DUPLEX, "media_duplex", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_duplex, &max_media_duplex}, {NET_AX25_MEDIA_TXDELAY, "media_txdelay", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_txdelay, &max_media_txdelay}, {NET_AX25_MEDIA_TXTAIL, "media_txtail", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_txtail, &max_media_txtail}, {NET_AX25_MEDIA_TXBITRATE, "media_txbitrate", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_txbitrate, &max_media_txbitrate}, {NET_AX25_MEDIA_RXBITRATE, "media_rxbitrate", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_rxbitrate, &max_media_rxbitrate}, {NET_AX25_MEDIA_SLOTTIME, "media_slottime", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_slottime, &max_media_slottime}, {NET_AX25_MEDIA_PPERSISTENCE, "media_ppersistence", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_ppersist, &max_media_ppersist}, {NET_AX25_MEDIA_AUTO_ADJUST, "media_autoadjust", NULL, sizeof(int), 0644, NULL, &ax25_proc_dointvec_minmax, &ax25_sysctl_intvec, NULL, &min_media_autoadj, &max_media_autoadj}, {0} /* that's all, folks! */ }; int ax25_proc_dointvec_minmax(ctl_table *table, int write, struct file *filp, void *buffer, size_t *lenp) { int id = table->ctl_name; int ret; int oldval, newval; struct net_device *dev; oldval = * (int *) table->data; ret = proc_dointvec_minmax(table, write, filp, buffer, lenp); newval = * (int *) table->data; if (oldval != newval) { dev = dev_get(table->de->parent->name); if (!dev) return ret; /* paranoia */ ax25_notify_dispatcher(dev, id-1, oldval, newval); } return ret; } int ax25_sysctl_intvec(ctl_table *table, int *name, int nlen, void *oldval, size_t *oldlenp, void *newval, size_t newlen, void **context) { int id = table->ctl_name; int ret; struct net_device *dev; ret = sysctl_intvec(table, name, nlen, oldval, oldlenp, newval, newlen, context); if (* (int *) oldval != * (int *) newval) { dev = dev_get(table->de->parent->name); if (!dev) return ret; /* paranoia */ ax25_notify_dispatcher(dev, id-1, * (int *) oldval, * (int *) newval); } return ret; } void ax25_register_sysctl(void) { struct net_device *dev; struct ax25_dev *ax25_device; int n, k, i; memset(ax25_table, 0x00, (AX25_MAX_DEVICES + 1) * sizeof(ctl_table)); n = 0; for (i = 0; i < AX25_MAX_DEVICES; i++) { if ((dev = ax25_devices[i]) != NULL) { ax25_device = AX25_PTR(dev); if (n <= AX25_MAX_DEVICES) { ax25_table[n].ctl_name = n + 1; ax25_table[n].procname = dev->name; ax25_table[n].data = NULL; ax25_table[n].maxlen = 0; ax25_table[n].mode = 0555; ax25_table[n].child = ax25_device->systable; ax25_table[n].proc_handler = NULL; memcpy(ax25_device->systable, ax25_param_table, sizeof(ax25_device->systable)); ax25_device->systable[AX25_MAX_VALUES].ctl_name = 0; /* just in case... */ for (k = 0; k < AX25_MAX_VALUES; k++) ax25_device->systable[k].data = &ax25_device->values[k]; n++; } } } ax25_table_header = register_sysctl_table(ax25_root_table, 1); } void ax25_unregister_sysctl(void) { unregister_sysctl_table(ax25_table_header); }