pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/upf-benchmark/+/40339?usp=email )
Change subject: testsuites: Add tunend-2trex test env
......................................................................
testsuites: Add tunend-2trex test env
In order to validate tunend scenario (encaps/decaps) against an UPF, we
use TRex in stateful mode (ASTF) with its tunnels_topo infrastructure.
This setup is less performant than the stateless mode used in the tunmap
scenario, and as a result less throughput can be generated.
This really poses a problem if the host running TRex (generating the
GTPU traffic) is the same or less poerful hardware than the UIT running
the UPF, as generating+handling traffic is at least as complex as the
work UPF is doing.
Hence, in order to be able to use less performant hardware to generate
the traffic, a new test environment is added which expects 2 hosts
instead of 1 running TRex. As a result, the tunnels configured their
traffic are split into 2 segments/buckets of IP addresses/TEIDs, each
configured on the UPF by its own osmo-upf-load-gen over PFCP, and also
traffic for each of those two being generated/handled by one of the two
TRex instances being run.
In order to get the benchmark results, one must add the output from the
console from both TRex instances running in parallel on separate hosts.
With this it becomes possible to fill in the 100Gbps using C240-1 and
c240-2 hosts.
Change-Id: I6dcc3a27ef61857c05ab8d5cb67cceab5bb3dffa
---
A testsuites/gtplab-sysmo2025/tunend-2trex/README.md
A testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.gtp_flood.vty
A testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.osmo-upf-load-gen.cfg
A testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.gtp_flood.vty
A testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.osmo-upf-load-gen.cfg
A testsuites/gtplab-sysmo2025/tunend-2trex/cpf/configure.sh
A testsuites/gtplab-sysmo2025/tunend-2trex/cpf/gen_gtpu_concurrent_ue_addr_range.py
A testsuites/gtplab-sysmo2025/tunend-2trex/cpf/run.sh
A testsuites/gtplab-sysmo2025/tunend-2trex/topology.dot
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/configure.sh
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/gtpu_topo.py
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/run.sh
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-1.yaml
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-2.yaml
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_epyc1.yaml
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_gtplab2.yaml
A testsuites/gtplab-sysmo2025/tunend-2trex/trex/udp_simple.py
A testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/configure.sh
A testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/eupf.yaml
A testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/run.sh
A testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/configure.sh
A testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/osmo-upf.cfg
A testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/run.sh
23 files changed, 1,018 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/upf-benchmark refs/changes/39/40339/1
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/README.md
b/testsuites/gtplab-sysmo2025/tunend-2trex/README.md
new file mode 100644
index 0000000..7a20f3a
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/README.md
@@ -0,0 +1,17 @@
+In this testsuite, TRex is used to generate Uplink GTPU traffic on the RAN side
+towards UPF on its 1st iface and which which should be sent back decapsulated
+(tunend) towards CN and received at TRex 2nd interface.
+
+The GTPU traffic is generated by gtp_1pkt_simply.py profile passed to TRex,
+which emulates <enb-ip-addr,TEID> sessions based on parameters passed through
+trex-console when launching the test, and which should match those configured in
+cpf/0.gtp_flood.vty used by osmo-upf-load-gen to allocated the sessions at the
+UPF.
+
+```
+[trex-ran](172.16.32.{2-101}) ----GTPU--> ()[upf]
+ |
+[trex-cn](172.16.31.{100-200}) <----IP---- ()[upf]
+```
+
+See topoology.dot for a more detailed graph.
\ No newline at end of file
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.gtp_flood.vty
b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.gtp_flood.vty
new file mode 100644
index 0000000..4142b5c
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.gtp_flood.vty
@@ -0,0 +1,132 @@
+# Establish N PFCP sessions for tunend, and emit massive GTP traffic to the UPF
+# to each established tunnel.
+#
+# osmo-upf-load-gen UPF "internet host"
+# |GTP-ep -------GTP-----> GTP-ep|UE-IP-addr -------IP------> arbitrary-IP|
+# |172.16.32.2 172.16.32.1|192.168.10.23 123.234.42.23|
+# |172.16.32.3
+# ^ ^ ^
+# ^ | | |
+# | | configure by configure by
+# configure by from UPF 'ue ip' 'payload target
ip',
+# 'gtp local' ("F-TEID=choose")
'payload target port'
+
+# Configure one or more local GTP endpoints to emit GTP packets from.
+# Established sessions will use these round-robin.
+no gtp local bind
+gtp local 172.16.32.2 2152 ue-ip-range 193.0.0.0 193.0.255.255
+gtp local 172.16.32.3 2152 ue-ip-range 193.1.0.0 193.1.255.255
+gtp local 172.16.32.4 2152 ue-ip-range 193.2.0.0 193.2.255.255
+gtp local 172.16.32.5 2152 ue-ip-range 193.3.0.0 193.3.255.255
+gtp local 172.16.32.6 2152 ue-ip-range 193.4.0.0 193.4.255.255
+gtp local 172.16.32.7 2152 ue-ip-range 193.5.0.0 193.5.255.255
+gtp local 172.16.32.8 2152 ue-ip-range 193.6.0.0 193.6.255.255
+gtp local 172.16.32.9 2152 ue-ip-range 193.7.0.0 193.7.255.255
+gtp local 172.16.32.10 2152 ue-ip-range 193.8.0.0 193.8.255.255
+gtp local 172.16.32.11 2152 ue-ip-range 193.9.0.0 193.9.255.255
+gtp local 172.16.32.12 2152 ue-ip-range 193.10.0.0 193.10.255.255
+gtp local 172.16.32.13 2152 ue-ip-range 193.11.0.0 193.11.255.255
+gtp local 172.16.32.14 2152 ue-ip-range 193.12.0.0 193.12.255.255
+gtp local 172.16.32.15 2152 ue-ip-range 193.13.0.0 193.13.255.255
+gtp local 172.16.32.16 2152 ue-ip-range 193.14.0.0 193.14.255.255
+gtp local 172.16.32.17 2152 ue-ip-range 193.15.0.0 193.15.255.255
+gtp local 172.16.32.18 2152 ue-ip-range 193.16.0.0 193.16.255.255
+gtp local 172.16.32.19 2152 ue-ip-range 193.17.0.0 193.17.255.255
+gtp local 172.16.32.20 2152 ue-ip-range 193.18.0.0 193.18.255.255
+gtp local 172.16.32.21 2152 ue-ip-range 193.19.0.0 193.19.255.255
+gtp local 172.16.32.22 2152 ue-ip-range 193.20.0.0 193.20.255.255
+gtp local 172.16.32.23 2152 ue-ip-range 193.21.0.0 193.21.255.255
+gtp local 172.16.32.24 2152 ue-ip-range 193.22.0.0 193.22.255.255
+gtp local 172.16.32.25 2152 ue-ip-range 193.23.0.0 193.23.255.255
+gtp local 172.16.32.26 2152 ue-ip-range 193.24.0.0 193.24.255.255
+gtp local 172.16.32.27 2152 ue-ip-range 193.25.0.0 193.25.255.255
+gtp local 172.16.32.28 2152 ue-ip-range 193.26.0.0 193.26.255.255
+gtp local 172.16.32.29 2152 ue-ip-range 193.27.0.0 193.27.255.255
+gtp local 172.16.32.30 2152 ue-ip-range 193.28.0.0 193.28.255.255
+gtp local 172.16.32.31 2152 ue-ip-range 193.29.0.0 193.29.255.255
+gtp local 172.16.32.32 2152 ue-ip-range 193.30.0.0 193.30.255.255
+gtp local 172.16.32.33 2152 ue-ip-range 193.31.0.0 193.31.255.255
+gtp local 172.16.32.34 2152 ue-ip-range 193.32.0.0 193.32.255.255
+gtp local 172.16.32.35 2152 ue-ip-range 193.33.0.0 193.33.255.255
+gtp local 172.16.32.36 2152 ue-ip-range 193.34.0.0 193.34.255.255
+gtp local 172.16.32.37 2152 ue-ip-range 193.35.0.0 193.35.255.255
+gtp local 172.16.32.38 2152 ue-ip-range 193.36.0.0 193.36.255.255
+gtp local 172.16.32.39 2152 ue-ip-range 193.37.0.0 193.37.255.255
+gtp local 172.16.32.40 2152 ue-ip-range 193.38.0.0 193.38.255.255
+gtp local 172.16.32.41 2152 ue-ip-range 193.39.0.0 193.39.255.255
+gtp local 172.16.32.42 2152 ue-ip-range 193.40.0.0 193.40.255.255
+gtp local 172.16.32.43 2152 ue-ip-range 193.41.0.0 193.41.255.255
+gtp local 172.16.32.44 2152 ue-ip-range 193.42.0.0 193.42.255.255
+gtp local 172.16.32.45 2152 ue-ip-range 193.43.0.0 193.43.255.255
+gtp local 172.16.32.46 2152 ue-ip-range 193.44.0.0 193.44.255.255
+gtp local 172.16.32.47 2152 ue-ip-range 193.45.0.0 193.45.255.255
+gtp local 172.16.32.48 2152 ue-ip-range 193.46.0.0 193.46.255.255
+gtp local 172.16.32.49 2152 ue-ip-range 193.47.0.0 193.47.255.255
+gtp local 172.16.32.50 2152 ue-ip-range 193.48.0.0 193.48.255.255
+gtp local 172.16.32.51 2152 ue-ip-range 193.49.0.0 193.49.255.255
+gtp local 172.16.32.52 2152 ue-ip-range 193.50.0.0 193.50.255.255
+gtp local 172.16.32.53 2152 ue-ip-range 193.51.0.0 193.51.255.255
+gtp local 172.16.32.54 2152 ue-ip-range 193.52.0.0 193.52.255.255
+gtp local 172.16.32.55 2152 ue-ip-range 193.53.0.0 193.53.255.255
+gtp local 172.16.32.56 2152 ue-ip-range 193.54.0.0 193.54.255.255
+gtp local 172.16.32.57 2152 ue-ip-range 193.55.0.0 193.55.255.255
+gtp local 172.16.32.58 2152 ue-ip-range 193.56.0.0 193.56.255.255
+gtp local 172.16.32.59 2152 ue-ip-range 193.57.0.0 193.57.255.255
+gtp local 172.16.32.60 2152 ue-ip-range 193.58.0.0 193.58.255.255
+gtp local 172.16.32.61 2152 ue-ip-range 193.59.0.0 193.59.255.255
+gtp local 172.16.32.62 2152 ue-ip-range 193.60.0.0 193.60.255.255
+gtp local 172.16.32.63 2152 ue-ip-range 193.61.0.0 193.61.255.255
+gtp local 172.16.32.64 2152 ue-ip-range 193.62.0.0 193.62.255.255
+gtp local 172.16.32.65 2152 ue-ip-range 193.63.0.0 193.63.255.255
+gtp local 172.16.32.66 2152 ue-ip-range 193.64.0.0 193.64.255.255
+gtp local 172.16.32.67 2152 ue-ip-range 193.65.0.0 193.65.255.255
+gtp local 172.16.32.68 2152 ue-ip-range 193.66.0.0 193.66.255.255
+gtp local 172.16.32.69 2152 ue-ip-range 193.67.0.0 193.67.255.255
+gtp local 172.16.32.70 2152 ue-ip-range 193.68.0.0 193.68.255.255
+gtp local 172.16.32.71 2152 ue-ip-range 193.69.0.0 193.69.255.255
+gtp local 172.16.32.72 2152 ue-ip-range 193.70.0.0 193.70.255.255
+gtp local 172.16.32.73 2152 ue-ip-range 193.71.0.0 193.71.255.255
+gtp local 172.16.32.74 2152 ue-ip-range 193.72.0.0 193.72.255.255
+gtp local 172.16.32.75 2152 ue-ip-range 193.73.0.0 193.73.255.255
+gtp local 172.16.32.76 2152 ue-ip-range 193.74.0.0 193.74.255.255
+gtp local 172.16.32.77 2152 ue-ip-range 193.75.0.0 193.75.255.255
+gtp local 172.16.32.78 2152 ue-ip-range 193.76.0.0 193.76.255.255
+gtp local 172.16.32.79 2152 ue-ip-range 193.77.0.0 193.77.255.255
+gtp local 172.16.32.80 2152 ue-ip-range 193.78.0.0 193.78.255.255
+gtp local 172.16.32.81 2152 ue-ip-range 193.79.0.0 193.79.255.255
+gtp local 172.16.32.82 2152 ue-ip-range 193.80.0.0 193.80.255.255
+gtp local 172.16.32.83 2152 ue-ip-range 193.81.0.0 193.81.255.255
+gtp local 172.16.32.84 2152 ue-ip-range 193.82.0.0 193.82.255.255
+gtp local 172.16.32.85 2152 ue-ip-range 193.83.0.0 193.83.255.255
+gtp local 172.16.32.86 2152 ue-ip-range 193.84.0.0 193.84.255.255
+gtp local 172.16.32.87 2152 ue-ip-range 193.85.0.0 193.85.255.255
+gtp local 172.16.32.88 2152 ue-ip-range 193.86.0.0 193.86.255.255
+gtp local 172.16.32.89 2152 ue-ip-range 193.87.0.0 193.87.255.255
+gtp local 172.16.32.90 2152 ue-ip-range 193.88.0.0 193.88.255.255
+gtp local 172.16.32.91 2152 ue-ip-range 193.89.0.0 193.89.255.255
+gtp local 172.16.32.92 2152 ue-ip-range 193.90.0.0 193.90.255.255
+gtp local 172.16.32.93 2152 ue-ip-range 193.91.0.0 193.91.255.255
+gtp local 172.16.32.94 2152 ue-ip-range 193.92.0.0 193.92.255.255
+gtp local 172.16.32.95 2152 ue-ip-range 193.93.0.0 193.93.255.255
+gtp local 172.16.32.96 2152 ue-ip-range 193.94.0.0 193.94.255.255
+gtp local 172.16.32.97 2152 ue-ip-range 193.95.0.0 193.95.255.255
+gtp local 172.16.32.98 2152 ue-ip-range 193.96.0.0 193.96.255.255
+gtp local 172.16.32.99 2152 ue-ip-range 193.97.0.0 193.97.255.255
+gtp local 172.16.32.100 2152 ue-ip-range 193.98.0.0 193.98.255.255
+gtp local 172.16.32.101 2152 ue-ip-range 193.99.0.0 193.99.255.255
+
+gtp core 172.16.32.200
+
+# now associate with UPF and start N sessions.
+pfcp-peer 172.16.31.2
+ tx assoc-setup-req
+ sleep 1
+ date
+
+ n 100000 session create tunend
+ wait responses
+ # All sessions established
+ date
+
+# give some time to gather counters before the tunnel is removed
+sleep 999999
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.osmo-upf-load-gen.cfg
b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.osmo-upf-load-gen.cfg
new file mode 100644
index 0000000..6c3f75c
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/0.osmo-upf-load-gen.cfg
@@ -0,0 +1,18 @@
+log stderr
+ logging color 1
+ logging print category-hex 0
+ logging print category 1
+ logging timestamp 0
+ logging print file basename last
+ logging print level 1
+ logging level set-all info
+ logging level lpfcp error
+
+line vty
+ no login
+ bind 127.0.0.1
+ctrl
+ bind 127.0.0.1
+
+local-addr 0.0.0.0 8805
+listen
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.gtp_flood.vty
b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.gtp_flood.vty
new file mode 100644
index 0000000..ce86b7d
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.gtp_flood.vty
@@ -0,0 +1,133 @@
+# Establish N PFCP sessions for tunend, and emit massive GTP traffic to the UPF
+# to each established tunnel.
+#
+# osmo-upf-load-gen UPF "internet host"
+# |GTP-ep -------GTP-----> GTP-ep|UE-IP-addr -------IP------> arbitrary-IP|
+# |172.16.32.2 172.16.32.1|192.168.10.23 123.234.42.23|
+# |172.16.32.3
+# ^ ^ ^
+# ^ | | |
+# | | configure by configure by
+# configure by from UPF 'ue ip' 'payload target
ip',
+# 'gtp local' ("F-TEID=choose")
'payload target port'
+
+# Configure one or more local GTP endpoints to emit GTP packets from.
+# Established sessions will use these round-robin.
+no gtp local bind
+gtp local 172.16.32.102 2152 ue-ip-range 193.100.0.0 193.100.255.255
+gtp local 172.16.32.103 2152 ue-ip-range 193.101.0.0 193.101.255.255
+gtp local 172.16.32.104 2152 ue-ip-range 193.102.0.0 193.102.255.255
+gtp local 172.16.32.105 2152 ue-ip-range 193.103.0.0 193.103.255.255
+gtp local 172.16.32.106 2152 ue-ip-range 193.104.0.0 193.104.255.255
+gtp local 172.16.32.107 2152 ue-ip-range 193.105.0.0 193.105.255.255
+gtp local 172.16.32.108 2152 ue-ip-range 193.106.0.0 193.106.255.255
+gtp local 172.16.32.109 2152 ue-ip-range 193.107.0.0 193.107.255.255
+gtp local 172.16.32.110 2152 ue-ip-range 193.108.0.0 193.108.255.255
+gtp local 172.16.32.111 2152 ue-ip-range 193.109.0.0 193.109.255.255
+gtp local 172.16.32.112 2152 ue-ip-range 193.110.0.0 193.110.255.255
+gtp local 172.16.32.113 2152 ue-ip-range 193.111.0.0 193.111.255.255
+gtp local 172.16.32.114 2152 ue-ip-range 193.112.0.0 193.112.255.255
+gtp local 172.16.32.115 2152 ue-ip-range 193.113.0.0 193.113.255.255
+gtp local 172.16.32.116 2152 ue-ip-range 193.114.0.0 193.114.255.255
+gtp local 172.16.32.117 2152 ue-ip-range 193.115.0.0 193.115.255.255
+gtp local 172.16.32.118 2152 ue-ip-range 193.116.0.0 193.116.255.255
+gtp local 172.16.32.119 2152 ue-ip-range 193.117.0.0 193.117.255.255
+gtp local 172.16.32.120 2152 ue-ip-range 193.118.0.0 193.118.255.255
+gtp local 172.16.32.121 2152 ue-ip-range 193.119.0.0 193.119.255.255
+gtp local 172.16.32.122 2152 ue-ip-range 193.120.0.0 193.120.255.255
+gtp local 172.16.32.123 2152 ue-ip-range 193.121.0.0 193.121.255.255
+gtp local 172.16.32.124 2152 ue-ip-range 193.122.0.0 193.122.255.255
+gtp local 172.16.32.125 2152 ue-ip-range 193.123.0.0 193.123.255.255
+gtp local 172.16.32.126 2152 ue-ip-range 193.124.0.0 193.124.255.255
+gtp local 172.16.32.127 2152 ue-ip-range 193.125.0.0 193.125.255.255
+gtp local 172.16.32.128 2152 ue-ip-range 193.126.0.0 193.126.255.255
+gtp local 172.16.32.129 2152 ue-ip-range 193.127.0.0 193.127.255.255
+gtp local 172.16.32.130 2152 ue-ip-range 193.128.0.0 193.128.255.255
+gtp local 172.16.32.131 2152 ue-ip-range 193.129.0.0 193.129.255.255
+gtp local 172.16.32.132 2152 ue-ip-range 193.130.0.0 193.130.255.255
+gtp local 172.16.32.133 2152 ue-ip-range 193.131.0.0 193.131.255.255
+gtp local 172.16.32.134 2152 ue-ip-range 193.132.0.0 193.132.255.255
+gtp local 172.16.32.135 2152 ue-ip-range 193.133.0.0 193.133.255.255
+gtp local 172.16.32.136 2152 ue-ip-range 193.134.0.0 193.134.255.255
+gtp local 172.16.32.137 2152 ue-ip-range 193.135.0.0 193.135.255.255
+gtp local 172.16.32.138 2152 ue-ip-range 193.136.0.0 193.136.255.255
+gtp local 172.16.32.139 2152 ue-ip-range 193.137.0.0 193.137.255.255
+gtp local 172.16.32.140 2152 ue-ip-range 193.138.0.0 193.138.255.255
+gtp local 172.16.32.141 2152 ue-ip-range 193.139.0.0 193.139.255.255
+gtp local 172.16.32.142 2152 ue-ip-range 193.140.0.0 193.140.255.255
+gtp local 172.16.32.143 2152 ue-ip-range 193.141.0.0 193.141.255.255
+gtp local 172.16.32.144 2152 ue-ip-range 193.142.0.0 193.142.255.255
+gtp local 172.16.32.145 2152 ue-ip-range 193.143.0.0 193.143.255.255
+gtp local 172.16.32.146 2152 ue-ip-range 193.144.0.0 193.144.255.255
+gtp local 172.16.32.147 2152 ue-ip-range 193.145.0.0 193.145.255.255
+gtp local 172.16.32.148 2152 ue-ip-range 193.146.0.0 193.146.255.255
+gtp local 172.16.32.149 2152 ue-ip-range 193.147.0.0 193.147.255.255
+gtp local 172.16.32.150 2152 ue-ip-range 193.148.0.0 193.148.255.255
+gtp local 172.16.32.151 2152 ue-ip-range 193.149.0.0 193.149.255.255
+gtp local 172.16.32.152 2152 ue-ip-range 193.150.0.0 193.150.255.255
+gtp local 172.16.32.153 2152 ue-ip-range 193.151.0.0 193.151.255.255
+gtp local 172.16.32.154 2152 ue-ip-range 193.152.0.0 193.152.255.255
+gtp local 172.16.32.155 2152 ue-ip-range 193.153.0.0 193.153.255.255
+gtp local 172.16.32.156 2152 ue-ip-range 193.154.0.0 193.154.255.255
+gtp local 172.16.32.157 2152 ue-ip-range 193.155.0.0 193.155.255.255
+gtp local 172.16.32.158 2152 ue-ip-range 193.156.0.0 193.156.255.255
+gtp local 172.16.32.159 2152 ue-ip-range 193.157.0.0 193.157.255.255
+gtp local 172.16.32.160 2152 ue-ip-range 193.158.0.0 193.158.255.255
+gtp local 172.16.32.161 2152 ue-ip-range 193.159.0.0 193.159.255.255
+gtp local 172.16.32.162 2152 ue-ip-range 193.160.0.0 193.160.255.255
+gtp local 172.16.32.163 2152 ue-ip-range 193.161.0.0 193.161.255.255
+gtp local 172.16.32.164 2152 ue-ip-range 193.162.0.0 193.162.255.255
+gtp local 172.16.32.165 2152 ue-ip-range 193.163.0.0 193.163.255.255
+gtp local 172.16.32.166 2152 ue-ip-range 193.164.0.0 193.164.255.255
+gtp local 172.16.32.167 2152 ue-ip-range 193.165.0.0 193.165.255.255
+gtp local 172.16.32.168 2152 ue-ip-range 193.166.0.0 193.166.255.255
+gtp local 172.16.32.169 2152 ue-ip-range 193.167.0.0 193.167.255.255
+gtp local 172.16.32.170 2152 ue-ip-range 193.168.0.0 193.168.255.255
+gtp local 172.16.32.171 2152 ue-ip-range 193.169.0.0 193.169.255.255
+gtp local 172.16.32.172 2152 ue-ip-range 193.170.0.0 193.170.255.255
+gtp local 172.16.32.173 2152 ue-ip-range 193.171.0.0 193.171.255.255
+gtp local 172.16.32.174 2152 ue-ip-range 193.172.0.0 193.172.255.255
+gtp local 172.16.32.175 2152 ue-ip-range 193.173.0.0 193.173.255.255
+gtp local 172.16.32.176 2152 ue-ip-range 193.174.0.0 193.174.255.255
+gtp local 172.16.32.177 2152 ue-ip-range 193.175.0.0 193.175.255.255
+gtp local 172.16.32.178 2152 ue-ip-range 193.176.0.0 193.176.255.255
+gtp local 172.16.32.179 2152 ue-ip-range 193.177.0.0 193.177.255.255
+gtp local 172.16.32.180 2152 ue-ip-range 193.178.0.0 193.178.255.255
+gtp local 172.16.32.181 2152 ue-ip-range 193.179.0.0 193.179.255.255
+gtp local 172.16.32.182 2152 ue-ip-range 193.180.0.0 193.180.255.255
+gtp local 172.16.32.183 2152 ue-ip-range 193.181.0.0 193.181.255.255
+gtp local 172.16.32.184 2152 ue-ip-range 193.182.0.0 193.182.255.255
+gtp local 172.16.32.185 2152 ue-ip-range 193.183.0.0 193.183.255.255
+gtp local 172.16.32.186 2152 ue-ip-range 193.184.0.0 193.184.255.255
+gtp local 172.16.32.187 2152 ue-ip-range 193.185.0.0 193.185.255.255
+gtp local 172.16.32.188 2152 ue-ip-range 193.186.0.0 193.186.255.255
+gtp local 172.16.32.189 2152 ue-ip-range 193.187.0.0 193.187.255.255
+gtp local 172.16.32.190 2152 ue-ip-range 193.188.0.0 193.188.255.255
+gtp local 172.16.32.191 2152 ue-ip-range 193.189.0.0 193.189.255.255
+gtp local 172.16.32.192 2152 ue-ip-range 193.190.0.0 193.190.255.255
+gtp local 172.16.32.193 2152 ue-ip-range 193.191.0.0 193.191.255.255
+gtp local 172.16.32.194 2152 ue-ip-range 193.192.0.0 193.192.255.255
+gtp local 172.16.32.195 2152 ue-ip-range 193.193.0.0 193.193.255.255
+gtp local 172.16.32.196 2152 ue-ip-range 193.194.0.0 193.194.255.255
+gtp local 172.16.32.197 2152 ue-ip-range 193.195.0.0 193.195.255.255
+gtp local 172.16.32.198 2152 ue-ip-range 193.196.0.0 193.196.255.255
+gtp local 172.16.32.199 2152 ue-ip-range 193.197.0.0 193.197.255.255
+gtp local 172.16.32.200 2152 ue-ip-range 193.198.0.0 193.198.255.255
+gtp local 172.16.32.201 2152 ue-ip-range 193.199.0.0 193.199.255.255
+
+
+gtp core 172.16.32.201
+
+# now associate with UPF and start N sessions.
+pfcp-peer 172.16.31.2
+ tx assoc-setup-req
+ sleep 1
+ date
+
+ n 100000 session create tunend
+ wait responses
+ # All sessions established
+ date
+
+# give some time to gather counters before the tunnel is removed
+sleep 999999
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.osmo-upf-load-gen.cfg
b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.osmo-upf-load-gen.cfg
new file mode 100644
index 0000000..290d69f
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/1.osmo-upf-load-gen.cfg
@@ -0,0 +1,18 @@
+log stderr
+ logging color 1
+ logging print category-hex 0
+ logging print category 1
+ logging timestamp 0
+ logging print file basename last
+ logging print level 1
+ logging level set-all info
+ logging level lpfcp error
+
+line vty
+ no login
+ bind 127.0.0.2
+ctrl
+ bind 127.0.0.2
+
+local-addr 0.0.0.0 8806
+listen
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/configure.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/configure.sh
new file mode 100755
index 0000000..5270225
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/configure.sh
@@ -0,0 +1,17 @@
+#!/bin/bash -xe
+
+case $(hostname) in
+gtplab0)
+ IFACE_UPF="enp2s0f0np0"
+ ;;
+c240-3)
+ IFACE_UPF="ens2f0np0"
+ ;;
+*)
+ echo "UNEXPECTED HOSTNAME: $(hostname)"
+ exit 1
+ ;;
+esac
+
+sudo ip addr add 172.16.31.1/24 dev $IFACE_UPF || true
+sudo ip link set up dev $IFACE_UPF || true
diff --git
a/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/gen_gtpu_concurrent_ue_addr_range.py
b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/gen_gtpu_concurrent_ue_addr_range.py
new file mode 100755
index 0000000..926381f
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/gen_gtpu_concurrent_ue_addr_range.py
@@ -0,0 +1,52 @@
+#!/usr/bin/python3
+import argparse
+
+def inc_addr(addr_str, inc):
+ li = addr_str.split(".")
+ num_0 = (int(li[0]) << (3*8))
+ num_1 = (int(li[1]) << (2*8))
+ num_2 = (int(li[2]) << (1*8))
+ num_3 = int(li[3])
+ num = num_0 | num_1 | num_2 | num_3
+ num += inc
+ li[0] = str((num >> (3*8)) & 0xff)
+ li[1] = str((num >> (2*8)) & 0xff)
+ li[2] = str((num >> (1*8)) & 0xff)
+ li[3] = str(num & 0xff)
+ return ".".join(li)
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument('--num-streams',
+ type=int,
+ default=200000,
+ help="The number of streams (UE sessions).")
+parser.add_argument('--num-addrs',
+ type=int,
+ default=100,
+ help="The number of src IP addresses.")
+parser.add_argument('--gtp-local-port',
+ type=int,
+ default=2152,
+ help="The GTPU local port, 2152 by default")
+parser.add_argument('--gtp-local-addr',
+ type=str,
+ default='172.16.32.2',
+ help='The first GTPU local IP address in the concurrent list')
+parser.add_argument('--ue-addr',
+ type=str,
+ default='193.0.0.0',
+ help='The first UE IP address in the concurrent list')
+
+args = parser.parse_args()
+
+streams_per_tun = (args.num_streams // args.num_addrs)
+total_ue_addr_end = inc_addr(args.ue_addr, args.num_streams - 1)
+print("# num-streams: %d, num-addrs: %d, UE sessions per GTPU address: %d"
%(args.num_streams, args.num_addrs, streams_per_tun))
+print("# start UE addr: %s, end UE addr: %s" %(args.ue_addr,
total_ue_addr_end))
+
+for addr_idx in range(args.num_addrs):
+ gtp_local_addr = inc_addr(args.gtp_local_addr, addr_idx)
+ ue_addr_start = '193.%d.0.0' % addr_idx
+ ue_addr_end = inc_addr(ue_addr_start, streams_per_tun - 1)
+ print("gtp local %s\t%d ue-ip-range %s\t%s" % (gtp_local_addr,
args.gtp_local_port, ue_addr_start, ue_addr_end))
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/run.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/run.sh
new file mode 100755
index 0000000..0314edb
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/cpf/run.sh
@@ -0,0 +1,7 @@
+#!/bin/bash -xe
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &>
/dev/null && pwd )
+
+RUN_IDX=${IDX:-0}
+
+osmo-upf-load-gen -c "${SCRIPT_DIR}/${RUN_IDX}.osmo-upf-load-gen.cfg"
"${SCRIPT_DIR}/${RUN_IDX}.gtp_flood.vty"
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/topology.dot
b/testsuites/gtplab-sysmo2025/tunend-2trex/topology.dot
new file mode 100644
index 0000000..7a10319
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/topology.dot
@@ -0,0 +1,40 @@
+digraph G {
+ rankdir=TB;
+ labelloc=t;
+ label="gtplab @ sysmocom";
+
+ subgraph cluster_gtplab2 {
+ label="TRex (gtplab2)";
+ trex [label="TRex",shape=box3d];
+ gtplab2_172_32 [label="172.16.32.{2-101}/24"];
+ gtplab2_172_31 [label="172.16.31.{100-200}/24"];
+ }
+ subgraph cluster_switch {
+ label="Switch (100gb)";
+ switch_vlan1 [label="vlan1"];
+ switch_vlan2 [label="vlan2"];
+ }
+ subgraph cluster_gtplab1 {
+ label="UPF (gtplab1)";
+ gtplab1_172_31 [label="172.16.31.2/24"];
+ gtplab1_172_32 [label="172.16.32.1/24"];
+
+ upf [label="UPF\ntunend",shape=box3d];
+ }
+ subgraph cluster_gtplab0 {
+ label="CPF (gtplab0)";
+ rankdir=TB;
+ gtplab0_172_31 [label="172.16.31.1/24"];
+ pfcp_tool [label="osmo-udp-load-gen",shape=box3d];
+ }
+
+
+ pfcp_tool -> gtplab0_172_31 -> switch_vlan1 -> gtplab1_172_31 -> upf
[label="PFCP",dir=both,style=dashed,color=black];
+
+ trex -> gtplab2_172_32 -> switch_vlan2 -> gtplab1_172_32 -> upf
[label="GTPU UL (RAN)",style=bold, color=red];
+ upf -> gtplab1_172_31 -> switch_vlan1 -> gtplab2_172_31 -> trex
[label="IP UL (CN)",style=bold, color=purple];
+
+ trex -> gtplab2_172_31 -> switch_vlan1 -> gtplab1_172_31 -> upf
[label="IP DL (CN)",style=bold,color=blue];
+ upf -> gtplab1_172_32 -> switch_vlan2 -> gtplab2_172_32 -> trex
[label="GTPU DL (RAN)",style=bold,color=darkgreen];
+
+}
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/configure.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/configure.sh
new file mode 100755
index 0000000..dcc1fbb
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/configure.sh
@@ -0,0 +1,27 @@
+#!/bin/bash -xe
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &>
/dev/null && pwd )
+HOSTNAME="$(hostname)"
+
+case $HOSTNAME in
+gtplab2)
+ TREX_BIN="/opt/trex/t-rex-64"
+ ;;
+c240-*)
+ # Crashes at startup with "t-rex-64"
+ TREX_BIN="/opt/trex/t-rex-64-o"
+ ;;
+epyc1)
+ # Crashes at startup with "t-rex-64"
+ TREX_BIN="/opt/trex/t-rex-64-o"
+ ;;
+*)
+ echo "UNEXPECTED HOSTNAME: $(hostname)"
+ exit 1
+ ;;
+esac
+
+sudo sysctl -w vm.nr_hugepages=4096
+
+cd /opt/trex
+sudo $TREX_BIN -i --astf --software --tso-disable --no-scapy-server --cfg
"${SCRIPT_DIR}/trex_cfg_$HOSTNAME.yaml" --no-ofed-check -v 3
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/gtpu_topo.py
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/gtpu_topo.py
new file mode 100644
index 0000000..870ee4e
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/gtpu_topo.py
@@ -0,0 +1,52 @@
+from trex.astf.api import *
+from trex.astf.tunnels_topo import TunnelsTopo
+import argparse
+
+def calc_src_addr(addr_str, inc):
+ li = addr_str.split(".")
+ num_0 = (int(li[0]) << (3*8))
+ num_1 = (int(li[1]) << (2*8))
+ num_2 = (int(li[2]) << (1*8))
+ num_3 = int(li[3])
+ num = num_0 | num_1 | num_2 | num_3
+ num += inc
+ li[0] = str((num >> (3*8)) & 0xff)
+ li[1] = str((num >> (2*8)) & 0xff)
+ li[2] = str((num >> (1*8)) & 0xff)
+ li[3] = str(num & 0xff)
+ return ".".join(li)
+
+
+def add_tun(topo, num_streams, num_addrs, addr_offset, start_teid, tun_idx):
+ streams_per_tun = num_streams // num_addrs
+ src_gtpu_ip = calc_src_addr('172.16.32.2', addr_offset + tun_idx)
+ start_teid += tun_idx
+ teid_jump = 1*num_addrs
+ src_start = '193.%d.0.0' % (addr_offset + tun_idx)
+ src_end = calc_src_addr(src_start, streams_per_tun)
+ topo.add_tunnel_ctx(
+ src_start = src_start,
+ src_end = src_end,
+ initial_teid = start_teid,
+ teid_jump = teid_jump,
+ sport = 2152,
+ version = 4,
+ tunnel_type = 1,
+ src_ip = src_gtpu_ip,
+ dst_ip = '172.16.32.1',
+ activate = True
+ )
+
+
+def get_topo(**kwargs):
+ print("get_topo params: %r" % (kwargs))
+ num_streams = kwargs.get('num-streams', 1)
+ num_addrs = kwargs.get('num-addrs', 1)
+ addr_offset = kwargs.get('addr-offset', 0)
+ # NOTE Assume previous segments have same amount of streams as this one:
+ start_teid = kwargs.get('start-teid', 0x00000001 + ((num_streams //
num_addrs) * addr_offset))
+ topo = TunnelsTopo()
+
+ for tun_idx in range(num_addrs):
+ add_tun(topo, num_streams, num_addrs, addr_offset, start_teid, tun_idx)
+ return topo
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/run.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/run.sh
new file mode 100755
index 0000000..09836b8
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/run.sh
@@ -0,0 +1,29 @@
+#!/bin/bash -xe
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &>
/dev/null && pwd )
+
+# see
https://trex-tgn.cisco.com/trex/doc/trex_astf.html#_gtpu_traffic_tutorials
+
+ADDR_OFFSET=${ADDR_OFFSET:-0}
+NUM_STREAMS=100000
+NUM_ADDRS=100
+
+set +x
+echo "To start the test, run: >"
+echo "tunnel --type gtpu;"
+echo "tunnels_topo load -f ${SCRIPT_DIR}/gtpu_topo.py -t
num-streams=${NUM_STREAMS},num-addrs=${NUM_ADDRS},addr-offset=${ADDR_OFFSET};"
+echo "start -f ${SCRIPT_DIR}/udp_simple.py -m 50000 -d 600 -t
num-streams=${NUM_STREAMS},num-addrs=${NUM_ADDRS},addr-offset=${ADDR_OFFSET},num-pkts-ul=1,num-pkts-dl=1,dir=ul;"
+echo ""
+printf "Once the test finished, run: >\ntunnel --type gtpu --off;\n
stats\n"
+set -x
+# Needs to be executed from /opt/trex ...
+cd /opt/trex/
+/opt/trex/trex-console
+
+# Troubleshooting:
+# > portattr
+# > service
+# > ping -p 0 -d 172.16.32.1 -n 3
+# > ping -p 1 -d 172.16.31.2 -n 3
+# > service --off
+# > tunnels_topo show
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-1.yaml
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-1.yaml
new file mode 100644
index 0000000..87be35c
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-1.yaml
@@ -0,0 +1,24 @@
+### Config file generated by dpdk_setup_ports.py ###
+
+- version: 2
+ interfaces: ['5e:00.0', '5e:00.1']
+ c: 18
+ rx_desc: 4096
+ tx_desc: 4096
+ port_info:
+ - ip: 172.16.32.2
+ default_gw: 172.16.32.1
+ - ip: 172.16.31.200
+ default_gw: 172.16.31.2
+
+ platform:
+ master_thread_id: 0
+ latency_thread_id: 1
+ dual_if:
+ - socket: 0
+ threads: [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
+
+ memory:
+ mbuf_2048: 128000
+ global: 256000
+
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-2.yaml
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-2.yaml
new file mode 100644
index 0000000..638bde3
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_c240-2.yaml
@@ -0,0 +1,24 @@
+### Config file generated by dpdk_setup_ports.py ###
+
+- version: 2
+ interfaces: ['5e:00.0', '5e:00.1']
+ c: 18
+ rx_desc: 4096
+ tx_desc: 4096
+ port_info:
+ - ip: 172.16.32.254
+ default_gw: 172.16.32.1
+ - ip: 172.16.31.201
+ default_gw: 172.16.31.2
+
+ platform:
+ master_thread_id: 0
+ latency_thread_id: 1
+ dual_if:
+ - socket: 0
+ threads: [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
+
+ memory:
+ mbuf_2048: 128000
+ global: 256000
+
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_epyc1.yaml
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_epyc1.yaml
new file mode 100644
index 0000000..4f38c55
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_epyc1.yaml
@@ -0,0 +1,24 @@
+### Config file generated by dpdk_setup_ports.py ###
+
+- version: 2
+ interfaces: ['81:00.0', '81:00.1']
+ c: 22
+ rx_desc: 4096
+ tx_desc: 4096
+ port_info:
+ - ip: 172.16.32.2
+ default_gw: 172.16.32.1
+ - ip: 172.16.31.200
+ default_gw: 172.16.31.2
+
+ platform:
+ master_thread_id: 0
+ latency_thread_id: 1
+ dual_if:
+ - socket: 0
+ threads: [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]
+
+ memory:
+ mbuf_2048: 128000
+ global: 256000
+
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_gtplab2.yaml
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_gtplab2.yaml
new file mode 100644
index 0000000..4a4e02b
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/trex_cfg_gtplab2.yaml
@@ -0,0 +1,24 @@
+### Config file generated by dpdk_setup_ports.py ###
+
+- version: 2
+ interfaces: ['02:00.0', '02:00.1']
+ c: 10
+ rx_desc: 4096
+ tx_desc: 4096
+ port_info:
+ - ip: 172.16.32.2
+ default_gw: 172.16.32.1
+ - ip: 172.16.31.200
+ default_gw: 172.16.31.2
+
+ platform:
+ master_thread_id: 0
+ latency_thread_id: 1
+ dual_if:
+ - socket: 0
+ threads: [2,3,4,5,6,7,8,9,10,11]
+
+ memory:
+ mbuf_2048: 128000
+ global: 256000
+
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/trex/udp_simple.py
b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/udp_simple.py
new file mode 100644
index 0000000..ac8fb82
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/trex/udp_simple.py
@@ -0,0 +1,113 @@
+from trex.astf.api import *
+import argparse
+
+ul_pkt = (1400*'x')
+dl_pkt = (1400*'y')
+
+class Prof1():
+ def __init__(self):
+ pass
+
+ def calc_src_addr(self, addr_str, inc):
+ li = addr_str.split(".")
+ num_0 = (int(li[0]) << (3*8))
+ num_1 = (int(li[1]) << (2*8))
+ num_2 = (int(li[2]) << (1*8))
+ num_3 = int(li[3])
+ num = num_0 | num_1 | num_2 | num_3
+ num += inc
+ li[0] = str((num >> (3*8)) & 0xff)
+ li[1] = str((num >> (2*8)) & 0xff)
+ li[2] = str((num >> (1*8)) & 0xff)
+ li[3] = str(num & 0xff)
+ return ".".join(li)
+
+ def create_ip_gen(self, prog_c, prog_s, addr_idx):
+ # ip generator
+ start_ms_addr = "193.%d.0.0" % (self.addr_offset + addr_idx)
+ end_ms_addr = self.calc_src_addr(start_ms_addr, (self.num_streams //
self.num_addrs) - 1)
+ start_srv_addr = "48.%d.0.1" % (self.addr_offset)
+ end_srv_addr = self.calc_src_addr(start_srv_addr, self.num_addrs - 1)
+ ip_gen_c = ASTFIPGenDist(ip_range=[start_ms_addr, end_ms_addr],
distribution="seq")
+ ip_gen_s = ASTFIPGenDist(ip_range=[start_srv_addr, end_srv_addr],
distribution="seq")
+ ip_gen = ASTFIPGen(glob=ASTFIPGenGlobal(ip_offset="1.0.0.0"),
+ dist_client=ip_gen_c,
+ dist_server=ip_gen_s)
+ return ip_gen
+
+ def create_template(self, prog_c, prog_s, addr_idx):
+ # ip generator
+ ip_gen = self.create_ip_gen(prog_c, prog_s, addr_idx)
+ # template
+ srv_port = 80 + addr_idx
+ temp_c = ASTFTCPClientTemplate(program=prog_c, ip_gen=ip_gen, port=srv_port)
+ temp_s = ASTFTCPServerTemplate(program=prog_s,
assoc=ASTFAssociation(rules=ASTFAssociationRule(port=srv_port)))
+ template = ASTFTemplate(client_template=temp_c, server_template=temp_s,
tg_name='latency')
+ return template
+
+ def get_profile(self, tunables, **kwargs):
+ parser = argparse.ArgumentParser(description='Argparser for
{}'.format(os.path.basename(__file__)),
+
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ parser.add_argument('--num-streams',
+ type=int,
+ default=1,
+ help="The number of streams.")
+ parser.add_argument('--num-addrs',
+ type=int,
+ default=1,
+ help="The number of src IP addresses.")
+ parser.add_argument('--addr-offset',
+ type=int,
+ default=0,
+ help="Start index assigning --num-addrs
addresses.")
+ parser.add_argument('--num-pkts-ul',
+ type=int,
+ default=1,
+ help="The number of UL Packets to transmit per
flow.")
+ parser.add_argument('--num-pkts-dl',
+ type=int,
+ default=1,
+ help="The number of DL Packets to transmit per
flow.")
+ parser.add_argument('--dir',
+ type=str,
+ default='ul',
+ choices={'ul', 'dl', 'uldl'},
+ help='')
+ args = parser.parse_args(tunables)
+ self.num_streams = args.num_streams
+ self.num_addrs = args.num_addrs
+ self.addr_offset = args.addr_offset
+ self.num_pkts_ul = args.num_pkts_ul
+ self.num_pkts_dl = args.num_pkts_dl
+ do_ul = "ul" in args.dir.lower()
+ do_dl = "dl" in args.dir.lower()
+
+ # client commands
+ prog_c = ASTFProgram(stream=False, udp_mtu=1400, addon='latency')
+ if do_ul:
+ for _ in range(self.num_pkts_ul):
+ prog_c.send_msg(ul_pkt)
+ if do_dl:
+ prog_c.set_keepalive_msg(10000)
+ prog_c.recv_msg(self.num_pkts_dl)
+
+ prog_s = ASTFProgram(stream=False, udp_mtu=1400, addon='latency')
+ if do_ul:
+ prog_s.set_keepalive_msg(10000)
+ prog_s.recv_msg(self.num_pkts_ul)
+ if do_dl:
+ for _ in range(self.num_pkts_dl):
+ prog_s.send_msg(dl_pkt)
+
+ # Not really used, but must be passed to ASTFProfile:
+ default_ip_gen = self.create_ip_gen(prog_c, prog_s, 0)
+
+ templates = []
+ for addr_idx in range(self.num_addrs):
+ templates.append(self.create_template(prog_c, prog_s, addr_idx = addr_idx))
+
+ return ASTFProfile(default_ip_gen=default_ip_gen, templates=templates)
+
+def register():
+ return Prof1()
+
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/configure.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/configure.sh
new file mode 100755
index 0000000..7fff94b
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/configure.sh
@@ -0,0 +1,88 @@
+#!/bin/bash -xe
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &>
/dev/null && pwd )
+
+NUM_ENB=100
+# Interface towards UPF:
+ADDR_GW_CN="172.16.31.200"
+
+case $(hostname) in
+gtplab1)
+ IFACE_RAN="enp2s0f1np1"
+ IFACE_CN="enp2s0f0np0"
+ MAC_RAN_PEER="ec:0d:9a:8a:27:52"
+ MAC_CN_PEER="ec:0d:9a:8a:27:53"
+ ;;
+c240-2)
+ IFACE_RAN="ens2f0np0"
+ IFACE_CN="ens2f1np1"
+ # TRex peer is epyc1's Mellanox NIC:
+ MAC_RAN_PEER="b8:ce:f6:fe:62:e0"
+ MAC_CN_PEER="b8:ce:f6:fe:62:e1"
+ # Adapt Rx/Tx Queues and IRQs to Numa Node of device:
+ # cat /sys/class/net/$IFACE_RAN/device/numa_node
+ # 0
+ # cat /sys/class/net/$IFACE_RAN/device/local_cpulist
+ # 0-19
+ sudo ethtool -L $IFACE_RAN combined 20
+ sudo ethtool -L $IFACE_CN combined 20
+ sudo "$SCRIPT_DIR/../../../../../scripts/set_irq_affinity_cpulist.sh"
0-19 $IFACE_RAN
+ sudo "$SCRIPT_DIR/../../../../../scripts/set_irq_affinity_cpulist.sh"
0-19 $IFACE_CN
+ ;;
+epyc1)
+ IFACE_RAN="enp129s0f0np0"
+ IFACE_CN="enp129s0f1np1"
+ # TRex peer is c240-1 Mellanox NIC:
+ MAC_RAN_PEER="88:e9:a4:3b:f0:48"
+ MAC_CN_PEER="88:e9:a4:3b:f0:49"
+ ;;
+*)
+ echo "UNEXPECTED HOSTNAME: $(hostname)"
+ exit 1
+ ;;
+esac
+
+# Disable ethernet flow control:
+sudo ethtool -A $IFACE_RAN autoneg off rx off tx off
+sudo ethtool -A $IFACE_CN autoneg off rx off tx off
+# Disable GRO / LRO:
+sudo ethtool -K $IFACE_RAN gro off lro off
+sudo ethtool -K $IFACE_CN gro off lro off
+# Increase NIC buffers:
+sudo ethtool -G $IFACE_RAN rx 8192 tx 8192
+sudo ethtool -G $IFACE_CN rx 8192 tx 8192
+
+# Enable IP forwarding:
+sudo sysctl -w net.ipv4.ip_forward=1
+
+# Increase UDP buffer memory:
+sudo sysctl -w net.ipv4.udp_mem="763563 900000000 1000000000"
+sudo sysctl -w net.core.optmem_max=16000000
+sudo sysctl -w net.core.rmem_max=2000000000
+sudo sysctl -w net.core.rmem_default=2000000000
+sudo sysctl -w net.core.wmem_max=2000000000
+sudo sysctl -w net.core.wmem_default=2000000000
+sudo sysctl -w net.core.netdev_max_backlog=2000
+sudo sysctl -w net.core.netdev_budget=600
+
+# Set up UPF address:
+sudo ip addr add 172.16.32.1/24 dev $IFACE_RAN || true
+sudo ip link set up dev $IFACE_RAN || true
+sudo ip addr add 172.16.31.2/24 dev $IFACE_CN || true
+sudo ip link set up dev $IFACE_CN || true
+
+# TRex doesn't answer ARPs, so we need to set up the peers:
+for i in $(seq "2" "$((NUM_ENB + 1))"); do
+ # Delete needed to potentially drop incomplet entries created when trying to Tx
traffic:
+ sudo ip neigh del "$(printf "172.16.32.%u" "$i")"
lladdr $MAC_RAN_PEER nud permanent dev $IFACE_RAN || true
+ sudo ip neigh add "$(printf "172.16.32.%u" "$i")"
lladdr $MAC_RAN_PEER nud permanent dev $IFACE_RAN || true
+done
+sudo ip neigh del 172.16.31.200 lladdr $MAC_CN_PEER nud permanent dev $IFACE_CN || true
+sudo ip neigh add 172.16.31.200 lladdr $MAC_CN_PEER nud permanent dev $IFACE_CN || true
+
+# Add route towards HTTP server on the CN side, aka "the Internet"
+sudo ip route add 48.0.0.0/16 via $ADDR_GW_CN dev $IFACE_CN || true
+
+# Apply host specific iface names:
+sed -i "s/TEMPLATE_IFACE_RAN/$IFACE_RAN/g" "${SCRIPT_DIR}/eupf.yaml"
+sed -i "s/TEMPLATE_IFACE_CN/$IFACE_CN/g" "${SCRIPT_DIR}/eupf.yaml"
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/eupf.yaml
b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/eupf.yaml
new file mode 100644
index 0000000..3f7326b
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/eupf.yaml
@@ -0,0 +1,15 @@
+interface_name: [TEMPLATE_IFACE_RAN, TEMPLATE_IFACE_CN]
+xdp_attach_mode: native
+api_address: :8080
+pfcp_address: 172.16.31.2:8805
+pfcp_node_id: 172.16.31.2
+metrics_address: :9090
+n3_address: 172.16.32.1
+n9_address: 172.16.31.2
+qer_map_size: 4000000
+far_map_size: 4000000
+pdr_map_size: 4000000
+feature_ueip: false
+feature_ftup: true
+teid_pool: 4000000
+logging_level: 2
\ No newline at end of file
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/run.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/run.sh
new file mode 100755
index 0000000..1532b76
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/eupf/run.sh
@@ -0,0 +1,5 @@
+#!/bin/bash -xe
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &>
/dev/null && pwd )
+
+sudo eupf --config "$SCRIPT_DIR/eupf.yaml"
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/configure.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/configure.sh
new file mode 100755
index 0000000..36dfef5
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/configure.sh
@@ -0,0 +1,121 @@
+#!/bin/bash -xe
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &>
/dev/null && pwd )
+
+NUM_ENB=200
+
+NUM_SEGMENTS=2
+NUM_ENB_SEGMENT=$((NUM_ENB / NUM_SEGMENTS))
+
+# Interface towards UPF:
+IFACE_APN="apn-flood"
+ADDR_GW_CN="172.16.31.200"
+ADDR_GW_CN2="172.16.31.201"
+case $(hostname) in
+gtplab1)
+ IFACE_RAN="enp2s0f1np1"
+ IFACE_CN="enp2s0f0np0"
+ MAC_RAN_PEER="ec:0d:9a:8a:27:52"
+ MAC_CN_PEER="ec:0d:9a:8a:27:53"
+ ;;
+c240-2)
+ IFACE_RAN="ens2f0np0"
+ IFACE_CN="ens2f1np1"
+ # TRex peer is epyc1's Mellanox NIC:
+ MAC_RAN_PEER="b8:ce:f6:fe:62:e0"
+ MAC_CN_PEER="b8:ce:f6:fe:62:e1"
+ # Adapt Rx/Tx Queues and IRQs to Numa Node of device:
+ # cat /sys/class/net/$IFACE_RAN/device/numa_node
+ # 0
+ # cat /sys/class/net/$IFACE_RAN/device/local_cpulist
+ # 0-19
+ sudo ethtool -L $IFACE_RAN combined 20
+ sudo ethtool -L $IFACE_CN combined 20
+ sudo "$SCRIPT_DIR/../../../../../scripts/set_irq_affinity_cpulist.sh"
0-19 $IFACE_RAN
+ sudo "$SCRIPT_DIR/../../../../../scripts/set_irq_affinity_cpulist.sh"
0-19 $IFACE_CN
+ ;;
+epyc1)
+ IFACE_RAN="enp129s0f0np0"
+ IFACE_CN="enp129s0f1np1"
+ # TRex peer is c240-1 Mellanox NIC:
+ MAC_RAN_PEER="88:e9:a4:3b:f0:48"
+ MAC_CN_PEER="88:e9:a4:3b:f0:49"
+ # TRex peer is c240-2 Mellanox NIC:
+ MAC_RAN_PEER2="88:e9:a4:3b:21:38"
+ MAC_CN_PEER2="88:e9:a4:3b:21:39"
+ ;;
+*)
+ echo "UNEXPECTED HOSTNAME: $(hostname)"
+ exit 1
+ ;;
+esac
+
+setup_arp_enb() {
+ local enb_offset="$1"
+ local iface_ran="$2"
+ local mac_ran_peer="$3"
+ local enb_start="$((2 + enb_offset))"
+ local enb_end="$((enb_start + NUM_ENB_SEGMENT - 1))"
+ # TRex doesn't answer ARPs, so we need to set up the peers:
+ for i in $(seq "$enb_start" "$enb_end"); do
+ local ip_addr
+ ip_addr="$(printf "172.16.32.%u" "$i")"
+ # Delete needed to potentially drop incomplete entries created when
trying to Tx traffic:
+ sudo ip neigh del "$ip_addr" lladdr "$mac_ran_peer"
nud permanent dev "$iface_ran" || true
+ sudo ip neigh add "$ip_addr" lladdr "$mac_ran_peer"
nud permanent dev "$iface_ran" || true
+ done
+}
+
+setup_arp_cn() {
+ local cn_ip_addr="$1"
+ local iface_cn="$2"
+ local mac_cn_peer="$3"
+ sudo ip neigh del "$cn_ip_addr" lladdr "$mac_cn_peer" nud
permanent dev "$iface_cn" || true
+ sudo ip neigh add "$cn_ip_addr" lladdr "$mac_cn_peer" nud
permanent dev "$iface_cn" || true
+}
+
+# Disable ethernet flow control:
+sudo ethtool -A $IFACE_RAN autoneg off rx off tx off
+sudo ethtool -A $IFACE_CN autoneg off rx off tx off
+# Disable GRO / LRO:
+sudo ethtool -K $IFACE_RAN gro off lro off
+sudo ethtool -K $IFACE_CN gro off lro off
+# Increase NIC buffers:
+sudo ethtool -G $IFACE_RAN rx 8192 tx 8192
+sudo ethtool -G $IFACE_CN rx 8192 tx 8192
+
+# Enable IP forwarding:
+sudo sysctl -w net.ipv4.ip_forward=1
+
+# Increase UDP buffer memory:
+sudo sysctl -w net.ipv4.udp_mem="763563 900000000 1000000000"
+sudo sysctl -w net.core.optmem_max=16000000
+sudo sysctl -w net.core.rmem_max=2000000000
+sudo sysctl -w net.core.rmem_default=2000000000
+sudo sysctl -w net.core.wmem_max=2000000000
+sudo sysctl -w net.core.wmem_default=2000000000
+sudo sysctl -w net.core.netdev_max_backlog=2000
+sudo sysctl -w net.core.netdev_budget=600
+
+# Set up UPF address:
+sudo ip addr add 172.16.32.1/24 dev $IFACE_RAN || true
+sudo ip link set up dev $IFACE_RAN || true
+sudo ip addr add 172.16.31.2/24 dev $IFACE_CN || true
+sudo ip link set up dev $IFACE_CN || true
+
+# TRex doesn't answer ARPs, so we need to set up the peers:
+setup_arp_enb 0 "$IFACE_RAN" "$MAC_RAN_PEER"
+setup_arp_enb "$NUM_ENB_SEGMENT" "$IFACE_RAN"
"$MAC_RAN_PEER2"
+
+setup_arp_cn "$ADDR_GW_CN" "$IFACE_CN" "$MAC_CN_PEER"
+setup_arp_cn "$ADDR_GW_CN2" "$IFACE_CN" "$MAC_CN_PEER2"
+
+# Add route towards HTTP server on the CN side, aka "the Internet"
+sudo ip route del 48.0.0.0/16 via $ADDR_GW_CN dev $IFACE_CN || true
+sudo ip route add 48.0.0.0/16 via $ADDR_GW_CN dev $IFACE_CN || true
+sudo ip route del 48.$NUM_ENB_SEGMENT.0.0/16 via $ADDR_GW_CN2 dev $IFACE_CN || true
+sudo ip route add 48.$NUM_ENB_SEGMENT.0.0/16 via $ADDR_GW_CN2 dev $IFACE_CN || true
+
+# Set up UE IP routes:
+# FIXME: This one below need to be done *after* osmo-upf creates the iface....
+sudo ip route add 193.0.0.0/8 dev $IFACE_APN
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/osmo-upf.cfg
b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/osmo-upf.cfg
new file mode 100644
index 0000000..3ba93db
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/osmo-upf.cfg
@@ -0,0 +1,29 @@
+log stderr
+ logging filter all 1
+ logging color 1
+ logging print category-hex 0
+ logging print category 1
+ logging timestamp 0
+ logging print file basename last
+ logging print level 1
+ logging level set-all notice
+ logging level set-all info
+ logging level session debug
+ logging level nft debug
+ logging level gtp debug
+ logging level set-all error
+
+line vty
+ bind 127.0.0.1
+ctrl
+ bind 127.0.0.1
+
+timer pfcp x24 5000
+timer nft x32 100
+timer nft x33 100
+pfcp
+ local-addr 172.16.31.2
+tunend
+ dev create apn-flood 172.16.32.1
+netinst
+ add netinst-flood 172.16.32.1
diff --git a/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/run.sh
b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/run.sh
new file mode 100755
index 0000000..6a9f679
--- /dev/null
+++ b/testsuites/gtplab-sysmo2025/tunend-2trex/upf/osmo-upf/run.sh
@@ -0,0 +1,9 @@
+#!/bin/bash -xe
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &>
/dev/null && pwd )
+
+sudo osmo-upf -c "$SCRIPT_DIR/osmo-upf.cfg"
+
+# TODO: Route needs to be set up manually on the tun iface once it becomes created, since
osmo-upf is not yet doing it (OS#6585).
+# For now, run this manually after starting osmo-upf with the current run.sh script:
+# ip route add 193.0.0.0/8 dev apn-flood
--
To view, visit
https://gerrit.osmocom.org/c/upf-benchmark/+/40339?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: upf-benchmark
Gerrit-Branch: master
Gerrit-Change-Id: I6dcc3a27ef61857c05ab8d5cb67cceab5bb3dffa
Gerrit-Change-Number: 40339
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>