Generated banner for Doca Eth
Generated logo for Doca Eth

Doca Eth

NVIDIAOfficialCreated by NVIDIA

  • Skill
  • Tool integration
  • Software development
  • Apache-2.0
  • Medium risk

From the author

Use this skill for hands-on DOCA Ethernet packet-queue work on a BlueField DPU or ConnectX NIC — bringing up a `doca_eth_rxq` or `doca_eth_txq` on a port / representor / SF, picking among the four `enum doca_eth_rxq_type` values (`_REGULAR` / `_CYCLIC` / `_MANAGED_MEMPOOL` / `_SHARED_MEMPOOL`), sizing burst or scatter-gather length against the `_cap_*` queries, submitting `doca_eth_txq_task_send` / `_lso_send` (carrying packet `doca_buf`s — no `doca_eth_frame` struct exists), or debugging DOCA_ERROR_* from an Ethernet call. `doca_eth_rxq` and `doca_eth_txq` are two Core contexts; one `doca_ctx_start()` does not cover both. Trigger on implicit phrasings: "my RX queue is up but no packets arrive", "send-task returns AGAIN at line rate", "which queue type for fixed-MTU ingress", "device open fails without sudo", or "is L3 checksum offload available here". Refuse and route elsewhere for installing DOCA, flow-rule / steering programming, host↔DPU control messaging, or RDMA data movement.
— the description by NVIDIA

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

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/nvidia/doca-eth/download
  2. Unzip 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_rxq plus a doca_eth_txq on a single BlueField representor for first-run testing". Answered by two independent Core contexts (each with its own start) in

    configure +

    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_supported against a doca_devinfo) in

    configure.

  • "How do I send a packet from user code through doca_eth_txq?" — worked example: "allocate a packet doca_buf, attach the payload, submit one send-task, wait for the completion event". Answered by the TX submission shape in

    Capabilities and modes

    • the property-set workflow in

    modify.

  • "My queue is up but no packets arrive — why?" — worked example: "doca_eth_rxq started cleanly but the recv callback never fires". Answered by the steering-dependency rule in

    Safety policy

    • the env-prep checklist in

    configure step 1, which

    routes the steering side to doca-flow/SKILL.md and the promiscuous-mode side to doca-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_supported against a doca_devinfo) in

    Capabilities 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_AGAIN on doca_task_submit for an eth_txq send-task at high rate". Answered by the Ethernet overlay on the cross-library taxonomy in

    Error 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_rxq on a doca_dev opened against a physical port, a representor, or an SF — choosing among the regular / cyclic / managed-recv RX types based on data shape before doca_ctx_start().

  • Initializing a doca_eth_txq on the same or a different doca_dev and posting send-tasks against packet doca_bufs payload buffers.

  • Reading or setting Ethernet queue properties via doca_eth_rxq_set_* / doca_eth_txq_set_* and querying device capability via doca_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-library DOCA_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 a Deferred task verbs block that points out-of-scope questions at the right next skill, and a Command appendix of 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 in doca-programming-guide/SKILL.md, layered with the Ethernet-specific overrides in

    modify.

  • 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, where pkg-config --modversion doca-eth is the source of truth.

  • A samples/, bindings/, or reference/ 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

  1. Read this skill first to confirm the user's question is in scope.

  2. For the Ethernet capability matrix, RX-type taxonomy, send surface, capability-query rules, error taxonomy, observability, and safety policy, see the capabilities companion.

  3. 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".

  • 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 is DOCA-Ethernet.

  • doca-setup/SKILL.md — env preparation, install verification, port-state checks (devlink dev show, ip link), permission and group-membership requirements for opening a doca_dev. This skill assumes its preconditions are satisfied.

  • doca-version/SKILL.md — canonical DOCA version-handling rules. This skill's ## Version compatibility cross-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 canonical pkg-config + meson build pattern, the universal modify-a-shipped-sample first-app workflow, the universal lifecycle, the cross-library DOCA_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 which doca_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

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:

  1. Confirm the env preconditions BEFORE writing any code. Per the precondition matrix in CAPABILITIES.md ## Safety policy, verify three things: the user can open a doca_dev on the target port (sudo or mlnx-group membership; id to check); the port is up at the driver layer (devlink dev show reports state: PORT_ACTIVE; ip link shows the device UP,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 to doca-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 a DOCA_ERROR_*.

  2. 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. One doca_ctx_start() on RX does not start TX (and vice versa). Sketch the call sequence per side before writing code.

  3. 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 the DOCA_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.

  4. 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.

  5. 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, and doca_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 with doca_eth_rxq_shared_mempool_create, configure its properties with the doca_eth_rxq_shared_mempool_set_* family in the DOCA Ethernet public header, start it with doca_eth_rxq_shared_mempool_start, and attach it to the RXQ with doca_eth_rxq_set_shared_mempool before 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).

  6. 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 returns DOCA_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:

SlotValueWhy it matters
pkg-config module namedoca-ethThe library's .pc file installed by the DOCA host packages
Include flagspkg-config --cflags doca-ethResolves to headers under $(pkg-config --variable=includedir doca-common) for the Ethernet subset
Link flagspkg-config --libs doca-ethPulls 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 librariesdoca-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 queuesAdding unnecessary companion libs bloats the link line and obscures real partial-install issues
Minimum required DOCA versionQuery with pkg-config --modversion doca-eth; never hardcode in build filesCross-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:

SlotWhat the agent asks the userEthernet-specific consideration
1. Starting sampleWhich 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 changeSwitching 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 sizingChanging 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 / promiscAdding 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 flagsEnabling 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:

  1. 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 returned DOCA_SUCCESS), or promiscuous mode is on at the kernel layer (ip link show <dev> reports PROMISC). Without one of these, the RX queue is silent regardless of how cleanly DOCA Ethernet came up.

  2. Capture the structured log. Set DOCA_LOG_LEVEL=trace for the first run (see doca-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.

  3. 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.

  4. 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_register family and, inside that handler, retrieved the per-packet arrays with the doca_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 the doca_eth_rxq_shared_mempool_* family (..._allocate_non_library_buffer, ..._free_buf, and ..._free_buf_bulk). The RX queue must also have been configured with doca_eth_rxq_set_shared_mempool and a CQE format from the DOCA_ETH_RXQ_CQE_FORMAT_* family. See the DOCA Ethernet header for the exact signatures and constants.

  5. 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:

  1. Capability re-check. Re-run doca_eth_rxq_cap_is_type_supported(devinfo, type) for the chosen RX type and doca_eth_txq_cap_get_max_send_buf_list_len(devinfo) for the chosen scatter-gather depth, against the active doca_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.

  2. Precondition re-check. Walk the matrix in CAPABILITIES.md ## Safety policy again: 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).

  3. Single-packet smoke. As in ## run step 3 — one TX → loopback / echo → one RX. If yes, advance. If no, walk the error: a TX-side DOCA_ERROR_* narrows to the TX queue or the send-task; no RX completion narrows to the steering plan or the RX type.

  4. 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.

  5. 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 triggerWhat it looks likeWhat changes next iteration
Single-packet RX never firesQueue started cleanly, no DOCA_ERROR_*, no completion eventAlmost 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 submitsFirst N submissions succeed; then AGAINThe 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 startA doca_eth_rxq_cap_is_type_supported returned true for the type, but doca_ctx_start() rejects itThe 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 applyPackets go out but the checksum is wrongThe 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 BOne host advertises an RX type or offload the other does notRe-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 ## configure step 1 before any code change. Route the steering side to doca-flow/SKILL.md.

  • DOCA_ERROR_AGAIN on TX submit is always a missing doca_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 returns DOCA_ERROR_BAD_STATE from 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_SUPPORTED at the matching setter or at doca_ctx_start(). Walk the cap-query rule in CAPABILITIES.md ## Capabilities and modes before 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 underlying doca_dev before doca_ctx_destroy() on the queue.

  • Sizing-vs-drain mismatch: DOCA_ERROR_NO_MEMORY on the RX side, DOCA_ERROR_AGAIN on 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-config wiring, port-bring-up — defer to doca-setup/SKILL.md and 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_core driver, burning new ConnectX firmware, or modifying mlxconfig parameters that need a reset — out of scope. Route to doca-setup ## debug (doca-setup/TASKS.md#debug) layer 5 (driver), then to the upstream MLNX OFED / firmware documentation reachable through doca-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:

  1. Probe for the matching structured helper FIRST (doca-env --json for version + devices + libraries + drivers + hugepages in one shot; doca-capability-snapshot for per-device capability flags; version-matrix.json for “available since” lookups).

  2. 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>”.

  3. If the probe fails, fall back to the manual command in the row. Report “falling back to manual chain”.

  4. 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 by doca-version/SKILL.md.

Command (worked example)Owning stepClass of question it answersWhat healthy output looks like
pkg-config --modversion doca-eth## configure step 1; ## build slot 1What 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## buildWhat 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 1Which 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 7Is 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 7Does 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 7Does the driver report link / speed / duplex?A non-zero speed and Link detected: yes
doca_caps --list-devs## configure step 3Which 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
`dmesgtail -n 40` (requires sudo)## debug layer 7What did the kernel / driver log around the last Ethernet call?
`mlxconfig -d <pcie> qhead -n 40` (requires sudo)## debug layer 7What firmware config does the underlying NIC report?
DOCA_LOG_LEVEL=trace ./<binary>## run step 2What 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