MRC packet structure — SRv6 path + 32-bit entropy value (EV)

IPv6-in-IPv6 encapsulation. The 32-bit EV is striped across the outer IPv6 flow label and UDP source port. ECMP is disabled — the SRv6 uN uSID stack statically encodes the path; the EV is carried only to be echoed back in SACK/NACK feedback.

Outer IPv6 header — SRv6 transport Src address sender NIC Destination address SRv6 uN uSID stack Flow label EV bits (20b) UDP header Source port EV bits (16b) Destination port RoCEv2 (4791) Length / checksum standard UDP Inner IPv6 header — decap target Source address sender NIC addr Destination address receiving NIC addr RDMA transport header (BTH-like) Opcode / PSN RDMA write, seq # Virtual address GPU memory destination Remote key memory access key Payload Payload application data, variable size ICRC checksum 32-bit EV: IPv6 flow label + UDP source port SRv6 uN uSID = source-routed path Inner destination = NIC decapsulation target RDMA fields = out-of-order placement
EV generation. At QP startup, the NIC generates a set of 128–256 entropy values, equally split across the 8 MRC planes. A different EV is selected for every packet, spraying all traffic from a single QP across many paths automatically — no application changes needed.
SRv6 forwarding. Each switch compares the first 48 bits of the destination address to its configured locator + uSID. On match, it left-shifts the uSID portion by 16 bits — moving the next-hop uSID into position — then does a static forwarding table lookup. Tables are set once at install and never change; dynamic routing (BGP) and ECMP are both disabled.
Why the EV still rides along. Since the path is statically encoded in the uSID stack, the EV plays no role in forwarding. It exists purely so the receiving NIC can echo it back in SACK/NACK packets — telling the sender's MRC engine which EV (and therefore which path) is healthy, congested, or has failed.
Loss vs. trim. A genuinely dropped packet signals path failure — its EV is retired immediately and not reused. A trimmed packet (payload stripped, header forwarded) signals congestion only — it triggers a SACK-based selective retransmit of just the missing data, not a full resend.