A step-by-step test for verifying that newly purchased 25G NICs are compatible with an Arista switch.
Topology: Server A (25G NIC) ── Arista switch (25G port) ── Server B (25G NIC)
Key checks: link speed (25G), transceiver detection, FEC mode match, error counters, measured throughput
[00] Overall Architecture
1
2
3
4
5
6
7
8
|
Server A Arista switch Server B
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐
│ 25G NIC │ SFP28 DAC │ Ethernet1 (25G) │ SFP28 DAC │ 25G NIC │
│ ens1f0 ├──────────────┤ ├──────────────┤ ens1f0 │
│ 10.0.0.1/24 │ │ Ethernet2 (25G) │ │ 10.0.0.2/24 │
└──────────────┘ └──────────────────┘ └──────────────┘
│ │ │
ethtool / iperf3 show interfaces ethtool / iperf3
|
Most 25G link compatibility problems come from one of three things: ① transceiver/cable not detected, ② FEC mode mismatch, ③ speed auto-negotiation failure. This guide focuses on those three.
[01] Test Goals and Pass Criteria
| Item |
Pass criteria |
| Link speed |
25 Gbps on both ends, up
|
| Transceiver detection |
Switch/server identify the SFP28 transceiver; vendor/serial shown |
| FEC mode |
Same mode on both switch and server (RS-FEC recommended), uncorrected = 0 |
| Error counters |
No increase in CRC/symbol/FEC-uncorrected errors |
| Throughput |
≥ 23 Gbps with multiple streams (accounting for overhead) |
| Latency |
Tens of µs RTT through the same switch, 0% loss |
| Item |
Details |
| Server A/B |
OS (e.g. Ubuntu 22.04 / RHEL 9), 25G NIC model, slot (PCIe Gen3 x8+) |
| 25G NIC |
e.g. Mellanox ConnectX-4 Lx / ConnectX-5, Intel E810/XXV710, Broadcom |
| Cable |
SFP28 DAC (≤3m) or AOC/optical — confirm it’s 25G (not 10G SFP+) |
| Switch |
Arista EOS with 25G-capable ports (e.g. 7050X3/7060X) |
| Tools |
ethtool, iperf3, ping, (optional) sockperf, lspci
|
1
2
3
4
|
# Install tools on the servers (Ubuntu)
sudo apt-get install -y ethtool iperf3 pciutils
# RHEL/Rocky
sudo dnf install -y ethtool iperf3 pciutils
|
[03] Physical Cabling and Interface Identification
Connect Server A’s NIC to switch Ethernet1 and Server B’s NIC to Ethernet2 with SFP28 cables. First identify the 25G interface name on each server.
1
2
|
# Interface list with state
ip -br link
|
Sample output:
1
2
3
|
lo UNKNOWN 00:00:00:00:00:00
eno1 UP a0:36:9f:xx:xx:xx
ens1f0 UP b8:ce:f6:xx:xx:xx
|
1
2
|
# NIC model and PCIe location
lspci | grep -i ethernet
|
Sample output:
1
|
01:00.0 Ethernet controller: Mellanox Technologies MT27710 Family [ConnectX-4 Lx]
|
ens1f0 is the 25G interface under test. Confirm the same on both servers.
[04] Switch Side — Link/Speed Check
From the Arista console (or SSH), check port status.
1
|
sw-core-01# show interfaces Ethernet1 status
|
Sample output:
1
2
|
Port Name Status Vlan Duplex Speed Type Flags
Et1 connected 1 full 25G 25GBASE-CR
|
| Field |
Meaning |
Status: connected |
Physical link up (notconnect = not connected / negotiation failed) |
Speed: 25G |
Negotiated at 25 Gbps (dropping to 10G = cable/port config issue) |
Type: 25GBASE-CR |
DAC copper. Optical would be 25GBASE-SR, etc. |
To see multiple ports at once:
1
|
sw-core-01# show interfaces status | include 25G
|
Confirm the port is “configured” for 25G (negotiated ≠ configured):
The Speed in show interfaces ... status is the negotiated result. What speed is actually configured on the port has to be checked separately in the running-config. In environments where auto-negotiation is flaky, it’s safer to force the port to 25G.
1
|
sw-core-01# show running-config interfaces Ethernet1
|
Sample output (default — auto-negotiation):
1
2
|
interface Ethernet1
! no speed line means auto (auto-negotiation)
|
Sample output (forced 25G):
1
2
|
interface Ethernet1
speed forced 25gfull
|
To see it alongside the current operating speed:
1
2
|
sw-core-01# show interfaces Ethernet1 status | include 25G
sw-core-01# show interfaces Ethernet1 | include -i -E 'Speed|BW|bandwidth'
|
| Check |
Meaning |
No speed line in running-config |
Auto-negotiation — negotiates to 25G if the transceiver is 25G |
speed forced 25gfull |
Forced to 25G (use when auto-neg fails / platform compatibility issues) |
Speed is 25G in status
|
Actually linked up at 25G |
Force 25G (if needed):
1
2
|
sw-core-01(config)# interface Ethernet1
sw-core-01(config-if-Et1)# speed forced 25gfull
|
On some platforms a port belongs to a 40G/100G breakout group (e.g. 4x10G / 4x25G) and won’t come up as a standalone 25G port. In that case you must first split the port group into 25G breakout mode so that 25G subports like Ethernet1/1 appear.
[05] Switch Side — Transceiver Detection (Compatibility Core)
Check that the switch correctly identifies the new transceiver/cable. Arista may flag unsupported/third-party transceivers.
1
|
sw-core-01# show interfaces Ethernet1 transceiver
|
Sample output:
1
2
|
Port Vendor Part Number Serial Number Type
Et1 Arista Networks CAB-D-D-25G-3M XYZ123456789 25GBASE-CR
|
Detailed diagnostics (optical power for optics):
1
|
sw-core-01# show interfaces Ethernet1 transceiver detail
|
| Check |
Meaning |
| Vendor/Part/Serial shown |
Transceiver EEPROM read correctly |
Type is 25GBASE-* |
25G-specific cable (10G shown = wrong cable) |
| Rx Power in range (optical) |
Optical signal level healthy |
On Arista, third-party transceivers may be blocked by default policy. If needed, check rejection logs with show logging | include transceiver and confirm the model is policy-allowed.
[06] FEC Mode Check and Match (Most Important)
At 25G, if the FEC (Forward Error Correction) mode differs between the two ends, the link may not come up — or come up but accumulate errors. This is the core step of new-card compatibility verification.
-
RS-FEC (CL91, Reed-Solomon): generally required for 25GBASE-CR (DAC > 3m) and SR optics
-
FC-FEC (CL74, Fire-code / BASE-R): usable on short DACs
-
None (disabled): very short passive cables only
Switch-side FEC check:
1
|
sw-core-01# show interfaces Ethernet1 phy detail | include -i fec
|
Or from the interface config:
1
|
sw-core-01# show running-config interfaces Ethernet1
|
Sample output:
1
2
|
interface Ethernet1
error-correction encoding reed-solomon
|
Switch-side FEC config (if needed):
1
2
|
sw-core-01(config)# interface Ethernet1
sw-core-01(config-if-Et1)# error-correction encoding reed-solomon
|
Options: reed-solomon (RS-FEC), fire-code (FC-FEC), disabled. Match the server side exactly.
Server-side FEC check:
1
|
ethtool --show-fec ens1f0
|
Sample output:
1
2
3
|
FEC parameters for ens1f0:
Configured FEC encodings: Auto
Active FEC encoding: RS
|
| Field |
Meaning |
Active FEC encoding: RS |
RS-FEC active now (must match the switch) |
Auto |
Auto-negotiated. If one side is fixed, fix both |
Force server-side FEC (on mismatch):
1
2
3
|
# Fix to RS-FEC
sudo ethtool --set-fec ens1f0 encoding rs
# Options: rs | baser (= FC-FEC) | off | auto
|
Fixing both ends to the same mode is the most stable. Mixing one auto and one rs can cause intermittent link flaps.
[07] Server Side — Link/Speed Check
Sample output (excerpt):
1
2
3
4
5
6
|
Settings for ens1f0:
Supported link modes: 25000baseCR/Full
Speed: 25000Mb/s
Duplex: Full
Auto-negotiation: on
Link detected: yes
|
| Field |
Meaning |
Speed: 25000Mb/s |
25 Gbps link OK |
Link detected: yes |
Physical link up |
Auto-negotiation: on |
Auto-neg in use (policy must match both ends) |
Both servers (A/B) must show 25000Mb/s, Link detected: yes.
[08] Server Side — Driver/Firmware Check
For a new card, driver/firmware versions directly affect compatibility.
Sample output:
1
2
3
4
|
driver: mlx5_core
version: 5.15.0-xx
firmware-version: 14.32.1010 (MT_0000000080)
bus-info: 0000:01:00.0
|
| Field |
Meaning |
driver |
Kernel NIC driver (e.g. mlx5_core, ice, i40e, bnxt_en) |
firmware-version |
NIC firmware — confirm it’s the vendor-recommended latest |
Old firmware can carry 25G/FEC negotiation bugs, so cross-check vendor release notes.
[09] PCIe Bandwidth Check (Bottleneck)
To push 25G (≈3.125 GB/s) you need at least PCIe Gen3 x8.
1
|
sudo lspci -vv -s 01:00.0 | grep -i -E 'LnkCap|LnkSta'
|
Sample output:
1
2
|
LnkCap: ... Speed 8GT/s, Width x8
LnkSta: ... Speed 8GT/s, Width x8
|
| Check |
Meaning |
LnkSta Width x8
|
Slot operating at x8 (dropping to x4 throttles throughput) |
Speed 8GT/s (Gen3)+ |
Can carry 25G line rate |
[10] IP Setup and Basic Connectivity
1
2
3
4
5
6
|
# Server A
sudo ip addr add 10.0.0.1/24 dev ens1f0
sudo ip link set ens1f0 up
# Server B
sudo ip addr add 10.0.0.2/24 dev ens1f0
sudo ip link set ens1f0 up
|
Connectivity check:
1
2
|
# From A to B
ping -c 4 10.0.0.2
|
Sample output:
1
2
3
|
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.045 ms
...
4 packets transmitted, 4 received, 0% packet loss
|
0% packet loss with µs-level RTT means the L2/L3 path is healthy.
[11] MTU / Jumbo Frame Setup and Verification
Before high-throughput tests, set Jumbo Frames (9000) to lower CPU load and raise throughput. Both servers and the switch port/VLAN must use the same MTU.
1
2
|
# Both servers
sudo ip link set ens1f0 mtu 9000
|
1
2
3
|
# Switch (Arista) — port L2 MTU
sw-core-01(config)# interface Ethernet1
sw-core-01(config-if-Et1)# l2 mtu 9214
|
Verify the jumbo path (9000B without fragmentation):
1
|
ping -M do -s 8972 -c 4 10.0.0.2
|
| Result |
Meaning |
| Success (0% loss) |
9000 MTU path OK |
Message too long / 100% loss |
MTU mismatch somewhere → recheck switch/server MTU |
[12] Throughput Test — iperf3
A single TCP stream may not saturate 25G due to single-core limits. Use multiple streams (-P) to approach line rate.
Server B (receiver / server role):
Server A (sender / client):
1
2
|
# 8 parallel streams, 30 seconds
iperf3 -c 10.0.0.2 -P 8 -t 30
|
Sample output (excerpt):
1
2
|
[SUM] 0.00-30.00 sec 82.1 GBytes 23.5 Gbits/sec 0 sender
[SUM] 0.00-30.00 sec 82.0 GBytes 23.5 Gbits/sec receiver
|
| Field |
Meaning |
23.5 Gbits/sec |
Measured throughput — ~94% of 25G, normal given TCP/header overhead |
Retr (retransmits) 0 or small |
Closer to 0 is better. A spike suggests FEC/congestion/buffer issues |
Test the reverse direction (B→A) too:
1
|
iperf3 -c 10.0.0.2 -P 8 -t 30 -R
|
If both directions exceed 23 Gbps, compatibility/performance pass. If only one direction is low, inspect that sender’s NIC/cable.
To see line-rate loss with UDP:
1
|
iperf3 -c 10.0.0.2 -u -b 25G -t 20
|
Lost/Total Datagrams should be near 0%.
[13] End-to-End 25G Verification (PC A → Switch → PC B)
So far each segment (Server A, switch port, Server B) was checked individually. The final step confirms, end-to-end, that when PC A sends at 25G, PC B receives at the same 25G. If this test passes, it proves in one shot that every element on the path (Server A NIC → switch forwarding → Server B NIC) satisfies 25G.
Decision logic:
| Observation |
Conclusion |
| PC A sends ≈ 25G and PC B receives ≈ 25G |
TX NIC · switch forwarding · RX NIC all OK at 25G
|
| PC A sends 25G, PC B receives < 25G |
Switch queue drops or RX-side NIC/PCIe bottleneck
|
| PC A can’t even send at 25G |
TX-side NIC/cable/port negotiation problem |
Key idea: if the line rate injected at one end comes out at the other end intact, it simultaneously proves the switch in the middle and both NICs all handle 25G.
1) Measure the sender — PC A:
1
2
|
# PC A → PC B, 8 streams to approach line rate
iperf3 -c 10.0.0.2 -P 8 -t 30
|
2) Measure the receiver — PC B (at the same time):
In PC B’s iperf3 -s output, check that the receiver line’s Gbits/sec matches PC A’s send value. To watch the live receive rate on the interface separately:
1
2
3
4
|
# On PC B: per-second received bytes → receive line rate
sar -n DEV 1
# or
ifstat -i ens1f0 1
|
Interpreting the output:
1
2
3
4
5
6
|
# PC A (sender) iperf3
[SUM] 0.00-30.00 sec 82.1 GBytes 23.5 Gbits/sec sender
# PC B (receiver) iperf3 server
[SUM] 0.00-30.00 sec 82.0 GBytes 23.5 Gbits/sec receiver
# PC B (sar -n DEV)
ens1f0 ... rxkB/s ≈ 2.9e6 (≈ 23.5 Gbps received)
|
| Check |
Meaning |
| Send ≈ Receive ≈ 23 Gbps+ |
End-to-end 25G verification passed — switch + both NICs all pass |
| Receive far below send |
Switch drops / RX NIC bottleneck → check show interfaces Et2 counters, ethtool -S for drops |
3) Bidirectional (full-duplex) check:
25G is full-duplex, so each direction should sustain 25G simultaneously.
1
2
|
# PC A: simultaneous TX + RX load
iperf3 -c 10.0.0.2 -P 8 -t 30 --bidir
|
Sample output (excerpt):
1
2
|
[SUM][TX] 0.00-30.00 sec 81.9 GBytes 23.4 Gbits/sec sender
[SUM][RX] 0.00-30.00 sec 81.8 GBytes 23.4 Gbits/sec receiver
|
If both directions sustain ~23 Gbps, full-duplex 25G is verified too. This empirically confirms that “traffic PC A sent at 25G is received by PC B at 25G,” so you can conclude that both the switch and both PCs’ NICs satisfy 25G.
[14] Latency Test
1
2
|
# RTT distribution at a fast interval
sudo ping -i 0.2 -c 50 10.0.0.2
|
Sample output:
1
|
rtt min/avg/max/mdev = 0.038/0.046/0.071/0.008 ms
|
| Metric |
Meaning |
avg tens of µs |
Normal through the same switch |
Small mdev (jitter) |
Stable. Large spikes suggest FEC retries/buffer issues |
[15] Error Counter Check (Before/After Comparison)
Snapshot counters before and after the throughput test and look at the delta. Compatibility problems show up here.
Server side:
1
|
ethtool -S ens1f0 | grep -i -E 'err|drop|fec|crc'
|
Sample output:
1
2
3
4
|
rx_crc_errors_phy: 0
rx_corrected_bits_phy: 1024
rx_symbol_err_phy: 0
fec_uncorrectable_blocks: 0
|
| Counter |
Meaning |
rx_crc_errors_phy |
CRC errors — must not increase (cable/FEC issue) |
fec_corrected_* |
Bits FEC corrected — small increase is normal (evidence FEC is working) |
fec_uncorrectable_* |
Correction failures — must be 0. Increase = link quality / FEC mismatch |
rx_symbol_err_phy |
Symbol errors — 0 preferred |
Switch side:
1
|
sw-core-01# show interfaces Ethernet1 counters errors
|
Sample output:
1
2
|
Port FCS Err Align Err Symbol Err Rx Err Tx Err
Et1 0 0 0 0 0
|
1
2
|
# FEC stats (corrected/uncorrected codewords)
sw-core-01# show interfaces Ethernet1 phy detail | include -i -A2 fec
|
| Check |
Meaning |
| FCS/Symbol Err stay 0 |
Link quality good |
| FEC uncorrected = 0 |
Required pass condition |
[16] Compatibility Troubleshooting
| Symptom |
Cause / action |
Link won’t come up (notconnect / Link detected: no) |
FEC mismatch → fix both switch and server to the same mode (RS-FEC). Confirm the cable is 25G SFP28 |
| Negotiates at 10G, not 25G |
Cable is 10G SFP+ or a forced port speed → set speed forced 25gfull on the switch or align auto-neg |
| Transceiver not detected / rejection logs |
Third-party block policy → check show logging | include transceiver, verify allowed model/policy |
| Link flaps (intermittent drops) |
One side auto, the other fixed → fix both the same. Consider firmware update |
| Throughput stuck at ~10G |
PCIe x4 downgrade (check LnkSta), single-stream limit → use -P multi-stream, tune IRQ/RSS |
| FEC corrected surges + uncorrected appears |
Cable quality/length limit → replace cable, apply stronger FEC (RS) |
[17] Summary Checklist
| Step |
Where |
Check |
| STEP 04 |
Switch |
show interfaces Et1 status → connected, 25G
|
| STEP 04 |
Switch |
show running-config interfaces Et1 → port configured for 25G (auto / forced 25gfull) |
| STEP 05 |
Switch |
show interfaces Et1 transceiver → transceiver detected |
| STEP 06 |
Switch + server |
FEC mode identical on both (RS recommended) |
| STEP 07 |
Server |
ethtool ens1f0 → 25000Mb/s, Link: yes
|
| STEP 08 |
Server |
ethtool -i → latest driver/firmware |
| STEP 09 |
Server |
lspci → PCIe x8 / Gen3+ |
| STEP 11 |
Both |
MTU 9000 matched, ping -M do -s 8972 succeeds |
| STEP 12 |
Server |
iperf3 -P 8 → ≥ 23 Gbps both directions |
| STEP 13 |
Both |
End-to-end: PC A send ≈ PC B receive ≈ 23 Gbps+ (incl. --bidir full-duplex) |
| STEP 15 |
Both |
CRC/FEC uncorrected delta 0
|
When all items pass, consider the compatibility and performance between the new 25G NIC and the Arista switch verified. In particular, when STEP 13 (end-to-end) shows PC B receiving the 25G that PC A sent, it proves in one shot that the switch and both PCs’ NICs all satisfy 25G.