Congestion signaling
Congestion signaling (CSIG) is a lightweight, in-band telemetry mechanism for Ultra Ethernet (UE) fabrics that enables network devices to communicate congestion information directly within forwarded packets. CSIG provides visibility into bottleneck conditions encountered along a packet's path by collecting and aggregating per-hop congestion metrics.
Unlike traditional congestion indicators such as packet loss, round-trip time (RTT), or explicit congestion notification (ECN) marking, which provide only end-to-end information, CSIG reports congestion conditions observed at individual network elements. This enables faster congestion detection, improved congestion-control algorithms, and more accurate path selection in AI/ML and high-performance computing (HPC) environments.
CSIG processing is supported only for IP-forwarded traffic.
CSIG domain and discovery
CSIG domain
A CSIG domain is the path from the source network interface card (SNIC) or source forwarding endpoint (FEP) to the destination NIC (DNIC) or destination FEP. Every device on the path that processes the CSIG tag is part of the CSIG domain.
The following are the roles of each of the devices in a CSIG domain.
- The SNIC or source FEP inserts the CSIG tag into packets for which congestion information is required. It sets the signal type, initial signal value, and D = 0.
- Each switch on the path checks for the CSIG tag, compares the local measurement for the signal with the value in the tag, and updates the signal value and locator metadata when the local condition is more severe. A transit switch does not insert a CSIG tag.
- The DNIC or destination FEP removes the CSIG tag and can reflect the collected congestion information to the SNIC.
On SR Linux, enable
congestion signaling using the oam congestion-signaling admin-state
enable command. Configure the node-locator so that,
when this switch updates the CSIG tag, the locator identifies the local node. When
CSIG is enabled, the switch processes received packets that already carry a CSIG
tag.
Use the same tag format, compact or wide, on every NIC, FEP, and switch in the CSIG domain. Enable CSIG only when every switch on the forwarding path can process that selected format.
Discovery
Neighbors advertise CSIG support in LLDP, in the Ultra Ethernet Link Negotiation Options TLV. A 2-bit telemetry (TEL) field carries the capability. Each device compares its own capability with the peer’s. The formats both sides support are the ones that can be used on that link. For TEL values and strip-and-forward behavior, see LLDP for CSIG.
CSIG tag formats
SR Linux supports processing and updating CSIG tags on transit nodes and provides operational visibility, configuration controls, and statistics for CSIG-enabled networks.
A CSIG tag is a fixed-length Layer 2 tag that congestion signaling carries on an application packet. It collects one summary of the bottleneck as the packet crosses the fabric.
The source forwarding endpoint or NIC inserts the tag. Each transit switch that receives a valid tag compares its local measurement with the value in the tag and updates the tag when the local condition is more severe. The destination removes the tag and returns the collected information to the sender.
The tag is the last tag in the Layer 2 header, immediately before the Ethertype. A Tag Protocol Identifier in bits 0–15 identifies the format.
SR Linux supports two formats, selected with tag-length.
| Format | Length | What it carries |
|---|---|---|
| Compact | 4 bytes | Up to 8 signal types, a 5-bit bucket (32 values), a 6-bit locator for the bottleneck device or port, and a trimmed-packet (D) flag |
| Wide | 8 bytes | Up to 16 signal types, a 20-bit signal value, a 15-bit locator, and the D flag |
The signal-type field (T) in the tag selects which measurement the tag carries. Supported signal types, aggregation rules, and units are listed in CSIG signal types. Configure the same tag format (compact or wide) on every device in the CSIG domain.
CSIG signal types
A CSIG tag carries one signal type and one quantized signal value. Each transit switch measures the local value, maps it to an integer bucket, and compares that bucket with the value in the tag. If the local value is more severe, the switch updates the tag according to the aggregation rule for that signal type and writes its local locator to the tag.
Minimum signals retain the lowest value observed along the path. Maximum signals retain the highest value observed on the path. All signals use integer units. Available-bandwidth calculations exclude MAC frames from the load count.
SR Linux supports the three base signals as described in the following table.
|
Signal |
Type |
Aggregation |
Local measurement |
Unit |
Use |
|---|---|---|---|---|---|
|
Minimum available bandwidth, min(ABW) |
0 |
Minimum |
Port capacity minus the sliding-window transmit rate over the measurement interval |
Bytes per second |
Multipath load balancing. Prefer paths with more spare capacity. |
|
Minimum normalized available bandwidth, min(ABW/C) |
1 |
Minimum |
min(ABW) divided by port capacity, from 0 to 100 |
Percent |
Rate increases in NSCC and RCCC. Claims spare capacity on mixed-speed paths. |
|
Maximum per-hop delay, max(Delay) |
2 |
Maximum |
Timestamp difference between ingress pipeline start and egress end at start of packet |
ns |
Delay-based congestion control. The value represents the queueing delay at the bottleneck hop. |
Measurement interval
For rate-based signals such as available bandwidth, the measurement interval is the window over which the switch counts transmitted traffic before it quantizes available bandwidth. Keep the interval at or below the unloaded round-trip time, so that the sample reflects the timescale of the congestion-control loop.
On SR Linux, configure the compact measurement interval using the oam congestion-signaling interval command. The valid values are 1, 100, 1000, 10000, and 100000. The default value is 100 microseconds.
CSIG lifecycle
In SR Linux, a CSIG packet collects a single bottleneck congestion summary as it travels from the source forwarding endpoint (FEP) to the destination FEP.
-
Initialization
The source FEP inserts a compact or wide CSIG tag, sets the signal type and initial signal value, and sets the trimmed-packet flag D to 0. The source selects a signal type as described in CSIG signal types.
-
Transit
When an SR Linux transit device receives a valid CSIG tag, it measures local congestion on the egress port, quantizes the measurement, and compares it with the value in the tag. If the local condition is more severe, it updates the signal value and locator metadata using the aggregation rule for that signal type (see CSIG signal types).
-
Termination
At the destination, SR Linux FEP reads the CSIG tag, removes it from the packet, and provides the congestion information to the transport. The destination can use that information locally for congestion control, or reflect it to the sender.
-
Reflection
Reflection is an endpoint behavior, used when congestion control is performed at the sender. The destination places the CSIG tag data in a 64-bit header on a
UET ACK_CCXorUET NACK_CCX. A type indicator in that header identifies the original CSIG tag format:0for compact,1for wide. -
Egress toward next hop
Before forwarding the packet, SR Linux uses LLDP to determine whether the next-hop peer supports the tag format on the packet. If the peer cannot process the tag, the device strips it and forwards the packet; otherwise it preserves and updates the tag. See LLDP for CSIG.
LLDP for CSIG
CSIG capability discovery uses the ue-link-neg-options LLDP TLV. Devices
advertise CSIG support in a 2-bit telemetry (TEL) field, also called the
csig-capability field.
The following table lists the TEL values and their corresponding capabilities.
|
TEL value |
Capability |
|---|---|
|
00 |
No CSIG support |
|
01 |
Compact CSIG only |
|
10 |
Wide CSIG only |
|
11 |
Compact and wide CSIG |
When LLDP is enabled, each device compares its local capability with the capability advertised by its peer. The intersection of the two capabilities determines the tag format that can be used on the link.
If the peer does not support CSIG, or does not support the tag format in use, the device strips the CSIG tag before forwarding the packet on that interface. This behavior is also referred to as strip-and-forward.
If the peer supports the same tag format, the device preserves the tag and updates it as usual.
For information about LLDP configuration, see the SR Linux Interfaces Guide.
Configuring congestion signaling
To configure congestion signaling, enable CSIG using the oam congestion-signaling admin-state enable command and specify the parameters as shown in the following example.
Configuring congestion signaling
--{ + candidate shared default }--[ ]--
# info with-context oam congestion-signaling
oam {
congestion-signaling {
admin-state enable
tag-length compact
node-locator 9
interval 100
tpid 1536
compact {
quantization-parameters {
available-bandwidth {
algorithm default-bucket
bucket 1 {
maximum-value 23
}
}
}
}
}
}
Configuring congestion signaling interface locators
Interface locator metadata tells the receiver which port on this switch was the
bottleneck. It is configured on the egress interface, separately from the global
node-locator.
When a transit switch updates a CSIG tag, it writes a locator into the tag's locator
metadata (LM) field. The global node-locator identifies the switch.
The interface locator identifies the egress port. If this port's
local measurement is more severe than the value already in the tag, the switch
writes that interface locator into the LM field. The destination can then map the
value back to the bottleneck port.
On a compact tag the LM field is 6 bits, so use 0 to 63. On a wide tag it is 15 bits, so use 0 to 32767. Give each bottleneck port its own locator.
action update allows this interface to compare the local measurement
with the tag and update the tag. update is the only action value in
the sample configuration.
Configuring interface locators
--{ + candidate shared default }--[ ]--
# info with-context interface ethernet-1/1
interface ethernet-1/1 {
admin-state enable
congestion-signaling {
locator 9
action update
}
}
Verifying a neighbor’s congestion signaling capability
Use the info from state system lldp interface neighbor * command to verify the congestion signaling tag formats supported by the directly connected peer. The peer advertises its capability in the Ultra Ethernet Link Negotiation Options TLV. Verify that the advertised capability supports the configured compact or wide CSIG tag format. If the peer does not support the configured format, the switch strips the CSIG tag before forwarding the packet. For TEL values, see LLDP for CSIG.
Verifying a neighbor’s congestion signaling capability
--{ + candidate shared default }--[ ]--
# info from state system lldp interface ethernet-1/1 neighbor *
neighbor 1A:2C:01:FF:00:00 {
first-message "2026-10-02T15:30:33.001Z (33 minutes ago)"
last-update "2026-10-02T16:04:03.011Z (10 seconds ago)"
system-name srl2
system-description "SRLinux-v26.10.1-4-g6e55664c578 srl2 6.6.87.2-microsoft-standard-WSL2 #1 SMP PREEMPT_DYNAMIC Thu Jun 5 18:30:46 UTC 2025"
chassis-id 1A:2C:01:FF:00:00
chassis-id-type MAC_ADDRESS
port-id ethernet-1/1
port-id-type INTERFACE_NAME
port-description ""
custom-tlv 127 oui 00:12:0f oui-subtype 4 {
value AAA=
maximum-frame-size 0
}
custom-tlv 127 oui 00:80:c2 oui-subtype 10 {
value AAEjRWcAAAAAAAAAAAAAAAAAAAAA
}
custom-tlv 127 oui 00:80:c2 oui-subtype 11 {
value CAA=
}
custom-tlv 127 oui 00:80:c2 oui-subtype 7 {
value AQAAAAA=
aggregation {
capable true
status NOT_AGGREGATED
port-type NO_PORT_TYPE
aggregated-port-id 0
}
}
custom-tlv 127 oui 00:80:c2 oui-subtype 9 {
value AAEjRWcAAAAAAAAAAAAAAAAAAAAA
}
custom-tlv 127 oui fa:7a:cb oui-subtype 32 {
value CAAAAA==
ue-link-neg-options {
version 1
link-options {
csig-capability CSIG_COMPACT_ONLY
}
}
}
capability ROUTER {
enabled true
}
}
Displaying congestion signaling state
Use the info with-context from state oam congestion-signaling command to display the congestion signaling state.
Displaying congestion signaling state
--{ + candidate shared default }--[ ]--
A:root@srl1# info with-context from state oam congestion-signaling
oam {
congestion-signaling {
admin-state enable
tag-length compact
node-locator 9
interval 100
tpid 0x600
compact {
quantization-parameters {
available-bandwidth {
algorithm default-bucket
bucket 0 {
maximum-value 195312500
}
bucket 1 {
maximum-value 781250000
}
bucket 2 {
maximum-value 1757812500
}
bucket 3 {
maximum-value 3125000000
}
bucket 4 {
maximum-value 4882812500
}
bucket 5 {
maximum-value 7031250000
}
bucket 6 {
maximum-value 9570312500
}
bucket 7 {
maximum-value 12500000000
}
bucket 8 {
maximum-value 15820312500
}
bucket 9 {
maximum-value 19531250000
}
bucket 10 {
maximum-value 23632812500
}
bucket 11 {
maximum-value 28125000000
}
bucket 12 {
maximum-value 33007812500
}
bucket 13 {
maximum-value 38281250000
}
bucket 14 {
maximum-value 43945312500
}
bucket 15 {
maximum-value 50000000000
}
bucket 16 {
maximum-value 56445312500
}
bucket 17 {
maximum-value 63281250000
}
bucket 18 {
maximum-value 70507812500
}
bucket 19 {
maximum-value 78125000000
}
bucket 20 {
maximum-value 86132812500
}
bucket 21 {
maximum-value 94531250000
}
bucket 22 {
maximum-value 103320312500
}
bucket 23 {
maximum-value 112500000000
}
bucket 24 {
maximum-value 122070312500
}
bucket 25 {
maximum-value 132031250000
}
bucket 26 {
maximum-value 142382812500
}
bucket 27 {
maximum-value 153125000000
}
bucket 28 {
maximum-value 164257812500
}
bucket 29 {
maximum-value 175781250000
}
bucket 30 {
maximum-value 187695312500
}
bucket 31 {
maximum-value 200000000000
}
}
relative-available-bandwidth {
algorithm default-bucket
bucket 0 {
maximum-value 3
}
bucket 1 {
maximum-value 6
}
bucket 2 {
maximum-value 9
}
bucket 3 {
maximum-value 12
}
bucket 4 {
maximum-value 15
}
bucket 5 {
maximum-value 18
}
bucket 6 {
maximum-value 21
}
bucket 7 {
maximum-value 24
}
bucket 8 {
maximum-value 27
}
bucket 9 {
maximum-value 30
}
bucket 10 {
maximum-value 33
}
bucket 11 {
maximum-value 36
}
bucket 12 {
maximum-value 39
}
bucket 13 {
maximum-value 42
}
bucket 14 {
maximum-value 45
}
bucket 15 {
maximum-value 48
}
bucket 16 {
maximum-value 51
}
bucket 17 {
maximum-value 54
}
bucket 18 {
maximum-value 57
}
bucket 19 {
maximum-value 60
}
bucket 20 {
maximum-value 63
}
bucket 21 {
maximum-value 66
}
bucket 22 {
maximum-value 69
}
bucket 23 {
maximum-value 72
}
bucket 24 {
maximum-value 75
}
bucket 25 {
maximum-value 78
}
bucket 26 {
maximum-value 81
}
bucket 27 {
maximum-value 84
}
bucket 28 {
maximum-value 87
}
bucket 29 {
maximum-value 90
}
bucket 30 {
maximum-value 93
}
bucket 31 {
maximum-value 100
}
}
delay {
algorithm default-bucket
bucket 0 {
maximum-value 100
}
bucket 1 {
maximum-value 200
}
bucket 2 {
maximum-value 300
}
bucket 3 {
maximum-value 400
}
bucket 4 {
maximum-value 500
}
bucket 5 {
maximum-value 600
}
bucket 6 {
maximum-value 700
}
bucket 7 {
maximum-value 800
}
bucket 8 {
maximum-value 900
}
bucket 9 {
maximum-value 1000
}
bucket 10 {
maximum-value 1100
}
bucket 11 {
maximum-value 1200
}
bucket 12 {
maximum-value 1300
}
bucket 13 {
maximum-value 1400
}
bucket 14 {
maximum-value 1500
}
bucket 15 {
maximum-value 1600
}
bucket 16 {
maximum-value 1700
}
bucket 17 {
maximum-value 1800
}
bucket 18 {
maximum-value 1900
}
bucket 19 {
maximum-value 2000
}
bucket 20 {
maximum-value 2100
}
bucket 21 {
maximum-value 2200
}
bucket 22 {
maximum-value 2300
}
bucket 23 {
maximum-value 2400
}
bucket 24 {
maximum-value 2500
}
bucket 25 {
maximum-value 2600
}
bucket 26 {
maximum-value 2700
}
bucket 27 {
maximum-value 2800
}
bucket 28 {
maximum-value 2900
}
bucket 29 {
maximum-value 3000
}
bucket 30 {
maximum-value 3100
}
bucket 31 {
maximum-value 4294967295
}
}
}
}
wide {
quantization-parameters {
available-bandwidth {
algorithm default-bucket
}
relative-available-bandwidth {
algorithm default
}
delay {
algorithm default
step 0
}
}
}
statistics {
available-bandwidth-packet-counter 0
available-bandwidth-byte-counter 0
relative-available-bandwidth-packet-counter 0
relative-available-bandwidth-byte-counter 0
delay-packet-counter 0
delay-byte-counter 0
}
}
}
Displaying congestion signaling statistics
Use the info from state with-context oam congestion-signaling statistics command to display congestion signaling statistics.
Displaying congestion signaling statistics
--{ + candidate shared default }--[ ]--
# info from state with-context oam congestion-signaling statistics
oam {
congestion-signaling {
statistics {
available-bandwidth-packet-counter 0
available-bandwidth-byte-counter 0
relative-available-bandwidth-packet-counter 0
relative-available-bandwidth-byte-counter 0
delay-packet-counter 0
delay-byte-counter 0
}
}
}
Clearing congestion signaling statistics
Use the tools oam congestion-signaling statistics clear command to clear congestion signaling statistics.
Clearing congestion signaling statistics
--{ + candidate shared default }--[ ]--
# tools oam congestion-signaling statistics clear