After commit 07f4c90062f8f ("tcp/dccp: try to not exhaust ip_local_port_range in connect()") it is advised to have an even number of ports described in /proc/sys/net/ipv4/ip_local_port_range This means start/end values should have a different parity. Let's warn sysadmins of this, so that they can update their settings if they want to.
Unified · Split
| @@ -19,6 +19,7 @@ struct sock; · 18 unmodified lines | |||
| 19 | struct local_ports { | 19 | struct local_ports { |
| 20 | seqlock_t lock; | 20 | seqlock_t lock; |
| 21 | int range[2]; | 21 | int range[2]; |
| 22 | bool warned; | ||
| 22 | }; | 23 | }; |
| 23 | 24 | ||
| 24 | struct ping_group_range { | 25 | struct ping_group_range { |
| @@ -45,7 +45,13 @@ static int ip_ping_group_range_max[] = { GID_T_MAX, GID_T_MAX }; · 44 unmodified lines | |||
| 45 | /* Update system visible IP port range */ | 45 | /* Update system visible IP port range */ |
| 46 | static void set_local_port_range(struct net *net, int range[2]) | 46 | static void set_local_port_range(struct net *net, int range[2]) |
| 47 | { | 47 | { |
| 48 | bool same_parity = !((range[0] ^ range[1]) & 1); | ||
| 49 | |||
| 48 | write_seqlock(&net->ipv4.ip_local_ports.lock); | 50 | write_seqlock(&net->ipv4.ip_local_ports.lock); |
| 51 | if (same_parity && !net->ipv4.ip_local_ports.warned) { | ||
| 52 | net->ipv4.ip_local_ports.warned = true; | ||
| 53 | pr_err_ratelimited("ip_local_port_range: prefer different parity for start/end values.\n"); | ||
| 54 | } | ||
| 49 | net->ipv4.ip_local_ports.range[0] = range[0]; | 55 | net->ipv4.ip_local_ports.range[0] = range[0]; |
| 50 | net->ipv4.ip_local_ports.range[1] = range[1]; | 56 | net->ipv4.ip_local_ports.range[1] = range[1]; |
| 51 | write_sequnlock(&net->ipv4.ip_local_ports.lock); | 57 | write_sequnlock(&net->ipv4.ip_local_ports.lock); |