Tested in Unix (ubuntu)
## Step 1: Download source codecd {GOLDEN_UNIT_ROOT} gitclonehttps://github.com/geodranas/golden_unit.git# Step 2: Install perfsonar (OWAMP/TWAMP)sudosnapinstallcurlsudosucurl-shttps://downloads.perfsonar.net/install|sh-s-toolssudoaptinstallperfsonar-toolssudoaptinstallowamp-serversudoaptinstallowamp-clientsudoaptinstalltwamp-serversudoaptinstalltwamp-clientexit# Step 3: Install iperfsudoapt-getinstalliperf3# Step 4: Install wiresharksudoaptinstalltsharksudoapt-getinstallwiresharksudodpkg-reconfigurewireshark-commonsudousermod-a-Gwireshark $USER# Step 5: Install and activate dockersudoapt-getinstalldocker# if it fails, try with docker.iosudogroupadddockersudogpasswd-a $USERdockersudoreboot# Step 6: Install udp-pingcd/{GOLDEN_UNIT_ROOT}/golden_unit/clientgitclonehttps://github.com/EricssonResearch/udp-ping.gitsudoapt-getinstallbuild-essentialsudoapt-getinstalllibboost-program-options-devsudoapt-getinstallcmakecd/{GOLDEN_UNIT_ROOT}/golden_unit/client/udp-pingg++-oudpServerudpServer.cpp-lboost_program_optionsg++-oudpClientudpClient.cpp-lboost_program_options# Step 7: Install Python/Anaconda (recommended)<installanaconda>condacreate--namegolden_unitpython=3.8condaactivategolden_unitpipinstalliperf3pysharkpandasdockericmplibpyserialpipinstallpaho-mqttdashdash-bootstrap-componentsmatplotlibfsspec# Step 8: Build Client-side docker imagescd {GOLDEN_UNIT_ROOT}/golden_unit/client/client_streamdockerbuild-tclient_stream .
cd {GOLDEN_UNIT_ROOT}/golden_unit/client/client_mqttdockerbuild-tclient_mqtt .
dockerimages# you should see all images generated# Repeat Steps: 1-7 from client-side installation# (optional) Step 2: Disable firewalls if exposure of interfaces is blockedsudoufwdisable# Step 3: Server-side docker imagescd {GOLDEN_UNIT_ROOT}/golden_unit/server/server_streamdockerbuild-tserver_stream .
dockerimages# you should see all images generated# Terminal 1: Activate iperfiperf3--server# Terminal 2: Activate udp-pingcd/{GOLDEN_UNIT_ROOT}/golden_unit/server/udp-ping
./udpServer# Terminal 3: Activate OWAMP/TWAMP
(normallynoactionisrequiredintheserver-side)# Terminal 4: Activate Dockers at server-sidedockerrun-d--rm-p1883:1883-p8883:8883--namenanomqemqx/nanomq:latestdockerrun-it--rm-eENV_SERVER_IP={GOLDEN_UNIT_CLIENT_IP} -eENV_SERVER_PORT=8888--network=bridgeserver_stream
(thestreamerimageneedstoberegularlycheckedandoccasionallyrestarted-checklogs)The EaaS deployment runs:
qoscope-measurement-toolsiperf3server on TCP/UDP5201udp-pingserver on UDP1234
NanoMQ- MQTT broker on TCP
1883 - MQTTS on TCP
8883
- MQTT broker on TCP
qoscope-server-stream- UL video receiver logic
- connects to the UE/video-source IP and port
The Helm chart expects the following images:
ghcr.io/feron-tech/qoscope-measurement-tools:latest
ghcr.io/feron-tech/qoscope-server-stream:latest
emqx/nanomq:latest
Edit:
eaas/application/Artifacts/MCIOPs/qoscope-server/values.yamlImportant fields:
images:
measurementTools: ghcr.io/feron-tech/qoscope-measurement-tools:latestserverStream: ghcr.io/feron-tech/qoscope-server-stream:latestnanomq: emqx/nanomq:latestvideo:
sourceIP: "<UE_REACHABLE_IP>"sourcePort: "8888"services:
iperfNodePortTcp: 32101iperfNodePortUdp: 32102udpPingNodePort: 32103mqttNodePort: 32104mqttsNodePort: 32105video.sourceIP must be set to the reachable UE/video-source IP.
After changing values.yaml, rebuild the Helm .tgz:
cd eaas/application/Artifacts/MCIOPs
helm package qoscope-serverThis creates:
qoscope-server-0.1.0.tgz
The EaaS application package should include:
application/
├── QoSCOPEApplication.yaml
├── QoSCOPEApplication.mf
└── Artifacts/
└── MCIOPs/
└── qoscope-server-0.1.0.tgz
The application YAML must reference:
mciopId: Artifacts/MCIOPs/qoscope-server-0.1.0.tgzThen zip the application folder according to the EaaS example format:
cd eaas/application
zip -r app.zip QoSCOPEApplication.yaml QoSCOPEApplication.mf Artifacts/Upload app.zip to the EaaS platform.
# Terminal 1: Set root dir & activate toolcd/{GOLDEN_UNIT_ROOT}/golden_unit/nanogparams.py# (settings)<setyour"ROOT_DIR"dependingonyourOS><disable"LOCAL_TEST"flag><saveandexit># Terminal 2: Initiate backendcd/{GOLDEN_UNIT_ROOT}/golden_unit/# check that conda env is activatedpythonmain_backend.py
(notethatexistingDockercontainerswillberemoved)# Terminal 3: Enable PHY layer measurementscd/{GOLDEN_UNIT_ROOT}/golden_unit/
{ROOT}/envs/golden_unit/bin/pythonphysical.py# use python bin to run physical.py script# Terminal 4: Initiate GUIcd/{GOLDEN_UNIT_ROOT}/golden_unit/# check that conda env is activatedpythonmain_gui.pyBaseline statistics
- Requires at least 2 experiments for visualization
- Live (aggregated) stats
- Mean packet throughput - TCP (UL/DL) from iperf3
- Mean packet throughput - UDP from iperf3
- Packet RTT & Jitter from icmp ping
Application-specific statistics
- Requires at least 2 experiments for visualization
- Live (aggregated) stats
- Mean throughput for each application
- Mean RTT for each application
Event log
- Shows information in regards to the campaign's progress
Save stats button
- Downloads raw experiment data (packet-level)
- This might require several mins depending on the experiment's settings
# Method 1DownloadfromGUIatclientside: "Save stats"button# Method 2cd/{GOLDEN_UNIT_ROOT}/golden_unit/#At client-side<resultsareshowninthe"db"folder>- File: iperf.json
- Stats frequency: per iperf experiment
| Feature | Description |
|---|---|
| camp_name | Measurement campaign name |
| repeat_id | Repetition ID (if campaign is repeated) |
| exp_id | Campaign's experiment ID (if campaign includes several experiments) |
| timestamp | UNIX timestamp of the measurement |
| tcp_dl_retransmits | iperf TCP Downlink - # retransmissions |
| tcp_dl_sent_bps | iperf TCP Downlink - sent rate (bps) |
| tcp_dl_sent_bytes | iperf TCP Downlink - sent payload (bytes) |
| tcp_dl_received_bps | iperf TCP Downlink - received rate (bps) |
| tcp_dl_received_bytes | iperf TCP Downlink - received payload (bytes) |
| tcp_ul_retransmits | iperf TCP Uplink - # retransmissions |
| tcp_ul_sent_bps | iperf TCP Uplink - sent rate (bps) |
| tcp_ul_sent_bytes | iperf TCP Uplink - sent payload (bytes) |
| tcp_ul_received_bps | iperf TCP Uplink - received rate (bps) |
| tcp_ul_received_bytes | iperf TCP Uplink - received payload (bytes) |
| udp_dl_bytes | iperf UDP Downlink - payload (bytes) |
| udp_dl_bps | iperf UDP Downlink - rate (bps) |
| udp_dl_jitter_ms | iperf UDP Downlink - jitter (ms) |
| udp_dl_lost_percent | iperf UDP Downlink - lost packet percentage (%) |
| udp_ul_bytes | iperf UDP Uplink - payload (bytes) |
| udp_ul_bps | iperf UDP Uplink - rate (bps) |
| udp_ul_jitter_ms | iperf UDP Uplink - jitter (ms) |
| udp_ul_lost_percent | iperf UDP Uplink - lost packet percentage (%) |
- File: icmp.json
- Stats frequency: per icmp experiment
| Feature | Description |
|---|---|
| camp_name | Measurement campaign name |
| repeat_id | Repetition ID (if campaign is repeated) |
| exp_id | Campaign's experiment ID (if campaign includes several experiments) |
| timestamp | UNIX timestamp of the measurement |
| min_rtt_ms | minimum round-trip-time of all packets (ms) |
| avg_rtt_ms | average round-trip-time of all packets (ms) |
| max_rtt_ms | maximum round-trip-time of all packets (ms) |
| rtts_ms | round-trip-times for all packets (ms) |
| packets_sent | total packets sent |
| packets_received | total packets received |
| packet_loss_0to1 | packet loss ratio (minimum 0, maximum 1) |
| jitter_ms | total jitter (standard deviation of rtt in ms) |
- File: udpping.json
- Stats frequency: per packet
| Feature | Description |
|---|---|
| camp_name | Measurement campaign name |
| repeat_id | Repetition ID (if campaign is repeated) |
| exp_id | Campaign's experiment ID (if campaign includes several experiments) |
| timestamp | UNIX timestamp of the measurement |
| seq_nr | sequency (packet) number |
| send_time | send timestamp |
| server_time | server timestamp |
| receive_time | receive timestamp |
| client2server_ns | client-to-server delay (ns) |
| server2client_ns | server-to-client delay (ns) |
| rtt_ns | round-trip delay (ns) |
- File: owamp.json
- Stats frequency: per packet
| Feature | Description |
|---|---|
| camp_name | Measurement campaign name |
| repeat_id | Repetition ID (if campaign is repeated) |
| exp_id | Campaign's experiment ID (if campaign includes several experiments) |
| timestamp | UNIX timestamp of the measurement |
| seq_nr | sequence number (unsigned long) |
| tx_time | sendtime (owptimestamp - PRIu64) |
| tx_sync | send synchronized flag (boolean unsigned) |
| tx_err_perc | send err estimate (float %) |
| rx_time | recvtime (owptimestamp - PRIu64) |
| rx_sync | recv synchronized flag (boolean unsigned) |
| rx_err_perc | recv err estimate (float %) |
| ttl | ttl (unsigned short) |
| direction | direction (ul/dl) aka client to/from server (string) |
- File: owamp.json
- Stats frequency: per packet
| Feature | Description |
|---|---|
| camp_name | Measurement campaign name |
| repeat_id | Repetition ID (if campaign is repeated) |
| exp_id | Campaign's experiment ID (if campaign includes several experiments) |
| timestamp | UNIX timestamp of the measurement |
| tx_seq_nr | send sequence number (unsigned long) |
| tx_time | sendtime (owptimestamp - PRIu64) |
| tx_sync | send synchronized flag (boolean unsigned) |
| tx_err_perc | send err estimate (float %) |
| tx_rx_time | send (receive) time (owptimestamp - PRIu64) |
| tx_rx_sync | send (receive) synchronized flag (boolean unsigned) |
| tx_rx_err_perc | send (receive) err estimate (float %) |
| tx_ttl | send ttl (unsigned short) |
| reflect_seq_nr | reflect sequence number (unsigned long) |
| reflect_tx_time | reflected (send) time (owptimestamp - PRIu64) |
| reflect_tx_sync | reflected (send) synchronized (boolean unsigned) |
| reflect_tx_err_perc | reflected (send) err estimate (float %) |
| rx_time | recvtime (owptimestamp - PRIu64) |
| rx_sync | recv synchronized flag (boolean unsigned) |
| rx_err_perc | recv err estimate (float %g) |
| reflect_ttl | reflected ttl (unsigned short) |
- File: app.json
- Stats frequency: per application per packet
| Feature | Description |
|---|---|
| camp_name | Measurement campaign name |
| repeat_id | Repetition ID (if campaign is repeated) |
| exp_id | Campaign's experiment ID (if campaign includes several experiments) |
| timestamp | UNIX timestamp of the measurement |
| app_name | application name (string) |
| pack_id | packet id (wireshark) |
| sniff_time | sniffing time (wireshark) |
| sniff_timestamp | sniffing timestamp (wireshark) |
| protocol | packet protocol (TCP, UDP, ICMP, etc.) |
| pack_len_bytes | packet length (bytes) |
| addr_src | source IP address |
| port_src | source port |
| addr_dest | destination IP address |
| port_dest | destination port |
| rtt | round-trip-time (sec) |
| drop_flag | if packet is lost (boolean) |
- File: gui_app.json
- Stats frequency: per experiment (aggregated app statistics)
| Feature | Description |
|---|---|
| RTT (msec) | Mean Round-trip-time of all application packets (msec) |
| app_name | Application name |
| Throughput (Mbps) | Application throughput during the experiment(Mbps) |
| timestamp | Measurement UNIX timestamp |
- File: phy.json
- Stats frequency: serial connection (async w.r.t. to the experiment)
| Feature | Description |
|---|---|
| camp_name | Measurement campaign name |
| timestamp | UNIX timestamp |
| mode_pref | RAN mode (LTE/5G) |
| oper | Operator |
| act | Operator response |
| apn | APN |
| resp1 | APN response |
| rssi | RSSI |
| ber | Bit-error rate |
| qrsrp_prx | QRSRP |
| qrsrp_drx | QRSRP |
| qrsrp_rx2 | QRSRP |
| qrsrp_rx3 | QRSRP |
| qrsrp_sysmode | QRSRP |
| rsrq_prx | RSRQ |
| rsrq_drx | RSRQ |
| rsrq_rx2 | RSRQ |
| rsrq_rx3 | RSRQ |
| rsrq_sysmode | RSRQ |
| sinr_prx | SINR |
| sinr_drx | SINR |
| sinr_rx2 | SINR |
| sinr_rx3 | SINR |
| sinr_sysmode | SINR |
| net_info | Network param info |
| serving_cell_info | Serving cell param info |
- File: phy_raw.json
- Raw responses of the modem's AT cmds
- File: in_user.json
- File: out_log.json
- https://docs.perfsonar.net/manage_regular_tests.html
- https://github.com/perfsonar/owamp
- https://github.com/nokia/twampy
- https://github.com/emirica/twamp-protocol
- https://github.com/perfsonar/toolkit
- https://data.mendeley.com/datasets/8cjkkw79z2/1
- https://github.com/sonata-nfv/tng-sdk-benchmark
- https://github.com/EricssonResearch/udp-ping
- https://github.com/rtlabs-com/p-net