11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * DECnet       An implementation of the DECnet protocol suite for the LINUX
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              operating system.  DECnet is implemented using the  BSD Socket
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              interface as the means of communication with the user level.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *              DECnet sysctl support functions
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Author:      Steve Whitehouse <SteveW@ACM.org>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Changes:
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Steve Whitehouse - C99 changes and default device handling
131f12bcc9d1840fd26bf577065214f1ebeb2609baSteven Whitehouse * Steve Whitehouse - Memory buffer settings, like the tcp ones
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sysctl.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/fs.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netdevice.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/neighbour.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/dst.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/flow.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/uaccess.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/dn.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/dn_dev.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <net/dn_route.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint decnet_debug_level;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint decnet_time_wait = 30;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint decnet_dn_count = 1;
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint decnet_di_count = 3;
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint decnet_dr_count = 3;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint decnet_log_martians = 1;
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint decnet_no_fc_max_cwnd = NSP_MIN_WINDOW;
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
401f12bcc9d1840fd26bf577065214f1ebeb2609baSteven Whitehouse/* Reasonable defaults, I hope, based on tcp's defaults */
418d987e5c75107ca7515fa19e857cfa24aab6ec8fEric Dumazetlong sysctl_decnet_mem[3] = { 768 << 3, 1024 << 3, 1536 << 3 };
421f12bcc9d1840fd26bf577065214f1ebeb2609baSteven Whitehouseint sysctl_decnet_wmem[3] = { 4 * 1024, 16 * 1024, 128 * 1024 };
431f12bcc9d1840fd26bf577065214f1ebeb2609baSteven Whitehouseint sysctl_decnet_rmem[3] = { 4 * 1024, 87380, 87380 * 2 };
441f12bcc9d1840fd26bf577065214f1ebeb2609baSteven Whitehouse
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_SYSCTL
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern int decnet_dst_gc_interval;
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int min_decnet_time_wait[] = { 5 };
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int max_decnet_time_wait[] = { 600 };
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int min_state_count[] = { 1 };
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int max_state_count[] = { NSP_MAXRXTSHIFT };
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int min_decnet_dst_gc_interval[] = { 1 };
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int max_decnet_dst_gc_interval[] = { 60 };
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int min_decnet_no_fc_max_cwnd[] = { NSP_MIN_WINDOW };
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int max_decnet_no_fc_max_cwnd[] = { NSP_MAX_WINDOW };
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic char node_name[7] = "???";
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct ctl_table_header *dn_table_header = NULL;
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * ctype.h :-)
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISNUM(x) (((x) >= '0') && ((x) <= '9'))
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISLOWER(x) (((x) >= 'a') && ((x) <= 'z'))
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISUPPER(x) (((x) >= 'A') && ((x) <= 'Z'))
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define ISALPHA(x) (ISLOWER(x) || ISUPPER(x))
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define INVALID_END_CHAR(x) (ISNUM(x) || ISALPHA(x))
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void strip_it(char *str)
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	for(;;) {
7106f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches		switch (*str) {
7206f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches		case ' ':
7306f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches		case '\n':
7406f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches		case '\r':
7506f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches		case ':':
7606f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches			*str = 0;
7706f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches			/* Fallthrough */
7806f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches		case 0:
7906f8fe11bb4a84de9d9faa50c7ffbe40b90d395aJoe Perches			return;
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		str++;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Simple routine to parse an ascii DECnet address
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * into a network order address.
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
89c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehousestatic int parse_addr(__le16 *addr, char *str)
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
91c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouse	__u16 area, node;
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while(*str && !ISNUM(*str)) str++;
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (*str == 0)
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	area = (*str++ - '0');
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ISNUM(*str)) {
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		area *= 10;
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		area += (*str++ - '0');
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (*str++ != '.')
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!ISNUM(*str))
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	node = *str++ - '0';
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ISNUM(*str)) {
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		node *= 10;
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		node += (*str++ - '0');
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ISNUM(*str)) {
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		node *= 10;
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		node += (*str++ - '0');
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ISNUM(*str)) {
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		node *= 10;
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		node += (*str++ - '0');
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if ((node > 1023) || (area > 63))
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (INVALID_END_CHAR(*str))
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -1;
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
130c4106aa88a440430d387e022f2ad6dc1e0d52e98Harvey Harrison	*addr = cpu_to_le16((area << 10) | node);
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
135fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic int dn_node_address_handler(struct ctl_table *table, int write,
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				void __user *buffer,
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				size_t *lenp, loff_t *ppos)
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char addr[DN_ASCBUF_LEN];
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t len;
141c4ea94ab3710eb2434abe2eab1a479c2dc01f8acSteven Whitehouse	__le16 dnaddr;
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!*lenp || (*ppos && !write)) {
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*lenp = 0;
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (write) {
149e57c624be8f99e56560fd2f4f485fe29f28dd74fHannes Eder		len = (*lenp < DN_ASCBUF_LEN) ? *lenp : (DN_ASCBUF_LEN-1);
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_from_user(addr, buffer, len))
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		addr[len] = 0;
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strip_it(addr);
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (parse_addr(&dnaddr, addr))
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EINVAL;
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dn_dev_devices_off();
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		decnet_address = dnaddr;
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		dn_dev_devices_on();
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*ppos += len;
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171c4106aa88a440430d387e022f2ad6dc1e0d52e98Harvey Harrison	dn_addr2asc(le16_to_cpu(decnet_address), addr);
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len = strlen(addr);
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	addr[len++] = '\n';
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (len > *lenp) len = *lenp;
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (copy_to_user(buffer, addr, len))
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EFAULT;
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*lenp = len;
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*ppos += len;
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
186fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic int dn_def_dev_handler(struct ctl_table *table, int write,
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				void __user *buffer,
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds				size_t *lenp, loff_t *ppos)
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	size_t len;
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct net_device *dev;
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char devname[17];
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!*lenp || (*ppos && !write)) {
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*lenp = 0;
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (write) {
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (*lenp > 16)
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -E2BIG;
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (copy_from_user(devname, buffer, *lenp))
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -EFAULT;
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		devname[*lenp] = 0;
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		strip_it(devname);
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
209881d966b48b035ab3f3aeaae0f3d3f9b584f45b2Eric W. Biederman		dev = dev_get_by_name(&init_net, devname);
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (dev == NULL)
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -ENODEV;
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (dev->dn_ptr == NULL) {
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dev_put(dev);
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -ENODEV;
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (dn_dev_set_default(dev, 1)) {
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			dev_put(dev);
2201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			return -ENODEV;
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		}
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*ppos += *lenp;
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev = dn_dev_get_default();
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (dev == NULL) {
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		*lenp = 0;
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	strcpy(devname, dev->name);
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev_put(dev);
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	len = strlen(devname);
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	devname[len++] = '\n';
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (len > *lenp) len = *lenp;
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (copy_to_user(buffer, devname, len))
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EFAULT;
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*lenp = len;
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	*ppos += len;
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
249fe2c6338fd2c6f383c4d4164262f35c8f3708e1fJoe Perchesstatic struct ctl_table dn_table[] = {
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
251429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.procname = "node_address",
252429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.maxlen = 7,
253429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.mode = 0644,
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.proc_handler = dn_node_address_handler,
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "node_name",
258429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.data = node_name,
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = 7,
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
2616d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dostring,
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
264429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.procname = "default_device",
265429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.maxlen = 16,
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.proc_handler = dn_def_dev_handler,
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "time_wait",
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data = &decnet_time_wait,
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = sizeof(int),
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
2746d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec_minmax,
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra1 = &min_decnet_time_wait,
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra2 = &max_decnet_time_wait
2771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "dn_count",
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data = &decnet_dn_count,
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = sizeof(int),
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
2836d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec_minmax,
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra1 = &min_state_count,
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra2 = &max_state_count
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "di_count",
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data = &decnet_di_count,
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = sizeof(int),
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
2926d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec_minmax,
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra1 = &min_state_count,
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra2 = &max_state_count
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "dr_count",
2981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data = &decnet_dr_count,
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = sizeof(int),
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
3016d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec_minmax,
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra1 = &min_state_count,
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra2 = &max_state_count
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "dst_gc_interval",
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data = &decnet_dst_gc_interval,
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = sizeof(int),
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
3106d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec_minmax,
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra1 = &min_decnet_dst_gc_interval,
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra2 = &max_decnet_dst_gc_interval
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "no_fc_max_cwnd",
3161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data = &decnet_no_fc_max_cwnd,
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = sizeof(int),
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
3196d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec_minmax,
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra1 = &min_decnet_no_fc_max_cwnd,
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.extra2 = &max_decnet_no_fc_max_cwnd
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
3231f12bcc9d1840fd26bf577065214f1ebeb2609baSteven Whitehouse       {
324429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.procname = "decnet_mem",
325429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.data = &sysctl_decnet_mem,
326429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.maxlen = sizeof(sysctl_decnet_mem),
327429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.mode = 0644,
3288d987e5c75107ca7515fa19e857cfa24aab6ec8fEric Dumazet		.proc_handler = proc_doulongvec_minmax
329429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki	},
330429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki	{
331429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.procname = "decnet_rmem",
332429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.data = &sysctl_decnet_rmem,
333429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.maxlen = sizeof(sysctl_decnet_rmem),
334429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.mode = 0644,
3356d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec,
336429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki	},
337429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki	{
338429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.procname = "decnet_wmem",
339429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.data = &sysctl_decnet_wmem,
340429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.maxlen = sizeof(sysctl_decnet_wmem),
341429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki		.mode = 0644,
3426d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec,
343429eb0fae6c06c9adcda03401c09c2b9ccaa7ebdYOSHIFUJI Hideaki	},
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	{
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.procname = "debug",
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.data = &decnet_debug_level,
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.maxlen = sizeof(int),
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		.mode = 0644,
3496d9f239a1edb31d6133230f478fd1dc2da338ec5Alexey Dobriyan		.proc_handler = proc_dointvec,
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	},
351f8572d8f2a2ba75408b97dc24ef47c83671795d7Eric W. Biederman	{ }
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid dn_register_sysctl(void)
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3569bdcc88fa03a09c1f0478c0d7443d0aba7872210Eric W. Biederman	dn_table_header = register_net_sysctl(&init_net, "net/decnet", dn_table);
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid dn_unregister_sysctl(void)
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3615dd3df105b9f6cb7dd2472b59e028d0d1c878ecbEric W. Biederman	unregister_net_sysctl_table(dn_table_header);
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#else  /* CONFIG_SYSCTL */
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid dn_unregister_sysctl(void)
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid dn_register_sysctl(void)
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
373