fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / net / decnet / sysctl_net_decnet.c
index 1c692b4..a4065eb 100644 (file)
@@ -10,9 +10,9 @@
  *
  * Changes:
  * Steve Whitehouse - C99 changes and default device handling
+ * Steve Whitehouse - Memory buffer settings, like the tcp ones
  *
  */
-#include <linux/config.h>
 #include <linux/mm.h>
 #include <linux/sysctl.h>
 #include <linux/fs.h>
@@ -37,6 +37,11 @@ int decnet_dr_count = 3;
 int decnet_log_martians = 1;
 int decnet_no_fc_max_cwnd = NSP_MIN_WINDOW;
 
+/* Reasonable defaults, I hope, based on tcp's defaults */
+int sysctl_decnet_mem[3] = { 768 << 3, 1024 << 3, 1536 << 3 };
+int sysctl_decnet_wmem[3] = { 4 * 1024, 16 * 1024, 128 * 1024 };
+int sysctl_decnet_rmem[3] = { 4 * 1024, 87380, 87380 * 2 };
+
 #ifdef CONFIG_SYSCTL
 extern int decnet_dst_gc_interval;
 static int min_decnet_time_wait[] = { 5 };
@@ -80,9 +85,9 @@ static void strip_it(char *str)
  * Simple routine to parse an ascii DECnet address
  * into a network order address.
  */
-static int parse_addr(dn_address *addr, char *str)
+static int parse_addr(__le16 *addr, char *str)
 {
-       dn_address area, node;
+       __u16 area, node;
 
        while(*str && !ISNUM(*str)) str++;
 
@@ -127,13 +132,12 @@ static int parse_addr(dn_address *addr, char *str)
 }
 
 
-static int dn_node_address_strategy(ctl_table *table, int *name, int nlen,
-                               void *oldval, size_t *oldlenp,
-                               void *newval, size_t newlen,
-                               void **context)
+static int dn_node_address_strategy(ctl_table *table, int __user *name, int nlen,
+                               void __user *oldval, size_t __user *oldlenp,
+                               void __user *newval, size_t newlen)
 {
        size_t len;
-       dn_address addr;
+       __le16 addr;
 
        if (oldval && oldlenp) {
                if (get_user(len, oldlenp))
@@ -141,14 +145,14 @@ static int dn_node_address_strategy(ctl_table *table, int *name, int nlen,
                if (len) {
                        if (len != sizeof(unsigned short))
                                return -EINVAL;
-                       if (put_user(decnet_address, (unsigned short *)oldval))
+                       if (put_user(decnet_address, (__le16 __user *)oldval))
                                return -EFAULT;
                }
        }
        if (newval && newlen) {
                if (newlen != sizeof(unsigned short))
                        return -EINVAL;
-               if (get_user(addr, (unsigned short *)newval))
+               if (get_user(addr, (__le16 __user *)newval))
                        return -EFAULT;
 
                dn_dev_devices_off();
@@ -162,13 +166,14 @@ static int dn_node_address_strategy(ctl_table *table, int *name, int nlen,
 
 static int dn_node_address_handler(ctl_table *table, int write, 
                                struct file *filp,
-                               void *buffer, size_t *lenp)
+                               void __user *buffer,
+                               size_t *lenp, loff_t *ppos)
 {
        char addr[DN_ASCBUF_LEN];
        size_t len;
-       dn_address dnaddr;
+       __le16 dnaddr;
 
-       if (!*lenp || (filp->f_pos && !write)) {
+       if (!*lenp || (*ppos && !write)) {
                *lenp = 0;
                return 0;
        }
@@ -191,7 +196,7 @@ static int dn_node_address_handler(ctl_table *table, int write,
 
                dn_dev_devices_on();
 
-               filp->f_pos += len;
+               *ppos += len;
 
                return 0;
        }
@@ -206,16 +211,15 @@ static int dn_node_address_handler(ctl_table *table, int write,
                return -EFAULT;
 
        *lenp = len;
-       filp->f_pos += len;
+       *ppos += len;
 
        return 0;
 }
 
 
-static int dn_def_dev_strategy(ctl_table *table, int *name, int nlen,
-                               void *oldval, size_t *oldlenp,
-                               void *newval, size_t newlen,
-                               void **context)
+static int dn_def_dev_strategy(ctl_table *table, int __user *name, int nlen,
+                               void __user *oldval, size_t __user *oldlenp,
+                               void __user *newval, size_t newlen)
 {
        size_t len;
        struct net_device *dev;
@@ -273,13 +277,14 @@ static int dn_def_dev_strategy(ctl_table *table, int *name, int nlen,
 
 static int dn_def_dev_handler(ctl_table *table, int write, 
                                struct file * filp,
-                               void *buffer, size_t *lenp)
+                               void __user *buffer,
+                               size_t *lenp, loff_t *ppos)
 {
        size_t len;
        struct net_device *dev;
        char devname[17];
 
-       if (!*lenp || (filp->f_pos && !write)) {
+       if (!*lenp || (*ppos && !write)) {
                *lenp = 0;
                return 0;
        }
@@ -307,7 +312,7 @@ static int dn_def_dev_handler(ctl_table *table, int write,
                        dev_put(dev);
                        return -ENODEV;
                }
-               filp->f_pos += *lenp;
+               *ppos += *lenp;
 
                return 0;
        }
@@ -329,7 +334,7 @@ static int dn_def_dev_handler(ctl_table *table, int write,
                return -EFAULT;
 
        *lenp = len;
-       filp->f_pos += len;
+       *ppos += len;
 
        return 0;
 }
@@ -426,6 +431,33 @@ static ctl_table dn_table[] = {
                .extra1 = &min_decnet_no_fc_max_cwnd,
                .extra2 = &max_decnet_no_fc_max_cwnd
        },
+       {
+                .ctl_name = NET_DECNET_MEM,
+                .procname = "decnet_mem",
+                .data = &sysctl_decnet_mem,
+                .maxlen = sizeof(sysctl_decnet_mem),
+                .mode = 0644,
+                .proc_handler = &proc_dointvec,
+                .strategy = &sysctl_intvec,
+        },
+        {
+                .ctl_name = NET_DECNET_RMEM,
+                .procname = "decnet_rmem",
+                .data = &sysctl_decnet_rmem,
+                .maxlen = sizeof(sysctl_decnet_rmem),
+                .mode = 0644,
+                .proc_handler = &proc_dointvec,
+                .strategy = &sysctl_intvec,
+        },
+        {
+                .ctl_name = NET_DECNET_WMEM,
+                .procname = "decnet_wmem",
+                .data = &sysctl_decnet_wmem,
+                .maxlen = sizeof(sysctl_decnet_wmem),
+                .mode = 0644,
+                .proc_handler = &proc_dointvec,
+                .strategy = &sysctl_intvec,
+        },
        {
                .ctl_name = NET_DECNET_DEBUG_LEVEL,
                .procname = "debug",