Doca Eth
NVIDIAOfficialCreated by NVIDIA
- Skill
- Tool integration
- Software development
- Apache-2.0
- Medium risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides technical guidance for developers working with the DOCA Ethernet library to perform line-rate packet I/O. It covers the lifecycle management of independent RX and TX core contexts, the selection of RX queue types, capability querying, and error handling. The skill is designed to assist with hands-on development tasks, such as configuring queues on physical ports or representors and debugging packet arrival issues, while maintaining a clear separation from steering logic and installation procedures.
What it does
- Guides the initialization and lifecycle management of doca_eth_rxq and doca_eth_txq contexts.
- Explains the RX-type taxonomy including regular, cyclic, and managed-mempool configurations.
- Provides methods for querying device capabilities like L3 checksum offload and burst size limits.
- Assists in debugging DOCA_ERROR_* codes and common runtime issues like silent RX queues.
- Outlines the submission process for send-tasks using doca_buf structures.
- Routes users to appropriate companion skills for steering, installation, or RDMA-related tasks.
When to use it
- When implementing packet I/O applications using the DOCA Ethernet C ABI.
- When troubleshooting why packets are not arriving at an initialized RX queue.
- When determining the correct RX queue type for specific data shapes or performance requirements.
- When verifying if a specific Ethernet capability is supported on a target device.
- When debugging errors encountered during task submission or queue lifecycle transitions.
Advantages
- Clarifies the independent nature of RX and TX core contexts to prevent lifecycle errors.
- Provides a structured approach to capability discovery using standard DOCA query patterns.
- Helps isolate root causes by distinguishing between Ethernet queue issues and steering configuration.
- Maintains a clean separation between library-specific logic and general DOCA programming patterns.
Usage examples
- “My RX queue is up but no packets arrive.”
- The agent will guide you to verify steering rules in the DOCA Flow library and check runtime preconditions like device access and port state.
- “Which RX type fits my data shape for line-rate ingress?”
- The agent will explain the RX-type taxonomy and help you select between regular, cyclic, or managed-mempool types based on your buffer requirements.
- “How do I send a packet through doca_eth_txq?”
- The agent will provide the workflow for allocating a doca_buf, attaching the payload, and submitting a send-task.
- “Is L3 checksum offload available on my device?”
- The agent will show you how to use the capability-query rule against your doca_devinfo to confirm hardware support.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/nvidia/doca-eth/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip doca-eth.zip -d .agents/skills
Documentation by NVIDIA
DOCA Ethernet
Examples
"My RX queue is up but no packets arrive." — RX and TX are two Core contexts; one
doca_ctx_start()does not cover both."Send-task returns AGAIN at line rate." — size burst against the
_cap_*queries before changing queue type.
Instructions
Follow Loading order below. Open the tasks companion for configure / build / run. Open the capabilities companion for the RX-type taxonomy and send surface. Do not open every companion file.
Where to start: This skill assumes DOCA is already installed and
the user is doing hands-on packet-queue work on a host or
BlueField with DOCA. Open the tasks companion if the user wants
to do something (configure / build / modify / run / test /
debug); open the capabilities companion when the question
is what can a DOCA Ethernet queue express on this version. If
the user has not installed DOCA yet, route to
doca-setup/SKILL.md first. RX and TX are
independent Core contexts. A doca_eth_rxq and a doca_eth_txq
each get their own doca_ctx_create / _start / _stop /
_destroy; one doca_ctx_start() does not start both sides.
Do not walk a single lifecycle for "the queue pair". If the user is
asking "how do I get packets to land on my RX queue at all", the
answer lives in doca-flow/SKILL.md — DOCA
Ethernet is the queue surface; DOCA Flow is the steering
surface, and they are independent libraries.
Example questions this skill answers well
The CLASSES of DOCA Ethernet questions this skill is built to answer, each with one worked example. The agent should treat the class as the load-bearing piece — the worked example is a single instance.
"How do I bring up an RX and TX queue on a representor or physical port?" — worked example: "set up a
doca_eth_rxqplus adoca_eth_txqon a single BlueField representor for first-run testing". Answered by two independent Core contexts (each with its own start) inconfigure +
Capabilities and modes
RX / TX object table.
"Which RX type fits my data shape — regular, cyclic, or managed-recv?" — worked example: "line-rate ingress with fixed-size frames into a pre-allocated buffer ring". Answered by the RX-type taxonomy in
Capabilities and modes
the capability-query rule (
doca_eth_rxq_cap_is_type_supportedagainst adoca_devinfo) in
configure.
"How do I send a packet from user code through
doca_eth_txq?" — worked example: "allocate a packetdoca_buf, attach the payload, submit one send-task, wait for the completion event". Answered by the TX submission shape inCapabilities and modes
the property-set workflow in
modify.
"My queue is up but no packets arrive — why?" — worked example: "
doca_eth_rxqstarted cleanly but the recv callback never fires". Answered by the steering-dependency rule inSafety policy
the env-prep checklist in
configure step 1, which
routes the steering side to
doca-flow/SKILL.mdand the promiscuous-mode side todoca-setup/SKILL.md."Is this Ethernet capability available on my device + my installed DOCA?" — worked example: "does this device advertise L3 checksum offload". Answered by the capability-query rule (
doca_eth_txq_cap_is_l3_chksum_offload_supportedagainst adoca_devinfo) inCapabilities and modes
the version-and-device overlay in
Version compatibility.
"What does this
DOCA_ERROR_*from an Ethernet call mean and which layer caused it?" — worked example: "DOCA_ERROR_AGAINondoca_task_submitfor aneth_txqsend-task at high rate". Answered by the Ethernet overlay on the cross-library taxonomy inError taxonomy
the layered ladder in
debug that escalates to
doca-debug/SKILL.md.
Picking the root-cause layer when several could explain a symptom.
Walk the layers bottom-up (install → version → build → link → runtime →
program → driver) with the read-only check each layer names in TASKS.md
## debug. The lowest layer whose check fails is the root cause: fix it,
change one variable at a time, and re-run the same check before moving up.
For a silent RX queue, rule out the three runtime preconditions (device
access, port up, traffic steered to the queue) before any program or driver
cause.
Audience
This skill serves external developers building applications that
consume the DOCA Ethernet library — i.e., users whose code calls
doca_eth_rxq_* / doca_eth_txq_* (directly in C/C++, or through
FFI/bindings from another language) to do line-rate packet I/O on
physical ports, representors, or SFs of a BlueField or ConnectX
device. It is not for NVIDIA developers contributing to DOCA
Ethernet itself.
Language scope. DOCA Ethernet ships as a C library with
pkg-config module name doca-eth. The shipped samples are
written in C. C and C++ consumers are the canonical case; the
worked examples in the tasks companion assume that path. Other-language
consumers (Rust, Go, Python, …) consume the same *.so through
FFI or language-specific bindings; the skill's contribution in
that case is to keep the queue-object split, lifecycle,
capability-discovery, permission, RX-type taxonomy, and
error-taxonomy guidance language-neutral, and to route the agent
to the public C ABI as the authoritative surface that any wrapper
will eventually call.
When to load this skill
Load this skill when the user is doing hands-on DOCA Ethernet work, in any language. Concretely:
Initializing a
doca_eth_rxqon adoca_devopened against a physical port, a representor, or an SF — choosing among the regular / cyclic / managed-recv RX types based on data shape beforedoca_ctx_start().Initializing a
doca_eth_txqon the same or a differentdoca_devand posting send-tasks against packetdoca_bufs payload buffers.Reading or setting Ethernet queue properties via
doca_eth_rxq_set_*/doca_eth_txq_set_*and querying device capability viadoca_eth_rxq_cap_*/doca_eth_txq_cap_*(max burst size, RX-type support, max scatter-gather length, checksum-offload presence).Confirming the port is up and that traffic is actually steered to the chosen RX queue — either via DOCA Flow rules (the canonical path) or via kernel-side promiscuous mode (the expedient first-run path).
Wiring an Ethernet queue to a higher-level data plane: GPU packet processing via DOCA GPUNetIO, custom user-space forwarding agents, or telemetry mirrors that snap a copy of every packet.
Debugging a
DOCA_ERROR_*returned from an Ethernet call (lifecycle vs. permission vs. capability vs. send-queue-full vs. driver-below) and the per-queue progress engine events.Designing or extending non-C bindings (Rust, Go, Python, …) that wrap the DOCA Ethernet C ABI — for the lifecycle, queue split, RX-type, capability, and permission rules the wrapper must honor.
Do not load this skill for general DOCA orientation, install
of DOCA itself, flow-rule programming (use
doca-flow/SKILL.md), host ↔ DPU control
messaging (use doca-comch/SKILL.md), or
RDMA data movement (use doca-rdma/SKILL.md).
For DOCA documentation orientation, use
doca-public-knowledge-map/SKILL.md.
What this skill provides
This is a thin loader. The body keeps only the orientation needed to pick the right next file. The substantive Ethernet- specific material lives in two companion files:
the capabilities companion — what a DOCA Ethernet queue can express on this version: the RX / TX object split, the RX-type taxonomy (regular / cyclic / managed-recv), the send-task / frame submission surface, the capability-query surface (
doca_eth_rxq_cap_*/doca_eth_txq_cap_*), the Ethernet error taxonomy (mapped onto the cross-libraryDOCA_ERROR_*set), the observability surface (per-queue progress engine events, capability snapshots), and the safety policy that gates the steering / permission / port-state preconditions.the tasks companion — step-by-step workflows for the six in-scope Ethernet verbs:
configure,build,modify,run,test,debug. Plus aDeferred task verbsblock that points out-of-scope questions at the right next skill, and aCommand appendixof the recurring commands the agent reaches for.
The skill assumes a host or BlueField where DOCA is already
installed at the standard location and the user has the
privileges their public install profile expects (typically sudo
or mlnx-group membership to open a doca_dev against a port).
It does not cover installing DOCA — that path goes through
doca-setup/SKILL.md.
What this skill deliberately does not ship
This skill is agent guidance, not a samples or templates bundle. To keep the boundary clean, it deliberately does not contain — and pull requests should not add:
Pre-written DOCA Ethernet application source code, in any language. The verified Ethernet source code is the shipped C samples at
/opt/mellanox/doca/samples/doca_eth/<name>/. The agent's job is to route the user to those files and prescribe a minimum-diff modification on them via the universal modify-a-sample workflow indoca-programming-guide/SKILL.md, layered with the Ethernet-specific overrides inmodify.
Standalone build manifests (
meson.build,CMakeLists.txt,Cargo.toml, …) parked inside the skill. The agent constructs the build manifest in the user's project directory against the user's installed DOCA, wherepkg-config --modversion doca-ethis the source of truth.A
samples/,bindings/, orreference/subtree of any kind. A mock or incomplete artifact in this skill's tree, even one labeled "reference", is misleading: users will read it as buildable.
Loading order
Read this skill first to confirm the user's question is in scope.
For the Ethernet capability matrix, RX-type taxonomy, send surface, capability-query rules, error taxonomy, observability, and safety policy, see the capabilities companion.
For step-by-step workflows — configure, build, modify, run, test, debug — see the tasks companion.
Both companion files cross-link to each other,
doca-version/SKILL.md for the canonical
version-handling rules,
doca-flow/SKILL.md for the steering side
that the RX queue depends on, and
doca-public-knowledge-map/SKILL.md
whenever the right answer is "look it up in the public docs or
the installed package layout" rather than "Ethernet-specific
guidance".
Related skills
doca-public-knowledge-map/SKILL.md— the routing table for every public DOCA documentation source and the on-disk layout of an installed DOCA package. The Ethernet URL slug isDOCA-Ethernet.doca-setup/SKILL.md— env preparation, install verification, port-state checks (devlink dev show,ip link), permission and group-membership requirements for opening adoca_dev. This skill assumes its preconditions are satisfied.doca-version/SKILL.md— canonical DOCA version-handling rules. This skill's## Version compatibilitycross-links the four-way match rule and adds only the Ethernet-specific overlay (RX-type availability windows, checksum-offload device-conditional support).doca-structured-tools-contract/SKILL.md— the bundle's structured-tools precedence rule (detect / prefer / fall back / report). The Command appendix in the tasks companion honors this contract.doca-programming-guide/SKILL.md— general DOCA programming patterns shared by every library: the canonicalpkg-config+ meson build pattern, the universal modify-a-shipped-sample first-app workflow, the universal lifecycle, the cross-libraryDOCA_ERROR_*taxonomy, and the program-side debug order. This skill layers Ethernet specifics on top.doca-flow/SKILL.md— the steering surface that decides which packets land on whichdoca_eth_rxq. DOCA Ethernet does not program steering itself; an empty RX queue almost always means a missing or wrong Flow rule, not an Ethernet bug.doca-debug/SKILL.md— the cross-cutting debug ladder (install / version / build / link / runtime / program / driver). Ethernet-specific debug (RX-type mismatches, send-queue-full retries, steering-empty-queue symptoms) overlays on top of that ladder.
Files
- ATTRIBUTION.mdAdded by AutoGineer882 B
- BENCHMARK.md9.7 KiB
- CAPABILITIES.md20.2 KiB
- LICENSELicence file added by AutoGineer11.2 KiB
- SKILL.md13.8 KiB
- SKILLCARD.yaml2.6 KiB
- TASKS.md24.2 KiB
- evals/evals.json3.1 KiB
- skill-card.md5.1 KiB
- skill.oms.sig5.1 KiB
TASKS.md
DOCA Ethernet workflows
Where to start: The verbs run configure → build → modify → run → test → debug. Skip ahead only when the user is already
past a verb. The ## test verb is an iterative loop (capability
check → precondition check → single-packet smoke → completion
drain → loop back if the RX type, size, or steering plan
changed), not a one-shot pass — see the eval-loop overlay in
## test below.
Read this file when the loader sent you here from
SKILL.md. For the Ethernet capability surface,
RX-type taxonomy, TX submission shape, capability-query rules,
error taxonomy, observability, and safety policy, see
CAPABILITIES.md. For the cross-library DOCA
patterns layered under everything below (the universal
lifecycle, the cross-library DOCA_ERROR_* taxonomy, the
modify-a-shipped-sample workflow), see
doca-programming-guide/SKILL.md.
For the steering side that decides which packets land on which
RX queue, see doca-flow/SKILL.md.
Each verb below describes the shape of the workflow, not a copy-paste recipe. The agent's job is to walk the user through the steps in order, verifying preconditions before recommending the next call.
configure
Goal: stand up a doca_eth_rxq and / or doca_eth_txq on a
port, representor, or SF, with the user aware of the RX type
they need and the steering plan that has to be in place before
any packet flow is meaningful.
Steps the agent should walk the user through:
Confirm the env preconditions BEFORE writing any code. Per the precondition matrix in
CAPABILITIES.md ## Safety policy, verify three things: the user can open adoca_devon the target port (sudo ormlnx-group membership;idto check); the port is up at the driver layer (devlink dev showreportsstate: PORT_ACTIVE;ip linkshows the deviceUP,LOWER_UP); and the user has a steering plan for inbound traffic — either a DOCA Flow rule that will steer matching packets to this queue (route todoca-flow/SKILL.md), or kernel-side promiscuous mode on the underlying interface (expedient first-run only). If any of the three is missing, fix it FIRST; an empty RX queue without these is silent, not aDOCA_ERROR_*.Pick the queue side(s). RX, TX, or both. Per the RX / TX object table in
CAPABILITIES.md ## Capabilities and modes, each is its own DOCA Core context with its own lifecycle. Onedoca_ctx_start()on RX does not start TX (and vice versa). Sketch the call sequence per side before writing code.Run capability discovery against the active
doca_devinfo. For RX:doca_eth_rxq_cap_get_max_burst_size, for each RX type the user is considering,doca_eth_rxq_cap_is_type_supported(devinfo, type), and for each CQE format under consideration,doca_eth_rxq_cap_is_cqe_format_supported(devinfo, format). The CQE format values are theDOCA_ETH_RXQ_CQE_FORMAT_*family in the DOCA Ethernet public header. For TX:doca_eth_txq_cap_get_max_send_buf_list_len,doca_eth_txq_cap_get_max_inline_data_size, and, if the user wants offload,doca_eth_txq_cap_is_l3_chksum_offload_supported. Quote the queried values back to the user; do not assume from prior installs.Pick the RX type per data shape. Per the RX-type taxonomy in
CAPABILITIES.md ## Capabilities and modes, regular = per-packet user tasks (debug-friendly first-run); cyclic = pre-allocated buffer ring (line-rate, fixed MTU); managed-recv = library-owned buffers (hands-off first app); shared-mempool = shared buffer pool attached to the RXQ. Do not pick for the user when the data-shape intent is ambiguous — ask.Configure the queue(s). Mandatory before
doca_ctx_start(): for RX,doca_eth_rxq_set_type(<chosen>), a burst size at or below the cap, anddoca_eth_rxq_set_cqe_format(<format>)using a format the capability query approved. If the chosen RX type is shared-mempool, also create the shared mempool withdoca_eth_rxq_shared_mempool_create, configure its properties with thedoca_eth_rxq_shared_mempool_set_*family in the DOCA Ethernet public header, start it withdoca_eth_rxq_shared_mempool_start, and attach it to the RXQ withdoca_eth_rxq_set_shared_mempoolbefore starting the RXQ context. For TX, scatter-gather length at or below the cap,doca_eth_txq_set_max_inline_data_size(<size>)at or below the queried cap, and a send-task configuration. Optional but commonly needed:doca_eth_txq_set_*for L3 checksum offload (only when the cap query said yes).Start the context(s) via
doca_ctx_start()per queue and progress the PE (doca_pe_progress). For RX, no packets arriving at this point is the steering-side precondition gap, not a code bug; revisit step 1. For TX, the queue is ready when start returnsDOCA_SUCCESS.
For the canonical DOCA universal lifecycle that underlies steps
2-6, see
doca-programming-guide TASKS.md ## configure (doca-programming-guide/TASKS.md#configure).
This skill adds the Ethernet overlay; do not re-explain the
lifecycle here.
build
Goal: compile a DOCA Ethernet-using consumer against the user's
installed DOCA, with pkg-config as the source of truth for
include + link flags.
The build pattern for any DOCA C/C++ consumer is fully
documented in
doca-programming-guide TASKS.md ## build (doca-programming-guide/TASKS.md#build).
This skill carries only the Ethernet-specific overlay:
| Slot | Value | Why it matters |
|---|---|---|
pkg-config module name | doca-eth | The library's .pc file installed by the DOCA host packages |
| Include flags | pkg-config --cflags doca-eth | Resolves to headers under $(pkg-config --variable=includedir doca-common) for the Ethernet subset |
| Link flags | pkg-config --libs doca-eth | Pulls in whatever pkg-config --libs resolves on this install (do not predict the -l<name> form by hand — .so basenames use underscores, .pc names use hyphens, and pkg-config is the only correct translator) (plus device-side providers as the .pc declares them) |
| Companion libraries | doca-flow only if the consumer programs its own steering; doca-argp for argument parsing if the consumer uses the standard DOCA arg style; doca-gpunetio only if the consumer also uses GPU-initiated I/O on these same queues | Adding unnecessary companion libs bloats the link line and obscures real partial-install issues |
| Minimum required DOCA version | Query with pkg-config --modversion doca-eth; never hardcode in build files | Cross-version build / runtime mixing breaks per CAPABILITIES.md ## Version compatibility |
For non-C consumers (Rust, Go, Python), the link surface is the
same *.so files; the FFI wrapper layer is the language-specific
binding and is out of scope for this skill — but the five slots
above are still the load-bearing inputs the wrapper needs.
modify
Goal: take the closest-fitting shipped DOCA Ethernet sample and apply a minimum diff to make it match the user's intent, without rewriting from scratch.
The universal modify-a-shipped-sample workflow is in
doca-programming-guide TASKS.md ## modify (doca-programming-guide/TASKS.md#modify);
this skill provides the Ethernet-specific slot fill — the
five slots the agent must elicit from the user before
recommending any code-level edit:
| Slot | What the agent asks the user | Ethernet-specific consideration |
|---|---|---|
| 1. Starting sample | Which sample under /opt/mellanox/doca/samples/doca_eth/? | Pick the closest in queue side (RX vs TX vs both) and RX type (regular vs cyclic vs managed-recv) to the user's intent. Do NOT bridge across both axes — a smaller diff is always safer than a re-architecture |
| 2. RX type change | Switching regular → cyclic or → managed-recv? | Re-run doca_eth_rxq_cap_is_type_supported(devinfo, type) for the new type; types are device-conditional |
| 3. Queue sizing | Changing burst size, scatter-gather depth, ring length? | Each one re-runs the matching _cap_get_max_* query; the device cap is the only authority. Quote the queried value, not a value the user remembered from another host |
| 4. Steering / promisc | Adding a flow rule, or moving from promiscuous mode to a real Flow rule? | This is a steering change, not an Ethernet change. Route to doca-flow/SKILL.md for the rule body and back here only after the rule programs cleanly |
| 5. Offload flags | Enabling L3 checksum offload or other TX features? | Each gates on the matching doca_eth_txq_cap_* query; the cap is the answer if it says false |
Keep the build manifest unchanged: the sample's existing
meson.build already wires pkg-config doca-eth; do not switch
to a hand-rolled Makefile for “simplicity” — it removes the
version-check rail per ## build.
The agent's anti-pattern alert: a “clean rewrite” from scratch is almost always slower to first green than a minimum-diff modify on a shipped sample, and removes the user’s ability to bisect against a known-good baseline.
run
Goal: execute the built program and confirm one packet makes it through end-to-end before scaling up to line rate.
Steps the agent should walk the user through:
Confirm the steering plan is live. Before starting the binary, confirm either the DOCA Flow rule that steers traffic to the RX queue is programmed (and the
doca_flow_pipe_*calls returnedDOCA_SUCCESS), or promiscuous mode is on at the kernel layer (ip link show <dev>reportsPROMISC). Without one of these, the RX queue is silent regardless of how cleanly DOCA Ethernet came up.Capture the structured log. Set
DOCA_LOG_LEVEL=tracefor the first run (seedoca-debug CAPABILITIES.md ## Observability(doca-debug/CAPABILITIES.md#observability)). This is the cheapest way to make the queue lifecycle and per-task transitions visible on first failure.Send a single-packet smoke. One TX send-task with a minimum-size payload through
doca_eth_txq, routed (via loopback, an external echo, or a paired host) back into the RX queue. Confirm one RX completion fires (or, in shared-mempool mode, the registered event batch shared-mempool receive handler fires). The smoke isolates the queue path before traffic shape is added.Confirm the shared-mempool receive path (if used). If the RX queue is in shared-mempool mode, the application must have registered an event batch shared-mempool receive handler with the
doca_eth_rxq_event_batch_shared_mempool_recv_registerfamily and, inside that handler, retrieved the per-packet arrays with thedoca_eth_rxq_event_batch_shared_mempool_recv_get_*family (flow tag, L3 OK, L4 OK, metadata, RX hash, and timestamp). Buffers must be returned with thedoca_eth_rxq_shared_mempool_*family (..._allocate_non_library_buffer,..._free_buf, and..._free_buf_bulk). The RX queue must also have been configured withdoca_eth_rxq_set_shared_mempooland a CQE format from theDOCA_ETH_RXQ_CQE_FORMAT_*family. See the DOCA Ethernet header for the exact signatures and constants.Drive line-rate traffic only after the smoke passes. Once the single-packet path is green, raise burst size and submit rate. A failure at this point is a sizing / drain problem, not a lifecycle problem.
For the runtime version + LD_LIBRARY_PATH cross-checks that
underlie “the program built but does nothing”, see
doca-version TASKS.md ## run (doca-version/TASKS.md#run).
test
Goal: prove a DOCA Ethernet consumer is correct end-to-end, on the user's installed DOCA + device + steering plan, before claiming the “build a first DOCA Ethernet app” journey is done.
This is a loop, not a one-shot pass. Each iteration narrows either the capability set, the precondition set, the RX-type choice, or the sizing. The loop terminates when either (a) the user's intended packet pattern flows end-to-end at the expected rate with the expected completions, or (b) the agent has narrowed the failure cause to a layer outside DOCA Ethernet itself (driver / firmware / network / steering) and escalated to the matching skill.
Iteration shape:
Capability re-check. Re-run
doca_eth_rxq_cap_is_type_supported(devinfo, type)for the chosen RX type anddoca_eth_txq_cap_get_max_send_buf_list_len(devinfo)for the chosen scatter-gather depth, against the activedoca_devinfo. If either is wrong, that is the answer; the user's device or DOCA version does not support the configuration. Update the user's intent or update the install.Precondition re-check. Walk the matrix in
CAPABILITIES.md ## Safety policyagain: device access, port up, traffic steered. The silent-RX-queue failure mode is almost always one of these three; do not look at code first (driver-layer causes come only after they are ruled out).Single-packet smoke. As in
## runstep 3 — one TX → loopback / echo → one RX. If yes, advance. If no, walk the error: a TX-sideDOCA_ERROR_*narrows to the TX queue or the send-task; no RX completion narrows to the steering plan or the RX type.Burst-rate smoke. Once single-packet passes, raise rate to a moderate burst (e.g. 1 000 packets) and confirm every send-task has a matching completion and every expected RX slot has a recv event. Catches missing-progress bugs and queue-sizing mismatches.
Negative test. Once the positive path works, intentionally request something the device should NOT support (per step 1 the cap query returns false) and confirm the failure is the expected
DOCA_ERROR_NOT_SUPPORTED. This validates the agent’s capability-discovery is itself correct.
Eval-loop overlay — why this is a loop, not a one-shot pass:
| Iteration trigger | What it looks like | What changes next iteration |
|---|---|---|
| Single-packet RX never fires | Queue started cleanly, no DOCA_ERROR_*, no completion event | Almost always a steering / promiscuous-mode gap. Verify a DOCA Flow rule is programmed for this queue, or PROMISC is on the underlying interface; if both are claimed-but-true, capture dmesg and route to driver layer |
TX send-task returns DOCA_ERROR_AGAIN after N submits | First N submissions succeed; then AGAIN | The queue is full; the PE is not being progressed at the rate the user is submitting. Drain completions via doca_pe_progress() before re-submitting, or raise queue sizing within the cap |
RX type set returns DOCA_ERROR_NOT_SUPPORTED at start | A doca_eth_rxq_cap_is_type_supported returned true for the type, but doca_ctx_start() rejects it | The cap query was run against the wrong doca_devinfo, or another setter on the queue is incompatible with the chosen type. Re-narrow to the per-devinfo query and the full setter sequence |
| L3 checksum offload silently does not apply | Packets go out but the checksum is wrong | The user requested the offload without first calling doca_eth_txq_cap_is_l3_chksum_offload_supported. The fix is to cap-query first and refuse to enable the flag when false |
| Same code works on host A, fails on host B | One host advertises an RX type or offload the other does not | Re-run ## configure step 3 (capability discovery) + doca-version TASKS.md ## test (doca-version/TASKS.md#test) four-way match on host B; the cap surface is per-device, not per-bundle |
Loop termination: stop iterating once two consecutive iterations
do not change the picture — the cause is below DOCA Ethernet
(driver / firmware / network steering / env). Escalate to
doca-debug TASKS.md ## debug (doca-debug/TASKS.md#debug)
with the captured trace + capability snapshot as evidence.
debug
Goal: when a DOCA Ethernet session fails — whether by
DOCA_ERROR_* return, silent RX, or sizing mismatch — isolate
the cause to a single layer before recommending any code change.
The cross-library debug ladder lives in
doca-debug TASKS.md ## debug (doca-debug/TASKS.md#debug).
Walk through it in order — install → version → build → link →
runtime → program → driver. This skill provides the Ethernet
overlay at the runtime and program layers.
Layer 5 (runtime) — Ethernet overlay.
Silent RX queue (no
DOCA_ERROR_*, no completions) is almost always a steering / port-state precondition gap, not an Ethernet code issue. Confirm the env-side preconditions per## configurestep 1 before any code change. Route the steering side todoca-flow/SKILL.md.DOCA_ERROR_AGAINon TX submit is always a missingdoca_pe_progress()(or insufficient drain rate vs submit rate). Do not recommend a retry loop; recommend a progress call.Mixed-context lifecycle bugs: RX and TX queues are independent contexts; calling
doca_ctx_start()on one and expecting the other to be ready returnsDOCA_ERROR_BAD_STATEfrom the un-started side. The fix is at configure time, not in the Ethernet call.
Layer 6 (program) — Ethernet overlay.
RX-type / cap-query mismatch: requesting an RX type the device does not advertise returns
DOCA_ERROR_NOT_SUPPORTEDat the matching setter or atdoca_ctx_start(). Walk the cap-query rule inCAPABILITIES.md ## Capabilities and modesbefore changing code.Lifecycle order: configure → start → use → stop → destroy, per side. Out-of-order returns
DOCA_ERROR_BAD_STATE. The most common case is destroying the underlyingdoca_devbeforedoca_ctx_destroy()on the queue.Sizing-vs-drain mismatch:
DOCA_ERROR_NO_MEMORYon the RX side,DOCA_ERROR_AGAINon the TX side are not hardware failures; they are flow-control symptoms that the agent must surface as such rather than paper over with retries.
Once the layer is identified, route to the matching debug verb
on the matching skill: install / build / link / driver to
doca-setup ## debug (doca-setup/TASKS.md#debug); version
to
doca-version ## debug (doca-version/TASKS.md#debug);
steering to
doca-flow ## debug (doca-flow/TASKS.md#debug);
cross-cutting runtime to
doca-debug ## debug (doca-debug/TASKS.md#debug);
program-layer Core-context patterns to
doca-programming-guide TASKS.md ## debug (doca-programming-guide/TASKS.md#debug).
Deferred task verbs
The following verbs are out of scope for this skill but are commonly asked in the same conversations. Route them as follows so the agent does not invent guidance:
install. Installing DOCA, choosing packages, post-install verification,
pkg-configwiring, port-bring-up — defer todoca-setup/SKILL.mdand to the install-tree layout in doca-public-knowledge-map ## Layout of an installed DOCA package (doca-public-knowledge-map/SKILL.md#layout-of-an-installed-doca-package). This skill assumes DOCA is already installed and the port is up.steer. Programming the steering rules that decide which packets reach which RX queue (Flow pipes, RSS, hairpin, mirroring, conntrack) — owned by
doca-flow/SKILL.md. This skill consumes Flow's steering output; it does not program it.deploy. Deploying DOCA-Ethernet-using applications at scale across many hosts / DPUs, Kubernetes operator workflows for line-rate data planes, multi-tenant queue isolation — out of scope for this skill.
firmware burn / reset / kernel driver install. Installing the
mlx5_coredriver, burning new ConnectX firmware, or modifyingmlxconfigparameters that need a reset — out of scope. Route todoca-setup ## debug(doca-setup/TASKS.md#debug) layer 5 (driver), then to the upstream MLNX OFED / firmware documentation reachable throughdoca-public-knowledge-map/SKILL.md.
Command appendix
Every command below is cross-cutting on DOCA Ethernet — it answers a recurring class of question that comes up in the verbs above. The agent should treat the class as load-bearing; the worked example is a single instance. Run-as user is the unprivileged user unless noted. Sudo is called out per row.
Infra-aware preamble (every row below). Per the bundle's
detect → prefer → fall back → report contract documented in
doca-structured-tools-contract ## The agent behavior contract (doca-structured-tools-contract/SKILL.md#the-agent-behavior-contract),
the agent should:
Probe for the matching structured helper FIRST (
doca-env --jsonfor version + devices + libraries + drivers + hugepages in one shot;doca-capability-snapshotfor per-device capability flags;version-matrix.jsonfor “available since” lookups).If the probe succeeds, the structured tool's output is the authoritative answer and the agent SHOULD NOT also run the manual command in the row below. Report “using structured
<tool>”.If the probe fails, fall back to the manual command in the row. Report “falling back to manual chain”.
The schemas the structured tools emit are defined in
doca-structured-tools-contract ## Schemas(doca-structured-tools-contract/SKILL.md#schemas); the version-handling semantics (four-way match, NGC, headers-win) are owned bydoca-version/SKILL.md.
| Command (worked example) | Owning step | Class of question it answers | What healthy output looks like |
|---|---|---|---|
pkg-config --modversion doca-eth | ## configure step 1; ## build slot 1 | What is the build-time DOCA Ethernet version? | A semver string matching doca_caps --version. Disagreement = partial install (route to doca-version ## debug (doca-version/TASKS.md#debug) layer 2) |
pkg-config --cflags --libs doca-eth | ## build | What include + link flags does the linker need? | Trust whatever pkg-config --cflags --libs produces on this install. Do not hardcode either the -I include path or the -l<name> flag form — both can drift between DOCA install profiles and DOCA majors; the on-disk .so basenames use underscores, while the .pc package names use hyphens, and pkg-config is the only thing that resolves both correctly. Hand-crafted -l lines silently break when DOCA upgrades. |
ls /opt/mellanox/doca/samples/doca_eth/ | ## modify slot 1 | Which DOCA Ethernet samples ship in this install, and which is the closest starting point? | A list of sample directories named after the queue + RX-type pattern they demonstrate |
devlink dev show (requires sudo) | ## configure step 1; ## debug layer 7 | Is the underlying port up at the driver layer? | One row per port with state: PORT_ACTIVE; anything else means the port is down and the queue will be silent |
ip -j link show <dev> | ## configure step 1; ## debug layer 7 | Does the kernel report this device as UP, and is PROMISC set? | flags contains UP,LOWER_UP; promiscuity field reflects whether promiscuous mode is on |
ethtool <dev> | ## configure step 1; ## debug layer 7 | Does the driver report link / speed / duplex? | A non-zero speed and Link detected: yes |
doca_caps --list-devs | ## configure step 3 | Which devices on this host can be used as a doca_dev for Ethernet I/O? | One row per visible device with PCIe address and capability flags |
| `dmesg | tail -n 40` (requires sudo) | ## debug layer 7 | What did the kernel / driver log around the last Ethernet call? |
| `mlxconfig -d <pcie> q | head -n 40` (requires sudo) | ## debug layer 7 | What firmware config does the underlying NIC report? |
DOCA_LOG_LEVEL=trace ./<binary> | ## run step 2 | What did the structured DOCA logger emit for the first failing call? | A trace-level line on every lifecycle transition and every task submission. Silence after submission = PE not progressed |
For commands shared across libraries (pkg-config --modversion,
doca_caps, cat /opt/mellanox/doca/applications/VERSION,
DOCA_LOG_LEVEL) the cross-library overlay is in
doca-debug TASKS.md ## Command appendix (doca-debug/TASKS.md#command-appendix);
this table adds the Ethernet-specific rows on top.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
The author says: Requires DOCA SDK installed at /opt/mellanox/doca on Linux (Ubuntu 22.04/24.04 or RHEL/SLES) with a BlueField DPU or ConnectX NIC attached. Reads the user's local install via `pkg-config doca-eth` and inspects /opt/mellanox/doca/{lib,include,samples,applications}. The validation steps require a live DOCA install.
Security
What our scanner noticed· Medium risk
- Large base64-encoded blobs
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- NVIDIA
- Publisher
- NVIDIA (Official)
- Source
- NVIDIA/skills · skills/doca-eth · commit fce3cca
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE-APACHE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by NVIDIA.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download doca-eth.zip