aboutsummaryrefslogtreecommitdiff
path: root/pfinet/linux-src
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2017-09-10 16:02:05 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2017-09-10 16:04:31 +0200
commit7d906d22cf1953641303966a756f3c44535001ae (patch)
tree87d0e000164f7c13835efbb5a1d3b8f716bc5b07 /pfinet/linux-src
parent973089f3832df9887259e1927f7ead800d9dd897 (diff)
downloadhurd-7d906d22cf1953641303966a756f3c44535001ae.tar.gz
hurd-7d906d22cf1953641303966a756f3c44535001ae.tar.bz2
hurd-7d906d22cf1953641303966a756f3c44535001ae.zip
pfinet: select UDP/TCP ports randomly
* pfinet/linux-src/include/net/tcp.h (tcp_port_rover): Remove declaration * pfinet/linux-src/include/net/udp.h (udp_port_rover): Likewise. * pfinet/linux-src/net/ipv4/tcp_ipv4.c (tcp_port_rover): Remove variable. (tcp_v4_get_port): Take port hint from net_random() instead of tcp_port_rover. * pfinet/linux-src/net/ipv4/udp.c (udp_port_rover, udp_v4_get_port): Likewise. * pfinet/linux-src/net/ipv6/tcp_ipv6.c (tcp_v6_get_port): Likewise. * pfinet/linux-src/net/ipv6/udp_ipv6.c (udp_v6_get_port): Likewise.
Diffstat (limited to 'pfinet/linux-src')
-rw-r--r--pfinet/linux-src/include/net/tcp.h1
-rw-r--r--pfinet/linux-src/include/net/udp.h2
-rw-r--r--pfinet/linux-src/net/ipv4/tcp_ipv4.c4
-rw-r--r--pfinet/linux-src/net/ipv4/udp.c12
-rw-r--r--pfinet/linux-src/net/ipv6/tcp_ipv6.c3
-rw-r--r--pfinet/linux-src/net/ipv6/udp_ipv6.c9
6 files changed, 10 insertions, 21 deletions
diff --git a/pfinet/linux-src/include/net/tcp.h b/pfinet/linux-src/include/net/tcp.h
index 96b8071d..d6797ea5 100644
--- a/pfinet/linux-src/include/net/tcp.h
+++ b/pfinet/linux-src/include/net/tcp.h
@@ -82,7 +82,6 @@ extern struct tcp_bind_bucket **tcp_bhash;
extern kmem_cache_t *tcp_bucket_cachep;
extern struct tcp_bind_bucket *tcp_bucket_create(unsigned short snum);
extern void tcp_bucket_unlock(struct sock *sk);
-extern int tcp_port_rover;
/* Level-1 socket-demux cache. */
#define TCP_NUM_REGS 32
diff --git a/pfinet/linux-src/include/net/udp.h b/pfinet/linux-src/include/net/udp.h
index f3ceadb5..daf67023 100644
--- a/pfinet/linux-src/include/net/udp.h
+++ b/pfinet/linux-src/include/net/udp.h
@@ -35,8 +35,6 @@ extern struct sock *udp_hash[UDP_HTABLE_SIZE];
#define UDP_NO_CHECK 0
-extern int udp_port_rover;
-
static inline int udp_lport_inuse(u16 num)
{
struct sock *sk = udp_hash[num & (UDP_HTABLE_SIZE - 1)];
diff --git a/pfinet/linux-src/net/ipv4/tcp_ipv4.c b/pfinet/linux-src/net/ipv4/tcp_ipv4.c
index df2c8b7c..8a5f7175 100644
--- a/pfinet/linux-src/net/ipv4/tcp_ipv4.c
+++ b/pfinet/linux-src/net/ipv4/tcp_ipv4.c
@@ -123,7 +123,6 @@ int sysctl_local_port_range[2] = { 1024, 4999 };
#else
int sysctl_local_port_range[2] = { 32768, 61000 };
#endif
-int tcp_port_rover = (1024 - 1);
static __inline__ int tcp_hashfn(__u32 laddr, __u16 lport,
__u32 faddr, __u16 fport)
@@ -223,9 +222,9 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum)
SOCKHASH_LOCK();
if (snum == 0) {
- int rover = tcp_port_rover;
int low = sysctl_local_port_range[0];
int high = sysctl_local_port_range[1];
+ int rover = net_random() % (high - low) + low;
int remaining = (high - low) + 1;
do { rover++;
@@ -239,7 +238,6 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum)
next:
; /* Do nothing. */
} while (--remaining > 0);
- tcp_port_rover = rover;
/* Exhausted local port range during search? */
if (remaining <= 0)
diff --git a/pfinet/linux-src/net/ipv4/udp.c b/pfinet/linux-src/net/ipv4/udp.c
index f9be2e04..ff5812a9 100644
--- a/pfinet/linux-src/net/ipv4/udp.c
+++ b/pfinet/linux-src/net/ipv4/udp.c
@@ -127,20 +127,16 @@ struct udp_mib udp_statistics;
struct sock *udp_hash[UDP_HTABLE_SIZE];
-/* Shared by v4/v6 udp. */
-int udp_port_rover = 0;
-
static int udp_v4_get_port(struct sock *sk, unsigned short snum)
{
SOCKHASH_LOCK();
if (snum == 0) {
+ int low = sysctl_local_port_range[0];
+ int high = sysctl_local_port_range[1];
int best_size_so_far, best, result, i;
- if (udp_port_rover > sysctl_local_port_range[1] ||
- udp_port_rover < sysctl_local_port_range[0])
- udp_port_rover = sysctl_local_port_range[0];
best_size_so_far = 32767;
- best = result = udp_port_rover;
+ best = result = net_random() % (high - low) + low;
for (i = 0; i < UDP_HTABLE_SIZE; i++, result++) {
struct sock *sk;
int size;
@@ -173,7 +169,7 @@ static int udp_v4_get_port(struct sock *sk, unsigned short snum)
break;
}
gotit:
- udp_port_rover = snum = result;
+ snum = result;
} else {
struct sock *sk2;
diff --git a/pfinet/linux-src/net/ipv6/tcp_ipv6.c b/pfinet/linux-src/net/ipv6/tcp_ipv6.c
index 3fba9af6..cca5abf4 100644
--- a/pfinet/linux-src/net/ipv6/tcp_ipv6.c
+++ b/pfinet/linux-src/net/ipv6/tcp_ipv6.c
@@ -130,9 +130,9 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
SOCKHASH_LOCK();
if (snum == 0) {
- int rover = tcp_port_rover;
int low = sysctl_local_port_range[0];
int high = sysctl_local_port_range[1];
+ int rover = net_random() % (high - low) + low;
int remaining = (high - low) + 1;
do { rover++;
@@ -148,7 +148,6 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
(void) 0;
} while (--remaining > 0);
- tcp_port_rover = rover;
/* Exhausted local port range during search? */
if (remaining <= 0)
diff --git a/pfinet/linux-src/net/ipv6/udp_ipv6.c b/pfinet/linux-src/net/ipv6/udp_ipv6.c
index bbc4f027..f838d251 100644
--- a/pfinet/linux-src/net/ipv6/udp_ipv6.c
+++ b/pfinet/linux-src/net/ipv6/udp_ipv6.c
@@ -92,13 +92,12 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum)
{
SOCKHASH_LOCK();
if (snum == 0) {
+ int low = sysctl_local_port_range[0];
+ int high = sysctl_local_port_range[1];
int best_size_so_far, best, result, i;
- if (udp_port_rover > sysctl_local_port_range[1] ||
- udp_port_rover < sysctl_local_port_range[0])
- udp_port_rover = sysctl_local_port_range[0];
best_size_so_far = 32767;
- best = result = udp_port_rover;
+ best = result = net_random() % (high - low) + low;
for (i = 0; i < UDP_HTABLE_SIZE; i++, result++) {
struct sock *sk;
int size;
@@ -132,7 +131,7 @@ static int udp_v6_get_port(struct sock *sk, unsigned short snum)
break;
}
gotit:
- udp_port_rover = snum = result;
+ snum = result;
} else {
struct sock *sk2;
int addr_type = ipv6_addr_type(&sk->net_pinfo.af_inet6.rcv_saddr);