Skip to content

Commit

Permalink
[INET]: Justification for local port range robustness.
Browse files Browse the repository at this point in the history
  There is a justifying patch for Stephen's patches. Stephen's patches
disallows using a port range of one single port and brakes the meaning
of the 'remaining' variable, in some places it has different meaning.
My patch gives back the sense of 'remaining' variable. It should mean
how many ports are remaining and nothing else. Also my patch allows
using a single port.

  I sure we must be able to use mentioned port range, this does not
restricted by documentation and does not brake current behavior.

usefull links:
Patches posted by Stephen Hemminger
  http://marc.info/?l=linux-netdev&m=119206106218187&w=2
  http://marc.info/?l=linux-netdev&m=119206109918235&w=2

Andrew Morton's comment
  http://marc.info/?l=linux-kernel&m=119248225007737&w=2

1. Allows using a port range of one single port.
2. Gives back sense of 'remaining' variable.

Signed-off-by: Anton Arapov <aarapov@redhat.com>
Acked-by: Stephen Hemminger <shemminger@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Anton Arapov authored and David S. Miller committed Oct 19, 2007
1 parent be702d5 commit a25de53
Show file tree
Hide file tree
Showing 6 changed files with 11 additions and 9 deletions.
5 changes: 3 additions & 2 deletions drivers/infiniband/core/cma.c
Original file line number Diff line number Diff line change
Expand Up @@ -2797,11 +2797,12 @@ static void cma_remove_one(struct ib_device *device)

static int cma_init(void)
{
int ret, low, high;
int ret, low, high, remaining;

get_random_bytes(&next_port, sizeof next_port);
inet_get_local_port_range(&low, &high);
next_port = ((unsigned int) next_port % (high - low)) + low;
remaining = (high - low) + 1;
next_port = ((unsigned int) next_port % remaining) + low;

cma_wq = create_singlethread_workqueue("rdma_cm");
if (!cma_wq)
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/inet_connection_sock.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ int inet_csk_get_port(struct inet_hashinfo *hashinfo,
int remaining, rover, low, high;

inet_get_local_port_range(&low, &high);
remaining = high - low;
remaining = (high - low) + 1;
rover = net_random() % remaining + low;

do {
Expand Down
2 changes: 1 addition & 1 deletion net/ipv4/inet_hashtables.c
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ int inet_hash_connect(struct inet_timewait_death_row *death_row,
struct inet_timewait_sock *tw = NULL;

inet_get_local_port_range(&low, &high);
remaining = high - low;
remaining = (high - low) + 1;

local_bh_disable();
for (i = 1; i <= remaining; i++) {
Expand Down
4 changes: 2 additions & 2 deletions net/ipv4/sysctl_net_ipv4.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ static int ipv4_local_port_range(ctl_table *table, int write, struct file *filp,
ret = proc_dointvec_minmax(&tmp, write, filp, buffer, lenp, ppos);

if (write && ret == 0) {
if (range[1] <= range[0])
if (range[1] < range[0])
ret = -EINVAL;
else
set_local_port_range(range);
Expand Down Expand Up @@ -150,7 +150,7 @@ static int ipv4_sysctl_local_port_range(ctl_table *table, int __user *name,

ret = sysctl_intvec(&tmp, name, nlen, oldval, oldlenp, newval, newlen);
if (ret == 0 && newval && newlen) {
if (range[1] <= range[0])
if (range[1] < range[0])
ret = -EINVAL;
else
set_local_port_range(range);
Expand Down
5 changes: 3 additions & 2 deletions net/ipv4/udp.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,14 @@ int __udp_lib_get_port(struct sock *sk, unsigned short snum,
write_lock_bh(&udp_hash_lock);

if (!snum) {
int i, low, high;
int i, low, high, remaining;
unsigned rover, best, best_size_so_far;

inet_get_local_port_range(&low, &high);
remaining = (high - low) + 1;

best_size_so_far = UINT_MAX;
best = rover = net_random() % (high - low) + low;
best = rover = net_random() % remaining + low;

/* 1st pass: look for empty (or shortest) hash chain */
for (i = 0; i < UDP_HTABLE_SIZE; i++) {
Expand Down
2 changes: 1 addition & 1 deletion net/ipv6/inet6_hashtables.c
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ int inet6_hash_connect(struct inet_timewait_death_row *death_row,
struct inet_timewait_sock *tw = NULL;

inet_get_local_port_range(&low, &high);
remaining = high - low;
remaining = (high - low) + 1;

local_bh_disable();
for (i = 1; i <= remaining; i++) {
Expand Down

0 comments on commit a25de53

Please sign in to comment.