Congestion signaling

Note: The feature is supported on 7220 IXR-H6 platforms.

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.

Table 1. CSIG tag formats
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.

Table 2. CSIG signals

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.

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

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

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

  4. 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_CCX or UET NACK_CCX. A type indicator in that header identifies the original CSIG tag format: 0 for compact, 1 for wide.

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

Table 3. TEL values and 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