# Independent Rust physical NIC owner proofs — 2026-10-01

Both outstanding Rust NIC proofs passed on HP through the root-owned, allowlisted bench
launcher. Configured TCPDirect initiator/acceptor ownership completes Logon, application delivery
and the FIX Logout handshake over the physical Solarflare ports. The independent raw ibverbs
receiver obtains five UDP payloads and a non-zero hardware timestamp over the physical Mellanox
ports. The Rust Solarflare and Mellanox subsystem cells therefore move from `partial` to `yes`.
These functional proofs add no latency or throughput measurements.

## Configured TCPDirect

Run: `20261001T224526Z`. Source revision:
`86345048fc2dc0261ca8b26d8383dc503e7d2036`.
The reviewed stage and root-installed `rust_pure` have identical SHA256:
`3245af17636c1bc04901125f113e58c72f86ba5b6af20715db1a079bb0dc2bd0`.

The two roles enter through `SessionConfig::acceptor()` and `SessionConfig::initiator()` with
`LibhftTransport=tcpdirect`, rather than constructing the bench transport directly. The physical
interfaces are `sfcA/ens5f0` (10.9.0.1) and `sfcB/ens5f1` (10.9.0.2); the listener port is 41042.

| Report field | Acceptor | Initiator |
|---|---|---|
| Schema | `libhft-rust-tcpdirect-owner-v2` | same |
| Configured transport / actual I/O | `tcpdirect` / `zf` | `tcpdirect` / `zf` |
| Logged on | true | true |
| ClOrdID | 424242 received | 424242 sent |
| Next inbound sequence after application | 3 | — |
| Logout proof | acknowledgement received, next inbound sequence 4 | peer Logout received and acknowledged, next outbound sequence 4 |
| Process exit | 0 | 0 |

The physical counter observed between the rig's pre/post checks is
`457033165 -> 457033166` (delta 1). The runner excludes each verification ping's own increment
from that interval and validates both complete JSON reports.

The first hardware attempt delivered the application but failed its initiator assertion: the
acceptor's teardown sent a normal FIX Logout, while the probe required `E_CLOSED`. Commit
`86345048f` makes Logout explicit, keeps polling the acceptor until the acknowledgement arrives,
and requires `E_LOGOUT` plus the corresponding sequence on the initiator. The seven rust-pure
tests, strict package Clippy and targeted rustfmt pass before the rebuilt hardware run.

## Raw ibverbs

Run: `20261001T223935Z`. Build source revision:
`8a1f67dcafa0dbd76e1969e0ff06e69b242fc54d`.
The receiver/shim/probe source commit is
`afae9a4960013c6e02647fd5d9fee41191e32896`.
The reviewed stage and root-installed probe have identical SHA256:
`743b4d52637a657e612877238c582c1859b91da12c07364d29910292a5488439`.

The root launcher supplies `ens4f0np0` in `mlxA`; the Rust receiver filters destination
10.9.1.1:41043. The root-owned `udp_blast` sends from `mlxB/ens4f1np1` (10.9.1.2) and reports
`10000/10000` datagrams. The receiver reports:

```text
[rust-ibv] open: prefix=0 hw_timestamps=true
rust ibverbs live poll: payloads=5 last_hw_timestamp=178059190104273
```

Both processes exit 0. The physical counter interval is
`1190958184 -> 1190958190` (delta 6), excluding the verification pings themselves.
The installed library package is `libibverbs-61.0-2.el9.x86_64`; Rust is 1.92.0.

The first harness attempt exhausted its 20-million-poll bound before the sender started after
a two-second sleep. The corrected runner waits for the receiver's ready report, allows two
billion polls within its existing 30-second process timeout, and then starts the sender. The
Rust receiver and its proof requirement remain the same: five payloads and a non-zero timestamp.

## Retained artifacts and remaining boundaries

Complete provenance, process transcripts, counter checks, summaries and exact runners are kept
outside the checkout under these paths on HP and BEELINK2:

```text
~/archive/libhft/rust-tcpdirect-owner-20261001/run-20261001T224526Z/
~/archive/libhft/rust-ibv-owner-20261001/run-20261001T223935Z/
```

Each directory includes `SHA256SUMS`. The source revisions are retained on `origin/main` in
`atrekes/libhft-devel`. HP uses Linux 5.14.0-687.44.1.el9_8.x86_64. Both probes run through
`sudo ip netns exec <namespace> /usr/local/libexec/libhft-bench/bench-run`, selecting only the
existing `rust_pure_zf`, `rust_ibv_probe` and `udp_blast` commands; the executables are installed
root:root with mode 755.

Rust now has 43 complete, 2 partial and 1 not-applicable subsystem rows. The two remaining rows
require live production venue endpoint/certification evidence, and FIXP two-host HA plus venue
schema certification. NIC ownership evidence does not satisfy those separate requirements.
