diff --git a/benchmarks/iperf/Makefile b/benchmarks/iperf/Makefile
index c3e8860aec..d0dfa4661c 100644
--- a/benchmarks/iperf/Makefile
+++ b/benchmarks/iperf/Makefile
@@ -1,6 +1,6 @@
PLUGIN_NAME= iperf
PLUGIN_VERSION= 1.0
-PLUGIN_REVISION= 2
+PLUGIN_REVISION= 3
PLUGIN_COMMENT= Connection speed tester
PLUGIN_DEPENDS= iperf3 ruby rubygem-rexml
PLUGIN_MAINTAINER= franz.fabian.94@gmail.com
diff --git a/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/Api/InstanceController.php b/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/Api/InstanceController.php
index 2418351163..693da0ac39 100644
--- a/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/Api/InstanceController.php
+++ b/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/Api/InstanceController.php
@@ -55,9 +55,11 @@ public function setAction()
'error' => 'interface parameter is missing');
}
$interface_name = $_POST['instance']['interface'];
+ $prefer_port_5201 = isset($_POST['instance']['prefer_port_5201']) &&
+ $_POST['instance']['prefer_port_5201'] === '1';
if ($interface = $this->get_real_interface_name($interface_name)) {
// start iperf
- return $this->send_command("start $interface", $backend);
+ return $this->send_command("start $interface " . ($prefer_port_5201 ? '1' : '0'), $backend);
} else {
return array('status' => 'error',
'error' => 'interface is unknown');
diff --git a/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/forms/instance_settings.xml b/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/forms/instance_settings.xml
index 5b5d1f70b3..1fb9987b07 100644
--- a/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/forms/instance_settings.xml
+++ b/benchmarks/iperf/src/opnsense/mvc/app/controllers/OPNsense/iperf/forms/instance_settings.xml
@@ -5,4 +5,10 @@
dropdown
Choose the interface on which the port should be opened.
+
+ instance.prefer_port_5201
+
+ checkbox
+ Use the standard iPerf port 5201 when it is available; otherwise, use a random available port.
+
diff --git a/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml b/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml
index f3254be98e..e6d600f14c 100644
--- a/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml
+++ b/benchmarks/iperf/src/opnsense/mvc/app/models/OPNsense/iperf/FakeInstance.xml
@@ -7,5 +7,9 @@
Y
N
+
+ 1
+ N
+
diff --git a/benchmarks/iperf/src/opnsense/scripts/iperf/ruby_iperf.rb b/benchmarks/iperf/src/opnsense/scripts/iperf/ruby_iperf.rb
index 23740fd90e..79db876cb8 100755
--- a/benchmarks/iperf/src/opnsense/scripts/iperf/ruby_iperf.rb
+++ b/benchmarks/iperf/src/opnsense/scripts/iperf/ruby_iperf.rb
@@ -39,6 +39,7 @@
ONE_HOUR = 3600
KEY_START_TIME = 'start_time'
KEY_PORT = 'port'
+IPERF_DEFAULT_PORT = 5201
LF = "\n"
def execute_firewall_port(rule)
@@ -106,8 +107,11 @@ def find_open_ports
ports
end
-def find_open_port
- find_open_ports.sample
+def find_open_port(prefer_default_port = false)
+ ports = find_open_ports
+ return IPERF_DEFAULT_PORT if prefer_default_port && ports.include?(IPERF_DEFAULT_PORT)
+
+ ports.sample
end
def run_iperf3(port)
@@ -123,9 +127,9 @@ def run_iperf3(port)
output
end
-def run_test(interface = 'any', data)
+def run_test(interface, data, prefer_default_port = false)
ret = nil
- data[KEY_PORT] = port = find_open_port
+ data[KEY_PORT] = port = find_open_port(prefer_default_port)
# regenerate ruleset
flush_firewall_rules
gen_firewall_rules
@@ -149,12 +153,12 @@ def run_test(interface = 'any', data)
ret
end
-def run_test_thread(interface = 'any')
+def run_test_thread(interface = 'any', prefer_default_port = false)
data = {}
t = Thread.new do
data[KEY_START_TIME] = Time.now
data['interface'] = interface
- run_test(interface, data)
+ run_test(interface, data, prefer_default_port)
end
$instances[t] = data
end
@@ -190,7 +194,8 @@ def run_test_thread(interface = 'any')
# check if a valid interface was given
interface = intf if intf =~ /^[a-z0-9_-]+$/
end
- data = run_test_thread interface
+ prefer_default_port = command.shift == '1'
+ data = run_test_thread interface, prefer_default_port
connection.puts '{"status": "queued job"}'
when 'query'
connection.puts $instances.values.to_json