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