summaryrefslogtreecommitdiffstats
path: root/net/ax25/sysctl_net_ax25.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ax25/sysctl_net_ax25.c')
-rw-r--r--net/ax25/sysctl_net_ax25.c188
1 files changed, 131 insertions, 57 deletions
diff --git a/net/ax25/sysctl_net_ax25.c b/net/ax25/sysctl_net_ax25.c
index e6016f93d..416f4cc80 100644
--- a/net/ax25/sysctl_net_ax25.c
+++ b/net/ax25/sysctl_net_ax25.c
@@ -1,14 +1,31 @@
-/* -*- linux-c -*-
- * sysctl_net_ax25.c: sysctl interface to net AX.25 subsystem.
+/*
+ * sysctl_net_ax25.c: sysctl interface for NEW-AX.25
*
- * Begun April 1, 1996, Mike Shaver.
- * Added /proc/sys/net/ax25 directory entry (empty =) ). [MS]
+ * 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 <linux/config.h>
#include <linux/mm.h>
#include <linux/sysctl.h>
+#include <linux/proc_fs.h>
+#include <linux/if_arp.h>
#include <net/ax25.h>
+#include <net/ax25dev.h>
+#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};
@@ -16,22 +33,29 @@ 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 * HZ};
-static int min_t2[] = {1}, max_t2[] = {20 * HZ};
-static int min_t3[] = {0}, max_t3[] = {3600 * HZ};
-static int min_idle[] = {0}, max_idle[] = {65535 * HZ};
+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_proto[] = {0}, max_proto[] = {3};
-static int min_ds_timeout[] = {0}, max_ds_timeout[] = {65535 * HZ};
+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;
-static int ax25_table_size;
+static ctl_table ax25_table[AX25_MAX_DEVICES + 1];
static ctl_table ax25_dir_table[] = {
- {NET_AX25, "ax25", NULL, 0, 0555, NULL},
+ {NET_AX25, "ax25", NULL, 0, 0555, ax25_table},
{0}
};
@@ -92,71 +116,121 @@ static const ctl_table ax25_param_table[] = {
{NET_AX25_PROTOCOL, "protocol",
NULL, sizeof(int), 0644, NULL,
&proc_dointvec_minmax, &sysctl_intvec, NULL,
- &min_proto, &max_proto},
+ &min_protocol, &max_protocol},
{NET_AX25_DAMA_SLAVE_TIMEOUT, "dama_slave_timeout",
NULL, sizeof(int), 0644, NULL,
&proc_dointvec_minmax, &sysctl_intvec, NULL,
- &min_ds_timeout, &max_ds_timeout},
+ &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! */
};
-void ax25_register_sysctl(void)
+int ax25_proc_dointvec_minmax(ctl_table *table, int write, struct file *filp,
+ void *buffer, size_t *lenp)
{
- ax25_dev *ax25_dev;
- int n, k;
+ 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;
+}
- for (ax25_table_size = sizeof(ctl_table), ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next)
- ax25_table_size += sizeof(ctl_table);
+void ax25_register_sysctl(void)
+{
+ struct net_device *dev;
+ struct ax25_dev *ax25_device;
- if ((ax25_table = kmalloc(ax25_table_size, GFP_ATOMIC)) == NULL)
- return;
+ int n, k, i;
- memset(ax25_table, 0x00, ax25_table_size);
+ memset(ax25_table, 0x00, (AX25_MAX_DEVICES + 1) * sizeof(ctl_table));
- for (n = 0, ax25_dev = ax25_dev_list; ax25_dev != NULL; ax25_dev = ax25_dev->next) {
- ctl_table *child = kmalloc(sizeof(ax25_param_table), GFP_ATOMIC);
- if (!child) {
- while (n--)
- kfree(ax25_table[n].child);
- kfree(ax25_table);
- return;
- }
- memcpy(child, ax25_param_table, sizeof(ax25_param_table));
- ax25_table[n].child = ax25_dev->systable = child;
- ax25_table[n].ctl_name = n + 1;
- ax25_table[n].procname = ax25_dev->dev->name;
- ax25_table[n].mode = 0555;
+ n = 0;
-#ifndef CONFIG_AX25_DAMA_SLAVE
- /*
- * We do not wish to have a representation of this parameter
- * in /proc/sys/ when configured *not* to include the
- * AX.25 DAMA slave code, do we?
- */
+ 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;
- child[AX25_VALUES_DS_TIMEOUT].procname = NULL;
-#endif
+ memcpy(ax25_device->systable, ax25_param_table, sizeof(ax25_device->systable));
- child[AX25_MAX_VALUES].ctl_name = 0; /* just in case... */
+ ax25_device->systable[AX25_MAX_VALUES].ctl_name = 0; /* just in case... */
- for (k = 0; k < AX25_MAX_VALUES; k++)
- child[k].data = &ax25_dev->values[k];
+ for (k = 0; k < AX25_MAX_VALUES; k++)
+ ax25_device->systable[k].data = &ax25_device->values[k];
- n++;
+ n++;
+ }
+ }
}
- ax25_dir_table[0].child = ax25_table;
-
ax25_table_header = register_sysctl_table(ax25_root_table, 1);
}
void ax25_unregister_sysctl(void)
{
- ctl_table *p;
unregister_sysctl_table(ax25_table_header);
-
- ax25_dir_table[0].child = NULL;
- for (p = ax25_table; p->ctl_name; p++)
- kfree(p->child);
- kfree(ax25_table);
}