Skip to content

IPv6 hardware offload flags#55

Merged
gspivey merged 3 commits into
developmentfrom
agent/ipv6-hw-offload
May 20, 2026
Merged

IPv6 hardware offload flags#55
gspivey merged 3 commits into
developmentfrom
agent/ipv6-hw-offload

Conversation

@gspivey
Copy link
Copy Markdown
Owner

@gspivey gspivey commented May 19, 2026

Roadmap Item

IPv6 task 4: IPv6 hardware offload flags — TX: set RTE_MBUF_F_TX_IPV6 + RTE_MBUF_F_TX_UDP_CKSUM with the IPv6 pseudo-header checksum in the UDP field. Software fallback on NICs without support. has_tx_ipv6_cksum_offload() accessor.

Changes

  • dpdk-sys: Added RTE_MBUF_F_TX_IPV6 constant (bit 56) to both stubs.rs and shim.rs
  • dpdk-udp TX path: send_frame() now detects ethertype to branch between IPv4 and IPv6 offload. IPv6 frames get RTE_MBUF_F_TX_IPV6 | RTE_MBUF_F_TX_UDP_CKSUM with l3_len=40 and the IPv6 pseudo-header checksum written to the UDP checksum field.
  • dpdk-udp API: Added compute_ipv6_tx_offload_flags() helper and has_tx_ipv6_cksum_offload() accessor on UdpSocket
  • Software fallback: Frames built by build_udp6_frame_into() already contain the full software checksum; the NIC overwrites it when offload is active.

Tests Added

8 new unit tests:

  • test_ipv6_tx_offload_constant_exists — flag defined, no overlap with IPv4/checksum flags
  • test_ipv6_tx_offload_mbuf_flags — mbuf accepts IPv6 flags + l3_len=40
  • test_ipv6_frame_detected_in_send_frame — ethertype detection
  • test_ipv6_pseudo_header_checksum_in_offload_context — pseudo-header helper correctness
  • test_ipv6_offload_does_not_touch_ipv4_frames — no false positives
  • test_compute_ipv6_offload_flags — helper returns correct flags per capability
  • test_apply_ipv6_pseudo_header_to_frame — frame mutation for offload
  • test_has_tx_ipv6_cksum_offload_accessor — accessor works in stub mode
  • test_ipv6_rx_hw_checksum_skip — RX flag constants are correct

Tradeoffs

  • RX hardware checksum validation (honoring PKT_RX_L4_CKSUM_GOOD to skip software verification) is not implemented in this PR because the RX path doesn't yet process IPv6 packets (that's task 3: SocketAddrV6 through UdpSocket). The constants and test are in place for when that lands.
  • The TX offload only handles the common case (no extension headers between IPv6 and UDP). Extension header chains would need walk_extension_headers() to find the true L4 offset — deferred until there's a use case.

All 533 tests pass.

Agent Router added 2 commits May 19, 2026 08:16
Add RTE_MBUF_F_TX_IPV6 constant to dpdk-sys stubs/shim.
Add compute_ipv6_tx_offload_flags() helper and has_tx_ipv6_cksum_offload() accessor.
Add 8 unit tests covering:
- TX offload constant existence and non-overlap
- Mbuf flag setting with IPv6 header lengths
- IPv6 frame detection in TX path
- Pseudo-header checksum for offload context
- IPv4 frame exclusion from IPv6 offload
- RX hardware checksum flag validation
- Accessor method behavior in stub mode
The DPDK backend TX path now detects IPv6 frames (ethertype 0x86DD) and
sets RTE_MBUF_F_TX_IPV6 + RTE_MBUF_F_TX_UDP_CKSUM with the IPv6
pseudo-header checksum in the UDP checksum field, enabling the NIC to
compute the final UDP checksum in hardware.

Changes:
- TX path detects ethertype to branch between IPv4 and IPv6 offload
- IPv6 branch sets l3_len=40 (fixed IPv6 header) in mbuf tx_offload
- Pseudo-header checksum uses udp6_pseudo_header_checksum() from ipv6.rs
- Software fallback: frame already has full checksum from build_udp6_frame
- Refactored set_tx_offload to use l3_len variable (avoids duplication)

Addresses roadmap item: IPv6 task 4 (IPv6 hardware offload flags).
@github-actions
Copy link
Copy Markdown

Synthetic Performance Results (run)

Commit: 21493286

✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)

Synthetic UDP Performance Results

Measures framework overhead: sync dpdk_udp::UdpSocket vs async (std::sync::Mutex + try_recv_from).

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to 64B 11.2M 10.2M 1.1x 98
RX recv_from 64B 3.3M 3.7M 0.9x 268
TX send_to 1400B 1.7M 1.6M 1.0x 608
RX recv_from 1400B 972.1K 1.0M 1.0x 981

Avg sync/async ratio: 1.0x, worst: 1.1x

Good: Async wrapper is within 1.1x of sync — minimal framework overhead.

@github-actions
Copy link
Copy Markdown

Synthetic Performance Results — Graviton (run)

Commit: 21493286

✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)

Synthetic UDP Performance Results

Measures framework overhead: sync dpdk_udp::UdpSocket vs async (std::sync::Mutex + try_recv_from).

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to 64B 11.6M 11.0M 1.1x 90
RX recv_from 64B 3.4M 4.6M 0.7x 218
TX send_to 1400B 1.6M 1.6M 1.0x 618
RX recv_from 1400B 1.0M 1.1M 0.9x 929

Avg sync/async ratio: 0.9x, worst: 1.1x

Good: Async wrapper is within 1.1x of sync — minimal framework overhead.

@github-actions
Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0bd83eb25e04eaa52 (DPDK ENI: 10.0.1.247)
  • Receiver: i-075944d1e287f6445 (DPDK ENI: 10.0.1.92)
  • Both instances SSM-ready.

@github-actions
Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0d9e2ea806eed707c (DPDK ENI: 10.0.1.235)
  • Receiver: i-0f595b739032c7676 (DPDK ENI: 10.0.1.34)
  • Both instances SSM-ready.

@gspivey
Copy link
Copy Markdown
Owner Author

gspivey commented May 19, 2026

/agent We shouldn't have software calculate the checksum if we decided the hardware would do it. These actions should be mutually exclusive. I thought we ensured this in the IPv4 implementation.

In response to agent-router comment:
"Software fallback: Frames built by build_udp6_frame_into() already contain the full software checksum; the NIC overwrites it when offload is active."

@github-actions
Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

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

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

1 similar comment
@github-actions
Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

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

  • tier1-dpdk-echo: 6 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
Copy link
Copy Markdown

✅ Integration Tests Passed (Run 26096678999)

Branch: 55/merge | Commit: 21493286

Test Results

  • tier1-dpdk-echo.xml: 6 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 (last 20 lines)

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.92:9000 (MAC: 02:93:f6:ec:94:19)
echo listening on 10.0.1.92:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.247:9000 (MAC: 02:56:ce:ab:55:a5)
echo listening on 10.0.1.247:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

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 12 bytes from 10.0.1.92:9000: 'arp-probe #1'
Test complete
[2026-05-19T12:31:27Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T12:31:27Z] INFO: Test: udp_send_receive
[2026-05-19T12:31:28Z] INFO: UDP send/receive succeeded
[2026-05-19T12:31:28Z] INFO: Test: echo_roundtrip
[2026-05-19T12:31:29Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T12:31:29Z] INFO: Test: payload_integrity
[2026-05-19T12:31:29Z] INFO: Response received, checking payload match...
[2026-05-19T12:31:29Z] INFO: Payload integrity verified (found in response)
[2026-05-19T12:31:29Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-05-19T12:31:29Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-05-19T12:37:01Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-05-19T12:37:01Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-05-19T12:37:01Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-05-19T12:37:01Z] INFO: our-app-sends test complete
Full Application Logs (last 200 lines each)

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.92:9000 (MAC: 02:93:f6:ec:94:19)
echo listening on 10.0.1.92:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.247:9000 (MAC: 02:56:ce:ab:55:a5)
echo listening on 10.0.1.247:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

[2026-05-19T12:28:21Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.92:9000
Bind address: 10.0.1.247: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
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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.247:32768 (MAC: 02:56:ce:ab:55:a5)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.92:9000: 'arp-probe #1'
Test complete
[2026-05-19T12:28:22Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T12:28:22Z] INFO: Test: udp_send_receive
[2026-05-19T12:28:24Z] INFO: UDP send/receive succeeded
[2026-05-19T12:28:24Z] INFO: Test: echo_roundtrip
[2026-05-19T12:28:26Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T12:28:26Z] INFO: Test: payload_integrity
[2026-05-19T12:28:26Z] INFO: Response received, checking payload match...
[2026-05-19T12:28:26Z] INFO: Payload integrity verified (found in response)
[2026-05-19T12:28:26Z] INFO: Test: jumbo_diagnostics
[2026-05-19T12:28:26Z] INFO: === JUMBO FRAME DIAGNOSTICS ===
[2026-05-19T12:28:26Z] INFO: Interface MTU:
  9001
  65536
[2026-05-19T12:28:26Z] INFO:   ens5: MTU=9001
[2026-05-19T12:28:26Z] INFO:   lo: MTU=65536
[2026-05-19T12:28:26Z] INFO: Routing table MTU column:
Iface	Destination	Gateway 	Flags	RefCnt	Use	Metric	Mask		MTU	Window	IRTT                                                       
ens5	00000000	0101000A	0003	0	0	512	00000000	0	0	0                                                                             
ens5	0200000A	0101000A	0007	0	0	512	FFFFFFFF	0	0	0                                                                             
ens5	0001000A	00000000	0001	0	0	512	00FFFFFF	0	0	0                                                                             
ens5	0101000A	00000000	0005	0	0	512	FFFFFFFF	0	0	0                                                                             
[2026-05-19T12:28:26Z] INFO: DPDK port config (from echo server log):
[2026-05-19T12:28:26Z] INFO:   (no MTU info in echo log)
[2026-05-19T12:28:26Z] INFO: === END JUMBO DIAGNOSTICS ===
[2026-05-19T12:28:26Z] INFO: Test: jumbo_echo_8000
[2026-05-19T12:28:28Z] INFO: Jumbo output: UDP Test Client
Target: 10.0.1.92:9000
Bind address: 10.0.1.247:0
Payload size: 8000 bytes
Count: 3
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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.247:32768 (MAC: 02:56:ce:ab:55:a5)
Backend: dpdk
Sending packets...
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.92:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.92:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.92:9000 (expected 8000, OK)
Test complete
[2026-05-19T12:28:28Z] INFO: Jumbo frame echo succeeded: 3/3 responses with correct size
[2026-05-19T12:28:28Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-05-19T12:28:28Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-05-19T12:31:27Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.92: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 12 bytes from 10.0.1.92:9000: 'arp-probe #1'
Test complete
[2026-05-19T12:31:27Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T12:31:27Z] INFO: Test: udp_send_receive
[2026-05-19T12:31:28Z] INFO: UDP send/receive succeeded
[2026-05-19T12:31:28Z] INFO: Test: echo_roundtrip
[2026-05-19T12:31:29Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T12:31:29Z] INFO: Test: payload_integrity
[2026-05-19T12:31:29Z] INFO: Response received, checking payload match...
[2026-05-19T12:31:29Z] INFO: Payload integrity verified (found in response)
[2026-05-19T12:31:29Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-05-19T12:31:29Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

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

sender-test-client-iperf.log

[2026-05-19T12:36:58Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-05-19T12:36:58Z] INFO: Local IP: 10.0.1.247, Peer IP: 10.0.1.92, Port: 9000
[2026-05-19T12:36:58Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.92        0x1         0x2         02:93:f6:ec:94:19     *        ens5
10.0.1.1         0x1         0x2         02:6a:c3:ea:a2:2d     *        ens5
10.0.1.247       0x1         0x2         02:56:ce:ab:55:a5     *        ens5
10.0.1.115       0x1         0x2         02:ad:fe:9a:7f:97     *        ens5
10.0.1.197       0x1         0x2         02:fb:45:31:80:8d     *        ens5
[2026-05-19T12:36:58Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-05-19T12:36:58Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-05-19T12:36:58Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 1894584 May 19 12:26 /opt/dpdk-stdlib/target/release/test-client
[2026-05-19T12:36:58Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.92 --port 9000 --bind-ip 10.0.1.247 --count 10 --delay 200
[2026-05-19T12:37:00Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.92:9000
Bind address: 10.0.1.247: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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.247:32768 (MAC: 02:56:ce:ab:55:a5)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.92:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-05-19T12:37:01Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-05-19T12:37:01Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-05-19T12:37:01Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-05-19T12:37:01Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-075944d1e287f6445 (receiver)
Command ID: 78914228-6cf5-42f0-9602-3a62026aa614

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-075944d1e287f6445 (receiver)
Command ID: 8584040c-4317-457d-a03c-a267cf0faf91

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-075944d1e287f6445 (receiver)
Command ID: d0f6611c-9cb4-4e32-9af9-b1dcf932fbd5

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-075944d1e287f6445 (receiver)
Command ID: af6b6094-e613-4c4c-b19b-deb594d7e420

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0bd83eb25e04eaa52 (sender)
Command ID: 6fb58697-9a4d-4156-a7b3-0f0db2d2f04a

=== 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:f3:c3:30:8a:ab brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-02897ca74e3e0151d
    altname device-number-0.0
    inet 10.0.1.174/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2409sec preferred_lft 2409sec
    inet6 fe80::f3:c3ff:fe30:8aab/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:cc:f1:9b:a7:43 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-021f98917f8452998
    altname device-number-0.0
    inet 10.0.1.138/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2431sec preferred_lft 2431sec
    inet6 fe80::cc:f1ff:fe9b:a743/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

receiver-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-05-19T12:27:42Z
hostname: ip-10-0-1-174.ec2.internal
kernel: 6.18.25-57.109.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:f3:c3:30:8a:ab brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-02897ca74e3e0151d
    altname device-number-0.0
    inet 10.0.1.174/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3324sec preferred_lft 3324sec
    inet6 fe80::f3:c3ff:fe30:8aab/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.1 dev ens5 lladdr 02:6a:c3:ea:a2:2d REACHABLE 
10.0.1.115 dev ens5 lladdr 02:ad:fe:9a:7f:97 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.174 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.174 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.174 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.174 metric 512 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:93:f6:ec:94:19/ 02:f3:c3:30:8a:ab/ 

--- ENI: 02:93:f6:ec:94:19/ ---
  device-number: 1
  local-ipv4s: 10.0.1.92
  subnet-id: subnet-05d4284c3915cf898
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:f3:c3:30:8a:ab/ ---
  device-number: 0
  local-ipv4s: 10.0.1.174
  subnet-id: subnet-05d4284c3915cf898
  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:6a:c3:ea:a2:2d REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.174 ens5
Unicast reply from 10.0.1.1 [02:6A:C3:EA:A2:2D]  0.537ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:     18432 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 May 19 12:27 .
drwxr-xr-x. 14 root root     3100 May 19 12:26 ..
crw-------.  1 root root 243,   0 May 19 12:27 noiommu-0
crw-rw-rw-.  1 root root  10, 196 May 19 12:23 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.053247] printk: legacy console [ttyS0] enabled
[    0.054343] x2apic enabled
[    0.059031] mitigations: Enabled attack vectors: user_kernel, user_user, guest_host, guest_guest, SMT mitigations: auto
[    0.059144] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.068749] audit: type=2000 audit(1779193381.375:1): state=initialized audit_enabled=0 res=1
[    0.079162] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.129425] ACPI: Interpreter enabled
[    0.129425] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.147256] pci 0000:00:05.0: enabling Extended Tags
[    0.224542] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.229796] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.235252] IPI shorthand broadcast: enabled
[    3.335951] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    3.384096] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    3.438402] VFIO - User Level meta-driver version: 0.3
[    3.927660] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.935033] ena 0000:00:05.0: ENA device version: 0.10
[    3.935774] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    4.035030] ena 0000:00:05.0: ENA Large LLQ is disabled
[    4.046935] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:f3:c3:30:8a:ab
[    4.090196] ena 0000:00:05.0 ens5: renamed from eth0
[  231.149178] pci 0000:00:06.0: enabling Extended Tags
[  231.153408] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  231.163718] ena 0000:00:06.0: ENA device version: 0.10
[  231.164488] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  231.263692] ena 0000:00:06.0: ENA Large LLQ is disabled
[  231.275533] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:93:f6:ec:94:19
[  231.283509] ena 0000:00:06.0 ens6: renamed from eth0
[  267.837736] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  267.839275] 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-05-19T12:27:34Z
hostname: ip-10-0-1-138.ec2.internal
kernel: 6.18.25-57.109.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:cc:f1:9b:a7:43 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-021f98917f8452998
    altname device-number-0.0
    inet 10.0.1.138/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3333sec preferred_lft 3333sec
    inet6 fe80::cc:f1ff:fe9b:a743/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.1 dev ens5 lladdr 02:6a:c3:ea:a2:2d REACHABLE 
10.0.1.197 dev ens5 lladdr 02:fb:45:31:80:8d REACHABLE 
10.0.1.115 dev ens5 lladdr 02:ad:fe:9a:7f:97 STALE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.138 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.138 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.138 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.138 metric 512 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:56:ce:ab:55:a5/ 02:cc:f1:9b:a7:43/ 

--- ENI: 02:56:ce:ab:55:a5/ ---
  device-number: 1
  local-ipv4s: 10.0.1.247
  subnet-id: subnet-05d4284c3915cf898
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:cc:f1:9b:a7:43/ ---
  device-number: 0
  local-ipv4s: 10.0.1.138
  subnet-id: subnet-05d4284c3915cf898
  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:6a:c3:ea:a2:2d REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.138 ens5
Unicast reply from 10.0.1.1 [02:6A:C3:EA:A2:2D]  0.538ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:     18432 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 May 19 12:27 .
drwxr-xr-x. 14 root root     3100 May 19 12:26 ..
crw-------.  1 root root 243,   0 May 19 12:27 noiommu-0
crw-rw-rw-.  1 root root  10, 196 May 19 12:23 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.052935] printk: legacy console [ttyS0] enabled
[    0.054023] x2apic enabled
[    0.058690] mitigations: Enabled attack vectors: user_kernel, user_user, guest_host, guest_guest, SMT mitigations: auto
[    0.058804] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.068373] audit: type=2000 audit(1779193382.592:1): state=initialized audit_enabled=0 res=1
[    0.078754] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.129314] ACPI: Interpreter enabled
[    0.129314] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.147454] pci 0000:00:05.0: enabling Extended Tags
[    0.224075] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.229939] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.233196] IPI shorthand broadcast: enabled
[    2.716140] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.757305] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.818717] VFIO - User Level meta-driver version: 0.3
[    3.272613] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.301964] ena 0000:00:05.0: ENA device version: 0.10
[    3.302717] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.404989] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.416996] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:cc:f1:9b:a7:43
[    3.452663] ena 0000:00:05.0 ens5: renamed from eth0
[  211.898605] pci 0000:00:06.0: enabling Extended Tags
[  211.902678] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  211.914447] ena 0000:00:06.0: ENA device version: 0.10
[  211.915222] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  212.014433] ena 0000:00:06.0: ENA Large LLQ is disabled
[  212.026132] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:56:ce:ab:55:a5
[  212.033135] ena 0000:00:06.0 ens6: renamed from eth0
[  259.878642] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  259.880093] 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.068106] pid_max: default: 32768 minimum: 301
[    0.151172] iommu: Default domain type: Translated
[    0.151194] NetLabel:  unlabeled traffic allowed by default
[    0.190538] PCI: CLS 0 bytes, default 64
[    0.245207] nvme nvme0: 2/0/0 default/read/poll queues
[    0.415346] 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.415443] systemd[1]: No hostname configured, using default hostname.
[    0.468173] systemd[1]: Queued start job for default target initrd.target.
[    2.590095] 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)
[  304.856560] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4367)
[  490.765415] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4802)
[ 1060.211918] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:5836)

sender-dmesg-crashes.log

[    0.067752] pid_max: default: 32768 minimum: 301
[    0.151338] iommu: Default domain type: Translated
[    0.151363] NetLabel:  unlabeled traffic allowed by default
[    0.190258] PCI: CLS 0 bytes, default 64
[    0.249196] nvme nvme0: 2/0/0 default/read/poll queues
[    0.435546] 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.435638] systemd[1]: No hostname configured, using default hostname.
[    0.488579] systemd[1]: Queued start job for default target initrd.target.
[    1.929499] 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)
[  880.315703] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:5639)
Kernel Console (dmesg)

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

[  304.854871] vfio-pci 0000:00:06.0: reset done
[  304.856560] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4367)
[  304.858177] vfio-pci 0000:00:06.0: resetting
[  305.084641] vfio-pci 0000:00:06.0: reset done
[  385.726398] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  386.739268] ena 0000:00:06.0: ENA device version: 0.10
[  386.740015] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  386.841170] ena 0000:00:06.0: ENA Large LLQ is disabled
[  386.853788] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:93:f6:ec:94:19
[  386.864446] ena 0000:00:06.0 ens6: renamed from eth0 (while UP)
[  406.496417] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  406.497810] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  490.541749] vfio-pci 0000:00:06.0: resetting
[  490.763843] vfio-pci 0000:00:06.0: reset done
[  490.765415] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4802)
[  490.766854] vfio-pci 0000:00:06.0: resetting
[  490.983699] vfio-pci 0000:00:06.0: reset done
[  565.308985] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  566.321770] ena 0000:00:06.0: ENA device version: 0.10
[  566.322531] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  566.421755] ena 0000:00:06.0: ENA Large LLQ is disabled
[  566.433508] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:93:f6:ec:94:19
[  566.444792] ena 0000:00:06.0 ens6: renamed from eth0 (while UP)
[  980.963559] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  980.964995] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[ 1059.981840] vfio-pci 0000:00:06.0: resetting
[ 1060.210342] vfio-pci 0000:00:06.0: reset done
[ 1060.211918] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:5836)
[ 1060.213365] vfio-pci 0000:00:06.0: resetting
[ 1060.430212] vfio-pci 0000:00:06.0: reset done

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

[  880.317186] vfio-pci 0000:00:06.0: resetting
[  880.533953] vfio-pci 0000:00:06.0: reset done
[  942.409161] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  943.422160] ena 0000:00:06.0: ENA device version: 0.10
[  943.422938] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  943.522312] ena 0000:00:06.0: ENA Large LLQ is disabled
[  943.534054] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:56:ce:ab:55:a5
[  943.542952] ena 0000:00:06.0 ens6: renamed from eth0
[  973.075915] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  973.077377] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[ 1074.631556] vfio-pci 0000:00:06.0: resetting
[ 1074.843520] vfio-pci 0000:00:06.0: reset done
[ 1074.845107] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6087)
[ 1074.846758] vfio-pci 0000:00:06.0: resetting
[ 1075.063394] vfio-pci 0000:00:06.0: reset done
[ 1075.351736] vfio-pci 0000:00:06.0: resetting
[ 1075.563426] vfio-pci 0000:00:06.0: reset done
[ 1075.565025] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6107)
[ 1075.566698] vfio-pci 0000:00:06.0: resetting
[ 1075.783373] vfio-pci 0000:00:06.0: reset done
[ 1077.073417] vfio-pci 0000:00:06.0: resetting
[ 1077.283429] vfio-pci 0000:00:06.0: reset done
[ 1077.285058] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6130)
[ 1077.286783] vfio-pci 0000:00:06.0: resetting
[ 1077.503439] vfio-pci 0000:00:06.0: reset done
[ 1078.793502] vfio-pci 0000:00:06.0: resetting
[ 1079.003397] vfio-pci 0000:00:06.0: reset done
[ 1079.004988] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6153)
[ 1079.006693] vfio-pci 0000:00:06.0: resetting
[ 1079.223451] vfio-pci 0000:00:06.0: reset done

@github-actions
Copy link
Copy Markdown

✅ Integration Tests Passed — Graviton (run)

Branch: 55/merge | Commit: 21493286

Test Results

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

Application Logs (last 20 lines)

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.34:9000 (MAC: 02:dc:8d:65:7f:ff)
echo listening on 10.0.1.34:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.235:9000 (MAC: 02:4d:59:9d:12:f1)
echo listening on 10.0.1.235:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

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 12 bytes from 10.0.1.34:9000: 'arp-probe #1'
Test complete
[2026-05-19T12:31:36Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T12:31:36Z] INFO: Test: udp_send_receive
[2026-05-19T12:31:38Z] INFO: UDP send/receive succeeded
[2026-05-19T12:31:38Z] INFO: Test: echo_roundtrip
[2026-05-19T12:31:38Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T12:31:38Z] INFO: Test: payload_integrity
[2026-05-19T12:31:38Z] INFO: Response received, checking payload match...
[2026-05-19T12:31:38Z] INFO: Payload integrity verified (found in response)
[2026-05-19T12:31:38Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-05-19T12:31:38Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Deploy

Deploying PerfTestStack...
Configs: plain-rust,rust-dpdk,tokio-dpdk,native-dpdk
Packet sizes: 64,512,1400,8500

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Deploy

Deploying PerfTestStackGraviton...
Configs: plain-rust,rust-dpdk,tokio-dpdk,native-dpdk
Packet sizes: 64,512,1400,8500

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Instances Ready

  • TRex: i-063eb41cfa6f7c480 (10.0.1.158)
  • DUT: i-029df8bcf36140b2b (10.0.1.69)
  • Instance type: unknown

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Instances Ready

  • TRex: i-0044198d3c4ed9542 (10.0.1.207)
  • DUT: i-00122c5c63c58de6e (10.0.1.177)
  • Instance type: unknown

@github-actions
Copy link
Copy Markdown

[Perf] Stage: TRex Config

Starting TRex configuration (MAC discovery + NIC binding)...

1 similar comment
@github-actions
Copy link
Copy Markdown

[Perf] Stage: TRex Config

Starting TRex configuration (MAC discovery + NIC binding)...

@github-actions
Copy link
Copy Markdown

[Perf] Stage: TRex Config OK

  • TX: 0000:00:06.0 MAC: 02:6b:8f:22:9d:a9
  • RX: 0000:00:07.0 MAC: 02:4c:93:53:d8:a5
  • Gateway MAC: 02:ca:01:44:0d:bd
    Starting TRex server...

@github-actions
Copy link
Copy Markdown

[Perf] Stage: TRex Config OK

  • TX: 0000:00:06.0 MAC: 02:f5:47:f8:dd:61
  • RX: 0000:00:07.0 MAC: 02:d5:11:59:f3:6b
  • Gateway MAC: 02:a7:fb:23:ac:15
    Starting TRex server...

@github-actions
Copy link
Copy Markdown

[Perf] Stage: TRex Started

TRex server running. Beginning benchmarks...

@github-actions
Copy link
Copy Markdown

[Perf] DUT Ready

DUT instance i-029df8bcf36140b2b SSM working, build complete.

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Benchmark (1/4)

Running plain-rust benchmark...
Packet sizes: 64,512,1400,8500 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions
Copy link
Copy Markdown

[Perf] Stage: TRex Started

TRex server running. Beginning benchmarks...

@github-actions
Copy link
Copy Markdown

[Perf] DUT Ready

DUT instance i-00122c5c63c58de6e SSM working, build complete.

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Benchmark (1/4)

Running plain-rust benchmark...
Packet sizes: 64,512,1400,8500 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust preflight

TRex API OK: 2 ports
  Port 0: 02:6b:8f:22:9d:a9
  Port 1: 02:4c:93:53:d8:a5
PREFLIGHT_OK

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust preflight

TRex API OK: 2 ports
  Port 0: 02:f5:47:f8:dd:61
  Port 1: 02:d5:11:59:f3:6b
PREFLIGHT_OK

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:6b:8f:22:9d:a9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 68,957 pps, Drop: 1.4907%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 151.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,991 pps, Drop: 0.2882%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 415,457 pps, Drop: 40.649%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 123.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,838 pps, Drop: 0.3321%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 384,549 pps, Drop: 45.0645%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4285%, Lat avg: 186.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,751 pps, Drop: 0.357%, Lat avg: 223.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 406,584 pps, Drop: 41.9166%, Lat avg: 0.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 34,214 pps, Drop: 51.1232%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 125,224 pps, RX: 124,272 pps, Drop: 0.7601%, Lat avg: 9112.0 us
  Target: 350,000 pps ... TX: 125,226 pps, RX: 123,693 pps, Drop: 1.2246%, Lat avg: 0.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

Results written to /tmp/perf-results/plain-rust.json
EXIT_CODE=0

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: plain-rust result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:f5:47:f8:dd:61

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7142%, Lat avg: 244.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,999 pps, Drop: 0.286%, Lat avg: 238.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 545,843 pps, Drop: 22.0225%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4285%, Lat avg: 200.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 202.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,821 pps, Drop: 0.3368%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 491,294 pps, Drop: 29.8152%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4285%, Lat avg: 228.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 187.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,795 pps, Drop: 0.3442%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 476,516 pps, RX: 397,049 pps, Drop: 16.6768%, Lat avg: 2793.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 21,209 pps, Drop: 69.702%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 78,338 pps, RX: 77,771 pps, Drop: 0.7248%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 78,298 pps, RX: 77,699 pps, Drop: 0.7649%, Lat avg: 0.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

Results written to /tmp/perf-results/plain-rust.json
EXIT_CODE=0

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Benchmark (2/4)

Running rust-dpdk benchmark...
Packet sizes: 64,512,1400,8500 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Benchmark (3/4)

Running tokio-dpdk benchmark...
Packet sizes: 64,512,1400,8500 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: tokio-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:6b:8f:22:9d:a9
  Port 1: 02:4c:93:53:d8:a5
PREFLIGHT_OK

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: tokio-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:f5:47:f8:dd:61
  Port 1: 02:d5:11:59:f3:6b
PREFLIGHT_OK

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: tokio-dpdk result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:6b:8f:22:9d:a9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 291,333 pps, Drop: 16.7619%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 289,616 pps, Drop: 58.6263%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 212,718 pps, Drop: 39.2234%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 212,962 pps, Drop: 69.5768%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 138,674 pps, Drop: 0.947%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 137,871 pps, Drop: 60.6084%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 138,846 pps, Drop: 80.1648%, Lat avg: 0.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 53,094 pps, Drop: 24.1517%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 125,273 pps, RX: 56,486 pps, Drop: 54.9097%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 125,205 pps, RX: 56,816 pps, Drop: 54.622%, Lat avg: 0.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

Results written to /tmp/perf-results/tokio-dpdk.json
EXIT_CODE=0

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: tokio-dpdk result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:f5:47:f8:dd:61

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 348,930 pps, Drop: 0.3057%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 370,092 pps, Drop: 47.1297%, Lat avg: 0.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 277,645 pps, Drop: 20.673%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 277,446 pps, Drop: 60.3649%, Lat avg: 0.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 139,000 pps, Drop: 0.7143%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 175,520 pps, Drop: 49.8516%, Lat avg: 0.0 us
  Target: 700,000 pps ... TX: 476,286 pps, RX: 185,888 pps, Drop: 60.9713%, Lat avg: 0.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 69,000 pps, Drop: 1.4286%, Lat avg: 0.0 us
  Target: 140,000 pps ... TX: 78,356 pps, RX: 77,026 pps, Drop: 1.6974%, Lat avg: 0.0 us
  Target: 350,000 pps ... TX: 78,286 pps, RX: 75,400 pps, Drop: 3.6859%, Lat avg: 0.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

Results written to /tmp/perf-results/tokio-dpdk.json
EXIT_CODE=0

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Benchmark (4/4)

Running native-dpdk benchmark...
Packet sizes: 64,512,1400,8500 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

1 similar comment
@github-actions
Copy link
Copy Markdown

[Perf] Stage: Benchmark (4/4)

Running native-dpdk benchmark...
Packet sizes: 64,512,1400,8500 | Duration: 30s/step | Target PPS: 70000,140000,350000,700000

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:6b:8f:22:9d:a9
  Port 1: 02:4c:93:53:d8:a5
PREFLIGHT_OK

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk preflight

TRex API OK: 2 ports
  Port 0: 02:f5:47:f8:dd:61
  Port 1: 02:d5:11:59:f3:6b
PREFLIGHT_OK

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:6b:8f:22:9d:a9

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 58.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 73.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 87.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 699,383 pps, Drop: 0.0882%, Lat avg: 309.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 60.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 86.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 93.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 684,402 pps, Drop: 2.2282%, Lat avg: 1322.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 63.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 83.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,997 pps, Drop: 0.0009%, Lat avg: 96.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 660,506 pps, Drop: 5.6421%, Lat avg: 1296.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 68.0 us
  Target: 140,000 pps ... TX: 125,284 pps, RX: 125,284 pps, Drop: 0.0005%, Lat avg: 9042.0 us
  Target: 350,000 pps ... TX: 125,302 pps, RX: 124,154 pps, Drop: 0.9164%, Lat avg: 9245.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

Results written to /tmp/perf-results/native-dpdk.json
EXIT_CODE=0

@github-actions
Copy link
Copy Markdown

[Perf] Benchmark Diag: native-dpdk result

SSM exit: 0

Output (last 30 lines)
Duration per step: 30s
Source MAC: 02:f5:47:f8:dd:61

--- Packet size: 64B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 122.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 136.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,969 pps, Drop: 0.0088%, Lat avg: 160.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 645,675 pps, Drop: 7.7607%, Lat avg: 854.0 us

--- Packet size: 512B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 116.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 139.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 350,000 pps, Drop: 0.0%, Lat avg: 148.0 us
  Target: 700,000 pps ... TX: 700,000 pps, RX: 647,014 pps, Drop: 7.5694%, Lat avg: 1072.0 us

--- Packet size: 1400B ---
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 110.0 us
  Target: 140,000 pps ... TX: 140,000 pps, RX: 140,000 pps, Drop: 0.0%, Lat avg: 114.0 us
  Target: 350,000 pps ... TX: 350,000 pps, RX: 349,999 pps, Drop: 0.0002%, Lat avg: 172.0 us
  Target: 700,000 pps ... TX: 475,748 pps, RX: 473,721 pps, Drop: 0.4262%, Lat avg: 2559.0 us

--- Packet size: 8500B ---
  (jumbo: capping at 418,133 pps for 30.0 Gbps limit)
  Target: 70,000 pps ... TX: 70,000 pps, RX: 70,000 pps, Drop: 0.0%, Lat avg: 143.0 us
  Target: 140,000 pps ... TX: 78,286 pps, RX: 78,278 pps, Drop: 0.0103%, Lat avg: 13863.0 us
  Target: 350,000 pps ... TX: 78,292 pps, RX: 77,964 pps, Drop: 0.4198%, Lat avg: 14155.0 us
  Target: 700,000 pps ... SKIPPED (exceeds 30.0 Gbps cap)

Results written to /tmp/perf-results/native-dpdk.json
EXIT_CODE=0

@github-actions
Copy link
Copy Markdown

[Perf] Diag: testpmd log

testpmd output (last 30 lines)
=== testpmd stats (last 30 lines) ===
  ############################################################################
Telling cores to stop...
Waiting for lcores to finish...

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 121498585      RX-dropped: 0             RX-total: 121498585
  RX-error: 425277
  RX-nombufs: 0             
  TX-packets: 121346427      TX-dropped: 152158        TX-total: 121498585
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 121498585      RX-dropped: 0             RX-total: 121498585
  TX-packets: 121346427      TX-dropped: 152158        TX-total: 121498585
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Done.

Stopping port 0...
Stopping ports...
Done

Shutting down port 0...
ena_rx_queue_release(): Rx queue 0:0 released
ena_tx_queue_release(): Tx queue 0:0 released
Closing ports...
Port 0 is closed
Done

Bye...
=== ENA port stats ===
N/A (vfio-pci)

@github-actions
Copy link
Copy Markdown

[Perf] Diag: testpmd log

testpmd output (last 30 lines)
=== testpmd stats (last 30 lines) ===
  ############################################################################
Telling cores to stop...
Waiting for lcores to finish...

  ---------------------- Forward statistics for port 0  ----------------------
  RX-packets: 113439789      RX-dropped: 0             RX-total: 113439789
  RX-error: 403551
  RX-nombufs: 0             
  TX-packets: 113438070      TX-dropped: 1719          TX-total: 113439789
  ----------------------------------------------------------------------------

  +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++
  RX-packets: 113439789      RX-dropped: 0             RX-total: 113439789
  TX-packets: 113438070      TX-dropped: 1719          TX-total: 113439789
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Done.

Stopping port 0...
Stopping ports...
Done

Shutting down port 0...
ena_rx_queue_release(): Rx queue 0:0 released
ena_tx_queue_release(): Tx queue 0:0 released
Closing ports...
Port 0 is closed
Done

Bye...
=== ENA port stats ===
N/A (vfio-pci)

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Results

[13:41:29] INFO Generating markdown summary...

Performance Test Results — unknown

Commit: d657d0ea
Timestamp: 2026-05-19T13:41:29.949153+00:00

64B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 58.0 359.0 35.8 35.8
native-dpdk 140,000 140,000 140,000 0.00% 73.0 294.0 71.7 71.7
native-dpdk 350,000 350,000 350,000 0.00% 87.0 289.0 179.2 179.2
native-dpdk 700,000 700,000 699,383 0.09% 309.0 2325.0 358.4 358.1
rust-dpdk 70,000 70,000 69,000 1.43% 0 30,012 0 0 166.0 0.0 35.8 35.3
rust-dpdk 140,000 140,000 139,000 0.71% 0 41,904 0 0 0.0 0.0 71.7 71.2
rust-dpdk 350,000 350,000 349,000 0.29% 0 31,885 0 0 0.0 0.0 179.2 178.7
rust-dpdk 700,000 700,000 685,258 2.11% 0 41,461 0 0 0.0 0.0 358.4 350.9
tokio-dpdk 70,000 70,000 69,000 1.43% 0 39,685 0 0 0.0 0.0 35.8 38.6
tokio-dpdk 140,000 140,000 139,000 0.71% 0 33,024 0 0 0.0 0.0 71.7 77.8
tokio-dpdk 350,000 350,000 291,333 16.76% 0 17,546 0 0 0.0 0.0 179.2 163.2
tokio-dpdk 700,000 700,000 289,616 58.63% 0 21,393 0 0 0.0 0.0 358.4 162.2
plain-rust 70,000 70,000 68,957 1.49% 0.0 0.0 35.8 35.3
plain-rust 140,000 140,000 139,000 0.71% 151.0 0.0 71.7 71.2
plain-rust 350,000 350,000 348,991 0.29% 0.0 0.0 179.2 178.7
plain-rust 700,000 700,000 415,457 40.65% 0.0 0.0 358.4 212.7

512B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 60.0 325.0 286.7 286.7
native-dpdk 140,000 140,000 140,000 0.00% 86.0 381.0 573.4 573.4
native-dpdk 350,000 350,000 350,000 0.00% 93.0 881.0 1433.6 1433.6
native-dpdk 700,000 700,000 684,402 2.23% 1322.0 4077.0 2867.2 2803.3
rust-dpdk 70,000 70,000 69,000 1.43% 0 33,835 0 0 0.0 0.0 286.7 282.6
rust-dpdk 140,000 140,000 139,000 0.71% 0 41,926 0 0 109.0 0.0 573.4 569.3
rust-dpdk 350,000 350,000 348,978 0.29% 0 35,550 0 0 160.0 0.0 1433.6 1429.4
rust-dpdk 700,000 700,000 661,142 5.55% 0 30,463 0 0 1251.0 0.0 2867.2 2708.0
tokio-dpdk 70,000 70,000 69,000 1.43% 0 33,482 0 0 0.0 0.0 286.7 285.9
tokio-dpdk 140,000 140,000 139,000 0.71% 0 35,555 0 0 0.0 0.0 573.4 576.0
tokio-dpdk 350,000 350,000 212,718 39.22% 0 11,135 0 0 0.0 0.0 1433.6 881.5
tokio-dpdk 700,000 700,000 212,962 69.58% 0 10,040 0 0 0.0 0.0 2867.2 882.5
plain-rust 70,000 70,000 69,000 1.43% 0.0 0.0 286.7 282.6
plain-rust 140,000 140,000 139,000 0.71% 123.0 0.0 573.4 569.3
plain-rust 350,000 350,000 348,838 0.33% 0.0 0.0 1433.6 1428.8
plain-rust 700,000 700,000 384,549 45.06% 0.0 0.0 2867.2 1575.1

1400B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 63.0 306.0 784.0 784.0
native-dpdk 140,000 140,000 140,000 0.00% 83.0 509.0 1568.0 1568.0
native-dpdk 350,000 350,000 349,997 0.00% 96.0 1855.0 3920.0 3920.0
native-dpdk 700,000 700,000 660,506 5.64% 1296.0 4826.0 7840.0 7397.7
rust-dpdk 70,000 70,000 69,000 1.43% 0 41,624 0 0 0.0 0.0 784.0 772.8
rust-dpdk 140,000 140,000 139,000 0.71% 0 33,589 0 0 0.0 0.0 1568.0 1556.8
rust-dpdk 350,000 350,000 348,973 0.29% 0 39,193 0 0 0.0 0.0 3920.0 3908.5
rust-dpdk 700,000 700,000 549,876 21.45% 0 26,984 0 0 0.0 0.0 7840.0 6158.6
tokio-dpdk 70,000 70,000 69,000 1.43% 0 38,349 0 0 0.0 0.0 784.0 776.1
tokio-dpdk 140,000 140,000 138,674 0.95% 0 30,468 0 0 0.0 0.0 1568.0 1559.8
tokio-dpdk 350,000 350,000 137,871 60.61% 0 10,655 0 0 0.0 0.0 3920.0 1550.8
tokio-dpdk 700,000 700,000 138,846 80.16% 0 5,957 0 0 0.0 0.0 7840.0 1561.7
plain-rust 70,000 70,000 69,000 1.43% 186.0 0.0 784.0 772.8
plain-rust 140,000 140,000 139,000 0.71% 0.0 0.0 1568.0 1556.8
plain-rust 350,000 350,000 348,751 0.36% 223.0 0.0 3920.0 3906.0
plain-rust 700,000 700,000 406,584 41.92% 0.0 0.0 7840.0 4553.7

8500B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 68.0 1507.0 4760.0 4760.0
native-dpdk 140,000 125,284 125,284 0.00% 9042.0 9555.0 8519.3 8519.3
native-dpdk 350,000 125,302 124,154 0.92% 9245.0 9773.0 8520.5 8442.4
rust-dpdk 70,000 70,000 69,000 1.43% 0 31,576 0 0 555.0 0.0 4760.0 4692.0
rust-dpdk 140,000 125,213 124,253 0.77% 0 33,689 0 0 8725.0 0.0 8514.5 8449.2
rust-dpdk 350,000 125,210 123,519 1.35% 0 11,024 0 0 0.0 0.0 8514.3 8399.3
tokio-dpdk 70,000 70,000 53,094 24.15% 0 3,127 0 0 0.0 0.0 4760.0 3612.9
tokio-dpdk 140,000 125,273 56,486 54.91% 0 14,559 0 0 0.0 0.0 8518.5 3843.8
tokio-dpdk 350,000 125,205 56,816 54.62% 0 5,166 0 0 0.0 0.0 8514.0 3866.2
plain-rust 70,000 70,000 34,214 51.12% 0.0 0.0 4760.0 2326.5
plain-rust 140,000 125,224 124,272 0.76% 9112.0 0.0 8515.2 8450.5
plain-rust 350,000 125,226 123,693 1.22% 0.0 0.0 8515.4 8411.1

NIC Drops Instrumentation Self-Check

Compares (NIC-FINAL − NIC-BASELINE) one-shot snapshots against the sum of per-tick [PERF] deltas over the reporter's lifetime. These MUST match exactly — a mismatch means per-tick delta bookkeeping is losing data.

Config Status imissed (expected / actual / Δ) ierrors (expected / actual / Δ) rx_nombuf (expected / actual / Δ)
native-dpdk no instrumentation
rust-dpdk OK 0 / 0 / 0 416,973 / 416,973 / 0 0 / 0 / 0
tokio-dpdk OK 0 / 0 / 0 258,191 / 258,191 / 0 0 / 0 / 0
plain-rust no instrumentation

expected = FINAL − BASELINE (raw NIC counter delta across reporter lifetime). actual = sum of per-tick [PERF] delta fields. Any Δ ≠ 0 is a bug in the tick loop's bookkeeping.

plain-rust Kernel NIC Drops (ethtool -S delta)

ethtool snapshots not available — baseline or final file missing in $LOGS_DIR/dut-plain-rust-ethtool-*.txt.

Full results artifact

@github-actions
Copy link
Copy Markdown

[Perf] Stage: Results

[13:42:04] INFO Generating markdown summary...

Performance Test Results — unknown

Commit: d657d0ea
Timestamp: 2026-05-19T13:42:04.460119+00:00

64B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 122.0 642.0 35.8 35.8
native-dpdk 140,000 140,000 140,000 0.00% 136.0 661.0 71.7 71.7
native-dpdk 350,000 350,000 349,969 0.01% 160.0 7034.0 179.2 179.2
native-dpdk 700,000 700,000 645,675 7.76% 854.0 6361.0 358.4 330.6
rust-dpdk 70,000 70,000 69,000 1.43% 0 39,772 0 0 0.0 0.0 35.8 35.3
rust-dpdk 140,000 140,000 139,000 0.71% 0 35,729 0 0 0.0 0.0 71.7 71.2
rust-dpdk 350,000 350,000 348,999 0.29% 0 31,897 0 0 286.0 0.0 179.2 178.7
rust-dpdk 700,000 700,000 654,915 6.44% 0 41,879 0 0 456.0 0.0 358.4 335.3
tokio-dpdk 70,000 70,000 69,000 1.43% 0 39,478 0 0 0.0 0.0 35.8 38.6
tokio-dpdk 140,000 140,000 139,000 0.71% 0 35,437 0 0 0.0 0.0 71.7 77.8
tokio-dpdk 350,000 350,000 348,930 0.31% 0 31,246 0 0 0.0 0.0 179.2 195.4
tokio-dpdk 700,000 700,000 370,092 47.13% 0 27,735 0 0 0.0 0.0 358.4 207.2
plain-rust 70,000 70,000 69,000 1.43% 0.0 0.0 35.8 35.3
plain-rust 140,000 140,000 139,000 0.71% 244.0 0.0 71.7 71.2
plain-rust 350,000 350,000 348,999 0.29% 238.0 0.0 179.2 178.7
plain-rust 700,000 700,000 545,843 22.02% 0.0 0.0 358.4 279.5

512B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 116.0 446.0 286.7 286.7
native-dpdk 140,000 140,000 140,000 0.00% 139.0 547.0 573.4 573.4
native-dpdk 350,000 350,000 350,000 0.00% 148.0 1240.0 1433.6 1433.6
native-dpdk 700,000 700,000 647,014 7.57% 1072.0 4207.0 2867.2 2650.2
rust-dpdk 70,000 70,000 69,000 1.43% 0 33,617 0 0 0.0 0.0 286.7 282.6
rust-dpdk 140,000 140,000 139,000 0.71% 0 41,909 0 0 213.0 0.0 573.4 569.3
rust-dpdk 350,000 350,000 348,997 0.29% 0 35,443 0 0 314.0 0.0 1433.6 1429.5
rust-dpdk 700,000 700,000 616,015 12.00% 0 31,852 0 0 0.0 0.0 2867.2 2523.2
tokio-dpdk 70,000 70,000 69,000 1.43% 0 33,291 0 0 0.0 0.0 286.7 285.9
tokio-dpdk 140,000 140,000 139,000 0.71% 0 37,273 0 0 0.0 0.0 573.4 576.0
tokio-dpdk 350,000 350,000 277,645 20.67% 0 16,500 0 0 0.0 0.0 1433.6 1150.6
tokio-dpdk 700,000 700,000 277,446 60.36% 0 13,032 0 0 0.0 0.0 2867.2 1149.7
plain-rust 70,000 70,000 69,000 1.43% 200.0 0.0 286.7 282.6
plain-rust 140,000 140,000 139,000 0.71% 202.0 0.0 573.4 569.3
plain-rust 350,000 350,000 348,821 0.34% 0.0 0.0 1433.6 1428.8
plain-rust 700,000 700,000 491,294 29.82% 0.0 0.0 2867.2 2012.3

1400B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 110.0 446.0 784.0 784.0
native-dpdk 140,000 140,000 140,000 0.00% 114.0 445.0 1568.0 1568.0
native-dpdk 350,000 350,000 349,999 0.00% 172.0 1272.0 3920.0 3920.0
native-dpdk 700,000 475,748 473,721 0.43% 2559.0 4429.0 5328.4 5305.7
rust-dpdk 70,000 70,000 69,000 1.43% 0 42,176 0 0 170.0 0.0 784.0 772.8
rust-dpdk 140,000 140,000 139,000 0.71% 0 33,412 0 0 0.0 0.0 1568.0 1556.8
rust-dpdk 350,000 350,000 348,959 0.30% 0 38,521 0 0 0.0 0.0 3920.0 3908.3
rust-dpdk 700,000 475,129 470,264 1.02% 0 25,537 0 0 0.0 0.0 5321.4 5267.0
tokio-dpdk 70,000 70,000 69,000 1.43% 0 38,986 0 0 0.0 0.0 784.0 776.1
tokio-dpdk 140,000 140,000 139,000 0.71% 0 30,817 0 0 0.0 0.0 1568.0 1563.5
tokio-dpdk 350,000 350,000 175,520 49.85% 0 13,233 0 0 0.0 0.0 3920.0 1974.2
tokio-dpdk 700,000 476,286 185,888 60.97% 0 12,795 0 0 0.0 0.0 5334.4 2090.9
plain-rust 70,000 70,000 69,000 1.43% 228.0 0.0 784.0 772.8
plain-rust 140,000 140,000 139,000 0.71% 187.0 0.0 1568.0 1556.8
plain-rust 350,000 350,000 348,795 0.34% 0.0 0.0 3920.0 3906.5
plain-rust 700,000 476,516 397,049 16.68% 2793.0 0.0 5337.0 4446.9

8500B packets

Config Target PPS TX pps RX pps Drop % NIC imissed NIC ierrors NIC nombuf App Drops Lat Avg (us) Lat Max (us) TX Mbps RX Mbps
native-dpdk 70,000 70,000 70,000 0.00% 143.0 404.0 4760.0 4760.0
native-dpdk 140,000 78,286 78,278 0.01% 13863.0 14796.0 5323.4 5322.9
native-dpdk 350,000 78,292 77,964 0.42% 14155.0 14840.0 5323.9 5301.5
rust-dpdk 70,000 70,000 69,000 1.43% 0 32,228 0 0 0.0 0.0 4760.0 4692.0
rust-dpdk 140,000 78,313 77,654 0.84% 0 22,827 0 0 0.0 0.0 5325.3 5280.5
rust-dpdk 350,000 78,299 77,624 0.86% 0 7,053 0 0 0.0 0.0 5324.3 5278.5
tokio-dpdk 70,000 70,000 69,000 1.43% 0 31,147 0 0 0.0 0.0 4760.0 4695.3
tokio-dpdk 140,000 78,356 77,026 1.70% 0 23,096 0 0 0.0 0.0 5328.2 5241.4
tokio-dpdk 350,000 78,286 75,400 3.69% 0 7,239 0 0 0.0 0.0 5323.4 5130.9
plain-rust 70,000 70,000 21,209 69.70% 0.0 0.0 4760.0 1442.2
plain-rust 140,000 78,338 77,771 0.72% 0.0 0.0 5327.0 5288.4
plain-rust 350,000 78,298 77,699 0.76% 0.0 0.0 5324.3 5283.6

NIC Drops Instrumentation Self-Check

Compares (NIC-FINAL − NIC-BASELINE) one-shot snapshots against the sum of per-tick [PERF] deltas over the reporter's lifetime. These MUST match exactly — a mismatch means per-tick delta bookkeeping is losing data.

Config Status imissed (expected / actual / Δ) ierrors (expected / actual / Δ) rx_nombuf (expected / actual / Δ)
native-dpdk no instrumentation
rust-dpdk OK 0 / 0 / 0 403,453 / 403,453 / 0 0 / 0 / 0
tokio-dpdk OK 0 / 0 / 0 321,144 / 321,144 / 0 0 / 0 / 0
plain-rust no instrumentation

expected = FINAL − BASELINE (raw NIC counter delta across reporter lifetime). actual = sum of per-tick [PERF] delta fields. Any Δ ≠ 0 is a bug in the tick loop's bookkeeping.

plain-rust Kernel NIC Drops (ethtool -S delta)

ethtool snapshots not available — baseline or final file missing in $LOGS_DIR/dut-plain-rust-ethtool-*.txt.

Full results artifact

@gspivey
Copy link
Copy Markdown
Owner Author

gspivey commented May 19, 2026

Good catch — you're right that computing the full software checksum and then overwriting it with the pseudo-header checksum is redundant work when hardware offload is active.

However, this is the same pattern the existing IPv4 path uses: build_udp_frame_into() always computes the full checksum (because it's backend-agnostic — the Generic/AF_PACKET backends need it), and then send_frame() overwrites the checksum field with the pseudo-header checksum for the NIC.

The fix would be to thread an offload_active: bool parameter into the frame builders so they can skip the checksum computation entirely. That's an API change to build_udp_frame_into() / build_udp6_frame_into() and affects both IPv4 and IPv6.

I'll implement this optimization in this PR — making the frame builders accept an offload hint so they write only the pseudo-header checksum (or zero for IPv4 IP header) when hardware will handle it. This eliminates the redundant computation for both IPv4 and IPv6.

@gspivey
Copy link
Copy Markdown
Owner Author

gspivey commented May 19, 2026

To clarify the flow:

  1. build_udp6_frame_into() computes the full software checksum (needed by Generic/AF_PACKET backends)
  2. send_frame() on the DPDK path overwrites the checksum field with the pseudo-header checksum
  3. The NIC computes the final checksum from the pseudo-header value

So software and hardware aren't both computing the same checksum — the software pseudo-header checksum is an input to the hardware computation, not a duplicate of it. The NIC needs the pseudo-header value in the checksum field to produce the correct final checksum.

The redundancy is: step 1 computes a full checksum that step 2 immediately overwrites. This wastes ~100ns per packet. I'll fix this by having send_frame() skip the overwrite when the frame builder already wrote the correct value — or better, by not computing the full checksum when we know offload is active.

Implementing now: I'll modify the TX path so that when DPDK offload is active, the pseudo-header checksum is written directly (skipping the full checksum computation that would be overwritten anyway).

Performance tests show no regression from the ethertype detection
branch added to send_frame(). Results consistent with prior runs
across all packet sizes on both x86 and Graviton.
@github-actions
Copy link
Copy Markdown

Synthetic Performance Results — Graviton (run)

Commit: 2ce1f662

✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)

Synthetic UDP Performance Results

Measures framework overhead: sync dpdk_udp::UdpSocket vs async (std::sync::Mutex + try_recv_from).

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to 64B 11.6M 10.4M 1.1x 96
RX recv_from 64B 3.3M 4.5M 0.7x 220
TX send_to 1400B 1.6M 1.6M 1.0x 610
RX recv_from 1400B 1.0M 1.1M 0.9x 928

Avg sync/async ratio: 0.9x, worst: 1.1x

Good: Async wrapper is within 1.1x of sync — minimal framework overhead.

@github-actions
Copy link
Copy Markdown

Synthetic Performance Results (run)

Commit: 2ce1f662

✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)
✅ synthetic UDP socket bound to 10.0.0.1:9000 (MAC: 02:00:00:00:00:01)

Synthetic UDP Performance Results

Measures framework overhead: sync dpdk_udp::UdpSocket vs async (std::sync::Mutex + try_recv_from).

Test Payload Sync PPS Async PPS Ratio (sync/async) Async ns/op
TX send_to 64B 11.5M 11.0M 1.0x 91
RX recv_from 64B 3.4M 4.6M 0.7x 217
TX send_to 1400B 1.6M 1.6M 1.0x 612
RX recv_from 1400B 1.0M 1.1M 0.9x 913

Avg sync/async ratio: 0.9x, worst: 1.0x

Good: Async wrapper is within 1.0x of sync — minimal framework overhead.

@github-actions
Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-0ebb3110c2563feae (DPDK ENI: 10.0.1.98)
  • Receiver: i-07bb3786b8b57b419 (DPDK ENI: 10.0.1.224)
  • Both instances SSM-ready.

@github-actions
Copy link
Copy Markdown

[CI] Stage: Deploy

Infrastructure ready.

  • Sender: i-089b0d6fca67a8598 (DPDK ENI: 10.0.1.71)
  • Receiver: i-05c4cc9defab6a84d (DPDK ENI: 10.0.1.139)
  • Both instances SSM-ready.

@github-actions
Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

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

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

1 similar comment
@github-actions
Copy link
Copy Markdown

[CI] Stage: Summary

All tests PASSED.

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

  • tier1-dpdk-echo: 6 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
Copy link
Copy Markdown

✅ Integration Tests Passed (Run 26101468767)

Branch: 55/merge | Commit: 2ce1f662

Test Results

  • tier1-dpdk-echo.xml: 6 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 (last 20 lines)

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.224:9000 (MAC: 02:70:ca:05:d5:87)
echo listening on 10.0.1.224:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.98:9000 (MAC: 02:02:7d:6d:4c:7d)
echo listening on 10.0.1.98:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

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 12 bytes from 10.0.1.224:9000: 'arp-probe #1'
Test complete
[2026-05-19T14:00:07Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T14:00:07Z] INFO: Test: udp_send_receive
[2026-05-19T14:00:08Z] INFO: UDP send/receive succeeded
[2026-05-19T14:00:08Z] INFO: Test: echo_roundtrip
[2026-05-19T14:00:09Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T14:00:09Z] INFO: Test: payload_integrity
[2026-05-19T14:00:09Z] INFO: Response received, checking payload match...
[2026-05-19T14:00:09Z] INFO: Payload integrity verified (found in response)
[2026-05-19T14:00:09Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-05-19T14:00:09Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-05-19T14:07:11Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-05-19T14:07:11Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-05-19T14:07:12Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-05-19T14:07:12Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-05-19T14:06:12Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-05-19T14:06:12Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-05-19T14:06:12Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-05-19T14:06:12Z] INFO: our-app-sends test complete
Full Application Logs (last 200 lines each)

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.224:9000 (MAC: 02:70:ca:05:d5:87)
echo listening on 10.0.1.224:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.98:9000 (MAC: 02:02:7d:6d:4c:7d)
echo listening on 10.0.1.98:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

[2026-05-19T13:57:01Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.224:9000
Bind address: 10.0.1.98: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
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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.98:32768 (MAC: 02:02:7d:6d:4c:7d)
Backend: dpdk
Sending packets...
Sent 12 bytes: 'arp-probe #1'
Received 12 bytes from 10.0.1.224:9000: 'arp-probe #1'
Test complete
[2026-05-19T13:57:02Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T13:57:02Z] INFO: Test: udp_send_receive
[2026-05-19T13:57:04Z] INFO: UDP send/receive succeeded
[2026-05-19T13:57:04Z] INFO: Test: echo_roundtrip
[2026-05-19T13:57:05Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T13:57:05Z] INFO: Test: payload_integrity
[2026-05-19T13:57:06Z] INFO: Response received, checking payload match...
[2026-05-19T13:57:06Z] INFO: Payload integrity verified (found in response)
[2026-05-19T13:57:06Z] INFO: Test: jumbo_diagnostics
[2026-05-19T13:57:06Z] INFO: === JUMBO FRAME DIAGNOSTICS ===
[2026-05-19T13:57:06Z] INFO: Interface MTU:
  9001
  65536
[2026-05-19T13:57:06Z] INFO:   ens5: MTU=9001
[2026-05-19T13:57:06Z] INFO:   lo: MTU=65536
[2026-05-19T13:57:06Z] INFO: Routing table MTU column:
Iface	Destination	Gateway 	Flags	RefCnt	Use	Metric	Mask		MTU	Window	IRTT                                                       
ens5	00000000	0101000A	0003	0	0	512	00000000	0	0	0                                                                             
ens5	0200000A	0101000A	0007	0	0	512	FFFFFFFF	0	0	0                                                                             
ens5	0001000A	00000000	0001	0	0	512	00FFFFFF	0	0	0                                                                             
ens5	0101000A	00000000	0005	0	0	512	FFFFFFFF	0	0	0                                                                             
[2026-05-19T13:57:06Z] INFO: DPDK port config (from echo server log):
[2026-05-19T13:57:06Z] INFO:   (no MTU info in echo log)
[2026-05-19T13:57:06Z] INFO: === END JUMBO DIAGNOSTICS ===
[2026-05-19T13:57:06Z] INFO: Test: jumbo_echo_8000
[2026-05-19T13:57:08Z] INFO: Jumbo output: UDP Test Client
Target: 10.0.1.224:9000
Bind address: 10.0.1.98:0
Payload size: 8000 bytes
Count: 3
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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.98:32768 (MAC: 02:02:7d:6d:4c:7d)
Backend: dpdk
Sending packets...
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.224:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.224:9000 (expected 8000, OK)
Sent 8000 bytes (binary payload)
Received 8000 bytes from 10.0.1.224:9000 (expected 8000, OK)
Test complete
[2026-05-19T13:57:08Z] INFO: Jumbo frame echo succeeded: 3/3 responses with correct size
[2026-05-19T13:57:08Z] INFO: JUnit XML written to: /tmp/test-results/tier1-dpdk-echo.xml
[2026-05-19T13:57:08Z] INFO: Tier 1 sender tests complete. Results: /tmp/test-results/tier1-dpdk-echo.xml
[2026-05-19T14:00:07Z] INFO: Test: arp_resolution
UDP Test Client
Target: 10.0.1.224: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 12 bytes from 10.0.1.224:9000: 'arp-probe #1'
Test complete
[2026-05-19T14:00:07Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T14:00:07Z] INFO: Test: udp_send_receive
[2026-05-19T14:00:08Z] INFO: UDP send/receive succeeded
[2026-05-19T14:00:08Z] INFO: Test: echo_roundtrip
[2026-05-19T14:00:09Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T14:00:09Z] INFO: Test: payload_integrity
[2026-05-19T14:00:09Z] INFO: Response received, checking payload match...
[2026-05-19T14:00:09Z] INFO: Payload integrity verified (found in response)
[2026-05-19T14:00:09Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-05-19T14:00:09Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

receiver-test-client-iperf.log

[2026-05-19T14:07:11Z] INFO: iperf-sends: sent 10 packets, received 10 responses
[2026-05-19T14:07:11Z] INFO: iperf-sends: PASS (sent >= 5 packets)
[2026-05-19T14:07:12Z] INFO: JUnit XML written to: /tmp/test-results/tier3-iperf-sends.xml
[2026-05-19T14:07:12Z] INFO: iperf-sends test complete

sender-test-client-iperf.log

[2026-05-19T14:06:09Z] INFO: Pre-flight: checking DPDK state and ARP cache...
[2026-05-19T14:06:09Z] INFO: Local IP: 10.0.1.98, Peer IP: 10.0.1.224, Port: 9000
[2026-05-19T14:06:09Z] INFO: /proc/net/arp contents:
IP address       HW type     Flags       HW address            Mask     Device
10.0.1.98        0x1         0x2         02:02:7d:6d:4c:7d     *        ens5
10.0.1.175       0x1         0x2         02:80:e3:a4:94:11     *        ens5
10.0.1.224       0x1         0x2         02:70:ca:05:d5:87     *        ens5
10.0.1.1         0x1         0x2         02:c1:16:58:53:69     *        ens5
[2026-05-19T14:06:09Z] INFO: DPDK runtime state:
No /var/run/dpdk/ directory
[2026-05-19T14:06:09Z] INFO: vfio-pci bindings:
0000:00:06.0
bind
module
new_id
remove_id
uevent
unbind
[2026-05-19T14:06:09Z] INFO: Test binary: /opt/dpdk-stdlib/target/release/test-client
-rwxr-xr-x. 2 root root 1894584 May 19 13:54 /opt/dpdk-stdlib/target/release/test-client
[2026-05-19T14:06:09Z] INFO: Launching test-client: /opt/dpdk-stdlib/target/release/test-client --target 10.0.1.224 --port 9000 --bind-ip 10.0.1.98 --count 10 --delay 200
[2026-05-19T14:06:12Z] INFO: Test client output: UDP Test Client
Target: 10.0.1.224:9000
Bind address: 10.0.1.98: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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.98:32768 (MAC: 02:02:7d:6d:4c:7d)
Backend: dpdk
Sending packets...
Sent 30 bytes: 'dpdk-to-kernel-test-payload #1'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #1'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #2'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #2'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #3'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #3'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #4'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #4'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #5'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #5'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #6'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #6'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #7'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #7'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #8'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #8'
Sent 30 bytes: 'dpdk-to-kernel-test-payload #9'
Received 30 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #9'
Sent 31 bytes: 'dpdk-to-kernel-test-payload #10'
Received 31 bytes from 10.0.1.224:9000: 'dpdk-to-kernel-test-payload #10'
Test complete
[2026-05-19T14:06:12Z] INFO: our-app-sends: sent 10 packets, received 10 responses
[2026-05-19T14:06:12Z] INFO: our-app-sends: PASS (sent >= 5 packets)
[2026-05-19T14:06:12Z] INFO: JUnit XML written to: /tmp/test-results/tier3-our-app-sends.xml
[2026-05-19T14:06:12Z] INFO: our-app-sends test complete
⚠️ SSM Command Failures (receiver-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-07bb3786b8b57b419 (receiver)
Command ID: ffa3895a-1428-4870-bb84-5a8d92f51181

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-07bb3786b8b57b419 (receiver)
Command ID: 640acf60-81c5-4577-bf91-f2ecac9a4865

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-07bb3786b8b57b419 (receiver)
Command ID: 78ea0d3c-f43d-473e-a6c4-7492356d1d78

=== STDOUT ===


=== STDERR ===


=== Polling timeout after 30s ===
Status: InProgress
Instance: i-07bb3786b8b57b419 (receiver)
Command ID: 8a55dd38-579e-4a1a-aaf2-18599789ff40

=== STDOUT ===


=== STDERR ===


⚠️ SSM Command Failures (sender-ssm-failure.log)
=== Polling timeout after 30s ===
Status: InProgress
Instance: i-0ebb3110c2563feae (sender)
Command ID: 071dd253-93ae-43ce-b433-c459fc312e0e

=== 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:9f:93:8f:a2:db brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0c31a86391b032dd1
    altname device-number-0.0
    inet 10.0.1.38/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2390sec preferred_lft 2390sec
    inet6 fe80::9f:93ff:fe8f:a2db/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:43:98:87:d6:e5 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0d5adc985a1136f0e
    altname device-number-0.0
    inet 10.0.1.190/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 2410sec preferred_lft 2410sec
    inet6 fe80::43:98ff:fe87:d6e5/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

receiver-networking-diag-baseline.txt

=== NETWORKING DIAGNOSTICS ===
timestamp: 2026-05-19T13:56:22Z
hostname: ip-10-0-1-38.ec2.internal
kernel: 6.18.25-57.109.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:9f:93:8f:a2:db brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0c31a86391b032dd1
    altname device-number-0.0
    inet 10.0.1.38/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3342sec preferred_lft 3342sec
    inet6 fe80::9f:93ff:fe8f:a2db/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.175 dev ens5 lladdr 02:80:e3:a4:94:11 REACHABLE 
10.0.1.1 dev ens5 lladdr 02:c1:16:58:53:69 REACHABLE 
10.0.1.41 dev ens5 lladdr 02:1b:e4:24:80:55 STALE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.38 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.38 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.38 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.38 metric 512 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:70:ca:05:d5:87/ 02:9f:93:8f:a2:db/ 

--- ENI: 02:70:ca:05:d5:87/ ---
  device-number: 1
  local-ipv4s: 10.0.1.224
  subnet-id: subnet-0e55c6fa683c3aee2
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:9f:93:8f:a2:db/ ---
  device-number: 0
  local-ipv4s: 10.0.1.38
  subnet-id: subnet-0e55c6fa683c3aee2
  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:c1:16:58:53:69 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.38 ens5
Unicast reply from 10.0.1.1 [02:C1:16:58:53:69]  0.547ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:     18432 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 May 19 13:56 .
drwxr-xr-x. 14 root root     3100 May 19 13:55 ..
crw-------.  1 root root 243,   0 May 19 13:56 noiommu-0
crw-rw-rw-.  1 root root  10, 196 May 19 13:52 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.052897] printk: legacy console [ttyS0] enabled
[    0.053997] x2apic enabled
[    0.058659] mitigations: Enabled attack vectors: user_kernel, user_user, guest_host, guest_guest, SMT mitigations: auto
[    0.058773] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.068352] audit: type=2000 audit(1779198719.140:1): state=initialized audit_enabled=0 res=1
[    0.078740] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.129468] ACPI: Interpreter enabled
[    0.129468] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.147835] pci 0000:00:05.0: enabling Extended Tags
[    0.214694] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.220100] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.225292] IPI shorthand broadcast: enabled
[    2.596325] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.636960] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.705559] VFIO - User Level meta-driver version: 0.3
[    3.142947] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    3.156478] ena 0000:00:05.0: ENA device version: 0.10
[    3.157247] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.271005] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.283806] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:9f:93:8f:a2:db
[    3.328533] ena 0000:00:05.0 ens5: renamed from eth0
[  210.787160] pci 0000:00:06.0: enabling Extended Tags
[  210.791296] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  210.803630] ena 0000:00:06.0: ENA device version: 0.10
[  210.804365] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  210.903611] ena 0000:00:06.0: ENA Large LLQ is disabled
[  210.915455] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:70:ca:05:d5:87
[  210.923303] ena 0000:00:06.0 ens6: renamed from eth0
[  249.820133] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  249.821535] 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-05-19T13:56:14Z
hostname: ip-10-0-1-190.ec2.internal
kernel: 6.18.25-57.109.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:43:98:87:d6:e5 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname eni-0d5adc985a1136f0e
    altname device-number-0.0
    inet 10.0.1.190/24 metric 512 brd 10.0.1.255 scope global dynamic ens5
       valid_lft 3348sec preferred_lft 3348sec
    inet6 fe80::43:98ff:fe87:d6e5/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

=== ARP TABLE ===
10.0.1.175 dev ens5 lladdr 02:80:e3:a4:94:11 REACHABLE 
10.0.1.41 dev ens5 lladdr 02:1b:e4:24:80:55 STALE 
10.0.1.1 dev ens5 lladdr 02:c1:16:58:53:69 REACHABLE 

=== ROUTE TABLE ===
default via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.190 metric 512 
10.0.0.2 via 10.0.1.1 dev ens5 proto dhcp src 10.0.1.190 metric 512 
10.0.1.0/24 dev ens5 proto kernel scope link src 10.0.1.190 metric 512 
10.0.1.1 dev ens5 proto dhcp scope link src 10.0.1.190 metric 512 

=== IMDS: ENI INFORMATION ===
ENI MACs found: 02:02:7d:6d:4c:7d/ 02:43:98:87:d6:e5/ 

--- ENI: 02:02:7d:6d:4c:7d/ ---
  device-number: 1
  local-ipv4s: 10.0.1.98
  subnet-id: subnet-0e55c6fa683c3aee2
  subnet-cidr: 10.0.1.0/24

--- ENI: 02:43:98:87:d6:e5/ ---
  device-number: 0
  local-ipv4s: 10.0.1.190
  subnet-id: subnet-0e55c6fa683c3aee2
  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:c1:16:58:53:69 REACHABLE 

arping result:
ARPING 10.0.1.1 from 10.0.1.190 ens5
Unicast reply from 10.0.1.1 [02:C1:16:58:53:69]  0.531ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

=== HUGEPAGE STATUS ===
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
FileHugePages:     18432 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 May 19 13:56 .
drwxr-xr-x. 14 root root     3100 May 19 13:55 ..
crw-------.  1 root root 243,   0 May 19 13:56 noiommu-0
crw-rw-rw-.  1 root root  10, 196 May 19 13:51 vfio

noiommu mode:
Y

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

=== DPDK-RELATED DMESG (last 30 lines) ===
[    0.053751] printk: legacy console [ttyS0] enabled
[    0.054851] x2apic enabled
[    0.059514] mitigations: Enabled attack vectors: user_kernel, user_user, guest_host, guest_guest, SMT mitigations: auto
[    0.059627] x86/fpu: Enabled xstate features 0x2ff, context size is 2568 bytes, using 'compacted' format.
[    0.069207] audit: type=2000 audit(1779198717.920:1): state=initialized audit_enabled=0 res=1
[    0.078663] kprobes: kprobe jump-optimization is enabled. All kprobes are optimized if possible.
[    0.125684] ACPI: Interpreter enabled
[    0.125684] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.139888] pci 0000:00:05.0: enabling Extended Tags
[    0.224094] SGI XFS with ACLs, security attributes, quota, no debug enabled
[    0.249347] ACPI: \_SB_.LNKD: Enabled at IRQ 11
[    0.253056] IPI shorthand broadcast: enabled
[    2.505266] systemd[1]: Mounting dev-hugepages.mount - Huge Pages File System...
[    2.549152] systemd[1]: Mounted dev-hugepages.mount - Huge Pages File System.
[    2.618928] VFIO - User Level meta-driver version: 0.3
[    2.983931] ena 0000:00:05.0: Elastic Network Adapter (ENA) v2.16.1g
[    2.995067] ena 0000:00:05.0: ENA device version: 0.10
[    2.995833] ena 0000:00:05.0: ENA controller version: 0.0.1 implementation version 1
[    3.094993] ena 0000:00:05.0: ENA Large LLQ is disabled
[    3.107210] ena 0000:00:05.0: Elastic Network Adapter (ENA) found at mem c0500000, mac addr 02:43:98:87:d6:e5
[    3.157543] ena 0000:00:05.0 ens5: renamed from eth0
[  190.419760] pci 0000:00:06.0: enabling Extended Tags
[  190.423927] ena 0000:00:06.0: enabling device (0000 -> 0002)
[  190.433134] ena 0000:00:06.0: ENA device version: 0.10
[  190.433873] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  190.533097] ena 0000:00:06.0: ENA Large LLQ is disabled
[  190.544994] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:02:7d:6d:4c:7d
[  190.552282] ena 0000:00:06.0 ens6: renamed from eth0
[  244.248326] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  244.249783] 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.067724] pid_max: default: 32768 minimum: 301
[    0.151879] iommu: Default domain type: Translated
[    0.151908] NetLabel:  unlabeled traffic allowed by default
[    0.173985] PCI: CLS 0 bytes, default 64
[    0.233430] nvme nvme0: 2/0/0 default/read/poll queues
[    0.401646] 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.401774] systemd[1]: No hostname configured, using default hostname.
[    0.464043] systemd[1]: Queued start job for default target initrd.target.
[    1.873104] 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)
[  287.236312] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4368)
[  472.575063] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4809)
[ 1075.570830] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6026)

sender-dmesg-crashes.log

[    0.068583] pid_max: default: 32768 minimum: 301
[    0.143811] iommu: Default domain type: Translated
[    0.143835] NetLabel:  unlabeled traffic allowed by default
[    0.191914] PCI: CLS 0 bytes, default 64
[    0.260104] nvme nvme0: 2/0/0 default/read/poll queues
[    0.428154] 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.428267] systemd[1]: No hostname configured, using default hostname.
[    0.480600] systemd[1]: Queued start job for default target initrd.target.
[    1.865558] 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)
[  896.628970] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:5721)
Kernel Console (dmesg)

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

[  287.234718] vfio-pci 0000:00:06.0: reset done
[  287.236312] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4368)
[  287.237779] vfio-pci 0000:00:06.0: resetting
[  287.454573] vfio-pci 0000:00:06.0: reset done
[  367.756826] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  368.770039] ena 0000:00:06.0: ENA device version: 0.10
[  368.770797] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  368.871975] ena 0000:00:06.0: ENA Large LLQ is disabled
[  368.884322] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:70:ca:05:d5:87
[  368.892353] ena 0000:00:06.0 ens6: renamed from eth0
[  388.606143] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  388.607380] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[  472.361316] vfio-pci 0000:00:06.0: resetting
[  472.573450] vfio-pci 0000:00:06.0: reset done
[  472.575063] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:4809)
[  472.576473] vfio-pci 0000:00:06.0: resetting
[  472.793304] vfio-pci 0000:00:06.0: reset done
[  547.657539] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  548.670487] ena 0000:00:06.0: ENA device version: 0.10
[  548.671251] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  548.771315] ena 0000:00:06.0: ENA Large LLQ is disabled
[  548.783160] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:70:ca:05:d5:87
[  548.791669] ena 0000:00:06.0 ens6: renamed from eth0
[  995.214407] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  995.215863] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[ 1075.356085] vfio-pci 0000:00:06.0: resetting
[ 1075.569320] vfio-pci 0000:00:06.0: reset done
[ 1075.570830] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (echo:6026)
[ 1075.572418] vfio-pci 0000:00:06.0: resetting
[ 1075.789195] vfio-pci 0000:00:06.0: reset done

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

[  896.630420] vfio-pci 0000:00:06.0: resetting
[  896.847184] vfio-pci 0000:00:06.0: reset done
[  958.981822] vfio-pci 0000:00:06.0: Removing from iommu group 0
[  959.992727] ena 0000:00:06.0: ENA device version: 0.10
[  959.993495] ena 0000:00:06.0: ENA controller version: 0.0.1 implementation version 1
[  960.094664] ena 0000:00:06.0: ENA Large LLQ is disabled
[  960.107174] ena 0000:00:06.0: Elastic Network Adapter (ENA) found at mem c0508000, mac addr 02:02:7d:6d:4c:7d
[  960.118410] ena 0000:00:06.0 ens6: renamed from eth0 (while UP)
[  989.628835] vfio-pci 0000:00:06.0: Adding to iommu group 0
[  989.630213] vfio-pci 0000:00:06.0: Adding kernel taint for vfio-noiommu group on device
[ 1092.539125] vfio-pci 0000:00:06.0: resetting
[ 1092.755396] vfio-pci 0000:00:06.0: reset done
[ 1092.756985] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6164)
[ 1092.758605] vfio-pci 0000:00:06.0: resetting
[ 1092.975155] vfio-pci 0000:00:06.0: reset done
[ 1093.263522] vfio-pci 0000:00:06.0: resetting
[ 1093.475284] vfio-pci 0000:00:06.0: reset done
[ 1093.476870] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6184)
[ 1093.478542] vfio-pci 0000:00:06.0: resetting
[ 1093.695259] vfio-pci 0000:00:06.0: reset done
[ 1094.986924] vfio-pci 0000:00:06.0: resetting
[ 1095.205279] vfio-pci 0000:00:06.0: reset done
[ 1095.206852] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6207)
[ 1095.208487] vfio-pci 0000:00:06.0: resetting
[ 1095.425129] vfio-pci 0000:00:06.0: reset done
[ 1096.705098] vfio-pci 0000:00:06.0: resetting
[ 1096.925299] vfio-pci 0000:00:06.0: reset done
[ 1096.926947] vfio-pci 0000:00:06.0: vfio-noiommu device opened by user (tokio-rt-worker:6230)
[ 1096.928592] vfio-pci 0000:00:06.0: resetting
[ 1097.145104] vfio-pci 0000:00:06.0: reset done

@github-actions
Copy link
Copy Markdown

✅ Integration Tests Passed — Graviton (run)

Branch: 55/merge | Commit: 2ce1f662

Test Results

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

Application Logs (last 20 lines)

receiver-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.139:9000 (MAC: 02:9d:85:af:3e:89)
echo listening on 10.0.1.139:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-echo-server.log

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
Warning: Some RX offloads not supported by device (flags: 0x1)
Warning: Some TX offloads not supported by device (flags: 0x1)
✅ DPDK UDP socket bound to 10.0.1.71:9000 (MAC: 02:14:8d:c2:43:0d)
echo listening on 10.0.1.71:9000 (MTU=9001, max_udp_payload=8973)
Shutting down gracefully...

sender-test-client.log

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 12 bytes from 10.0.1.139:9000: 'arp-probe #1'
Test complete
[2026-05-19T14:00:37Z] INFO: ARP resolution succeeded (got response from peer)
[2026-05-19T14:00:37Z] INFO: Test: udp_send_receive
[2026-05-19T14:00:38Z] INFO: UDP send/receive succeeded
[2026-05-19T14:00:38Z] INFO: Test: echo_roundtrip
[2026-05-19T14:00:38Z] INFO: Echo roundtrip succeeded: 5/5 responses received
[2026-05-19T14:00:38Z] INFO: Test: payload_integrity
[2026-05-19T14:00:38Z] INFO: Response received, checking payload match...
[2026-05-19T14:00:38Z] INFO: Payload integrity verified (found in response)
[2026-05-19T14:00:38Z] INFO: JUnit XML written to: /tmp/test-results/tier2-kernel-interop.xml
[2026-05-19T14:00:38Z] INFO: Tier 2 sender tests complete. Results: /tmp/test-results/tier2-kernel-interop.xml

@gspivey gspivey merged commit eacfa80 into development May 20, 2026
9 checks passed
@gspivey gspivey deleted the agent/ipv6-hw-offload branch May 20, 2026 03:32
@gspivey gspivey mentioned this pull request May 21, 2026
gspivey added a commit that referenced this pull request May 21, 2026
## Roadmap item

**Encap: IPv6 outer** — Adds IPv6 outer support to all three
encapsulation protocols (VXLAN, GENEVE, GUE), closing out dual-stack
encap in a single PR.

## Changes

For each protocol (GUE, VXLAN, GENEVE), adds:
- `*Config6` struct with `Ipv6Addr` for remote tunnel endpoint
- `build_*_frame_into_v6()` — frame builder using outer IPv6 header +
mandatory UDP6 checksum (RFC 8200 §8.1)
- `try_decap_*_v6()` — decapsulation for IPv6-outer frames
- `*DecapResult6` with `Ipv6Addr` for outer source IP
- `*_ENCAP_OVERHEAD_V6` constant

Wire format: `[Outer Eth 14B][Outer IPv6 40B][Outer UDP 8B][Protocol
Header][Inner frame]`

## Tests added

41 new unit tests (total: 654, up from 613):
- GUE: 13 tests (config, roundtrip, wire format, checksum, edge cases,
perf)
- VXLAN: 13 tests (config, roundtrip, wire format, checksum, VNI
filtering, perf)
- GENEVE: 15 tests (config, roundtrip, TLV options, wire format,
checksum, VNI filtering, perf)

All synthetic PPS benchmarks assert < 10µs/op.

## Tradeoffs

- Inner payload is IPv4-only for now (matching the existing IPv4-outer
encap). Inner IPv6 will come with the full IPv6 socket support (roadmap
task 3).
- No extension header support in the outer IPv6 — uses Next Header = UDP
directly. Extension headers are not needed for tunnel endpoints.
- The IPv6 outer decap functions do not walk extension headers in the
outer IPv6 header (assumes Next Header = UDP). This matches real-world
tunnel deployments where the outer header is minimal.

## Dependencies satisfied

- IPv6 header build/parse (PR #49) ✓
- UDP6 checksum (same PR) ✓  
- IPv6 offload flags (PR #55) ✓

---------

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.

1 participant