From 7d906d22cf1953641303966a756f3c44535001ae Mon Sep 17 00:00:00 2001
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
Date: Sun, 10 Sep 2017 16:02:05 +0200
Subject: 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.
---
 pfinet/linux-src/net/ipv6/udp_ipv6.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

(limited to 'pfinet/linux-src/net/ipv6/udp_ipv6.c')

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);
-- 
cgit v1.2.3