NumDownLinks. The tables list the attributes that set the Scala MRC NIC’s behavior, grouped by the component that holds them: the NIC itself, its network interface and buffers, its PCIe host interface, the queue pair manager, packet spraying, congestion control, and the MRC Monitor. The page ends with the configuration rules that stop a simulation. Transport, Multipath, Congestion control, Buffers and PCIe, 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 ScalaMrcNscc: 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. A string takes one of the values its row lists or, for the monitor’s filters and triggers, a comma-separated list. Where a description starts with a range, such as 0 to 7 or 1ns to 8s, a value outside it is refused when written or stops the run (Configuration rules that stop a simulation).
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. Buffer pools and Receive buffer 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. 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→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
ScalaMrcQpManager
These attributes sit underScalaMrcQpManager, at the top level of the NIC’s typedParameters. They are the NIC’s queue pair settings: packet marking, segmentation, the PSN window, QP groups, the spraying type, loss detection, the retransmission timer and retry budget, and RTT measurement. Transport explains each.
PacketSpraying
ThePacketSpraying component, at the top level of the NIC’s typedParameters, holds one sub-component, DefaultPacketSpraying.
DefaultPacketSpraying
These attributes sit underPacketSpraying → DefaultPacketSpraying, and apply only when PacketSprayingType is Default Packet Spraying (Default packet spraying).
ScalaMrcNscc
These attributes sit underScalaMrcNscc, at the top level of the NIC’s typedParameters, and apply to every congestion window on the NIC: one for each destination with QPGroupsEnabled true, one for each queue pair otherwise. How each attribute shapes the window puts them together.
ScalaMrcMonitor
These attributes sit underScalaMrcMonitor, at the top level of the NIC’s typedParameters, and configure the per-packet mrc-monitor record, which EnableMonitor on the NIC turns on (mrc-monitor). The monitor’s settings take effect once per simulator process: give every Scala MRC NIC in a configuration the same EnableMonitor and monitor settings.
The filters select queue pairs. Each is All, which matches every queue pair, or a comma-separated list, which a queue pair matches when it matches any entry; a queue pair is logged when it matches every filter that is not All. The Log toggles then choose which of its packets are logged: a packet needs the toggle for its type and the toggle for its direction, and a received NACK also the toggle for its code.
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 MRC NIC entry, ScalaMrcNic, 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 ScalaMrcNscc, is a nested object named after it. Sub-components with no attribute to set, such as the four layers under TransportProcessingLayers and ScalaMrcPCIePayloadFetchManager, appear as empty objects.
For example:
Add the NIC to a server
A Scala MRC 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=ScalaMrcNic,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, ScalaMrcNic, 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. - 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": "Default 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 a list of queue pair ends, each an IPv4 address, a colon, and a QP id, or a trigger set such astrim,nack, can 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 and EnableNetDeviceStatLogging, are not attributes of this model; change them with PATCH /api/v1/configurations/{config_id}/parameters.
Configuration rules that stop a simulation
A Scala MRC NIC exchanges traffic only with other Scala MRC NICs: every NIC that sends to or receives from a Scala MRC NIC must be a Scala MRC NIC (What is and is not modeled). 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 bool is neither true nor false, or when one of these attributes is outside the range its row gives: MSS, MaxPSNRange, LinearRetryCount, ExponentialRetryCount, EntropyMaskBits, StartingPortOffset, and either LaneCount.
POST /api/v1/configurations/{config_id}/validate returns the configuration’s validation errors and warnings. A configuration with a Scala MRC NIC is invalid when one of the attributes in the previous paragraph is outside its range, for example LaneCount outside 1 to 16.
The switch rules that involve this NIC are on the Scala Switch’s page (Configuration rules that stop a simulation). A switch with UETPolicyEnabled set to true accepts the Scala MRC NIC, which sends the codepoints the UET policy reads, and switch packet trimming needs the UET policy and PFC off on that switch.
The validation also warns, without making the configuration invalid, when a Scala MRC NIC has PacketSprayingType set to Default Packet Spraying, its Default, and a switch has LoadBalancingMethod set to flowlet; the simulation still runs. Packet spraying and flowlet switching both choose the paths packets take: the NIC through each packet’s entropy value (Multipath), and the switch by moving flows between equal-cost members (Dynamic load balancing (flowlet)).
The validation also warns, without making the configuration invalid, when a Scala MRC NIC with TrimmingEnabled true, its Default, shares the topology with a switch that does not trim: a Scala Switch whose PacketTrimmer TrimmingEnabled is not true, or a switch of another model. With TrimmingEnabled true, Quick Adapt fires only after a trim NACK, which only a trimming switch produces (Quick Adapt). The simulation still runs. To clear the warning, set the NIC’s TrimmingEnabled to false, or turn trimming on, with the UET policy, at every switch (Packet trimmer).
The NIC stops the run before the simulation starts when one of these attributes is outside the range its row gives: TransportStatsReportInterval, InitialAckTimeout, ReliabilityProbePeriod, ConfigBaseRTT, AlphaMultiplier, FairIncreaseMultiplier, FastIncreaseMultiplier, EtaMultiplier, DelayAlpha, QuickAdaptGate, or MaxCongestionWindow.
The NIC stops the run when it sets up its first queue pair, as a sender or a receiver, when:
PacketSprayingTypeisDefault Packet SprayingandStartingPortOffset+ 2^EntropyMaskBits− 1 is larger than 65,535. The largestStartingPortOffsetis 65,408 at the default 7 bits, and 65,280 at 8.OverrideSpecTargetQueueDelayistrueandTargetQueueDelayis below1ns,0included.ReferenceNetworkRTTis below1ns,0included.TrimmingEnabledistrue,OverrideSpecTargetQueueDelayisfalse, andConfigBaseRTTis below2ns.