9. The XGS 3300 and the last hop¶
On the XGS 3300 the control plane came up early: the handshake completed, the network agent answered, RPC worked. Frames went out of the front ports. Nothing came back in.

Inside: two heatsinks, the SFP cages down the right edge, the relay bank beside them, and a single blue light - the only one this board shows without software.
Nineteen dead ends¶
That last hop - the coprocessor handing a received frame to the host - is the fault the project spent longest on. Every idea tried against it was measured and written down, so that nothing was ever tried twice: a misprogrammed ring, a host out of credit, a missing interrupt, missing virtual functions, the wrong metadata, a missing logical interface. Nineteen of them, in the road. Three were real things that were missing; they were implemented, and changed nothing.
Nineteen dead ends is a long stretch to come back from, and it is where the one rule I keep matters most: step away for an hour, do something else entirely, and let the answer come.
The grant¶
What it was, in the end, was the grant - how much of the output ring the host tells the coprocessor it may fill. It opened on 2026-09-30: Grant the output ring in the block's own unit, and the last hop opens. A week later it was understood completely: a ring has to be granted its own size above the coprocessor's output watermark, or a full ring is written round instead of stopping the block.
The index was never wrong¶
Only the two cages wired straight to the coprocessor worked. The other ten front ports sat behind an 88E6193X switch that nothing had programmed. It was reached over the coprocessor's MDIO bus, and its eight copper ports came up at a gigabit.
Then frames arrived - and died. Two interface numbers were tried; neither worked. The index had never been wrong. The tag was. The switch's uplink runs in DSA mode, where every frame names the port it came from, and the driver had been using tag values the far side never produces. The right table had been published in the project's own reference page for months. With it: twelve front ports, twelve real addresses.
The day that was a quarter of the whole¶
On 2026-10-01 three things changed what the project is.
- A frame posted for one port could leave by another. Twelve interfaces shared one transmit buffer, and the next frame overwrote it before the coprocessor had read it. Every counter agreed with every other, because the count was right and only the contents were wrong. It was found by loading one port and watching a different one. One buffer per slot took the loss from 29% to 0.0%.
- IPv6 started working, because the port was finally asked to pass multicast.
- The crypto engine answered: an association installed and read back.
And that same day the appliance was opened and photographed, which settled three things that reading alone could not.
Previous: 8. Fourteen ports on the XGS 136 · Next: 10. From ports to offload
The discussion of this page is held in the project's GitHub Discussions. Showing it here loads giscus from giscus.app and GitHub, and writing in it needs a GitHub account - what that means.