Skip to main content
This page lists the Scala UET NIC attributes, with their types and defaults, and shows how to set them. A simulation configuration can set every attribute listed except the read-only NumDownLinks. The tables list the attributes that set the Scala UET NIC’s behavior, grouped by the component that holds them: the NIC itself, its network interface and buffers, its transport processing layers (packet delivery, packet spraying, congestion control, segmentation, and the UET Monitor), and its PCIe host interface. The page ends with the configuration rules that stop a simulation. Transport, Multipath, Congestion control, Buffers and PFC, and Records explain the behavior behind them.

How to read the tables

Default is the value an attribute carries in a NIC the platform adds to a configuration, for example with POST /api/v1/configurations/{config_id}/components. Such a NIC carries every attribute in these tables at its Default until you change it. If you supply a NIC’s typedParameters yourself instead, for example in the components of POST /api/v1/configurations, include every attribute of each sub-component you send, such as IngressBufferManager or ScalaUETCongestionControl: an attribute left out of it runs the model’s built-in value, which can differ from the Default shown here. Attributes at the NIC’s top level, and sub-components you leave out entirely, take their Defaults. Type is the value of the attribute’s type field in the API, which a patch must repeat. Values of type bytes, queuesize, datarate, and timeval carry a unit: sizes are in B, KB, KiB, MB, or MiB, where KB is 1,000 bytes, KiB 1,024 bytes, and MB 1,000,000 bytes; data rates are in Gbps or Mbps; times are in ps, ns, us (µs), ms, or s. A uint is a whole number of 0 or more, a double a decimal number, and a bool true or false. Where a description starts with a range, such as 0 to 15, a value outside it is refused (Configuration rules that stop a simulation). Attributes of type string that hold a list, such as PoolAllocationVector, hold eight comma-separated entries, where the index is the traffic class, 0 to 7; PoolAllocationVector also has a rule for where its non-zero entries go (Buffer pools). The platform shows them in square brackets, for example [0.9, 0.1, 0, 0, 0, 0, 0, 0]. Send them the same way when you change one: as a string, with the brackets and all eight entries (Change values in a configuration).

NIC

These attributes sit at the top level of the NIC component’s typedParameters.

Network interface

The NetworkInterface component holds four sub-components: UplinkNetworkInterface, the NIC’s Ethernet port to its rack switch; TransmissionMedium, the link; and IngressBufferManager and EgressBufferManager, the receive and transmit buffers.

UplinkNetworkInterface

TransmissionMedium

IngressBufferManager

The receive buffer. Receive buffer and PFC explain how it is used.

EgressBufferManager

The transmit buffer. Egress buffer and Transmit scheduling explain how it is used.

Transport processing layers

The TransportProcessingLayers component holds the NIC’s transport. The sections below cover its sub-components with attributes, in the order of the NIC’s typedParameters.

ScalaUETPdsManager

These attributes sit under TransportProcessingLayers → ScalaUETPdsManager, the NIC’s packet delivery settings: packet marking, PDC groups, the prefetch buffer, the delivery mode, the spraying type, the retransmission timer, and ACK requests. Transport explains each.

DefaultPacketSpraying

These attributes sit under TransportProcessingLayers → PacketSpraying → DefaultPacketSpraying, and apply only when PacketSprayingType is Default Packet Spraying (Default packet spraying).

RecycledEntropyPacketSpraying

These attributes sit under TransportProcessingLayers → PacketSpraying → RecycledEntropyPacketSpraying, and apply only when PacketSprayingType is Recycled Entropy Packet Spraying (Recycled entropy packet spraying).

ScalaUETCongestionControl

These attributes sit under TransportProcessingLayers → ScalaUETCongestionControl and apply to every congestion window on the NIC, one for each PDC group. How each attribute shapes the window puts them together.

SemanticLayer

This attribute sits under TransportProcessingLayers → SemanticLayer, the layer that cuts messages into packets (Segmentation).

ScalaUETMonitor

These attributes sit under TransportProcessingLayers → ScalaUETMonitor and control the per-packet uet-monitor record (uet-monitor). The monitor’s settings take effect once per simulator process, from one UET NIC: give every UET NIC in a configuration the same monitor settings. Each filter matches exactly, and every filter that is not All must match: the filters combine. Once a packet of a connection matches, or a trigger selects it, the monitor logs the rest of that connection’s packets for the run, at both of its ends when both NICs run in the same simulator process.

Host interface

The HostInterface component holds the PCIe link between the NIC and its host, as two sub-components: NICSide, the NIC’s end of the link, and HostSide, the host’s end. PCIe host interface explains how a transfer uses them, and Worked example: PCIe and network rates compares the link’s rates at the defaults with the network port’s. Each end holds a container named PCIeGen3.0. The name does not set the PCIe generation: each end’s LaneBps does, and the default 31.52 Gbps per lane is the PCIe 5.0 rate.

NIC side

On the NIC’s end of the link, each attribute’s path in the NIC’s typedParameters is:
  • RXHeaderBufferSize, TXHeaderBufferSize, RXDataBufferSize, TXDataBufferSize: HostInterface → NICSide → PCIeGen3.0 → NicDeviceLayer → NicPCIeInterface → TransactionLayer
  • LaneBps, LaneCount: HostInterface → NICSide → PCIeGen3.0 → NicDeviceLayer → NicPCIeInterface → PhysicalLayer

Host side

On the host’s end of the link:
  • RXHeaderBufferSize, TXHeaderBufferSize, RXDataBufferSize, TXDataBufferSize: HostInterface → HostSide → PCIeGen3.0 → ScalaHostPCIeDeviceLayer → HostPCIeInterface → TransactionLayer
  • LaneBps, LaneCount: HostInterface → HostSide → PCIeGen3.0 → ScalaHostPCIeDeviceLayer → HostPCIeInterface → PhysicalLayer

Setting attributes through the platform

Attributes are set per configuration, through the platform API. The reference pages for the two APIs involved are Components and Configurations. Get an API token first (Authentication) and export it as SCALA_API_TOKEN.

Read the NIC’s parameters

GET /api/v1/components lists the component types the platform offers; the Scala UET NIC entry, ScalaUETNIC, gives its id and its versions. GET /api/v1/components/{component_id}, with the version query parameter set to the model version these pages describe, returns the NIC’s typedParameters. Each attribute in the tables above appears there as an object with its value, its type, a unit for dimensional types, and, where the model sets them, its default, description, min, max, and allowed values in enum; NumDownLinks also carries readonly. A sub-component, such as NetworkInterface or TransportProcessingLayers, is a nested object named after it. For example:

Add the NIC to a server

A Scala UET NIC belongs to a server component: every instance of that server carries one NIC with the same typedParameters. Placing it takes two calls:
  1. POST /api/v1/configurations/{config_id}/components, with the query parameters modelId=ScalaUETNIC, type=nic, a name for the NIC component, and version, adds the NIC to the configuration with every attribute at its Default.
  2. PATCH /api/v1/configurations/{config_id}/configurations/{component_name}, where component_name is the server component, adds the NIC to that server. The body names the NIC component, with type nic and count 1.
Set CONFIG_ID to the configuration’s ID and SERVER_NAME to the name of the server component, which must already be in the configuration; GET /api/v1/configurations/{config_id}/components lists the configuration’s components and their names. modelId takes the model name, ScalaUETNIC, or its id from GET /api/v1/components.
Servers that need different NIC settings need different NIC components, each added to its own server component. The applications that run over the NIC are the Chakra workload and the Scala RDMA application.

Change values in a configuration

PATCH /api/v1/configurations/{config_id}/components/{component_name}/parameters merges a patch into the typedParameters of the component named component_name in the configuration; GET /api/v1/configurations/{config_id}/components lists the configuration’s components and their names. Set CONFIG_ID to the configuration’s ID and NIC_NAME to the name of the NIC component you are changing. A patch changes only the component it names, and so every server that carries that NIC component. The patch repeats the nesting of the component’s typedParameters, down to each attribute you change, as nested objects, one per name in the attribute’s path:
  • Only keys the component already has can be updated. An unknown key returns 400.
  • Each attribute’s type must match the stored type, or the request returns 400. The request also returns 400 for an empty patch, or when a nested object is sent where an attribute is expected, or the reverse.
  • The value and the unit you send replace the stored ones, so send the unit with every dimensional value.
  • A list attribute’s value is a string with its square brackets and exactly eight entries, each made of letters, digits, ., _, +, or -, for example "value": "[0.9, 0.1, 0, 0, 0, 0, 0, 0]". A list in any other form returns 400.
  • Where an attribute has enum values, its value must be one of them, or the request returns 400. Send a value that contains spaces as it is, for example "value": "Recycled Entropy Packet Spraying".
  • Any other string value, such as a monitor filter, cannot contain shell metacharacters, among them [ ] { } ( ) ' " ; $ * ? # ~ ! & < >, or the request returns 400. Spaces and ., :, -, and _ are allowed, so an IPv4 address or a PDC id such as 32.0.0.2:4500 can be sent as it is.
  • A 200 response returns the component’s full, updated typedParameters.
This example turns on recycled entropy packet spraying and lengthens its freezing time to 200 µs:
A NIC the platform added carries every attribute at its Default, so a patch only needs the attributes you change. For a NIC whose typedParameters you supplied yourself, see How to read the tables. Global simulation parameters, such as NDStatsReportInterval, EnableNetworkBufferStatsReporting, and EnablePCIeStatsLogging, are not attributes of this model; change them with PATCH /api/v1/configurations/{config_id}/parameters.

Configuration rules that stop a simulation

A configuration write returns 400 when a value breaks the rules in Change values in a configuration, when a dimensional value has a unit its type does not accept, when a uint is negative or fractional, when a number is outside the range its row gives, or when a bool is neither true nor false. PrefetchBufferSize below 4202 is refused this way even with the prefetch buffer off. A monitor filter that contains a character the platform refuses in string values also returns 400. POST /api/v1/configurations/{config_id}/validate returns the configuration’s validation errors and warnings. A configuration with a Scala UET NIC is invalid when:
  • A server with a Scala UET NIC runs an application other than the Chakra workload or the Scala RDMA application.
  • A switch has UETPolicyEnabled set to true and the configuration places a NIC other than the Scala UET NIC or the Scala MRC NIC anywhere in the topology. Switch packet trimming also needs the UET policy, and PFC off for every class on that switch (Configuration rules that stop a simulation).
  • LaneCount is outside 1 to 16.
The validation also warns, without making the configuration invalid, when a NIC’s PacketSprayingType is Recycled Entropy Packet Spraying and a switch’s LoadBalancingMethod is flowlet. The NIC stops the run before the simulation starts when:
  • An ingress or egress PoolAllocationVector has fewer than two non-zero entries. Classes 0 and 1 each need a pool (Traffic classes).
  • PrefetchBufferEnable is true and PrefetchBufferSize is smaller than one data packet on the wire, RdmaDataMSS + 106 bytes.
  • QueueSchedulingType is ProbabilisticWeightedRoundRobin in the IngressBufferManager or the EgressBufferManager.
The NIC checks its congestion control settings when it opens its first connection, as a sender or a receiver, and stops the run when:
  • The target queue delay resolves to 0: InitialBaseRTT is 0 while OverrideSpecTargetQueueDelay is false, or TargetQueueDelay is 0 while it is true.
  • OverrideUetSpecMaxCWind is false and 1.5 × the link rate × InitialBaseRTT ÷ 8 is smaller than one nominal packet, RdmaDataMSS + 88 bytes: InitialBaseRTT below about 56 ns at 400 Gbps.
  • 1.5 × the link rate × InitialBaseRTT ÷ 8 is larger than 4,294,967,295 bytes: InitialBaseRTT above about 57.3 ms at 400 Gbps, whatever the override.
  • ReferenceNetworkRTT is 0, or ReferenceNetworkLinkSpeed is below 1 Gbps.
  • ReferenceNetworkLinkSpeed × ReferenceNetworkRTT ÷ 8 is larger than 4,294,967,295 bytes: ReferenceNetworkRTT above about 85.9 ms at 400 Gbps.
  • The NIC’s link rate, the lower of its DataRate and the rack switch’s downlink DataRate, is below 1 Gbps.