⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysctl_net_ipv4.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * sysctl_net_ipv4.c: sysctl interface to net IPV4 subsystem. * * $Id: sysctl_net_ipv4.c,v 1.50 2001/10/20 00:00:11 davem Exp $ * * Begun April 1, 1996, Mike Shaver. * Added /proc/sys/net/ipv4 directory entry (empty =) ). [MS] */#include <linux/mm.h>#include <linux/module.h>#include <linux/sysctl.h>#include <linux/igmp.h>#include <linux/inetdevice.h>#include <linux/seqlock.h>#include <net/snmp.h>#include <net/icmp.h>#include <net/ip.h>#include <net/route.h>#include <net/tcp.h>#include <net/cipso_ipv4.h>#include <net/inet_frag.h>/* From af_inet.c */extern int sysctl_ip_nonlocal_bind;#ifdef CONFIG_SYSCTLstatic int zero;static int tcp_retr1_max = 255;static int ip_local_port_range_min[] = { 1, 1 };static int ip_local_port_range_max[] = { 65535, 65535 };#endifstruct ipv4_config ipv4_config;#ifdef CONFIG_SYSCTLstaticint ipv4_sysctl_forward(ctl_table *ctl, int write, struct file * filp,			void __user *buffer, size_t *lenp, loff_t *ppos){	int val = IPV4_DEVCONF_ALL(FORWARDING);	int ret;	ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);	if (write && IPV4_DEVCONF_ALL(FORWARDING) != val)		inet_forward_change();	return ret;}static int ipv4_sysctl_forward_strategy(ctl_table *table,			 int __user *name, int nlen,			 void __user *oldval, size_t __user *oldlenp,			 void __user *newval, size_t newlen){	int *valp = table->data;	int new;	if (!newval || !newlen)		return 0;	if (newlen != sizeof(int))		return -EINVAL;	if (get_user(new, (int __user *)newval))		return -EFAULT;	if (new == *valp)		return 0;	if (oldval && oldlenp) {		size_t len;		if (get_user(len, oldlenp))			return -EFAULT;		if (len) {			if (len > table->maxlen)				len = table->maxlen;			if (copy_to_user(oldval, valp, len))				return -EFAULT;			if (put_user(len, oldlenp))				return -EFAULT;		}	}	*valp = new;	inet_forward_change();	return 1;}extern seqlock_t sysctl_port_range_lock;extern int sysctl_local_port_range[2];/* Update system visible IP port range */static void set_local_port_range(int range[2]){	write_seqlock(&sysctl_port_range_lock);	sysctl_local_port_range[0] = range[0];	sysctl_local_port_range[1] = range[1];	write_sequnlock(&sysctl_port_range_lock);}/* Validate changes from /proc interface. */static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp,				 void __user *buffer,				 size_t *lenp, loff_t *ppos){	int ret;	int range[2] = { sysctl_local_port_range[0],			 sysctl_local_port_range[1] };	ctl_table tmp = {		.data = &range,		.maxlen = sizeof(range),		.mode = table->mode,		.extra1 = &ip_local_port_range_min,		.extra2 = &ip_local_port_range_max,	};	ret = proc_dointvec_minmax(&tmp, write, filp, buffer, lenp, ppos);	if (write && ret == 0) {		if (range[1] < range[0])			ret = -EINVAL;		else			set_local_port_range(range);	}	return ret;}/* Validate changes from sysctl interface. */static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name,					 int nlen, void __user *oldval,					 size_t __user *oldlenp,					void __user *newval, size_t newlen){	int ret;	int range[2] = { sysctl_local_port_range[0],			 sysctl_local_port_range[1] };	ctl_table tmp = {		.data = &range,		.maxlen = sizeof(range),		.mode = table->mode,		.extra1 = &ip_local_port_range_min,		.extra2 = &ip_local_port_range_max,	};	ret = sysctl_intvec(&tmp, name, nlen, oldval, oldlenp, newval, newlen);	if (ret == 0 && newval && newlen) {		if (range[1] < range[0])			ret = -EINVAL;		else			set_local_port_range(range);	}	return ret;}static int proc_tcp_congestion_control(ctl_table *ctl, int write, struct file * filp,				       void __user *buffer, size_t *lenp, loff_t *ppos){	char val[TCP_CA_NAME_MAX];	ctl_table tbl = {		.data = val,		.maxlen = TCP_CA_NAME_MAX,	};	int ret;	tcp_get_default_congestion_control(val);	ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);	if (write && ret == 0)		ret = tcp_set_default_congestion_control(val);	return ret;}static int sysctl_tcp_congestion_control(ctl_table *table, int __user *name,					 int nlen, void __user *oldval,					 size_t __user *oldlenp,					 void __user *newval, size_t newlen){	char val[TCP_CA_NAME_MAX];	ctl_table tbl = {		.data = val,		.maxlen = TCP_CA_NAME_MAX,	};	int ret;	tcp_get_default_congestion_control(val);	ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen);	if (ret == 1 && newval && newlen)		ret = tcp_set_default_congestion_control(val);	return ret;}static int proc_tcp_available_congestion_control(ctl_table *ctl,						 int write, struct file * filp,						 void __user *buffer, size_t *lenp,						 loff_t *ppos){	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX, };	int ret;	tbl.data = kmalloc(tbl.maxlen, GFP_USER);	if (!tbl.data)		return -ENOMEM;	tcp_get_available_congestion_control(tbl.data, TCP_CA_BUF_MAX);	ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);	kfree(tbl.data);	return ret;}static int proc_allowed_congestion_control(ctl_table *ctl,					   int write, struct file * filp,					   void __user *buffer, size_t *lenp,					   loff_t *ppos){	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };	int ret;	tbl.data = kmalloc(tbl.maxlen, GFP_USER);	if (!tbl.data)		return -ENOMEM;	tcp_get_allowed_congestion_control(tbl.data, tbl.maxlen);	ret = proc_dostring(&tbl, write, filp, buffer, lenp, ppos);	if (write && ret == 0)		ret = tcp_set_allowed_congestion_control(tbl.data);	kfree(tbl.data);	return ret;}static int strategy_allowed_congestion_control(ctl_table *table, int __user *name,					       int nlen, void __user *oldval,					       size_t __user *oldlenp,					       void __user *newval,					       size_t newlen){	ctl_table tbl = { .maxlen = TCP_CA_BUF_MAX };	int ret;	tbl.data = kmalloc(tbl.maxlen, GFP_USER);	if (!tbl.data)		return -ENOMEM;	tcp_get_available_congestion_control(tbl.data, tbl.maxlen);	ret = sysctl_string(&tbl, name, nlen, oldval, oldlenp, newval, newlen);	if (ret == 0 && newval && newlen)		ret = tcp_set_allowed_congestion_control(tbl.data);	kfree(tbl.data);	return ret;}ctl_table ipv4_table[] = {	{		.ctl_name	= NET_IPV4_TCP_TIMESTAMPS,		.procname	= "tcp_timestamps",		.data		= &sysctl_tcp_timestamps,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_TCP_WINDOW_SCALING,		.procname	= "tcp_window_scaling",		.data		= &sysctl_tcp_window_scaling,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_TCP_SACK,		.procname	= "tcp_sack",		.data		= &sysctl_tcp_sack,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_TCP_RETRANS_COLLAPSE,		.procname	= "tcp_retrans_collapse",		.data		= &sysctl_tcp_retrans_collapse,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_FORWARD,		.procname	= "ip_forward",		.data		= &IPV4_DEVCONF_ALL(FORWARDING),		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &ipv4_sysctl_forward,		.strategy	= &ipv4_sysctl_forward_strategy	},	{		.ctl_name	= NET_IPV4_DEFAULT_TTL,		.procname	= "ip_default_ttl",		.data		= &sysctl_ip_default_ttl,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &ipv4_doint_and_flush,		.strategy	= &ipv4_doint_and_flush_strategy,	},	{		.ctl_name	= NET_IPV4_NO_PMTU_DISC,		.procname	= "ip_no_pmtu_disc",		.data		= &ipv4_config.no_pmtu_disc,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_NONLOCAL_BIND,		.procname	= "ip_nonlocal_bind",		.data		= &sysctl_ip_nonlocal_bind,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_TCP_SYN_RETRIES,		.procname	= "tcp_syn_retries",		.data		= &sysctl_tcp_syn_retries,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_TCP_SYNACK_RETRIES,		.procname	= "tcp_synack_retries",		.data		= &sysctl_tcp_synack_retries,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_TCP_MAX_ORPHANS,		.procname	= "tcp_max_orphans",		.data		= &sysctl_tcp_max_orphans,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_TCP_MAX_TW_BUCKETS,		.procname	= "tcp_max_tw_buckets",		.data		= &tcp_death_row.sysctl_max_tw_buckets,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_IPFRAG_HIGH_THRESH,		.procname	= "ipfrag_high_thresh",		.data		= &ip4_frags_ctl.high_thresh,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_IPFRAG_LOW_THRESH,		.procname	= "ipfrag_low_thresh",		.data		= &ip4_frags_ctl.low_thresh,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_DYNADDR,		.procname	= "ip_dynaddr",		.data		= &sysctl_ip_dynaddr,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_IPFRAG_TIME,		.procname	= "ipfrag_time",		.data		= &ip4_frags_ctl.timeout,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,		.strategy	= &sysctl_jiffies	},	{		.ctl_name	= NET_IPV4_TCP_KEEPALIVE_TIME,		.procname	= "tcp_keepalive_time",		.data		= &sysctl_tcp_keepalive_time,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,		.strategy	= &sysctl_jiffies	},	{		.ctl_name	= NET_IPV4_TCP_KEEPALIVE_PROBES,		.procname	= "tcp_keepalive_probes",		.data		= &sysctl_tcp_keepalive_probes,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_TCP_KEEPALIVE_INTVL,		.procname	= "tcp_keepalive_intvl",		.data		= &sysctl_tcp_keepalive_intvl,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,		.strategy	= &sysctl_jiffies	},	{		.ctl_name	= NET_IPV4_TCP_RETRIES1,		.procname	= "tcp_retries1",		.data		= &sysctl_tcp_retries1,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_minmax,		.strategy	= &sysctl_intvec,		.extra2		= &tcp_retr1_max	},	{		.ctl_name	= NET_IPV4_TCP_RETRIES2,		.procname	= "tcp_retries2",		.data		= &sysctl_tcp_retries2,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec	},	{		.ctl_name	= NET_IPV4_TCP_FIN_TIMEOUT,		.procname	= "tcp_fin_timeout",		.data		= &sysctl_tcp_fin_timeout,		.maxlen		= sizeof(int),		.mode		= 0644,		.proc_handler	= &proc_dointvec_jiffies,		.strategy	= &sysctl_jiffies	},#ifdef CONFIG_SYN_COOKIES	{		.ctl_name	= NET_TCP_SYNCOOKIES,		.procname	= "tcp_syncookies",

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -