Skip to content

Does the coprocessor drop an address it is given? Measured, 2026-10-19

No - not on the XGS 3300's firmware (v22), and not on the XGS 136's either (measured 2026-10-20). The question came from the vendor's own design: its command list has three commands between the QoS ones and the first IPsec one - DOS_SET_POLICY, DOS_ADD_BLACKLIST_ENTRY and DOS_CLEAR_BLACKLIST, 27, 28 and 29 - with their structures in dos_table.h: a policy (a packets-per-second ceiling, a type, whether a source over the ceiling is blacklisted, and for how long) and an entry (a family, a type, an address, a duration). The XGS 136's helper module was built with two more facts about them - an even type is a source and the next odd one its destination; an entry lasts 30 seconds by default and 3,600 at most - and with an error code for a full DoS table. If the coprocessor kept such a table, a block list could be enforced there, at the port, before a frame reached the host.

Nothing that sends these commands was found: not in the GPL source drop, not in the v22 host module (usfp_firewall), and the v22 fast path has no counter and no string for them. So they were tried.

How it was measured

On the second XGS 3300, rebooted onto a driver that lets rpc.cmd post the three commands with rpc.allow_write (octep.ko 398,912 bytes, md5 6919ba50; the payloads built from dos_table.h). One stream from the bench PC on F1 to the bench VM behind F2, in hardware; during it, a policy, then a blacklist entry for the PC's address in four forms, each left for four seconds of the stream - type 0 with the address in network order, the same little-endian, type 2, type 1 - and then the clear. The coprocessor's answer to each (rpc.last) and what the VM received, every two seconds (images/deploy/lab-dos-probe.sh, photographed).

Results

command the coprocessor's answer the stream
a policy: 1,000 packets a second, blacklist on rc 0x8006, not dispatched -
an entry for the PC, type 0, network order rc 0x8006, not dispatched 4,807 and 4,804 Mbit/s
the same, little-endian rc 0x8006, not dispatched 4,471 and 4,833 Mbit/s
type 2 rc 0x8006, not dispatched 4,761 and 4,846 Mbit/s
type 1 rc 0x8006, not dispatched 4,824 and 4,802 Mbit/s
clear rc 0x8006, not dispatched 4,432 Mbit/s

The DoS commands, with the coprocessor's answers: each not dispatched, and the stream untouched

  • rc 0x8006 is the transport's own errno, "the command was not dispatched": the request reached the coprocessor, and nothing there takes command 27, 28 or 29. Every read and write this driver uses answers rc 0 through the same path.
  • The stream from the listed address never slowed: 4,571 Mbit/s before, 4.4 to 4.8 Gbit/s during every form and after the clear.
  • Four runs were made; this is the fourth. The first printed an empty line where the answers should have been (the script read the answer's first line, which is blank). The second and third printed them, but their rates counted the time each ssh read took as part of the two seconds - the third showed 13,293 Mbit/s, more than the 10G link carries. The script now reads the VM's own clock beside its byte count. All three earlier runs showed the same answers and a stream that never stopped; their photographs were not kept - the first two also caught keystrokes typed into the window while it ran.

On the XGS 136

The same answer, 2026-10-20. The XGS 136's coprocessor was asked the same seven questions through its own rpc_channel.command, which posts any command with its payload in hexadecimal, so no other driver was needed (npuep.ko md5 9619e07c, the flow maker on). During one stream in hardware from the bench PC into F1, out of Port8 to the second XGS 3300, it was sent:

  • the policy;
  • the entry for the PC's address in the same four forms;
  • the clear;
  • and last, a policy that limits nothing with blacklisting off, so that whatever the first policy had done, the coprocessor was left as it was found.

The stream's rate was read on the 3300's Port8 by its own clock (images/deploy/lab-136-dos-probe.sh, photographed).

command the coprocessor's answer the stream
a policy: 1,000 packets a second, blacklist on rc 0x8006, not dispatched 289 and 297 Mbit/s
an entry for the PC, type 0, network order rc 0x8006, not dispatched 277 and 310 Mbit/s
the same, little-endian rc 0x8006, not dispatched 279 and 278 Mbit/s
type 2 rc 0x8006, not dispatched 308 and 285 Mbit/s
type 1 rc 0x8006, not dispatched 283 and 274 Mbit/s
clear rc 0x8006, not dispatched 246 Mbit/s
a policy that limits nothing rc 0x8006, not dispatched 292 Mbit/s

The XGS 136's answers to the DoS commands: each refused with rc 0x8006, the stream untouched; the PC's address blurred

The stream from the listed address ran at 285 to 296 Mbit/s before, and at the same rate through every command. That is the bench PC's USB adapter's pace on this path, not the 136's. Neither family's firmware keeps an address table the host can fill. What both can drop is one connection, below.

What the coprocessor can drop

One connection. A microflow programmed with action 0 is dropped by the fast path itself - measured when the action values were sorted out (FROM_WIRE_DROP_MFLOW_ACTION on the first frame; OCTEP_MFLOW_ACTION_DROP in contrib/octep/octep.h). That covers a connection pf has already passed and the driver has put in hardware; it does not cover an address, a port or a flood of new connections, which still reach the host and pf. The block lists and the TLS fingerprints keep cutting connections by killing their pf states (lists-cut-2026-10-19.md, ja4-cut-2026-10-19.md).

Not tried: the XGS 136's coprocessor, whose firmware is a different build of the same fast path.

Discussion

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.