mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-22 15:02:32 +00:00
129 lines
3.6 KiB
Diff
129 lines
3.6 KiB
Diff
|
From 75090d40ffbd9b4863238e1d62b43f8598da5e5e Mon Sep 17 00:00:00 2001
|
||
|
From: Robert Love <rlove@google.com>
|
||
|
Date: Thu, 31 Jul 2008 11:12:44 -0400
|
||
|
Subject: [PATCH 082/134] sysfs_net_ipv4: Add sysfs-based knobs for controlling TCP window size
|
||
|
|
||
|
Add a family of knobs to /sys/kernel/ipv4 for controlling the TCP window size:
|
||
|
|
||
|
tcp_wmem_min
|
||
|
tcp_wmem_def
|
||
|
tcp_wmem_max
|
||
|
tcp_rmem_min
|
||
|
tcp_rmem_def
|
||
|
tcp_rmem_max
|
||
|
|
||
|
This six values mirror the sysctl knobs in /proc/sys/net/ipv4/tcp_wmem and
|
||
|
/proc/sys/net/ipv4/tcp_rmem.
|
||
|
|
||
|
Sysfs, unlike sysctl, allows us to set and manage the files' permissions and
|
||
|
owners.
|
||
|
|
||
|
Signed-off-by: Robert Love <rlove@google.com>
|
||
|
---
|
||
|
net/ipv4/Makefile | 1 +
|
||
|
net/ipv4/sysfs_net_ipv4.c | 88 +++++++++++++++++++++++++++++++++++++++++++++
|
||
|
2 files changed, 89 insertions(+), 0 deletions(-)
|
||
|
create mode 100644 net/ipv4/sysfs_net_ipv4.c
|
||
|
|
||
|
--- a/net/ipv4/Makefile
|
||
|
+++ b/net/ipv4/Makefile
|
||
|
@@ -14,6 +14,7 @@ obj-y := route.o inetpeer.o protocol
|
||
|
inet_fragment.o
|
||
|
|
||
|
obj-$(CONFIG_SYSCTL) += sysctl_net_ipv4.o
|
||
|
+obj-$(CONFIG_SYSFS) += sysfs_net_ipv4.o
|
||
|
obj-$(CONFIG_IP_FIB_HASH) += fib_hash.o
|
||
|
obj-$(CONFIG_IP_FIB_TRIE) += fib_trie.o
|
||
|
obj-$(CONFIG_PROC_FS) += proc.o
|
||
|
--- /dev/null
|
||
|
+++ b/net/ipv4/sysfs_net_ipv4.c
|
||
|
@@ -0,0 +1,88 @@
|
||
|
+/*
|
||
|
+ * net/ipv4/sysfs_net_ipv4.c
|
||
|
+ *
|
||
|
+ * sysfs-based networking knobs (so we can, unlike with sysctl, control perms)
|
||
|
+ *
|
||
|
+ * Copyright (C) 2008 Google, Inc.
|
||
|
+ *
|
||
|
+ * Robert Love <rlove@google.com>
|
||
|
+ *
|
||
|
+ * This software is licensed under the terms of the GNU General Public
|
||
|
+ * License version 2, as published by the Free Software Foundation, and
|
||
|
+ * may be copied, distributed, and modified under those terms.
|
||
|
+ *
|
||
|
+ * This program is distributed in the hope that it will be useful,
|
||
|
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
+ * GNU General Public License for more details.
|
||
|
+ */
|
||
|
+
|
||
|
+#include <linux/kobject.h>
|
||
|
+#include <linux/string.h>
|
||
|
+#include <linux/sysfs.h>
|
||
|
+#include <linux/init.h>
|
||
|
+#include <net/tcp.h>
|
||
|
+
|
||
|
+#define CREATE_IPV4_FILE(_name, _var) \
|
||
|
+static ssize_t _name##_show(struct kobject *kobj, \
|
||
|
+ struct kobj_attribute *attr, char *buf) \
|
||
|
+{ \
|
||
|
+ return sprintf(buf, "%d\n", _var); \
|
||
|
+} \
|
||
|
+static ssize_t _name##_store(struct kobject *kobj, \
|
||
|
+ struct kobj_attribute *attr, \
|
||
|
+ const char *buf, size_t count) \
|
||
|
+{ \
|
||
|
+ int val, ret; \
|
||
|
+ ret = sscanf(buf, "%d", &val); \
|
||
|
+ if (ret != 1) \
|
||
|
+ return -EINVAL; \
|
||
|
+ if (val < 0) \
|
||
|
+ return -EINVAL; \
|
||
|
+ _var = val; \
|
||
|
+ return count; \
|
||
|
+} \
|
||
|
+static struct kobj_attribute _name##_attr = \
|
||
|
+ __ATTR(_name, 0644, _name##_show, _name##_store)
|
||
|
+
|
||
|
+CREATE_IPV4_FILE(tcp_wmem_min, sysctl_tcp_wmem[0]);
|
||
|
+CREATE_IPV4_FILE(tcp_wmem_def, sysctl_tcp_wmem[1]);
|
||
|
+CREATE_IPV4_FILE(tcp_wmem_max, sysctl_tcp_wmem[2]);
|
||
|
+
|
||
|
+CREATE_IPV4_FILE(tcp_rmem_min, sysctl_tcp_rmem[0]);
|
||
|
+CREATE_IPV4_FILE(tcp_rmem_def, sysctl_tcp_rmem[1]);
|
||
|
+CREATE_IPV4_FILE(tcp_rmem_max, sysctl_tcp_rmem[2]);
|
||
|
+
|
||
|
+static struct attribute *ipv4_attrs[] = {
|
||
|
+ &tcp_wmem_min_attr.attr,
|
||
|
+ &tcp_wmem_def_attr.attr,
|
||
|
+ &tcp_wmem_max_attr.attr,
|
||
|
+ &tcp_rmem_min_attr.attr,
|
||
|
+ &tcp_rmem_def_attr.attr,
|
||
|
+ &tcp_rmem_max_attr.attr,
|
||
|
+ NULL
|
||
|
+};
|
||
|
+
|
||
|
+static struct attribute_group ipv4_attr_group = {
|
||
|
+ .attrs = ipv4_attrs,
|
||
|
+};
|
||
|
+
|
||
|
+static __init int sysfs_ipv4_init(void)
|
||
|
+{
|
||
|
+ struct kobject *ipv4_kobject;
|
||
|
+ int ret;
|
||
|
+
|
||
|
+ ipv4_kobject = kobject_create_and_add("ipv4", kernel_kobj);
|
||
|
+ if (!ipv4_kobject)
|
||
|
+ return -ENOMEM;
|
||
|
+
|
||
|
+ ret = sysfs_create_group(ipv4_kobject, &ipv4_attr_group);
|
||
|
+ if (ret) {
|
||
|
+ kobject_put(ipv4_kobject);
|
||
|
+ return ret;
|
||
|
+ }
|
||
|
+
|
||
|
+ return 0;
|
||
|
+}
|
||
|
+
|
||
|
+subsys_initcall(sysfs_ipv4_init);
|