NumDownLinks.
The tables list the attributes the components API offers for the Scala RoCE NIC, grouped by the component that holds them: the NIC itself, its network interface and buffers, its PCIe host interface, its transport layer, its queue pair manager, and its ECN handler. The page ends with the configuration rules that stop a simulation. Transport, Buffers and PFC, and Congestion control 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 ECNHandler: 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. 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.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. Fetching the payload over PCIe explains how a transfer uses them, with a worked example of the rates.
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→PhysicalLayerReadRequestSize:HostInterface→NICSide→NICPCIeHandler
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
Transport processing layers
TheTransportProcessingLayers component holds the NIC’s processing layers. Only the transport layer has attributes.
RoceTransportLayer
Acknowledgements and Retransmission timer explain how these combine.ScalaRoceQpManager
TheScalaRoceQpManager component manages the NIC’s queue pairs.
ECNHandler
TheECNHandler component holds the rate control loop’s settings, which apply to every queue pair on the NIC. The rate control loop explains each stage.
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 RoCE NIC entry, ScalaRoceNic, 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 ECNHandler, is a nested object named after it.
For example:
Add the NIC to a server
A Scala RoCE 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=ScalaRoceNic,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, ScalaRoceNic, 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.7, 0.7, 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. - 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 and the link MTU, Mtu in the GenericNetDevice section of DefaultNetworkParameters (4,184 bytes on the platform), 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 LaneCount is outside 1 to 16, or when a bool is neither true nor false.
The NIC checks these rules before the simulation starts, and stops the run when one is broken:
- An ingress or egress
PoolAllocationVectorhas an entry that is not a number, has a negative entry, or has no non-zero entry. - An entry of
WRRQueueWeightsorQuantaValueis not a whole number, or an entry ofPFCEnableVector,PfcStaticXoffThreshold, orPfcXonResumeThresholdis not a number. MSSis outside 1 to 9,216 bytes, orMSS+ 58 bytes is not smaller than the configuration’sMtu. With the platform’s 4,184-byteMtu, the largestMSSis 4,125 bytes.LaneCountis outside1to16.- A dimensional value has no number, is negative, or has a unit its type does not accept, or a
timevalis finer than 1 ps. - A server with a Scala RoCE NIC runs an application other than the Chakra workload or the Scala RDMA application.
- A switch in the topology has
UETPolicyEnabledset totrue. That policy assigns traffic classes from codepoints the Scala RoCE NIC does not send (Buffer under the UET policy).