Generated banner for Doca Rmax
Generated logo for Doca Rmax

Doca Rmax

NVIDIAOfficialCreated by NVIDIA

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

From the author

DOCA Rivermax (doca_rmax) receive streams for timing-precise media over IP (SMPTE ST 2110 video / audio, market data, scientific feeds) on a target BlueField DPU (DOCA Rivermax apps run only there), once the Rivermax libraries and license are installed; getting them is doca-setup / doca-public-knowledge-map territory. Trigger on "ST 2110 receive isn't getting frames", "sub-microsecond jitter on my media receiver", "NOT_SUPPORTED from doca_rmax_init", "no recv events after stream start", or "license check failing on a media receiver", even without naming Rivermax. Covers doca_rmax_in_stream sessions, the SDK + license precondition check, doca_rmax_get_*_supported capability queries, pairing with doca-eth queues and doca-flow steering, and DOCA_ERROR_* from Rivermax calls. Refuse and route elsewhere for programming the underlying queue (doca-eth), steering rules (doca-flow), PTP / clock sync (doca-firefly), or best-effort packet I/O.
— the description by NVIDIA

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The doca-rmax skill provides technical guidance for developers building applications that consume the DOCA Rivermax integration. It focuses on the C/C++ API for receiving timing-precise media streams, such as SMPTE ST 2110, on NVIDIA BlueField DPUs. The skill covers the lifecycle of doca_rmax_in_stream objects, capability discovery via doca_rmax_get_*_supported queries, and error handling. It emphasizes that Rivermax requires a separately installed SDK and license, and it provides a structured approach to debugging stream issues by coordinating with doca-eth and doca-flow.

What it does

  • Manages the lifecycle of Rivermax receive stream contexts.
  • Provides capability discovery for PTP clocks and packet-placement modes.
  • Maps DOCA_ERROR_* codes to specific Rivermax-related causes.
  • Coordinates Rivermax streams with underlying doca-eth queues and doca-flow steering.
  • Validates mandatory preconditions including Rivermax SDK and license presence.
  • Offers debugging strategies for jitter and stream-start failures.

When to use it

  • When developing applications for SMPTE ST 2110 video/audio or high-throughput scientific feeds.
  • When troubleshooting why a Rivermax stream is not receiving frames.
  • When querying device capabilities for specific packet-placement or clock synchronization.
  • When integrating Rivermax with DOCA networking and steering components.
  • When debugging initialization errors like NOT_SUPPORTED.

Advantages

  • Ensures correct integration of timing-sensitive media streams.
  • Provides a clear separation between Rivermax-specific logic and underlying networking.
  • Reduces configuration errors by enforcing mandatory license and SDK checks.
  • Standardizes the debugging process for complex media-over-IP pipelines.

Usage examples

“ST 2110 receive isn't getting frames.”
The agent will verify the Rivermax license and SDK, check if the stream object started, and guide the user to inspect doca-flow steering rules and doca-eth queue configurations.
“Can this device use ST 2110-20 sequence-number placement?”
The agent will instruct the user to call the appropriate doca_rmax_get_*_supported query to verify hardware support for the requested placement mode.
“NOT_SUPPORTED from doca_rmax_init.”
The agent will guide the user to check the Rivermax SDK installation, license validity, and device compatibility before investigating further code-level issues.

Install

  1. Download the skill as a ZIP:

    https://autogineer.com/agent-skills/nvidia/doca-rmax/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip doca-rmax.zip -d .agents/skills

Documentation by NVIDIA

DOCA Rivermax

Examples

  • "ST 2110 receive isn't getting frames." — this is in scope after Rivermax SDK + license are already present.

  • "How do I obtain / install the Rivermax SDK and its license?" — out of scope for this skill. Say so, give no install or licensing steps, and route: DOCA packages to doca-setup/SKILL.md, the Rivermax SDK + license to the public DOCA Rivermax guide via doca-public-knowledge-map/SKILL.md. Come back here once both are present.

  • "NOT_SUPPORTED from doca_rmax_init." — run the doca_rmax_get_*_supported queries before changing stream setup.

Instructions

Follow Loading order below. Open the tasks companion for configure / stream / debug. Open the capabilities companion for Rivermax preconditions. Do not open every companion file.

Where to start: This skill assumes DOCA is already installed on the target BlueField DPU (DOCA Rivermax apps run only on the target DPU), AND that the Rivermax libraries (doca-sdk-rmax / libdoca-sdk-rmax-dev from the DOCA repo) are installed with a valid Rivermax license present on the DPU. The agent's FIRST action on any Rivermax question is to confirm both — without the Rivermax libraries + license, doca-rmax cannot function regardless of how clean the DOCA-side code is, and this is the #1 first-app confusion (the Rivermax license, and the driver per the Rivermax SDK page, are obtained separately from 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 DOCA Rivermax express on this version + this Rivermax install. If the user has not installed DOCA yet, route to doca-setup/SKILL.md first; for the Rivermax SDK + license install itself, route to the public DOCA Rivermax guide (slug DOCA-Rivermax) via doca-public-knowledge-map/SKILL.md. If the user is asking "how do I get packets to land on my Rivermax input stream at all", the answer is layered: doca-rmax is the Rivermax integration surface, doca-eth/SKILL.md is the queue surface that carries the packets, and doca-flow/SKILL.md is the steering surface that directs them.

Example questions this skill answers well

The CLASSES of DOCA Rivermax 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.

  • "Can I even use doca-rmax on this host?" — worked example: "the public docs mention doca-rmax; is it usable without doing anything else?". Answered by the Rivermax-SDK + license precondition rule in

    Safety policy

    • the env-prep checklist in

    configure step 1, which

    routes the install-side question to the public Rivermax guide via doca-public-knowledge-map/SKILL.md and refuses to recommend a fallback to doca-eth alone that would silently lose the timing properties.

  • "How do I set up a SMPTE ST 2110 video receive stream?" — worked example: "line up an inbound Rivermax stream on a representor of a BlueField port for first-run testing". Answered by the per-stream object lifecycle in

    configure +

    Capabilities and modes

    input stream capability table.

  • "Which doca_rmax_get_*_supported query do I have to call before picking a PTP clock or hardware packet-placement order?" — worked example: "can this device + this Rivermax install use ST 2110-20 sequence-number placement?". Answered by the capability-query rule in

    Capabilities and modes

    • step 3 in

    configure.

  • "My stream is set up but no packets arrive — why?" — worked example: "the Rivermax stream object started cleanly but no recv events fire". Answered by the precondition matrix in

    Safety policy

    • the env-prep checklist in

    configure step 1, which

    routes the steering side to doca-flow/SKILL.md, the queue side to doca-eth/SKILL.md, and the license side back to the Rivermax-side precondition.

  • "Is this Rivermax integration capability available on my device + my installed DOCA + my Rivermax SDK?" — worked example: "does this device + this Rivermax version advertise the PTP clock or placement mode I need". Answered by the capability-query rule in

    Capabilities and modes

    • the version-and-device overlay in

    Version compatibility,

    which adds the Rivermax-side version is a second axis rule on top of the canonical DOCA version-handling chain in doca-version/SKILL.md.

  • "What does this DOCA_ERROR_* from a Rivermax call mean and which layer caused it?" — worked example: "DOCA_ERROR_NOT_SUPPORTED from doca_rmax_init()". Answered by the Rivermax overlay on the cross-library taxonomy in

    Error taxonomy

    • the layered ladder in

    debug that escalates to

    doca-debug/SKILL.md, and which preserves the installed header's call-specific mapping: init-time _NOT_SUPPORTED routes first to Rivermax SDK / license checks; later errors are interpreted from the exact failing call rather than generalized into a license diagnosis.

Audience

This skill serves external developers building applications that consume the DOCA Rivermax integration — i.e., users whose code calls doca_rmax_* (directly in C/C++, or through FFI/bindings from another language) to drive timing-precise media-over-IP streams (SMPTE ST 2110, real-time market data, high-throughput scientific instrument streams) on top of a separately-installed NVIDIA Rivermax SDK on a BlueField or ConnectX host. It is not for NVIDIA developers contributing to DOCA Rivermax itself, and it is not for users who want best-effort packet I/O — for that, route to doca-eth/SKILL.md directly.

Language scope. DOCA Rivermax ships as a C library with pkg-config module name doca-rmax. The shipped samples live under /opt/mellanox/doca/samples/doca_rmax/ and 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 precondition rule (Rivermax SDK + license), per-stream lifecycle, capability-discovery, permission, scheduling-discipline, 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 Rivermax work, in any language. Concretely:

  • Confirming that the NVIDIA Rivermax SDK and a valid Rivermax license are present on the host before any DOCA-side code is written — this is a mandatory precondition, not an error path; without it the answer is "doca-rmax cannot be used; pick a different library", not "let's try and see what fails".

  • Initializing the global DOCA Rivermax engine with doca_rmax_init() / doca_rmax_release(), then creating a doca_rmax_in_stream (receive) context with doca_rmax_in_stream_create() on a doca_dev opened against a physical port, a representor, or an SF, and converting it via doca_rmax_in_stream_as_ctx() before doca_ctx_start(). The public DOCA Rivermax API is receive-only — there is no transmit/output stream object.

  • Configuring a Rivermax input stream for SMPTE ST 2110 audio + video over IP, real-time market data feeds, or a scientific instrument stream — with awareness that PTP-clock and hardware packet-placement-order support are device- and Rivermax-conditional and gate on the matching doca_rmax_get_*_supported query.

  • Reading or setting Rivermax stream properties via doca_rmax_in_stream_set_* and querying device + Rivermax capability via the doca_rmax_get_*_supported family before assuming PTP-clock or hardware packet-placement-order support.

  • Pairing the Rivermax stream with the doca-eth queue surface that carries the packets and the doca-flow rules that steer them — Rivermax does not program steering itself.

  • Designing the real-time scheduling discipline for the streaming threads (the underlying Rivermax stack expects real-time priority for sub-microsecond jitter; the canonical scheduling guidance lives in the Rivermax SDK docs reachable through doca-public-knowledge-map/SKILL.md).

  • Debugging a DOCA_ERROR_* returned from a Rivermax call (lifecycle vs. license / permission vs. capability vs. driver-below) where the cause may live in the DOCA-side wrapper, the underlying Rivermax stack, or the licensing layer.

  • Designing or extending non-C bindings (Rust, Go, Python, …) that wrap the DOCA Rivermax C ABI — for the precondition rule, lifecycle, capability, permission, and scheduling rules the wrapper must honor.

Do not load this skill for general DOCA orientation, for installing DOCA itself, for installing the Rivermax SDK or managing the Rivermax license file (those live in the public Rivermax SDK guide reachable through doca-public-knowledge-map/SKILL.md), for best-effort packet I/O without timing requirements (use doca-eth/SKILL.md directly), or for pure host-side data processing without networking. 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 Rivermax-specific material lives in two companion files:

  • the capabilities companion — what DOCA Rivermax can express on this version and this Rivermax SDK install: the Rivermax-as-hard-dependency rule, the receive-only doca_rmax_in_stream object model, the capability-query surface (doca_rmax_get_*_supported), the Rivermax error taxonomy (mapped onto the cross-library DOCA_ERROR_* set, with Rivermax-specific causes called out per row), the observability surface (per-stream progress engine events, capability snapshots, Rivermax-side license + driver state), and the safety policy that gates the Rivermax-SDK-present / license-present / device-access / scheduling-discipline preconditions.

  • the tasks companion — step-by-step workflows for the six in-scope Rivermax verbs: configure, build, modify, run, test, debug. Plus a Deferred task verbs block that points out-of-scope questions (installing Rivermax, managing the license, programming steering, programming the underlying queue) 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, the NVIDIA Rivermax SDK is installed at its expected location with a valid license, 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. It does not cover installing Rivermax or its license — that path goes through the public Rivermax SDK guide reachable through doca-public-knowledge-map/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 Rivermax application source code, in any language. The verified Rivermax source code is the shipped C samples at /opt/mellanox/doca/samples/doca_rmax/<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 Rivermax-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-rmax is the source of truth.

  • Quoted Rivermax symbol names beyond the public family pattern (doca_rmax_get_*_supported for capability discovery, receive-only doca_rmax_in_stream session objects driven by the standard DOCA Core context lifecycle). Exact Rivermax symbol names are install-bound and Rivermax-SDK-version- bound; the agent should read them from the installed headers at $(pkg-config --variable=includedir doca-common) and from the public DOCA Rivermax guide rather than rely on agent memory.

  • 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 and that the Rivermax-SDK + license precondition has been considered.

  2. For the Rivermax capability matrix, the receive-only input stream model, 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 DOCA version-handling rules (Rivermax adds a Rivermax-SDK- version axis on top), doca-eth/SKILL.md for the queue surface that carries the packets, doca-flow/SKILL.md for the steering side that decides which packets land on which queue, and doca-public-knowledge-map/SKILL.md whenever the right answer is "look it up in the public Rivermax SDK guide or the installed package layout" rather than "Rivermax-integration-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 Rivermax URL slug is DOCA-Rivermax; the public Rivermax SDK guide (separate product) is reachable from the same routing table when the user asks how to install Rivermax or its license.

  • 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; the Rivermax-SDK + license preconditions are layered on top.

  • doca-version/SKILL.md — canonical DOCA version-handling rules. This skill's ## Version compatibility cross-links the four-way match rule and adds the Rivermax-specific overlay (Rivermax SDK version is a second axis; the capability set on this host is the intersection of DOCA-side cap-query results and Rivermax-side capabilities).

  • 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 Rivermax specifics on top.

  • doca-eth/SKILL.md — the queue surface that carries the packets a Rivermax stream produces or consumes. DOCA Rivermax does not program the underlying queue itself; it integrates with the queue programmed via doca-eth. The two skills' lifecycles are independent.

  • doca-flow/SKILL.md — the steering surface that decides which packets land on which queue. DOCA Rivermax does not program steering itself; an empty Rivermax input stream almost always means a missing or wrong Flow rule (or a missing Rivermax license), not a Rivermax bug.

  • doca-debug/SKILL.md — the cross-cutting debug ladder (install / version / build / link / runtime / program / driver). Rivermax-specific debug (license precondition gaps, stream-type / packet-rate capability mismatches, scheduling-discipline jitter symptoms) overlays on top of that ladder.

Files

TASKS.md

DOCA Rivermax 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 (Rivermax-precondition check → capability check → underlying queue + steering check → single-frame smoke → completion drain → loop back if the stream type, frame size, or scheduling 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 Rivermax capability surface, the receive-only input stream model, 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 queue surface that carries the packets a Rivermax stream produces or consumes, see doca-eth/SKILL.md. For the steering side that decides which packets land on which 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: initialize the process-global DOCA Rivermax engine (doca_rmax_init()) and stand up a receive-only doca_rmax_in_stream on a port, representor, or SF, with the user aware that the Rivermax SDK + license precondition is a gate (not an error path) and with the underlying queue + steering plan in place before any frame flow is meaningful.

Steps the agent should walk the user through:

  1. Confirm the Rivermax precondition AND env preconditions BEFORE writing any code. Per the precondition matrix in CAPABILITIES.md ## Safety policy, verify (in this order, because later rows are wasted effort if the first two fail): (a) the NVIDIA Rivermax SDK is installed at its expected location on the host; (b) a valid Rivermax license is readable by the user the streaming process will run as; (c) the user can open a doca_dev on the target port (sudo or mlnx-group membership; id to check); (d) the port is up at the driver layer (devlink dev show reports state: PORT_ACTIVE; ip link shows the device UP,LOWER_UP); (e) the user has a steering plan for inbound traffic — a DOCA Flow rule that will steer matching packets to the doca_eth_rxq the input stream will be attached to (route to doca-flow/SKILL.md). If (a) or (b) is missing, stop here and tell the user honestly that doca-rmax cannot be used without those two — there is no DOCA-side fallback that preserves timing precision. Route the install / license question to the public Rivermax SDK guide via doca-public-knowledge-map/SKILL.md.

  2. Stand up the underlying packet queue first. Per the queue-pair workflow in doca-eth TASKS.md ## configure (doca-eth/TASKS.md#configure), bring up a doca_eth_rxq on the target port (the Rivermax public API is receive-only). doca-rmax integrates with this queue; it does not replace it.

  3. Initialize the global engine and create the input stream. Call doca_rmax_init() once for the process (after any doca_rmax_set_cpu_affinity_mask()), then create the receive-only doca_rmax_in_stream via doca_rmax_in_stream_create() on a doca_dev (which must have a valid IPv4 address) and convert it to a DOCA Core context with doca_rmax_in_stream_as_ctx(). Per the object-model table in CAPABILITIES.md ## Capabilities and modes, there is no per-integration context object and no transmit/output stream. Sketch the call sequence before writing code. If doca_rmax_init() returns DOCA_ERROR_NOT_SUPPORTED, check the Rivermax SDK and license preconditions first; that call-specific mapping is documented by the installed header.

  4. Run capability discovery against the active doca_devinfo. Walk the doca_rmax_get_*_supported family per the capability-query rule in CAPABILITIES.md ## Capabilities and modes for PTP-clock support and hardware-accelerated packet-placement order (RTP-seqn, ST 2110-20 seqn) the user is considering. Quote the queried values back to the user; do not assume from prior installs or from the public docs. The cap query is the runtime authority — when it says not-supported, that is the answer.

  5. Configure the input stream. Set the scatter type, timestamp format, memory-block / element-count layout, and (only after step 4 confirmed support) the packet-placement order and PTP-synced timestamp via the doca_rmax_in_stream_set_* setters. Wire the underlying doca_eth_rxq in. Register the Rx-data event via doca_rmax_in_stream_event_rx_data_register(). Plan the real-time scheduling discipline for the streaming threads now, before start — the canonical scheduling guidance lives in the Rivermax SDK guide via doca-public-knowledge-map/SKILL.md.

  6. Start the input stream via doca_ctx_start(), attach a doca_rmax_flow filter with doca_rmax_flow_attach(), and progress the PE (doca_pe_progress). No frames arriving at this point is a Rivermax-license / steering / underlying-queue precondition gap, not a code bug; revisit step 1.

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 Rivermax overlay; do not re-explain the lifecycle here.

build

Goal: compile a DOCA Rivermax-using consumer against the user's installed DOCA and installed Rivermax SDK, with pkg-config as the source of truth for the DOCA-side include

  • link flags and the Rivermax SDK's own integration mechanism for the Rivermax-side ones.

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 Rivermax-specific overlay:

SlotValueWhy it matters
pkg-config module name (DOCA side)doca-rmaxThe library's .pc file installed by the DOCA host packages. A missing .pc does NOT imply the Rivermax SDK is missing — they are two independent install layers
Include flags (DOCA side)pkg-config --cflags doca-rmaxResolves to headers under $(pkg-config --variable=includedir doca-common) for the Rivermax-integration subset
Link flags (DOCA side)pkg-config --libs doca-rmaxPulls 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). The DOCA-side link does NOT include the Rivermax SDK itself — that comes from the SDK's own integration mechanism
Rivermax SDK integrationPer the public Rivermax SDK guide via doca-public-knowledge-map/SKILL.mdThe Rivermax SDK ships its own include / link integration mechanism (header location, library path, license-file path). The agent must consult the Rivermax SDK guide rather than invent flags
Companion DOCA librariesdoca-eth (always — the queue surface is required); doca-flow only if the consumer programs its own steering; doca-argp for argument parsing if the consumer uses the standard DOCA arg styleAdding unnecessary companion libs bloats the link line and obscures real partial-install issues
Minimum required DOCA versionQuery with pkg-config --modversion doca-rmax; never hardcode in build filesCross-version build / runtime mixing breaks per CAPABILITIES.md ## Version compatibility; the Rivermax SDK version is a second axis the build must also honor

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 six slots above are still the load-bearing inputs the wrapper needs, with the Rivermax SDK integration row being the most likely to surprise a wrapper author who assumes DOCA bundles the Rivermax engine.

modify

Goal: take the closest-fitting shipped DOCA Rivermax 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 Rivermax-specific slot fill — the six slots the agent must elicit from the user before recommending any code-level edit:

SlotWhat the agent asks the userRivermax-specific consideration
1. Starting sampleWhich sample under /opt/mellanox/doca/samples/doca_rmax/?Pick the closest in stream type (e.g. SMPTE ST 2110 video vs audio vs market data) to the user's intent. All public samples are receive-side; a smaller diff is always safer than a re-architecture
2. Rivermax precondition still satisfied?Has anything changed about the Rivermax SDK install or license since the last working build?A working sample that suddenly stops working after a modify is sometimes really a license that expired between runs; do not assume the diff is the cause without re-checking the precondition matrix in CAPABILITIES.md ## Safety policy
3. Stream-type changeSwitching the stream type (e.g. ST 2110 video → audio, or video frame rate / size change)?Re-run the matching doca_rmax_get_*_supported query (PTP clock, packet-placement order) for the new configuration against the active doca_devinfo; capability is the joint property of device + DOCA version + Rivermax SDK version
4. Underlying queue changeChanging the underlying doca_eth_rxq sizing, burst size, or RX type?This is an doca-eth change, not a Rivermax change. Route to doca-eth/SKILL.md for the queue body and back here only after the queue change re-validates against its own cap queries
5. Steering / Flow rule changeAdding or modifying the Flow rule that steers traffic to the queue?This is a steering change, not a Rivermax change. Route to doca-flow/SKILL.md for the rule body and back here only after the rule programs cleanly
6. Scheduling disciplineChanging the real-time priority of the streaming thread, the CPU pinning, or the isolation?This is a Rivermax-side concern; route the canonical scheduling guidance via the public Rivermax SDK guide reachable through doca-public-knowledge-map/SKILL.md. The agent must not invent scheduler flags

Keep the build manifest unchanged: the sample's existing meson.build already wires pkg-config doca-rmax alongside the Rivermax SDK integration; do not switch to a hand-rolled Makefile for “simplicity” — it removes both the version-check rail per ## build and the Rivermax SDK integration the sample author already got right.

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 — and in the Rivermax case it also removes the implicit confirmation that the Rivermax SDK integration was correct in the working sample.

run

Goal: execute the built program and confirm one frame makes it through end-to-end before scaling up to the full stream rate.

Steps the agent should walk the user through:

  1. Confirm the Rivermax license is still readable. Before starting the binary, confirm the Rivermax license file is present and readable by the user the process will run as. A license that expired or moved between configure and run is the second-most-common Rivermax first-app symptom (after “I didn't install Rivermax at all”). The documented call-specific signal is DOCA_ERROR_NOT_SUPPORTED from doca_rmax_init(). Do not infer a license failure from a later DOCA_ERROR_NOT_PERMITTED unless the installed header or Rivermax documentation maps that exact failing call.

  2. Confirm the steering plan is live. Before starting the binary (input direction), confirm the DOCA Flow rule that steers traffic to the underlying doca_eth_rxq is programmed (and the doca_flow_pipe_* calls returned DOCA_SUCCESS). Without it, the Rivermax input stream will be silent regardless of how cleanly Rivermax came up.

  3. Set the real-time scheduling on the streaming thread. Per the canonical Rivermax SDK guidance (route via doca-public-knowledge-map/SKILL.md), the streaming thread should run at real-time priority for sub-microsecond jitter to hold. Confirm the program is actually setting this — defaults are not enough.

  4. 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 per-stream lifecycle and per-event transitions visible on first failure.

  5. Send a single-frame smoke. One frame / chunk of the configured stream type: a single matching frame routed in via an external sender or loopback. Confirm one Rx-data event fires. The smoke isolates the Rivermax receive path before timing-precise rate is added.

  6. Drive full stream rate only after the smoke passes. Once the single-frame path is green, raise to the configured stream rate. A failure at this point is a jitter / scheduling-discipline / sizing 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 Rivermax consumer is correct end-to-end, on the user's installed DOCA + Rivermax SDK + device + license

  • steering plan, before claiming the “build a first DOCA Rivermax app” journey is done.

This is a loop, not a one-shot pass. Each iteration narrows either the precondition set, the capability set, the stream-type choice, the underlying queue / steering plan, or the scheduling discipline. The loop terminates when either (a) the user's intended stream flows end-to-end at the expected rate with the expected jitter and the expected completions, or (b) the agent has narrowed the failure cause to a layer outside DOCA Rivermax itself (Rivermax SDK / license / driver / firmware / steering / scheduling) and escalated to the matching skill or to the public Rivermax SDK guide.

Iteration shape:

  1. Rivermax precondition re-check. Re-walk the first two rows of the precondition matrix in CAPABILITIES.md ## Safety policy: Rivermax SDK installed; license readable. If either is wrong, the answer is the install / license fix, not a code change.

  2. Capability re-check. Re-run the matching doca_rmax_get_*_supported query for the chosen timestamp format / packet-placement order against the active doca_devinfo. If wrong, that is the answer; the device, DOCA version, or Rivermax SDK version does not support the configuration. Update the user's intent or update the install.

  3. Underlying queue + steering re-check. Walk doca-eth TASKS.md ## test (doca-eth/TASKS.md#test) for the queue side and doca-flow TASKS.md ## test (doca-flow/TASKS.md#test) for the steering side. A silent Rivermax input stream is almost always one of these two.

  4. Single-frame smoke. As in ## run step 5 — one matching frame received, one completion. If yes, advance. If no, walk the error: a DOCA_ERROR_* narrows to the doca_rmax_in_stream object or to doca_rmax_init(); no completion narrows to license, steering, queue, or missing-progress.

  5. Stream-rate smoke. Once single-frame passes, raise to the configured full stream rate and confirm every expected completion event fires on time. Catches scheduling- discipline gaps (jitter rises) and queue-sizing mismatches.

  6. Negative test. Once the positive path works, intentionally request something the device + Rivermax should NOT support (per step 2 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
doca_rmax_init() returns DOCA_ERROR_NOT_SUPPORTEDInitialization fails before any stream is createdRe-walk the Rivermax SDK and license preconditions and route their remediation through doca-public-knowledge-map. Do not reinterpret this as device access.
A later Rivermax call returns DOCA_ERROR_NOT_PERMITTEDThe exact failing call and installed-header mapping have been capturedFollow the call-specific evidence. For device open / stream create, validate DOCA-side device access; do not label the error a license failure without verified documentation for that call.
Input stream started cleanly, no completionsStream + underlying queue both STARTED; no DOCA_ERROR_*; no Rx-data eventAlmost always (a) Flow rule missing on the steering side, or (b) Rivermax license problem the agent missed at configure, or (c) PE not progressed in the user’s main loop. Walk those three in order.
Stream-rate smoke shows jitter / dropped framesSingle-frame smoke passed cleanly; full-rate run shows jitter past the Rivermax specThe streaming thread is not at real-time priority, or the CPU is not isolated, or another high-priority thread is preempting it. Route the scheduling discipline to the public Rivermax SDK guide via doca-public-knowledge-map/SKILL.md.
Placement-order set returns DOCA_ERROR_NOT_SUPPORTED at startA doca_rmax_get_*_supported query returned DOCA_SUCCESS, but doca_ctx_start() rejects the configurationThe cap query was run against the wrong doca_devinfo, or a doca_rmax_in_stream_set_* setter is incompatible with the chosen configuration. Re-narrow to the per-devinfo query and the full setter sequence. Confirm the Rivermax SDK version on the host matches the one the cap-query result implies.
Same code works on host A, fails on host BOne host has the Rivermax SDK + license; the other does not, or has a different Rivermax versionRe-walk the precondition matrix on host B; then re-run ## configure step 4 (capability discovery) + doca-version TASKS.md ## test (doca-version/TASKS.md#test) four-way match on host B. The cap surface is per-device AND per-Rivermax-version.

Loop termination: stop after five iterations or once two consecutive iterations do not change the picture, whichever comes first. Route Rivermax SDK, license, and Rivermax scheduling causes through doca-public-knowledge-map/SKILL.md to the public Rivermax guidance. Route DOCA runtime, driver, firmware, and device-access causes to doca-debug TASKS.md ## debug (doca-debug/TASKS.md#debug) (and its matching setup/driver route) with the captured trace, capability snapshot, and Rivermax-side state. Queue and steering causes remain with doca-eth and doca-flow respectively.

debug

Goal: when a DOCA Rivermax session fails — whether by DOCA_ERROR_* return, silent stream, or jitter-budget violation — 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 Rivermax overlay at the runtime and program layers, with one additional rule that overlays at install: Rivermax SDK + license is a second install axis that the standard ladder does not check.

Layer 1 (install) — Rivermax overlay.

  • Confirm that the Rivermax SDK is installed AND a valid license is readable BEFORE diagnosing anything else. This is the gate. A failure here cannot be papered over by any later layer; route to the public Rivermax SDK guide via doca-public-knowledge-map/SKILL.md.

Layer 5 (runtime) — Rivermax overlay.

  • Silent Rivermax input stream (no DOCA_ERROR_*, no completions) is almost always a missing Rivermax license, a missing-or-wrong Flow rule, or an unstarted underlying doca_eth_rxq. Confirm those env-side preconditions per ## configure step 1 before any code change.

  • DOCA_ERROR_NOT_SUPPORTED from doca_rmax_init() is the documented license / Rivermax-SDK precondition signal. A later DOCA_ERROR_NOT_PERMITTED is interpreted only from the exact failing call and installed-header evidence; do not generalize it into a license diagnosis.

  • Jitter past spec at full stream rate is almost always a scheduling-discipline gap — the streaming thread is not at real-time priority, or the CPU is not isolated, or another high-priority thread is preempting it. Route to the public Rivermax SDK guide for the canonical scheduling discipline via doca-public-knowledge-map/SKILL.md.

Layer 6 (program) — Rivermax overlay.

  • Capability / configuration mismatch: requesting a PTP clock or hardware packet-placement order the device + Rivermax SDK 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 on the doca_rmax_in_stream context. Out-of-order returns DOCA_ERROR_BAD_STATE. The most common case is treating the process-global doca_rmax_init() call as if it started the input stream context.

  • Wrong-layer responsibility: programming the queue from within Rivermax code, or programming steering from within Rivermax code, is a category error — Rivermax is the Rivermax integration surface, not the queue surface (use doca-eth/SKILL.md) and not the steering surface (use doca-flow/SKILL.md).

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); Rivermax SDK / license install to the public Rivermax SDK guide via doca-public-knowledge-map/SKILL.md; version to doca-version ## debug (doca-version/TASKS.md#debug); steering to doca-flow ## debug (doca-flow/TASKS.md#debug); queue to doca-eth ## debug (doca-eth/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 (Rivermax SDK + license). Installing the NVIDIA Rivermax SDK, configuring the license file, renewing / rotating the license — out of scope for this skill (and out of scope for the whole DOCA bundle). Route via the public Rivermax SDK guide reachable through doca-public-knowledge-map/SKILL.md. This skill assumes the SDK + license are already present.

  • install (DOCA). 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).

  • steer. Programming the steering rules that decide which packets reach which queue (Flow pipes, RSS, hairpin, mirroring) — owned by doca-flow/SKILL.md. This skill consumes Flow's steering output via the underlying queue; it does not program it.

  • queue. Programming the underlying packet queue (doca_eth_rxq / doca_eth_txq) — owned by doca-eth/SKILL.md. DOCA Rivermax integrates with the queue; it does not replace it.

  • deploy. Deploying DOCA-Rivermax-using applications at scale across many hosts / DPUs, Kubernetes operator workflows for timing-precise media data planes, multi-tenant stream 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 Rivermax — 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. Rows that need elevated privileges call that out explicitly.

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-rmax## configure step 1; ## build slot 1What is the build-time DOCA Rivermax (wrapper) version?A semver string matching doca_caps --version. Disagreement = partial install (route to doca-version ## debug (doca-version/TASKS.md#debug) layer 2). Success here does NOT imply the Rivermax SDK is installed
pkg-config --cflags --libs doca-rmax## buildWhat include + link flags does the linker need on the DOCA side?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_rmax/## modify slot 1Which DOCA Rivermax samples ship in this install, and which is the closest starting point?A list of receive-side sample directories named after the stream-type pattern they demonstrate. An empty result means no samples shipped on this install — route to doca-public-knowledge-map/SKILL.md for the public DOCA Rivermax guide
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 Rivermax stream will be silent
ip -j link show <dev>## configure step 1; ## debug layer 7Does the kernel report this device as UP?flags contains UP,LOWER_UP. Promiscuous mode is generally NOT how Rivermax input streams get their packets — they get them via a Flow rule on the underlying queue
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 4Which devices on this host can be used as a doca_dev for Rivermax integration?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 Rivermax 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 4What did the structured DOCA logger emit for the first failing call?A trace-level line on every lifecycle transition and every event / task. Preserve the exact failing call and return code: DOCA_ERROR_NOT_SUPPORTED from doca_rmax_init() routes first to SDK/license checks; silence after a started stream routes to PE progress, steering, and queue checks

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 Rivermax-specific rows on top. For the Rivermax SDK's own diagnostic commands (license check, Rivermax-side log capture, Rivermax-side version query) the canonical reference is the public Rivermax SDK guide via doca-public-knowledge-map/SKILL.md — the agent must not invent Rivermax-side commands from memory.

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 at /opt/mellanox/doca on Linux (Ubuntu 22.04/24.04 or RHEL/SLES) on the target BlueField DPU (DOCA Rivermax apps run only there), with `doca-sdk-rmax` from the DOCA repo AND a separately obtained Rivermax license readable by the user. Reads the local install via `pkg-config doca-rmax`; route Rivermax SDK install/license questions to the public Rivermax guide. 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-rmax · 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 or NVIDIA.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download doca-rmax.zip