Quantized Congestion Notification (QCN)

Linux Kernel Upstream Release Notes v5.17

Congestion control is used to reduce packet drops in lossy environments and mitigate congestion spreading and resulting victim flows in lossless environments.
The Quantized Congestion Notification (QCN) IEEE standard (802.1Qau) provides congestion control for long-lived flows in limited bandwidth-delay product Ethernet networks. It is part of the IEEE Data Center Bridging (DCB) protocol suite, which also includes ETS, PFC, and DCBX. QCN in conducted at L2, and is targeted for hardware implementations. QCN applies to all Ethernet packets and all transports, and both the host and switch behavior is detailed in the standard.
QCN user interface allows the user to configure QCN activity. QCN configuration and retrieval of information is done by the mlnx_qcn tool. The command interface provides the user with a set of changeable attributes, and with information regarding QCN's counters and statistics. All parameters and statistics are defined per port and priority. QCN command interface is available if and only the hardware supports it.

Warning

This tool is supported on ConnectX-3 and ConnectX-3 Pro NICs only.

mlnx_qcn is a tool used to configure QCN attributes of the local host. It communicates directly with the driver thus does not require setting up a DCBX daemon on the system.

The mlnx_qcn enables the user to:

  • Inspect the current QCN configurations for a certain port sorted by priority

  • Inspect the current QCN statistics and counters for a certain port sorted by priority

  • Set values of chosen QCN parameters

Usage

Copy
Copied!
            

mlnx_qcn -i <interface> \[options\]

Options

--version

Show program's version number and exit

-h, --help

Show this help message and exit

-i INTF, --interface=INTF

Interface name

-g TYPE, --get_type=TYPE

Type of information to get statistics/parameters

--rpg_enable=RPG_ENABLE_LIST

Set value of rpg_enable according to priority, use spaces between values and -1 for unknown values.

--rppp_max_rps=RPPP_MAX_RPS_LIST

Set value of rppp_max_rps according to priority, use spaces between values and -1 for unknown values.

--rpg_time_reset=RPG_TIME_RESET_LIST

Set value of rpg_time_reset according to priority, use spaces between values and -1 for unknown values.

--rpg_byte_reset=RPG_BYTE_RESET_LIST

Set value of rpg_byte_reset according to priority, use spaces between values and -1 for unknown values.

--rpg_threshold=RPG_THRESHOLD_LIST

Set value of rpg_threshold according to priority, use spaces between values and -1 for unknown values.

--rpg_max_rate=RPG_MAX_RATE_LIST

Set value of rpg_max_rate according to priority, use spaces between values and -1 for unknown values.

--rpg_ai_rate=RPG_AI_RATE_LIST

Set value of rpg_ai_rate according to priority, use spaces between values and -1 for unknown values.

--rpg_hai_rate=RPG_HAI_RATE_LIST

Set value of rpg_hai_rate according to priority, use spaces between values and -1 for unknown values.

--rpg_gd=RPG_GD_LIST

Set value of rpg_gd according to priority, use spaces between values and -1 for unknown values.

--rpg_min_dec_fac=RPG_MIN_DEC_FAC_LIST

Set value of rpg_min_dec_fac according to priority, use spaces between values and -1 for unknown values.

--rpg_min_rate=RPG_MIN_RATE_LIST

Set value of rpg_min_rate according to priority, use spaces between values and -1 for unknown values.

--cndd_state_machine=CNDD_STATE_MACHINE_LIST

Set value of cndd_state_machine according to priority, use spaces between values and -1 for unknown values.

Copy
Copied!
            

mlnx_qcn -i eth2 -g parameters

Copy
Copied!
            

mlnx_qcn -i eth2 -g statistics

Output example of running mlnx_qcn -i eth2 -g parameters:

Copy
Copied!
            

priority 0: rpg_enable: 0 rppp_max_rps: 1000 rpg_time_reset: 1464 rpg_byte_reset: 150000 rpg_threshold: 5 rpg_max_rate: 40000 rpg_ai_rate: 10 rpg_hai_rate: 50 rpg_gd: 8 rpg_min_dec_fac: 2 rpg_min_rate: 10 cndd_state_machine: 0 priority 1: rpg_enable: 0 rppp_max_rps: 1000 rpg_time_reset: 1464 rpg_byte_reset: 150000 rpg_threshold: 5 rpg_max_rate: 40000 rpg_ai_rate: 10 rpg_hai_rate: 50 rpg_gd: 8 rpg_min_dec_fac: 2 rpg_min_rate: 10 cndd_state_machine: 0 ............................. ............................. priority 7: rpg_enable: 0 rppp_max_rps: 1000 rpg_time_reset: 1464 rpg_byte_reset: 150000 rpg_threshold: 5 rpg_max_rate: 40000 rpg_ai_rate: 10 rpg_hai_rate: 50 rpg_gd: 8 rpg_min_dec_fac: 2 rpg_min_rate: 10 cndd_state_machine: 0

Setting QCN parameters requires updating its value for each priority. '-1' indicates no change in the current value.

Example for setting 'rpg_enable' in order to enable QCN for priorities 3, 5, 6:

Copy
Copied!
            

mlnx_qcn -i eth2 --rpg_enable=-1 -1 -1 1 -1 1 1 -1 

Example for setting 'rpg_hai_rate' for priorities 1, 6, 7:

Copy
Copied!
            

mlnx_qcn -i eth2 --rpg_hai_rate=60 -1 -1 -1 -1 -1 60 60 

© Copyright 2023, NVIDIA. Last updated on Oct 11, 2023.