Since you’re here — I ran OdinLink-Five on two Strix Halo boxes (EVO-X3 + ProArt PX13, Ubuntu 26.04, kernel 7.0.0-29, one USB4 cable) and it worked well once running: +20–26 % tokens/sec on vLLM TP=2 over TCP-over-Thunderbolt, across gemma-4-E2B, gemma-4-12B and Qwen3.6-35B-A3B. RCCL loaded the plugin straight from NCCL_NET_PLUGIN and reported Using network ODL_TB5. It also coexisted cleanly with thunderbolt-net the whole time — bound as a separate XDomain service, and our IP link never dropped a packet across ~10 load/unload cycles.
Four things that cost me time getting there, in case they’re useful:
1. The documented module parameter doesn’t exist. README and INSTALL say ring_size=; the code exposes odl_ring_size (plain module_param, no _named alias — unlike loopback). Passing the documented name gives unknown parameter 'ring_size' ignored and silently keeps the 4096 default, which wants a 16 MiB coherent DMA allocation. Ubuntu ships CmaTotal: 0, so probe dies:
odl_tb5: failed to alloc TX DMA buf 0 (16777216 bytes)
odl_tb5: DMA buf alloc failed for index 0: -12
odl_tb5 0-2.1: probe with driver odl_tb5 failed with error -12
odl_ring_size=1024 probes first try. This one makes the driver look completely broken on a stock distro — a module_param_named(ring_size, ...) alias, or an -ENOMEM fallback to a smaller ring, would save the next person a long evening.
2. The rdma-core provider can’t load on current distros. It builds libodl_tb5-rdmav34.so, but libibverbs loads providers matching its own ABI — rdma-core 61 wants rdmav59. The failure is quiet unless you look:
libibverbs: Warning: couldn't load driver 'libodl_tb5-rdmav59.so': cannot open shared object file
Also no /etc/libibverbs.d/*.driver is shipped, so even with a matching ABI nothing would find it. Building the provider through rdma-core’s own rdma_provider() macro gets the right ABI automatically on whatever host it’s built against.
3. loopback=1 doesn’t work — the advertised no-hardware path. With loopback=1 and no peer, SEND ioctl, odl_tb5_open() and RCCL listen() all fail with EINVAL (3 of the suite’s tests). The same binaries pass every one of those against a real peer, so it’s specific to loopback. GET_PEER also reports speed=0 Gb/s there vs a correct 20 Gb/s with hardware.
4. Plugin symbol versions are stale. RCCL logs ncclOsDlsym(ncclNetPlugin_v11/v10/v9/v8) failed: undefined symbol before falling back to an older plugin ABI that works. Fine today, but it’ll break whenever RCCL drops the legacy entry point.
Minor: the RCCL plugin advertises speed=80000 regardless of link — on our TB4 cable GET_PEER correctly says 20 Gb/s, so the two disagree.
Happy to re-test any of this if you push changes.


