Local retransmission enables frames received on one or more network ports to be retransmitted to one network port on the same SmartNIC without involving the host CPU. The frames are transmitted locally on the SmartNIC without being transferred to the host memory.
Local retransmission can be used to daisy-chain SmartNICs (to avoid multiple taps) or to load-balance network processing between multiple host servers (spillover).
The latency from RX port to TX port is typically 5 µs.
Frames are retransmitted without any changes, except the FCS is recalculated.
It is possible to retransmit frames received at one line rate on a port running another line rate.
Local retransmission can be applied together with host-based transmission (see Host-Based Transmission) on all SmartNICs supporting both features. In case of oversubscription of a TX port, frames that are locally retransmitted are prioritized over frames from the host.
- Local retransmission from a 10 Gbit/s source port to a 1 Gbit/s destination port.
- Local retransmission from several source ports to the one destination port.
- Simultaneous host transmission and local retransmission on the same port.
Frames are retransmitted as soon as possible, there is no traffic control.
Due to the 5 µs latency from RX port to TX port, statistics read from downlink appliances is not synchronized with statistics read from the retransmitting appliance.
Local retransmission is configured using NTPL.
The legacy NTPL command Retransmit is supported with unchanged syntax for one source port and one destination port.
The NTPL command Assign can retransmit traffic from more than one port, and can embed a time stamp in retransmitted traffic.
In this NTPL example, SMTP traffic is retransmitted on one port, HTTP traffic is retransmitted on another, and the rest of the traffic is retransmitted on a third port, while everything is captured.
DefineMacro("mTcpSrcPort", "Data[DynOffset=DynOffTcpFrame;Offset=0;DataType=ByteStr2;DataMask=[15:0]]") DefineMacro("mTcpPort_HTTP", "80") DefineMacro("mTcpPort_SMTP", "25") Assign[StreamId=0] = Port==0 # Capture all Assign[Priority=0; DestinationPort=1] = (mTcpSrcPort == mTcpPort_SMTP AND Port==0 AND Truncated==False) Assign[Priority=0; DestinationPort=2] = (mTcpSrcPort == mTcpPort_HTTP AND Port==0 AND Truncated==False) Assign[Priority=10;DestinationPort=3] = Port==0 # The remaining traffic
This figure illustrates the example.