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 withPOST /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’stypedParameters.
Network interface
TheNetworkInterface 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
TheTransportProcessingLayers 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 underTransportProcessingLayers → 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 underTransportProcessingLayers → PacketSpraying → DefaultPacketSpraying, and apply only when PacketSprayingType is Default Packet Spraying (Default packet spraying).
RecycledEntropyPacketSpraying
These attributes sit underTransportProcessingLayers → PacketSpraying → RecycledEntropyPacketSpraying, and apply only when PacketSprayingType is Recycled Entropy Packet Spraying (Recycled entropy packet spraying).
ScalaUETCongestionControl
These attributes sit underTransportProcessingLayers → 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 underTransportProcessingLayers → SemanticLayer, the layer that cuts messages into packets (Segmentation).
ScalaUETMonitor
These attributes sit underTransportProcessingLayers → 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
TheHostInterface 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’stypedParameters is:
RXHeaderBufferSize,TXHeaderBufferSize,RXDataBufferSize,TXDataBufferSize:HostInterface→NICSide→PCIeGen3.0→NicDeviceLayer→NicPCIeInterface→TransactionLayerLaneBps,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→TransactionLayerLaneBps,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 asSCALA_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 sametypedParameters. Placing it takes two calls:
POST /api/v1/configurations/{config_id}/components, with the query parametersmodelId=ScalaUETNIC,type=nic, anamefor the NIC component, andversion, adds the NIC to the configuration with every attribute at its Default.PATCH /api/v1/configurations/{config_id}/configurations/{component_name}, wherecomponent_nameis the server component, adds the NIC to that server. The body names the NIC component, withtypenicandcount1.
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.
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
typemust 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
valueand theunityou send replace the stored ones, so send theunitwith every dimensional value. - A list attribute’s
valueis 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
enumvalues, itsvaluemust 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 as32.0.0.2:4500can be sent as it is. - A 200 response returns the component’s full, updated
typedParameters.
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 auint 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
UETPolicyEnabledset totrueand 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). LaneCountis outside1to16.
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
PoolAllocationVectorhas fewer than two non-zero entries. Classes 0 and 1 each need a pool (Traffic classes). PrefetchBufferEnableistrueandPrefetchBufferSizeis smaller than one data packet on the wire,RdmaDataMSS+ 106 bytes.QueueSchedulingTypeisProbabilisticWeightedRoundRobinin theIngressBufferManageror theEgressBufferManager.
- The target queue delay resolves to 0:
InitialBaseRTTis0whileOverrideSpecTargetQueueDelayisfalse, orTargetQueueDelayis0while it istrue. OverrideUetSpecMaxCWindisfalseand 1.5 × the link rate ×InitialBaseRTT÷ 8 is smaller than one nominal packet,RdmaDataMSS+ 88 bytes:InitialBaseRTTbelow about 56 ns at 400 Gbps.- 1.5 × the link rate ×
InitialBaseRTT÷ 8 is larger than 4,294,967,295 bytes:InitialBaseRTTabove about 57.3 ms at 400 Gbps, whatever the override. ReferenceNetworkRTTis0, orReferenceNetworkLinkSpeedis below 1 Gbps.ReferenceNetworkLinkSpeed×ReferenceNetworkRTT÷ 8 is larger than 4,294,967,295 bytes:ReferenceNetworkRTTabove about 85.9 ms at 400 Gbps.- The NIC’s link rate, the lower of its
DataRateand the rack switch’s downlinkDataRate, is below 1 Gbps.