]> err.no Git - linux-2.6/commitdiff
[INET]: Justification for local port range robustness.
authorAnton Arapov <aarapov@redhat.com>
Fri, 19 Oct 2007 05:00:17 +0000 (22:00 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Oct 2007 05:00:17 +0000 (22:00 -0700)
  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>
drivers/infiniband/core/cma.c
net/ipv4/inet_connection_sock.c
net/ipv4/inet_hashtables.c
net/ipv4/sysctl_net_ipv4.c
net/ipv4/udp.c
net/ipv6/inet6_hashtables.c

index 93644f82592c426074a9beba068b4e23d4910b79..d08fb30768bcc73169884af2b2d011e6e07d695c 100644 (file)
@@ -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)
index 3cef12835c4b2bfa86b50a74a788488cd5ac9ea1..8fb6ca23700aa8de4c446879b19186e626dfa396 100644 (file)
@@ -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 {
index fac6398e436709c714b95992c9045e740454d004..16eecc7046a346d6a2a22e1c33f71055a333f4c2 100644 (file)
@@ -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++) {
index c78acc1a7f11395b154460774dbbd6ee52444e0f..ffddd2b453523c137dae115fde91aa1e91d5471a 100644 (file)
@@ -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);
@@ -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);
index cb9fc58efb2f1da00ad4789370be1d1ac07f1fcd..35d2b0e9e10bec0a1ac90c385dde9cbcf7c5f6ff 100644 (file)
@@ -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++) {
index 1c2c2765543505d7e61dd021fa2fcf2b9482757f..d6f1026f19438114bfef264b1f669cf03f0fd131 100644 (file)
@@ -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++) {