Repository navigation
feat: GUE tunnel endpoint (Generic UDP Encapsulation) - #42
Conversation
Implement RFC 8470-style L3-over-UDP encapsulation as a transparent tunnel mode on UdpSocket. When GUE is configured, the application's send_to/recv_from calls are automatically encapsulated/decapsulated through the tunnel. Wire format: [Outer Eth][Outer IPv4][Outer UDP:6080][GUE 4B][Inner IPv4][Inner UDP][Payload] Key changes: - New dpdk-udp/src/gue.rs: GUE header build/parse, frame encap/decap functions - UdpSocket.set_gue()/gue(): per-socket tunnel configuration - TX path: builds GUE-encapsulated frames, ARP resolves tunnel remote endpoint - RX path: decapsulates matching GUE frames, returns inner src address to app - NetworkConfig.with_gue(): builder integration parallel to VLAN - MTU check accounts for 32-byte GUE overhead (outer IP + outer UDP + GUE header) - 23 unit tests: header codec, frame roundtrip, socket-level decap, PPS benchmark - README roadmap updated: GUE moved from Planned to Done https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb
[CI] Stage: DeployInfrastructure ready.
|
[CI] Stage: SummaryAll tests PASSED. ARP seeding: kernel /proc/net/arp (automatic)
|
[Perf] Stage: DeployDeploying |
✅ Integration Tests Passed (Run 24551833374)Branch: Test Results
Application Logs (last 20 lines)receiver-echo-server.log sender-echo-server.log sender-test-client.log receiver-test-client-iperf.log sender-test-client-iperf.log Full Application Logs (last 200 lines each)receiver-echo-server.logsender-echo-server.logsender-test-client.logreceiver-test-client-iperf.logsender-test-client-iperf.log
|
[Perf] Stage: Instances Ready
|
[Perf] Stage: TRex ConfigStarting TRex configuration (MAC discovery + NIC binding)... |
[Perf] Stage: TRex Config OK
|
[Perf] Stage: TRex StartedTRex server running. Beginning benchmarks... |
[Perf] DUT ReadyDUT instance |
[Perf] Stage: Benchmark (1/4)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (2/4)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (3/4)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Stage: Benchmark (4/4)Running |
[Perf] Benchmark Diag:
|
[Perf] Benchmark Diag:
|
[Perf] Diag: testpmd logtestpmd output (last 30 lines) |
[Perf] Stage: Results[08:09:09] INFO Generating markdown summary... Performance Test Results — unknownCommit: 64B packets
512B packets
1400B packets
8500B packets
NIC Drops Instrumentation Self-CheckCompares
plain-rust Kernel NIC Drops (ethtool -S delta)ethtool snapshots not available — baseline or final file missing in |
No regressions detected. rust-dpdk matches or slightly exceeds Run #17 at all packet sizes and rates. The GUE Option::is_some() check in send/recv hot paths adds zero measurable overhead when GUE is not configured. https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb
* feat: GUE tunnel endpoint (Generic UDP Encapsulation) Implement RFC 8470-style L3-over-UDP encapsulation as a transparent tunnel mode on UdpSocket. When GUE is configured, the application's send_to/recv_from calls are automatically encapsulated/decapsulated through the tunnel. Wire format: [Outer Eth][Outer IPv4][Outer UDP:6080][GUE 4B][Inner IPv4][Inner UDP][Payload] Key changes: - New dpdk-udp/src/gue.rs: GUE header build/parse, frame encap/decap functions - UdpSocket.set_gue()/gue(): per-socket tunnel configuration - TX path: builds GUE-encapsulated frames, ARP resolves tunnel remote endpoint - RX path: decapsulates matching GUE frames, returns inner src address to app - NetworkConfig.with_gue(): builder integration parallel to VLAN - MTU check accounts for 32-byte GUE overhead (outer IP + outer UDP + GUE header) - 23 unit tests: header codec, frame roundtrip, socket-level decap, PPS benchmark - README roadmap updated: GUE moved from Planned to Done https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb * docs: add Run #19 perf results — GUE tunnel endpoint regression check No regressions detected. rust-dpdk matches or slightly exceeds Run #17 at all packet sizes and rates. The GUE Option::is_some() check in send/recv hot paths adds zero measurable overhead when GUE is not configured. https://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb --------- Co-authored-by: Claude <noreply@anthropic.com>
Summary
dpdk-udp/src/gue.rsmodule: GUE header codec, frame encapsulation/decapsulation,GueConfigbuilderUdpSocket: TX auto-encapsulates, RX auto-decapsulates, ARP resolves tunnel remote endpoint, MTU accounts for 32-byte overheadNetworkConfig::with_gue()builder integration parallel to the existing VLAN patternWire Format
Total encapsulation overhead: 32 bytes (outer IP + outer UDP + GUE header). The GUE header uses version 0, no control flag, and protocol number 4 (IPv4) for the inner packet.
API
Test plan
max_gue_payload()accounts for 32-byte overheadNetworkConfig::with_gue()builder integrationset_gue()/gue()getter/setter round-triphttps://claude.ai/code/session_01NmhvqXvaxmA3fSXRGrzPpb