doca-pcc · git:20261014.bbb601a · 2026-10-14 · sha256 f5e20898409442c3

doca-pcc git:20261014.bbb601aA

Immutable. This exact content never changes and is served at /api/v1/blob/f5e20898409442c3.

---
license: Apache-2.0
name: doca-pcc
description: >
  Use this skill when the user is doing hands-on host-side DOCA PCC work
  to load a CUSTOM Programmable Congestion Control algorithm onto a
  BlueField DPU — creating per-port `doca_pcc` contexts, loading a
  `dpacc`-compiled `doca_pcc_app` onto the `doca_dev` for the
  RoCE-bearing port, parameterizing it, walking triple-axis capability
  discovery (DOCA cap-query + DPA-capable BlueField + firmware
  custom-PCC slot enabled), or debugging `DOCA_ERROR_*` from
  `doca_pcc_*`. Trigger even without explicit "DOCA PCC" phrasing —
  implicit forms include "loading my own congestion control onto a BF
  port", "DOCA_ERROR_NOT_PERMITTED on algorithm load",
  "DOCA_ERROR_DRIVER when I attach my custom algorithm", "my custom
  rate-update isn't affecting RoCE traffic", or "load succeeds but no
  on-wire change". Refuse and route elsewhere for DPA-side
  algorithm-body design, the `pcc_counters` CLI, default factory PCC in
  ConnectX firmware, or setting up the RDMA / RoCE traffic — those
  belong to other skills.
metadata:
  author: NVIDIA <doca@nvidia.com>
  kind: library
  tags:
    - doca
    - pcc
    - congestion
compatibility: >
  Requires DOCA SDK installed at /opt/mellanox/doca on Linux (Ubuntu
  22.04/24.04 or RHEL/SLES) with a BlueField DPU whose DPA processor is
  exposed to the host AND whose firmware has the custom-PCC slot
  enabled. Also requires the DPACC compiler installed at a version
  matched to DOCA per the DOCA Compatibility Policy. Reads the user's
  local install via `pkg-config doca-pcc` and inspects
  /opt/mellanox/doca/{lib,include,samples,applications}. The validation
  steps require a live DOCA install.
---

# DOCA PCC

## Examples

- **"Loading my own congestion control onto a BF port."** — this
  is in scope. Stay on host-side `doca_pcc` + a DPACC-built
  `doca_pcc_app`; do not rewrite the algorithm body here.
- **"DOCA_ERROR_NOT_PERMITTED on algorithm load."** — check the
  firmware custom-PCC slot and DPA exposure before changing the
  load call.

## Instructions

Follow Loading order below. Open the tasks companion for configure /
load / debug. Open the capabilities companion for the triple-axis
cap query. Do not open every companion file.

**Where to start:** This skill assumes DOCA is already installed,
the user's BlueField has a DPA processor that the host can see
through DOCA, the BlueField firmware has the custom-PCC slot
enabled, and the user is doing **hands-on custom PCC work from
the host side** — i.e. using `doca-pcc` to load a DPA-side
congestion control algorithm onto the BlueField, attach it to a
port handling RDMA / RoCE traffic, and parameterize it from the
host. 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 the host-side PCC API express* on this version + this
BlueField generation + this firmware. If the user has not
installed DOCA yet, route to
[`doca-setup`](../../doca-setup/SKILL.md) first; if the user is
asking how to *write* the DPA-side congestion-control algorithm
itself (the code that runs on the DPA processor, compiled by
`dpacc`), that is a different scope — route via
[`doca-public-knowledge-map`](../../doca-public-knowledge-map/SKILL.md)
to the public DOCA PCC programming guide and to
[`doca-dpa`](../doca-dpa/SKILL.md) for the host-side DPA
lifecycle this skill builds on. If the user only wants to
*inspect* PCC counters at runtime without writing a custom
algorithm, that is the `pcc_counters` CLI tool — route via
[`doca-public-knowledge-map ## DOCA tools`](../../doca-public-knowledge-map/SKILL.md#doca-tools);
this skill is for *custom* algorithms only.

## Example questions this skill answers well

The CLASSES of PCC 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 deploy my own custom congestion control algorithm
  onto a BlueField port carrying RDMA / RoCE traffic?"** —
  worked example: *"load a small DPA-side PCC algorithm and
  attach it to the BlueField port that handles my RoCE traffic"*.
  Answered by the two-side-program model + the host-side
  load-and-attach workflow in
  ## Capabilities and modes
  + the bring-up steps in
  ## configure.
- **"Does this BlueField + firmware actually allow a custom PCC
  algorithm, and which PCC features does my DOCA install
  expose?"** — worked example: *"my host has a BlueField and the
  default factory PCC works; can I drop in a custom algorithm
  instead?"*. Answered by the triple-axis precondition rule
  (BlueField generation must carry a DPA, firmware must have the
  custom-PCC slot enabled, `doca_pcc_cap_*` against the active
  `doca_devinfo` must agree) in
  ## Capabilities and modes
  + the env-precondition checklist in
  ## configure step 1.
- **"Why does my custom PCC fail with `DOCA_ERROR_NOT_PERMITTED`
  even though I have `doca_dev` access?"** — worked example:
  *"the BlueField firmware in this host has the custom-PCC slot
  disabled"*. Answered by the permission matrix in
  ## Safety policy
  + the firmware-side env fix in
  ## configure step 1.
- **"Is this `doca-pcc` library the right tool for what I want,
  or do I want the default firmware PCC or the
  `pcc_counters` CLI?"** — worked example: *"I just want to
  read PCC counters without touching the algorithm"*. Answered
  by the path-selection rule in
  ## Capabilities and modes
  + the deferred-topic boundaries in
  ## Deferred topic boundaries
  which route to
  [`doca-public-knowledge-map ## DOCA tools`](../../doca-public-knowledge-map/SKILL.md#doca-tools)
  for the counter tool.
- **"Is the host-side PCC API I'm reading about on my installed
  DOCA?"** — worked example: *"is the host-side load helper I
  see in the docs available against the DOCA + DPACC versions on
  this host?"*. Answered by the version-compatibility overlay in
  ## Version compatibility
  which cross-links the canonical detection chain in
  [`doca-version`](../../doca-version/SKILL.md) and adds the
  PCC-specific *DOCA must match DPACC* overlay inherited from
  [`doca-dpa`](../doca-dpa/SKILL.md).
- **"What does this `DOCA_ERROR_*` from a `doca_pcc_*` call mean
  and which layer caused it?"** — worked example:
  *"`DOCA_ERROR_DRIVER` on the host-side algorithm-load call —
  is it DOCA, the firmware-side custom-PCC slot, or the DPACC-
  produced image?"*. Answered by the PCC overlay on the
  cross-library taxonomy in
  ## Error taxonomy
  + the layered ladder in
  ## debug that escalates to
  [`doca-debug`](../../doca-debug/SKILL.md).

## Audience

This skill serves **external developers building applications
that consume the DOCA PCC library from the host side** — i.e.,
users whose code calls `doca_pcc_*` from host C / C++ to stand
up the per-PCC-instance context, load a DPA-side PCC algorithm
image that `dpacc` produced from their DPA-side source, attach
it to the BlueField port that carries the RDMA / RoCE traffic
the algorithm is meant to control, parameterize the algorithm,
start the context, and observe runtime reports back from the
algorithm. It is *not* for NVIDIA developers contributing to
DOCA PCC itself, nor is it the place to learn how to *write*
the DPA-side congestion-control algorithm itself (that path
goes through the public DOCA PCC programming guide and the
companion DOCA DPA / DPACC guides via
[`doca-public-knowledge-map`](../../doca-public-knowledge-map/SKILL.md)).

**Language scope.** DOCA PCC ships as a host-side C library
with `pkg-config` module name `doca-pcc`. The host-side API is
C; the DPA-side congestion-control algorithm is a separate
translation unit written in the language the DPACC compiler
accepts and compiled by `dpacc` into a binary that the host
packages into the executable as the PCC algorithm image. The
shipped samples under `/opt/mellanox/doca/samples/doca_pcc/`
are written in C plus DPA-side source (NVIDIA's choice).
Other-language consumers are limited in practice — the
DPA-side algorithm has no FFI escape hatch because it must be
a translation unit `dpacc` accepts — but a Rust / Go / Python
host-side wrapper that drives `doca_pcc_*` setup and loads a
PCC algorithm image built separately is still useful, and the
skill keeps the lifecycle, capability-discovery,
env-precondition, and error-taxonomy guidance language-neutral.

## When to load this skill

Load this skill when the user is doing hands-on DOCA PCC work
**from the host side** for a **custom** congestion control
algorithm, in any host language plus a DPA-side translation
unit built by `dpacc`. Concretely:

- Initializing a `doca_pcc` against a `doca_dev` that maps to
  the BlueField port carrying the RDMA / RoCE traffic to be
  controlled.
- Loading a PCC algorithm image (`doca_pcc_app`) that `dpacc`
  produced from the user's DPA-side congestion-control algorithm
  source, into the `doca_pcc` context.
- Parameterizing the loaded algorithm with the host-side knobs
  the algorithm exposes, and starting the `doca_pcc` Core
  context so the algorithm begins affecting RDMA / RoCE
  traffic on the attached port.
- Checking which PCC features are supported on the active
  `doca_devinfo` via the `doca_pcc_cap_*` family — BlueField
  generations and firmware revisions differ in whether they
  permit a custom PCC algorithm.
- Debugging a `DOCA_ERROR_*` returned from a `doca_pcc_*` call
  — in particular disambiguating *firmware-level custom-PCC
  slot disabled* from *device does not support custom PCC at
  all* from *algorithm image incompatible with this device*
  from *standard `doca_dev` access denied*.
- Designing host-side bindings in a non-C language that drive
  a custom PCC algorithm image they built separately with
  `dpacc` — the env-precondition and capability-discovery rules
  in this skill still apply.

Do **not** load this skill for general DOCA orientation, install
of DOCA or the DPACC compiler, the DPA-side programming model
itself (how to write the congestion-control algorithm body that
runs on the DPA), questions about the default factory PCC
algorithm shipped in ConnectX firmware (no host-side `doca-pcc`
code needed — that path is firmware-only configuration), or
questions about the `pcc_counters` diagnostic CLI (route via
[`doca-public-knowledge-map ## DOCA tools`](../../doca-public-knowledge-map/SKILL.md#doca-tools)).
For all of those, route through
[`doca-public-knowledge-map`](../../doca-public-knowledge-map/SKILL.md)
to the matching upstream guide.

## What this skill provides

This is a **thin loader**. The body keeps only the orientation
needed to pick the right next file. The substantive
PCC-specific material lives in two companion files:

- the capabilities companion — what the host-side PCC API can express on
  this version + this BlueField generation + this firmware: the
  per-PCC-instance `doca_pcc` context, the loaded `doca_pcc_app`
  algorithm image produced by `dpacc`, the attach-to-port
  semantics that bind the algorithm to the RDMA / RoCE traffic
  it will control, the capability-query surface
  (`doca_pcc_cap_*`), the PCC error taxonomy mapped onto the
  cross-library `DOCA_ERROR_*` set, the observability surface
  (host-side reports plus the public PCC counter tool reachable
  via `doca-public-knowledge-map`), and the safety policy that
  gates env preconditions (DPA-capable BlueField, firmware-level
  custom-PCC slot enabled, matched DOCA + DPACC versions,
  algorithm image and host-side expectations agree).
- the tasks companion — step-by-step workflows for the six in-scope PCC
  verbs: `configure`, `build`, `modify`, `run`, `test`,
  `debug`. Plus a `Deferred task verbs` block that points
  out-of-scope questions at the right next skill.

The skill assumes a host where DOCA is already installed at
the standard location, a BlueField with a DPA processor is
physically present and visible to the host, the BlueField
firmware has the custom-PCC slot enabled, the DPACC compiler
is installed at a version matched to the DOCA install per the
DOCA Compatibility Policy, and the user already knows how
(at least at a sketch level) to write the DPA-side PCC
algorithm that `dpacc` will compile. It does not cover
installing DOCA, installing the DPACC compiler, or flipping
firmware-level configuration — those paths go through
[`doca-setup`](../../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 PCC application source code or DPA-side
  algorithm source, in any language.** The verified PCC source
  is the shipped C + DPA-side samples at
  `/opt/mellanox/doca/samples/doca_pcc/`. 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`](../../doca-programming-guide/SKILL.md),
  layered with the PCC-specific overrides in
  ## modify.
- **A specific congestion control algorithm.** This library
  *loads* an algorithm the user supplies; it does *not* define
  one. The agent must refuse to invent algorithm bodies and
  must route any *"what algorithm should I write"* question to
  the public DOCA PCC programming guide and the user's own
  domain expertise — that is a research question, not an API
  question.
- **Standalone build manifests** (`meson.build`,
  `CMakeLists.txt`, …) parked inside the skill. The agent
  constructs the build manifest *in the user's project
  directory* against the user's installed DOCA + DPACC
  compiler, where `pkg-config --modversion doca-pcc` and the
  installed `dpacc` are the two sources 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.
- **`pcc_counters` tool surface.** That CLI is a *separate
  artifact* (the `pcc_counters.sh` script under
  `tools/pcc_counters/`) with its own page; routing lives in
  [`doca-public-knowledge-map ## DOCA tools`](../../doca-public-knowledge-map/SKILL.md#doca-tools).
  Conflating it with the library is the most common PCC
  first-app design error.

## Loading order

1. Read this skill first to confirm the user's question is
   in scope (host-side custom PCC work, not DPA-side algorithm
   design and not the counter tool).
2. **For the PCC capability matrix, the two-side-program model,
   the `doca_pcc` per-instance context, the loaded `doca_pcc_app`
   algorithm image, the attach-to-port semantics, the
   triple-axis precondition rule, the env-precondition policy,
   the error taxonomy, the observability surface, and the
   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`](../../doca-version/SKILL.md) for the canonical
DOCA version-handling rules (with the PCC overlay that DOCA
must match the DPACC compiler), and
[`doca-public-knowledge-map`](../../doca-public-knowledge-map/SKILL.md)
whenever the right answer is "look it up in the public DOCA
PCC programming guide, the public DPA / DPACC guides, the
`pcc_counters` tool guide, or in the on-disk install
layout" rather than "PCC host-side-specific guidance".

## Related skills

- [`doca-public-knowledge-map`](../../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 PCC public guide is at
  <https://docs.nvidia.com/doca/sdk/DOCA-PCC/index.html>; the
  `pcc_counters` diagnostic CLI lives under the DOCA Tools
  umbrella as a *companion surface* rather than a redefined
  artifact here.
- [`doca-dpa`](../doca-dpa/SKILL.md) — the host-side DPA
  control library that PCC depends on conceptually: the
  custom PCC algorithm *is* DPA-side code, compiled by the
  DPACC compiler, and the host-side `doca-pcc` Core lifecycle
  follows the same shape as the `doca-dpa` Core lifecycle. The
  agent loads `doca-dpa` alongside this skill when the user
  has DPA-level questions (kernel-launch model, DPA-side
  libraries) that PCC is layered on top of.
- [`doca-rdma`](../doca-rdma/SKILL.md) — the library whose
  traffic the custom PCC algorithm is controlling. The custom
  PCC algorithm affects RDMA / RoCE flows on the attached
  BlueField port; if the user has not yet set up RDMA / RoCE
  traffic on that port, there is nothing for the algorithm to
  act on, and `doca-rdma` is the skill that brings that
  traffic up.
- [`doca-setup`](../../doca-setup/SKILL.md) — env preparation,
  install verification, DPACC compiler install / verification,
  BlueField firmware configuration (including the custom-PCC
  slot enable), and the *I have no install yet* path with the
  public NGC DOCA container. This skill assumes its
  preconditions are satisfied AND that DPACC is installed at a
  version that matches DOCA AND that the firmware-level
  custom-PCC slot is enabled.
- [`doca-version`](../../doca-version/SKILL.md) — canonical
  DOCA version-handling rules. This skill's `## Version
  compatibility` cross-links the four-way match rule and adds
  the PCC-specific *DOCA-and-DPACC must match* overlay per the
  DOCA Compatibility Policy (inherited from
  [`doca-dpa`](../doca-dpa/SKILL.md)).
- [`doca-structured-tools-contract`](../../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`](../../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 Core-context lifecycle, the cross-library
  `DOCA_ERROR_*` taxonomy, and the program-side debug order.
  This skill layers PCC specifics on top.
- [`doca-debug`](../../doca-debug/SKILL.md) — the cross-cutting
  debug ladder (install / version / build / link / runtime /
  program / driver). PCC-specific debug (custom-PCC slot not
  enabled in firmware, DPACC + DOCA version skew, algorithm
  image rejected as incompatible with the device, a loaded
  algorithm producing no on-wire change because
  `doca_pcc_start()` was never called or the attached port
  carries no RoCE traffic) overlays on top of that ladder.

> **"It loads but nothing changes on the wire" is a host-side
> question.** A successful load is not a live algorithm:
> `doca_pcc_start()` is the moment it goes live on the port, and
> PCC only modulates RoCE traffic that already exists on the
> `doca_dev` the `doca_pcc` was created against. Settle both here
> and do not audit the DPA-side algorithm body: that is
> [`doca-dpa`](../doca-dpa/SKILL.md)'s surface, and reports
> firing already proves the body runs — what is unproven is that
> it is bound and live. Ordered checks in
> ## debug.