Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9d8f1a6 authored by Cong Wang's avatar Cong Wang Committed by David S. Miller
Browse files

ipv4: move local_port_range out of CONFIG_SYSCTL



When CONFIG_SYSCTL is not set, ip_local_port_range should still work,
just that no one can change it. Therefore we should move it out of sysctl_inet.c.
Also, rename it to ->ip_local_ports instead.

Cc: David S. Miller <davem@davemloft.net>
Cc: Francois Romieu <romieu@fr.zoreil.com>
Reported-by: default avatarStefan de Konink <stefan@konink.de>
Signed-off-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 23a456f0
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ struct netns_ipv4 {
	int sysctl_icmp_ratemask;
	int sysctl_icmp_errors_use_inbound_ifaddr;

	struct local_ports sysctl_local_ports;
	struct local_ports ip_local_ports;

	int sysctl_tcp_ecn;
	int sysctl_ip_no_pmtu_disc;
+28 −0
Original line number Diff line number Diff line
@@ -1650,6 +1650,31 @@ static int __init init_ipv4_mibs(void)
	return register_pernet_subsys(&ipv4_mib_ops);
}

static __net_init int inet_init_net(struct net *net)
{
	/*
	 * Set defaults for local port range
	 */
	seqlock_init(&net->ipv4.ip_local_ports.lock);
	net->ipv4.ip_local_ports.range[0] =  32768;
	net->ipv4.ip_local_ports.range[1] =  61000;
	return 0;
}

static __net_exit void inet_exit_net(struct net *net)
{
}

static __net_initdata struct pernet_operations af_inet_ops = {
	.init = inet_init_net,
	.exit = inet_exit_net,
};

static int __init init_inet_pernet_ops(void)
{
	return register_pernet_subsys(&af_inet_ops);
}

static int ipv4_proc_init(void);

/*
@@ -1794,6 +1819,9 @@ static int __init inet_init(void)
	if (ip_mr_init())
		pr_crit("%s: Cannot init ipv4 mroute\n", __func__);
#endif

	if (init_inet_pernet_ops())
		pr_crit("%s: Cannot init ipv4 inet pernet ops\n", __func__);
	/*
	 *	Initialise per-cpu ipv4 mibs
	 */
+4 −4
Original line number Diff line number Diff line
@@ -37,11 +37,11 @@ void inet_get_local_port_range(struct net *net, int *low, int *high)
	unsigned int seq;

	do {
		seq = read_seqbegin(&net->ipv4.sysctl_local_ports.lock);
		seq = read_seqbegin(&net->ipv4.ip_local_ports.lock);

		*low = net->ipv4.sysctl_local_ports.range[0];
		*high = net->ipv4.sysctl_local_ports.range[1];
	} while (read_seqretry(&net->ipv4.sysctl_local_ports.lock, seq));
		*low = net->ipv4.ip_local_ports.range[0];
		*high = net->ipv4.ip_local_ports.range[1];
	} while (read_seqretry(&net->ipv4.ip_local_ports.lock, seq));
}
EXPORT_SYMBOL(inet_get_local_port_range);

+2 −2
Original line number Diff line number Diff line
@@ -240,11 +240,11 @@ static void inet_get_ping_group_range_net(struct net *net, kgid_t *low,
	unsigned int seq;

	do {
		seq = read_seqbegin(&net->ipv4.sysctl_local_ports.lock);
		seq = read_seqbegin(&net->ipv4.ip_local_ports.lock);

		*low = data[0];
		*high = data[1];
	} while (read_seqretry(&net->ipv4.sysctl_local_ports.lock, seq));
	} while (read_seqretry(&net->ipv4.ip_local_ports.lock, seq));
}


+11 −18
Original line number Diff line number Diff line
@@ -45,10 +45,10 @@ static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX };
/* Update system visible IP port range */
static void set_local_port_range(struct net *net, int range[2])
{
	write_seqlock(&net->ipv4.sysctl_local_ports.lock);
	net->ipv4.sysctl_local_ports.range[0] = range[0];
	net->ipv4.sysctl_local_ports.range[1] = range[1];
	write_sequnlock(&net->ipv4.sysctl_local_ports.lock);
	write_seqlock(&net->ipv4.ip_local_ports.lock);
	net->ipv4.ip_local_ports.range[0] = range[0];
	net->ipv4.ip_local_ports.range[1] = range[1];
	write_sequnlock(&net->ipv4.ip_local_ports.lock);
}

/* Validate changes from /proc interface. */
@@ -57,7 +57,7 @@ static int ipv4_local_port_range(struct ctl_table *table, int write,
				 size_t *lenp, loff_t *ppos)
{
	struct net *net =
		container_of(table->data, struct net, ipv4.sysctl_local_ports.range);
		container_of(table->data, struct net, ipv4.ip_local_ports.range);
	int ret;
	int range[2];
	struct ctl_table tmp = {
@@ -90,11 +90,11 @@ static void inet_get_ping_group_range_table(struct ctl_table *table, kgid_t *low
		container_of(table->data, struct net, ipv4.sysctl_ping_group_range);
	unsigned int seq;
	do {
		seq = read_seqbegin(&net->ipv4.sysctl_local_ports.lock);
		seq = read_seqbegin(&net->ipv4.ip_local_ports.lock);

		*low = data[0];
		*high = data[1];
	} while (read_seqretry(&net->ipv4.sysctl_local_ports.lock, seq));
	} while (read_seqretry(&net->ipv4.ip_local_ports.lock, seq));
}

/* Update system visible IP port range */
@@ -103,10 +103,10 @@ static void set_ping_group_range(struct ctl_table *table, kgid_t low, kgid_t hig
	kgid_t *data = table->data;
	struct net *net =
		container_of(table->data, struct net, ipv4.sysctl_ping_group_range);
	write_seqlock(&net->ipv4.sysctl_local_ports.lock);
	write_seqlock(&net->ipv4.ip_local_ports.lock);
	data[0] = low;
	data[1] = high;
	write_sequnlock(&net->ipv4.sysctl_local_ports.lock);
	write_sequnlock(&net->ipv4.ip_local_ports.lock);
}

/* Validate changes from /proc interface. */
@@ -819,8 +819,8 @@ static struct ctl_table ipv4_net_table[] = {
	},
	{
		.procname	= "ip_local_port_range",
		.maxlen		= sizeof(init_net.ipv4.sysctl_local_ports.range),
		.data		= &init_net.ipv4.sysctl_local_ports.range,
		.maxlen		= sizeof(init_net.ipv4.ip_local_ports.range),
		.data		= &init_net.ipv4.ip_local_ports.range,
		.mode		= 0644,
		.proc_handler	= ipv4_local_port_range,
	},
@@ -865,13 +865,6 @@ static __net_init int ipv4_sysctl_init_net(struct net *net)
	net->ipv4.sysctl_ping_group_range[0] = make_kgid(&init_user_ns, 1);
	net->ipv4.sysctl_ping_group_range[1] = make_kgid(&init_user_ns, 0);

	/*
	 * Set defaults for local port range
	 */
	seqlock_init(&net->ipv4.sysctl_local_ports.lock);
	net->ipv4.sysctl_local_ports.range[0] =  32768;
	net->ipv4.sysctl_local_ports.range[1] =  61000;

	net->ipv4.ipv4_hdr = register_net_sysctl(net, "net/ipv4", table);
	if (net->ipv4.ipv4_hdr == NULL)
		goto err_reg;