Skip to content

feat: add TRex-based performance testing framework - #17

Merged
gspivey merged 2 commits into
mainfrom
claude/add-performance-tests-9nsPV
Mar 8, 2026
Merged

gspivey merged 2 commits into
mainfrom
claude/add-performance-tests-9nsPV

Conversation

@gspivey

@gspivey gspivey commented Mar 8, 2026

Copy link
Copy Markdown
Owner

Add a complete performance benchmarking pipeline that measures UDP echo
throughput, latency, and packet loss across 4 configurations:

  • rust-dpdk: Our Rust+DPDK stack (the main thing we're measuring)
  • native-dpdk: testpmd macswap (DPDK C baseline / ceiling)
  • rust-stdlib: Our echo app falling back to kernel UDP
  • plain-rust: Minimal std::net echo server (kernel baseline)

Infrastructure:

  • PerfTestStack CDK (TRex c5n.2xlarge + DUT c5n.2xlarge, dual ENIs)
  • TRex AMI Packer template + build workflow
  • Manual-trigger perf-tests.yml workflow with configurable params

Orchestration (scripts/run-perf-tests.sh):

  • Deploys stack, waits for SSM, configures TRex
  • Runs each DUT config sequentially (rebinds NIC between DPDK/kernel)
  • Collects environment info, networking diagnostics, app logs
  • Posts staged PR comments at each phase (same pattern as integration tests)
  • Aggregates JSON results + generates markdown summary table
  • Safety-net teardown on failure

New app: apps/plain-echo — minimal std::net UDP echo (~30 lines, no deps
beyond clap) for the kernel baseline measurement.

https://claude.ai/code/session_01KQw8H7AZWpb5jQLSNpPiGr

Add a complete performance benchmarking pipeline that measures UDP echo
throughput, latency, and packet loss across 4 configurations:
- rust-dpdk: Our Rust+DPDK stack (the main thing we're measuring)
- native-dpdk: testpmd macswap (DPDK C baseline / ceiling)
- rust-stdlib: Our echo app falling back to kernel UDP
- plain-rust: Minimal std::net echo server (kernel baseline)

Infrastructure:
- PerfTestStack CDK (TRex c5n.2xlarge + DUT c5n.2xlarge, dual ENIs)
- TRex AMI Packer template + build workflow
- Manual-trigger perf-tests.yml workflow with configurable params

Orchestration (scripts/run-perf-tests.sh):
- Deploys stack, waits for SSM, configures TRex
- Runs each DUT config sequentially (rebinds NIC between DPDK/kernel)
- Collects environment info, networking diagnostics, app logs
- Posts staged PR comments at each phase (same pattern as integration tests)
- Aggregates JSON results + generates markdown summary table
- Safety-net teardown on failure

New app: apps/plain-echo — minimal std::net UDP echo (~30 lines, no deps
beyond clap) for the kernel baseline measurement.

https://claude.ai/code/session_01KQw8H7AZWpb5jQLSNpPiGr
@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0e181889f7c8b2ee4 (DPDK ENI: 10.0.1.121)
  • Receiver: i-035a44f245345f09a (DPDK ENI: 10.0.1.219)
  • Both instances SSM-ready.

@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

ARP seeding: kernel /proc/net/arp (automatic)

  • tier1-dpdk-echo: 4 tests, 0 failures
  • tier2-kernel-interop: 4 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures

@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown

✅ Integration Tests Passed (Run 22811666900)

Branch: 17/merge | Commit: f25a891e

Test Results

  • tier1-dpdk-echo.xml: 4 tests, 0 failures, skipped
  • tier2-kernel-interop.xml: 4 tests, 0 failures, skipped
  • tier3-iperf-sends.xml: 1 tests, 0 failures, skipped
  • tier3-our-app-sends.xml: 1 tests, 0 failures, skipped
Application Logs

receiver-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.219:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.219:9000 (MAC: 02:2d:d5:05:68:0b)
Using DPDK acceleration
✅ Socket created successfully!
📡 Local address: 10.0.1.219:9000
🔄 Echo server running... (Ctrl+C to stop)
📨 Received from 10.0.1.121:34299: arp-probe #1
📤 Sent 18 bytes back to 10.0.1.121:34299
📨 Received from 10.0.1.121:58347: hello-dpdk #1
📤 Sent 19 bytes back to 10.0.1.121:58347
📨 Received from 10.0.1.121:58347: hello-dpdk #2
📤 Sent 19 bytes back to 10.0.1.121:58347
📨 Received from 10.0.1.121:58347: hello-dpdk #3
📤 Sent 19 bytes back to 10.0.1.121:58347
📨 Received from 10.0.1.121:49798: roundtrip-test #1
📤 Sent 23 bytes back to 10.0.1.121:49798
📨 Received from 10.0.1.121:49798: roundtrip-test #2
📤 Sent 23 bytes back to 10.0.1.121:49798
📨 Received from 10.0.1.121:49798: roundtrip-test #3
📤 Sent 23 bytes back to 10.0.1.121:49798
📨 Received from 10.0.1.121:49798: roundtrip-test #4
📤 Sent 23 bytes back to 10.0.1.121:49798
📨 Received from 10.0.1.121:49798: roundtrip-test #5
📤 Sent 23 bytes back to 10.0.1.121:49798
📨 Received from 10.0.1.121:54115: Hello DPDK payload integrity check 12345 #1
📤 Sent 49 bytes back to 10.0.1.121:54115

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.121:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.121:9000 (MAC: 02:64:95:34:8e:15)
Using DPDK acceleration
✅ Socket created successfully!
📡 Local address: 10.0.1.121:9000
🔄 Echo server running... (Ctrl+C to stop)
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #1
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #2
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #3
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #4
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #5
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #6
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #7
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #8
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #9
📤 Sent 36 bytes back to 10.0.1.219:55442
📨 Received from 10.0.1.219:55442: kernel-to-dpdk-test-payload #10
📤 Sent 37 bytes back to 10.0.1.219:55442

sender-test-client.log

Sent 12 bytes: 'arp-probe #1'
Received 18 bytes from 10.0.1.219:9000: 'echo: arp-probe #1'
Test complete
[2026-03-08T02:03:57Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-08T02:03:57Z] INFO: Test: udp_send_receive
[2026-03-08T02:03:59Z] INFO: UDP send/receive succeeded
[2026-03-08T02:03:59Z] INFO: Test: echo_roundtrip
[2026-03-08T02:04:00Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-08T02:04:00Z] INFO: Test: payload_integrity
[2026-03-08T02:04:01Z] INFO: Payload integrity verified
[2026-03-08T02:04:01Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-08T02:04:01Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-08T02:09:37Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.219:9000
Bind address: 0.0.0.0:0
Message: 'arp-probe'
Count: 1
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
DPDK bind failed (Port init failed: Invalid port ID: 0), falling back to tokio
Backend: tokio
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 18 bytes from 10.0.1.219:9000: 'echo: arp-probe #1'
Test complete
[2026-03-08T02:09:37Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-08T02:09:37Z] INFO: Test: udp_send_receive
[2026-03-08T02:09:38Z] INFO: UDP send/receive succeeded
[2026-03-08T02:09:38Z] INFO: Test: echo_roundtrip
[2026-03-08T02:09:39Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-08T02:09:39Z] INFO: Test: payload_integrity
[2026-03-08T02:09:39Z] INFO: Payload integrity verified
[2026-03-08T02:09:39Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-08T02:09:39Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-03-08T02:14:48Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-03-08T02:14:48Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-03-08T02:14:48Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-03-08T02:14:48Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

Bind address: 10.0.1.121:0
Message: 'dpdk-to-kernel-test-payload'
Count: 10
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.121:32768 (MAC: 02:64:95:34:8e:15)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.219:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-08T02:13:48Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-08T02:13:48Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-08T02:13:48Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-08T02:13:48Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-035a44f245345f09a (receiver)
Command ID: 904394f6-2373-4288-a483-48cb08a4c6c7

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-035a44f245345f09a (receiver)
Command ID: 752dbf68-e514-440b-98bd-c9151c3e40b0

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-035a44f245345f09a (receiver)
Command ID: 1c31f5ef-9bb0-4191-b1a8-708d97a6c41a

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0e181889f7c8b2ee4 (sender)
Command ID: 2f0b8b79-95ec-45dd-a755-bcf320faa203

=== STDOUT ===


=== STDERR ===


Network & PCI State

receiver-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:50:3e:1c:22:3d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0be4b2cedd906d16f
    altname device-number-0.0
    inet 10.0.1.214/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2569sec preferred_lft 2569sec
    inet6 fe80::50:3eff:fe1c:223d/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:a0:e5:94:d0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 02:2d:d5:05:68:0b brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname ens6
    inet 10.0.1.219/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::2d:d5ff:fe05:680b/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

sender-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:8c:d5:1d:69:e5 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0d6adebe0fb32ee32
    altname device-number-0.0
    inet 10.0.1.165/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2589sec preferred_lft 2589sec
    inet6 fe80::8c:d5ff:fe1d:69e5/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:0d:f3:5f:a9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

receiver-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-08T02:03:28Z
hostname: ip-10-0-1-214.ec2.internal
kernel: 6.1.161-183.298.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:50:3e:1c:22:3d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0be4b2cedd906d16f
    altname device-number-0.0
    inet 10.0.1.214/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3366sec preferred_lft 3366sec
    inet6 fe80::50:3eff:fe1c:223d/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:a0:e5:94:d0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.201 dev ens5 lladdr 02:60:37:68:26:69 DELAY 
10.0.1.1 dev ens5 lladdr 02:1e:bc:cf:80:65 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.214 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.214 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.214 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.214 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:2d:d5:05:68:0b/ 02:50:3e:1c:22:3d/ 

--- ENI: 02:2d:d5:05:68:0b/ ---
  device-number: 1
  local-ipv4s: 10.0.1.219
  subnet-id: subnet-0cb4753843d957747
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:50:3e:1c:22:3d/ ---
  device-number: 0
  local-ipv4s: 10.0.1.214
  subnet-id: subnet-0cb4753843d957747
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:1e:bc:cf:80:65 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.214 ens5
Unicast reply from 10.0.1.1 [02:1E:BC:CF:80:65]  0.554ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar  8 02:03 .
drwxr-xr-x. 14 root root     3080 Mar  8 02:02 ..
crw-------.  1 root root 243,   0 Mar  8 02:03 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar  8 01:59 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.068987] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.075437] audit: type=2000 audit(1772935168.408:1): state=initialized audit_enabled=0 res=1
[    0.076956] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.100351] ACPI: Interpreter enabled
[    0.100351] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.124074] pci 0000:00:05.0: enabling Extended Tags
[    0.152910] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.207601] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.260719] IPI shorthand broadcast: enabled
[    0.260780] AES CTR mode by8 optimization enabled
[    2.485272] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.534552] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.571812] VFIO - User Level meta-driver version: 0.3
[    3.789376] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.801073] ena 0000:00:05.0: ENA device version: 0.10
[    3.801853] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.904136] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.917320] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:50:3e:1c:22:3d
[    4.005847] ena 0000:00:05.0 ens5: renamed from eth0
[    4.533045] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  190.817076] pci 0000:00:06.0: enabling Extended Tags
[  190.820875] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  190.833695] ena 0000:00:06.0: ENA device version: 0.10
[  190.834436] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  190.931007] ena 0000:00:06.0: ENA Large LLQ is disabled
[  190.944064] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:2d:d5:05:68:0b
[  190.985680] ena 0000:00:06.0 ens6: renamed from eth0
[  191.272835] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  226.760171] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  226.761460] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===

sender-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-08T02:03:20Z
hostname: ip-10-0-1-165.ec2.internal
kernel: 6.1.161-183.298.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:8c:d5:1d:69:e5 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0d6adebe0fb32ee32
    altname device-number-0.0
    inet 10.0.1.165/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3372sec preferred_lft 3372sec
    inet6 fe80::8c:d5ff:fe1d:69e5/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:0d:f3:5f:a9 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.91 dev ens5 lladdr 02:bf:06:c8:8c:17 REACHABLE 
10.0.1.1 dev ens5 lladdr 02:1e:bc:cf:80:65 REACHABLE 
10.0.1.239 dev ens5 lladdr 02:db:43:6f:e4:bd STALE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.165 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.165 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.165 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.165 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:64:95:34:8e:15/ 02:8c:d5:1d:69:e5/ 

--- ENI: 02:64:95:34:8e:15/ ---
  device-number: 1
  local-ipv4s: 10.0.1.121
  subnet-id: subnet-0cb4753843d957747
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:8c:d5:1d:69:e5/ ---
  device-number: 0
  local-ipv4s: 10.0.1.165
  subnet-id: subnet-0cb4753843d957747
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:1e:bc:cf:80:65 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.165 ens5
Unicast reply from 10.0.1.1 [02:1E:BC:CF:80:65]  0.538ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar  8 02:03 .
drwxr-xr-x. 14 root root     3080 Mar  8 02:02 ..
crw-------.  1 root root 243,   0 Mar  8 02:03 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar  8 01:59 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.068519] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.074993] audit: type=2000 audit(1772935167.065:1): state=initialized audit_enabled=0 res=1
[    0.076385] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.099402] ACPI: Interpreter enabled
[    0.099402] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.123466] pci 0000:00:05.0: enabling Extended Tags
[    0.149297] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.178634] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.257833] IPI shorthand broadcast: enabled
[    0.257895] AES CTR mode by8 optimization enabled
[    2.475153] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.515598] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.554974] VFIO - User Level meta-driver version: 0.3
[    3.610475] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.637356] ena 0000:00:05.0: ENA device version: 0.10
[    3.638138] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.734951] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.746911] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:8c:d5:1d:69:e5
[    3.785258] ena 0000:00:05.0 ens5: renamed from eth0
[    4.708478] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  190.927045] pci 0000:00:06.0: enabling Extended Tags
[  190.930885] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  190.943440] ena 0000:00:06.0: ENA device version: 0.10
[  190.944196] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  191.043420] ena 0000:00:06.0: ENA Large LLQ is disabled
[  191.055459] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:64:95:34:8e:15
[  191.114114] ena 0000:00:06.0 ens6: renamed from eth0
[  191.413017] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  221.277418] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  221.278682] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===
⚠️ Crash Diagnostics

receiver-dmesg-crashes.log

[    0.075416] pid_max: default: 32768 minimum: 301
[    0.126209] iommu: Default domain type: Translated 
[    0.126979] NetLabel:  unlabeled traffic allowed by default
[    0.148992] PCI: CLS 0 bytes, default 64
[    0.216247] nvme nvme0: 2/0/0 default/read/poll queues
[    0.426443] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.426539] systemd[1]: No hostname configured, using default hostname.
[    0.538773] systemd[1]: Queued start job for default target initrd.target.
[    1.688901] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    8.271088] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  251.678292] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6271)
[  593.579215] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:19907)

sender-dmesg-crashes.log

[    0.074921] pid_max: default: 32768 minimum: 301
[    0.125884] iommu: Default domain type: Translated 
[    0.126384] NetLabel:  unlabeled traffic allowed by default
[    0.134921] PCI: CLS 0 bytes, default 64
[    0.197253] nvme nvme0: 2/0/0 default/read/poll queues
[    0.423054] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.423150] systemd[1]: No hostname configured, using default hostname.
[    0.518431] systemd[1]: Queued start job for default target initrd.target.
[    1.618701] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    8.271954] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  903.619763] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:38080)
Kernel Console (dmesg)

receiver-console-output.log (PCI/driver events only)

[  190.814809] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  190.815856] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  190.817076] pci 0000:00:06.0: enabling Extended Tags
[  190.818815] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  190.819861] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  190.820875] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  190.833695] ena 0000:00:06.0: ENA device version: 0.10
[  190.834436] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  190.931007] ena 0000:00:06.0: ENA Large LLQ is disabled
[  190.944064] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:2d:d5:05:68:0b
[  190.985680] ena 0000:00:06.0 ens6: renamed from eth0
[  191.272835] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  226.760171] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  226.761460] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  251.678292] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6271)
[  355.138348] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  356.151804] ena 0000:00:06.0: ENA device version: 0.10
[  356.152552] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  356.253729] ena 0000:00:06.0: ENA Large LLQ is disabled
[  356.266690] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:2d:d5:05:68:0b
[  356.277225] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  475.170059] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  475.171353] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  593.579215] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:19907)
[  668.273033] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  669.282012] ena 0000:00:06.0: ENA device version: 0.10
[  669.282746] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  669.376837] ena 0000:00:06.0: ENA Large LLQ is disabled
[  669.389076] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:2d:d5:05:68:0b
[  669.399523] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels

sender-console-output.log (PCI/driver events only)

[    4.708478] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  190.923753] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  190.924823] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  190.925823] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  190.927045] pci 0000:00:06.0: enabling Extended Tags
[  190.928831] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  190.929873] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  190.930885] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  190.943440] ena 0000:00:06.0: ENA device version: 0.10
[  190.944196] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  191.043420] ena 0000:00:06.0: ENA Large LLQ is disabled
[  191.055459] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:64:95:34:8e:15
[  191.114114] ena 0000:00:06.0 ens6: renamed from eth0
[  191.413017] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  221.277418] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  221.278682] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  270.015143] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6279)
[  270.765100] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6299)
[  272.515099] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6321)
[  274.085075] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6575)
[  317.561026] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  318.572338] ena 0000:00:06.0: ENA device version: 0.10
[  318.573090] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  318.672315] ena 0000:00:06.0: ENA Large LLQ is disabled
[  318.684238] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:64:95:34:8e:15
[  318.694674] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  737.039519] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  737.040941] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  859.430125] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:35603)
[  903.619763] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:38080)

…:read)

gh run watch requires the checks:read permission which fine-grained PATs
cannot grant. Replace with gh run view --json polling loop in ci-validate.sh
and document the limitation in CLAUDE.md so future sessions avoid it.

https://claude.ai/code/session_01KQw8H7AZWpb5jQLSNpPiGr
@gspivey
gspivey merged commit c2ef63f into main Mar 8, 2026
3 checks passed
@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-068c67e323341f36f (DPDK ENI: 10.0.1.24)
  • Receiver: i-06b02c8f9b3aa65c1 (DPDK ENI: 10.0.1.250)
  • Both instances SSM-ready.

@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

ARP seeding: kernel /proc/net/arp (automatic)

  • tier1-dpdk-echo: 4 tests, 0 failures
  • tier2-kernel-interop: 4 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures
  • tier3-iperf-interop: 1 tests, 0 failures

@github-actions

github-actions Bot commented Mar 8, 2026

Copy link
Copy Markdown

✅ Integration Tests Passed (Run 22812424171)

Branch: 17/merge | Commit: 84758e69

Test Results

  • tier1-dpdk-echo.xml: 4 tests, 0 failures, skipped
  • tier2-kernel-interop.xml: 4 tests, 0 failures, skipped
  • tier3-iperf-sends.xml: 1 tests, 0 failures, skipped
  • tier3-our-app-sends.xml: 1 tests, 0 failures, skipped
Application Logs

receiver-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.250:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.250:9000 (MAC: 02:55:4e:c7:be:33)
Using DPDK acceleration
✅ Socket created successfully!
📡 Local address: 10.0.1.250:9000
🔄 Echo server running... (Ctrl+C to stop)
📨 Received from 10.0.1.24:46751: arp-probe #1
📤 Sent 18 bytes back to 10.0.1.24:46751
📨 Received from 10.0.1.24:50555: hello-dpdk #1
📤 Sent 19 bytes back to 10.0.1.24:50555
📨 Received from 10.0.1.24:50555: hello-dpdk #2
📤 Sent 19 bytes back to 10.0.1.24:50555
📨 Received from 10.0.1.24:50555: hello-dpdk #3
📤 Sent 19 bytes back to 10.0.1.24:50555
📨 Received from 10.0.1.24:35621: roundtrip-test #1
📤 Sent 23 bytes back to 10.0.1.24:35621
📨 Received from 10.0.1.24:35621: roundtrip-test #2
📤 Sent 23 bytes back to 10.0.1.24:35621
📨 Received from 10.0.1.24:35621: roundtrip-test #3
📤 Sent 23 bytes back to 10.0.1.24:35621
📨 Received from 10.0.1.24:35621: roundtrip-test #4
📤 Sent 23 bytes back to 10.0.1.24:35621
📨 Received from 10.0.1.24:35621: roundtrip-test #5
📤 Sent 23 bytes back to 10.0.1.24:35621
📨 Received from 10.0.1.24:36345: Hello DPDK payload integrity check 12345 #1
📤 Sent 49 bytes back to 10.0.1.24:36345

sender-echo-server.log

🚀 DPDK-STDLIB Echo Server
Binding to 10.0.1.24:9000
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.24:9000 (MAC: 02:75:70:85:c3:f7)
Using DPDK acceleration
✅ Socket created successfully!
📡 Local address: 10.0.1.24:9000
🔄 Echo server running... (Ctrl+C to stop)
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #1
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #2
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #3
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #4
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #5
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #6
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #7
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #8
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #9
📤 Sent 36 bytes back to 10.0.1.250:37386
📨 Received from 10.0.1.250:37386: kernel-to-dpdk-test-payload #10
📤 Sent 37 bytes back to 10.0.1.250:37386

sender-test-client.log

Sent 12 bytes: 'arp-probe #1'
Received 18 bytes from 10.0.1.250:9000: 'echo: arp-probe #1'
Test complete
[2026-03-08T02:58:07Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-08T02:58:07Z] INFO: Test: udp_send_receive
[2026-03-08T02:58:08Z] INFO: UDP send/receive succeeded
[2026-03-08T02:58:08Z] INFO: Test: echo_roundtrip
[2026-03-08T02:58:10Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-08T02:58:10Z] INFO: Test: payload_integrity
[2026-03-08T02:58:11Z] INFO: Payload integrity verified
[2026-03-08T02:58:11Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-08T02:58:11Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-03-08T03:05:09Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.250:9000
Bind address: 0.0.0.0:0
Message: 'arp-probe'
Count: 1
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
TELEMETRY: No legacy callbacks, legacy socket not created
DPDK bind failed (Port init failed: Invalid port ID: 0), falling back to tokio
Backend: tokio
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 18 bytes from 10.0.1.250:9000: 'echo: arp-probe #1'
Test complete
[2026-03-08T03:05:09Z] INFO: ARP resolution succeeded (got response from peer)
[2026-03-08T03:05:09Z] INFO: Test: udp_send_receive
[2026-03-08T03:05:10Z] INFO: UDP send/receive succeeded
[2026-03-08T03:05:10Z] INFO: Test: echo_roundtrip
[2026-03-08T03:05:11Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-03-08T03:05:11Z] INFO: Test: payload_integrity
[2026-03-08T03:05:11Z] INFO: Payload integrity verified
[2026-03-08T03:05:11Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-03-08T03:05:11Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-03-08T03:10:03Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-03-08T03:10:03Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-03-08T03:10:03Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-03-08T03:10:03Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

Bind address: 10.0.1.24:0
Message: 'dpdk-to-kernel-test-payload'
Count: 10
EAL: Detected CPU lcores: 2
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
EAL: VFIO support initialized
EAL: Using IOMMU type 8 (No-IOMMU)
EAL: Probe PCI driver: net_ena (1d0f:ec20) device: 0000:00:06.0 (socket -1)
TELEMETRY: No legacy callbacks, legacy socket not created
✅ DPDK UDP socket bound to 10.0.1.24:32768 (MAC: 02:75:70:85:c3:f7)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.250:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-03-08T03:09:03Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-03-08T03:09:03Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-03-08T03:09:03Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-03-08T03:09:03Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-06b02c8f9b3aa65c1 (receiver)
Command ID: 31f45bd2-528b-4b5d-81e2-715817064f2a

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-06b02c8f9b3aa65c1 (receiver)
Command ID: e699578e-0fbb-471b-b085-47648cf4eba7

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-06b02c8f9b3aa65c1 (receiver)
Command ID: 0a8a661d-87a6-482a-89a9-a4db82376763

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-068c67e323341f36f (sender)
Command ID: dd5ccb6c-54d4-4edd-9293-8512845483be

=== STDOUT ===


=== STDERR ===


Network & PCI State

receiver-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:54:c3:d4:f3:29 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0094ea845271001f4
    altname device-number-0.0
    inet 10.0.1.74/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2444sec preferred_lft 2444sec
    inet6 fe80::54:c3ff:fed4:f329/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:e1:a1:50:af brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 02:55:4e:c7:be:33 brd ff:ff:ff:ff:ff:ff
    altname enp0s6
    altname ens6
    inet 10.0.1.250/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::55:4eff:fec7:be33/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

sender-network-interfaces.log

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:12:59:6f:98:91 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0aaec6970d599cf39
    altname device-number-0.0
    inet 10.0.1.191/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2467sec preferred_lft 2467sec
    inet6 fe80::12:59ff:fe6f:9891/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:d8:e0:36:3e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

receiver-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-08T02:57:39Z
hostname: ip-10-0-1-74.ec2.internal
kernel: 6.1.161-183.298.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:54:c3:d4:f3:29 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0094ea845271001f4
    altname device-number-0.0
    inet 10.0.1.74/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3306sec preferred_lft 3306sec
    inet6 fe80::54:c3ff:fed4:f329/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:e1:a1:50:af brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.1 dev ens5 lladdr 02:09:a9:0d:13:23 REACHABLE 
10.0.1.198 dev ens5 lladdr 02:23:8b:10:6f:37 REACHABLE 
10.0.1.37 dev ens5 lladdr 02:41:fb:f9:6f:33 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.74 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.74 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.74 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.74 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:54:c3:d4:f3:29/ 02:55:4e:c7:be:33/ 

--- ENI: 02:54:c3:d4:f3:29/ ---
  device-number: 0
  local-ipv4s: 10.0.1.74
  subnet-id: subnet-04b5b1ac0a0b8d03e
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:55:4e:c7:be:33/ ---
  device-number: 1
  local-ipv4s: 10.0.1.250
  subnet-id: subnet-04b5b1ac0a0b8d03e
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:09:a9:0d:13:23 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.74 ens5
Unicast reply from 10.0.1.1 [02:09:A9:0D:13:23]  0.542ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar  8 02:57 .
drwxr-xr-x. 14 root root     3080 Mar  8 02:56 ..
crw-------.  1 root root 243,   0 Mar  8 02:57 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar  8 02:52 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.067586] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.074043] audit: type=2000 audit(1772938359.661:1): state=initialized audit_enabled=0 res=1
[    0.075475] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.098736] ACPI: Interpreter enabled
[    0.098736] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.122403] pci 0000:00:05.0: enabling Extended Tags
[    0.148759] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.177996] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.253880] IPI shorthand broadcast: enabled
[    0.253946] AES CTR mode by8 optimization enabled
[    2.355141] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.397217] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.459858] VFIO - User Level meta-driver version: 0.3
[    3.608183] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.615233] ena 0000:00:05.0: ENA device version: 0.10
[    3.615982] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.720104] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.732977] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:54:c3:d4:f3:29
[    3.835047] ena 0000:00:05.0 ens5: renamed from eth0
[    4.616496] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  250.311673] pci 0000:00:06.0: enabling Extended Tags
[  250.315528] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  250.324750] ena 0000:00:06.0: ENA device version: 0.10
[  250.325510] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  250.422381] ena 0000:00:06.0: ENA Large LLQ is disabled
[  250.434432] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:55:4e:c7:be:33
[  250.473606] ena 0000:00:06.0 ens6: renamed from eth0
[  250.820650] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  286.487564] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  286.488843] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===

sender-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-03-08T02:57:31Z
hostname: ip-10-0-1-191.ec2.internal
kernel: 6.1.161-183.298.amzn2023.x86_64

=== DPDK PORT STATUS ===

Network devices using DPDK-compatible driver
============================================
0000:00:06.0 'Elastic Network Adapter (ENA) ec20' drv=vfio-pci unused=ena

Network devices using kernel driver
===================================
0000:00:05.0 'Elastic Network Adapter (ENA) ec20' if=ens5 drv=ena unused=vfio-pci *Active*

No 'Baseband' devices detected
==============================

No 'Crypto' devices detected
============================

No 'DMA' devices detected
=========================

No 'Eventdev' devices detected
==============================

No 'Mempool' devices detected
=============================

No 'Compress' devices detected
==============================

No 'Misc (rawdev)' devices detected
===================================

No 'Regex' devices detected
===========================

=== IP ADDRESSES ===
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 02:12:59:6f:98:91 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0aaec6970d599cf39
    altname device-number-0.0
    inet 10.0.1.191/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3314sec preferred_lft 3314sec
    inet6 fe80::12:59ff:fe6f:9891/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:d8:e0:36:3e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.1 dev ens5 lladdr 02:09:a9:0d:13:23 REACHABLE 
10.0.1.198 dev ens5 lladdr 02:23:8b:10:6f:37 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.191 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.191 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.191 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.191 metric 512 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:12:59:6f:98:91/ 02:75:70:85:c3:f7/ 

--- ENI: 02:12:59:6f:98:91/ ---
  device-number: 0
  local-ipv4s: 10.0.1.191
  subnet-id: subnet-04b5b1ac0a0b8d03e
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:75:70:85:c3:f7/ ---
  device-number: 1
  local-ipv4s: 10.0.1.24
  subnet-id: subnet-04b5b1ac0a0b8d03e
  subnet-cidr: 10.0.1.0/24


=== GATEWAY ARP TEST ===
Gateway IP: 10.0.1.1
Gateway ARP entry:
10.0.1.1 dev ens5 lladdr 02:09:a9:0d:13:23 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.191 ens5
Unicast reply from 10.0.1.1 [02:09:A9:0D:13:23]  0.535ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:         0 kB
HugePages_Total:    1024
HugePages_Free:     1024
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:         2097152 kB

=== VFIO STATUS ===
total 0
drwxr-xr-x.  2 root root       80 Mar  8 02:57 .
drwxr-xr-x. 14 root root     3080 Mar  8 02:56 ..
crw-------.  1 root root 243,   0 Mar  8 02:57 noiommu-0
crw-rw-rw-.  1 root root  10, 196 Mar  8 02:52 vfio

noiommu mode:
Y

=== DPDK SHARED MEMORY ===
no /var/run/dpdk/ directory (clean state)

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.068785] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.075197] audit: type=2000 audit(1772938359.383:1): state=initialized audit_enabled=0 res=1
[    0.076659] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.100027] ACPI: Interpreter enabled
[    0.100027] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.123978] pci 0000:00:05.0: enabling Extended Tags
[    0.149613] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.181569] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.264828] IPI shorthand broadcast: enabled
[    0.264896] AES CTR mode by8 optimization enabled
[    2.285171] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.323132] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.375215] VFIO - User Level meta-driver version: 0.3
[    3.459212] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.470475] ena 0000:00:05.0: ENA device version: 0.10
[    3.471245] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.574970] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.588435] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:12:59:6f:98:91
[    3.665026] ena 0000:00:05.0 ens5: renamed from eth0
[    4.536336] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  230.933934] pci 0000:00:06.0: enabling Extended Tags
[  230.937806] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.950431] ena 0000:00:06.0: ENA device version: 0.10
[  230.951175] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  231.052376] ena 0000:00:06.0: ENA Large LLQ is disabled
[  231.065149] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:75:70:85:c3:f7
[  231.123047] ena 0000:00:06.0 ens6: renamed from eth0
[  231.503925] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  280.036589] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  280.037874] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device

=== DPDK-RELATED PROCESSES ===
no DPDK processes running

=== END DIAGNOSTICS ===
⚠️ Crash Diagnostics

receiver-dmesg-crashes.log

[    0.074026] pid_max: default: 32768 minimum: 301
[    0.124836] iommu: Default domain type: Translated 
[    0.125228] NetLabel:  unlabeled traffic allowed by default
[    0.136223] PCI: CLS 0 bytes, default 64
[    0.197180] nvme nvme0: 2/0/0 default/read/poll queues
[    0.418190] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.418290] systemd[1]: No hostname configured, using default hostname.
[    0.516960] systemd[1]: Queued start job for default target initrd.target.
[    1.616199] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    8.010206] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[  311.235543] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6418)
[  734.472691] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22495)

sender-dmesg-crashes.log

[    0.075186] pid_max: default: 32768 minimum: 301
[    0.126187] iommu: Default domain type: Translated 
[    0.126962] NetLabel:  unlabeled traffic allowed by default
[    0.135186] PCI: CLS 0 bytes, default 64
[    0.200293] nvme nvme0: 2/0/0 default/read/poll queues
[    0.436893] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    0.436991] systemd[1]: No hostname configured, using default hostname.
[    0.520944] systemd[1]: Queued start job for default target initrd.target.
[    1.540574] systemd[1]: systemd 252.23-11.amzn2023 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 -BZIP2 -LZ4 +XZ +ZLIB -ZSTD +BPF_FRAMEWORK +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
[    8.561032] bridge: filtering via arp/ip/ip6tables is no longer available by default. Update your scripts to load br_netfilter if you need this.
[ 1026.478148] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:42196)
Kernel Console (dmesg)

receiver-console-output.log (PCI/driver events only)

[  250.309413] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  250.310419] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  250.311673] pci 0000:00:06.0: enabling Extended Tags
[  250.313455] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  250.314500] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  250.315528] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  250.324750] ena 0000:00:06.0: ENA device version: 0.10
[  250.325510] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  250.422381] ena 0000:00:06.0: ENA Large LLQ is disabled
[  250.434432] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:55:4e:c7:be:33
[  250.473606] ena 0000:00:06.0 ens6: renamed from eth0
[  250.820650] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  286.487564] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  286.488843] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  311.235543] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6418)
[  473.263710] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  474.271930] ena 0000:00:06.0: ENA device version: 0.10
[  474.272671] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  474.371981] ena 0000:00:06.0: ENA Large LLQ is disabled
[  474.384003] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:55:4e:c7:be:33
[  474.394005] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  616.204457] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  616.205714] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  734.472691] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:22495)
[  809.074586] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  810.082889] ena 0000:00:06.0: ENA device version: 0.10
[  810.083654] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  810.179675] ena 0000:00:06.0: ENA Large LLQ is disabled
[  810.191830] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:55:4e:c7:be:33
[  810.204135] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels

sender-console-output.log (PCI/driver events only)

[    4.536336] ena 0000:00:05.0 ens5: Local page cache is disabled for less than 16 channels
[  230.930640] pci 0000:00:06.0: [1d0f:ec20] type 00 class 0x020000
[  230.931688] pci 0000:00:06.0: reg 0x10: [mem 0x00000000-0x00003fff]
[  230.932683] pci 0000:00:06.0: reg 0x18: [mem 0x00000000-0x000fffff pref]
[  230.933934] pci 0000:00:06.0: enabling Extended Tags
[  230.935812] pci 0000:00:06.0: BAR 2: assigned [mem 0xc0600000-0xc06fffff pref]
[  230.936822] pci 0000:00:06.0: BAR 0: assigned [mem 0xc0508000-0xc050bfff]
[  230.937806] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  230.950431] ena 0000:00:06.0: ENA device version: 0.10
[  230.951175] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  231.052376] ena 0000:00:06.0: ENA Large LLQ is disabled
[  231.065149] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:75:70:85:c3:f7
[  231.123047] ena 0000:00:06.0 ens6: renamed from eth0
[  231.503925] ena 0000:00:06.0 ens6: Local page cache is disabled for less than 16 channels
[  280.036589] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  280.037874] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  327.404490] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6731)
[  328.154377] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6753)
[  329.904417] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6775)
[  331.444407] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6798)
[  376.156260] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  377.169237] ena 0000:00:06.0: ENA device version: 0.10
[  377.169974] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  377.271131] ena 0000:00:06.0: ENA Large LLQ is disabled
[  377.283498] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:75:70:85:c3:f7
[  377.293181] ena 0000:00:06.0 eth0: Local page cache is disabled for less than 16 channels
[  859.220841] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  859.222155] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  982.028483] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:39860)
[ 1026.478148] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:42196)

@gspivey
gspivey deleted the claude/add-performance-tests-9nsPV branch March 17, 2026 03:25
gspivey pushed a commit that referenced this pull request Apr 13, 2026
Records hardware benchmark results from the spawn_blocking elimination.
tokio-dpdk improved from ~40K pps (Run #9) to 343K pps at 700K/64B (8.6x).
Matches sync DPDK at ≤140K pps; remaining gap at >350K pps is from
Tokio yield_now() scheduling latency, not framework overhead.

https://claude.ai/code/session_01EpC1AocdV7TkvTiMXmtCkm
gspivey pushed a commit that referenced this pull request Apr 13, 2026
The spin-poll optimization (commit a02b721) did not close the high-rate
tokio-dpdk performance gap. Hardware perf tests showed essentially flat
results vs Run #17, and the NIC counters (imissed=0) disprove the
original hypothesis that yield_now() scheduler latency was causing ring
overflow.

The real bottleneck is per-packet CPU cost in the async echo path
(~1.4 μs overhead per packet vs sync DPDK), likely from 2× Mutex
lock/unlock per packet and async_trait vtable dispatch. Spin-polling
doesn't help because the empty-poll idle path is not what's limiting
throughput.

Reverts the spin-poll change in DpdkUdpSocket::recv_from and the matching
benchmark code. Adds Run #18 to docs/perf-test-log.md documenting the
negative result and future directions that could actually help
(lock-free Arc<UdpSocket>, batch APIs, dedicated poll thread + mpsc).

https://claude.ai/code/session_01EpC1AocdV7TkvTiMXmtCkm
gspivey pushed a commit that referenced this pull request Apr 17, 2026
No regressions detected. rust-dpdk matches or slightly exceeds Run #17
at all packet sizes and rates. The GUE Option::is_some() check in
send/recv hot paths adds zero measurable overhead when GUE is not
configured.

https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb
gspivey added a commit that referenced this pull request Apr 17, 2026
* feat: GUE tunnel endpoint (Generic UDP Encapsulation)

Implement RFC 8470-style L3-over-UDP encapsulation as a transparent tunnel
mode on UdpSocket. When GUE is configured, the application's send_to/recv_from
calls are automatically encapsulated/decapsulated through the tunnel.

Wire format: [Outer Eth][Outer IPv4][Outer UDP:6080][GUE 4B][Inner IPv4][Inner UDP][Payload]

Key changes:
- New dpdk-udp/src/gue.rs: GUE header build/parse, frame encap/decap functions
- UdpSocket.set_gue()/gue(): per-socket tunnel configuration
- TX path: builds GUE-encapsulated frames, ARP resolves tunnel remote endpoint
- RX path: decapsulates matching GUE frames, returns inner src address to app
- NetworkConfig.with_gue(): builder integration parallel to VLAN
- MTU check accounts for 32-byte GUE overhead (outer IP + outer UDP + GUE header)
- 23 unit tests: header codec, frame roundtrip, socket-level decap, PPS benchmark
- README roadmap updated: GUE moved from Planned to Done

https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb

* docs: add Run #19 perf results — GUE tunnel endpoint regression check

No regressions detected. rust-dpdk matches or slightly exceeds Run #17
at all packet sizes and rates. The GUE Option::is_some() check in
send/recv hot paths adds zero measurable overhead when GUE is not
configured.

https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb

---------

Co-authored-by: Claude <noreply@anthropic.com>
gspivey added a commit that referenced this pull request Apr 17, 2026
* feat: GUE tunnel endpoint (Generic UDP Encapsulation)

Implement RFC 8470-style L3-over-UDP encapsulation as a transparent tunnel
mode on UdpSocket. When GUE is configured, the application's send_to/recv_from
calls are automatically encapsulated/decapsulated through the tunnel.

Wire format: [Outer Eth][Outer IPv4][Outer UDP:6080][GUE 4B][Inner IPv4][Inner UDP][Payload]

Key changes:
- New dpdk-udp/src/gue.rs: GUE header build/parse, frame encap/decap functions
- UdpSocket.set_gue()/gue(): per-socket tunnel configuration
- TX path: builds GUE-encapsulated frames, ARP resolves tunnel remote endpoint
- RX path: decapsulates matching GUE frames, returns inner src address to app
- NetworkConfig.with_gue(): builder integration parallel to VLAN
- MTU check accounts for 32-byte GUE overhead (outer IP + outer UDP + GUE header)
- 23 unit tests: header codec, frame roundtrip, socket-level decap, PPS benchmark
- README roadmap updated: GUE moved from Planned to Done

https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb

* docs: add Run #19 perf results — GUE tunnel endpoint regression check

No regressions detected. rust-dpdk matches or slightly exceeds Run #17
at all packet sizes and rates. The GUE Option::is_some() check in
send/recv hot paths adds zero measurable overhead when GUE is not
configured.

https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb

---------

Co-authored-by: Claude <noreply@anthropic.com>
gspivey pushed a commit that referenced this pull request May 20, 2026
Implement ICMPv6 error message parsing and handling (IPv6 roadmap task 8):

- Destination Unreachable (type 1): no route, admin prohibited, beyond
  scope, address unreachable, port unreachable
- Packet Too Big (type 2): carries Next-Hop MTU
- Time Exceeded (type 3): hop limit exceeded, fragment reassembly
- Parameter Problem (type 4): erroneous header, unrecognized next header

Adds Icmpv6ErrorInfo, parse_icmpv6_error(), Icmpv6Action enum,
process_icmpv6_full() on Icmpv6Handler, and RX path integration via
the existing error_queue/take_error() infrastructure.

24 new tests, no performance regression (Run #17 in perf-test-log.md).
gspivey pushed a commit that referenced this pull request Jun 13, 2026
- Append Run #43 to docs/perf-test-log.md with GitHub Actions
  performance test results (no regression)
- Update ROADMAP.md: mark item #17 as complete with PR #81
gspivey added a commit that referenced this pull request Jun 13, 2026
## Roadmap Item

Implements **roadmap item #17**: `dpdk-stdlib-tcp`: TimerWheel,
CongestionState, and Tcb.

Spec: `.kiro/specs/tcp-support/` tasks 5.5, 5.6, 5.7.

## Changes

### `dpdk-stdlib-tcp/src/timer.rs` — TimerWheel
- 1ms granularity timer wheel for TCP timer management
- 6 timer types: RTO, Persist, Keepalive, TimeWait, FinWait2, DelayedAck
- Operations: insert, cancel, cancel_all, expired (tick-advance),
next_deadline, is_active
- Each connection can have at most one active timer per type
- 8 unit tests covering insert/expire, cancel, replace, multiple timers,
all types

### `dpdk-stdlib-tcp/src/congestion.rs` — CongestionState
- RFC 5681 congestion control: slow-start + congestion avoidance
- RFC 6298 RTT/RTO estimation: α=1/8, β=1/4, Karn's algorithm, clamped
[1s, 60s]
- Initial window per RFC 6928: min(10×MSS, max(2×MSS, 14600))
- Fast retransmit/recovery (NewReno): on_triple_dup_ack, on_partial_ack,
on_recovery_exit
- effective_window(rwnd), backoff_rto, on_rto
- 19 unit tests covering all operations and edge cases

### `dpdk-stdlib-tcp/src/tcb.rs` — Tcb struct
- Full Transmission Control Block with all per-connection state
- Send/receive sequence variables (RFC 9293 §3.3.1)
- Window scaling, MSS (local + peer)
- CongestionState, timer deadlines, retransmit_count
- Engine-internal buffers: send_buf, retransmit_queue, reorder_buffer
- Nagle state, socket options, MAC addresses, shared ConnectionHandle
- Helper methods: effective_mss, flight_size, available_send_window
- 5 unit tests

## Tests Added
- 8 timer wheel tests
- 19 congestion control tests  
- 5 TCB tests
- All 88 unit tests + 10 property tests pass for dpdk-stdlib-tcp
- Full workspace: 0 failures

## Tradeoffs
- TimerWheel uses HashMap internally (O(n) expiration scan) rather than
a hierarchical wheel with slots. Sufficient for MVP connection counts;
can be optimized later if needed for thousands of concurrent
connections.
- CongestionState::on_ack takes `bytes_acked` parameter (prefixed unused
for now) — the slow-start/CA algorithms use per-ACK increment rather
than bytes-based, but the parameter is reserved for future use in RFC
3465 (ABC) or CUBIC.

---------

Co-authored-by: Agent Router <agent@agent-router.dev>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants