Skip to content

Solution: Duplex Mismatch

Summary

The server NIC is forced to 1000Mbps full-duplex, while the switch port is set to auto-negotiate. Because the server is not participating in auto-negotiation, the switch cannot determine the duplex setting and falls back to half-duplex (per IEEE 802.3 spec). This creates a duplex mismatch: the server sends in full-duplex (no carrier sense), while the switch expects half-duplex, resulting in collisions, late collisions, and severe throughput degradation.

Senior Workflow

Step 1: Check the server NIC settings

ethtool eth0

Look for: - Speed: 1000Mb/s - Duplex: Full - Auto-negotiation: off <-- This is the problem

Step 2: Check the switch port settings

sw-access-03# show interface GigabitEthernet0/12

Look for: - "Half-duplex, 1000Mb/s" -- the switch fell back to half-duplex - Input errors, CRC, runts incrementing - "Late collisions" counter > 0

Step 3: Check error counters on the server

ethtool -S eth0 | grep -E 'collision|error|drop'
# Or:
ip -s link show eth0

Expect: high collision counts, tx_errors.

Step 4: Understand the root cause

When the server forces 1000/full: 1. Server does NOT send auto-negotiation signals (FLP bursts) 2. Switch detects link (electrical signal present) at 1000Mbps 3. Switch cannot determine duplex -- defaults to half-duplex per IEEE 802.3 4. Server transmits without checking carrier (full-duplex behavior) 5. Switch interprets simultaneous send/receive as collisions

Step 5: Apply the fix

On the server:

ethtool -s eth0 autoneg on
# Or in /etc/network/interfaces or netplan config, remove forced settings

On the switch (if also forced):

sw-access-03(config)# interface GigabitEthernet0/12
sw-access-03(config-if)# speed auto
sw-access-03(config-if)# duplex auto

Step 6: Verify after fix

# Server side:
ethtool eth0
# Should show: Auto-negotiation: on, Speed: 1000Mb/s, Duplex: Full

# Switch side:
sw-access-03# show interface Gi0/12
# Should show: Full-duplex, 1000Mb/s, media type is 10/100/1000BaseTX

# Clear counters and monitor:
sw-access-03# clear counters Gi0/12

Step 7: Test throughput

iperf3 -c 10.80.1.1 -t 10
# Should now show ~940 Mbps instead of ~2 Mbps

Common Pitfalls

  • "Auto-negotiation is unreliable": This was sometimes true for 10/100 Ethernet in the 1990s. For Gigabit Ethernet, auto-negotiation is mandatory per IEEE 802.3ab and is extremely reliable.
  • Forcing only one side: If you force one side, you MUST force the other side to match. Best practice: use auto-negotiation on both.
  • Confusing link-up with correct config: The link comes up in both cases because speed can be detected by signal characteristics. Duplex requires auto-negotiation to determine.
  • Not checking error counters: Late collisions are the hallmark of duplex mismatch. Regular collisions in isolation could be other issues.
  • Not clearing counters after fix: Old error counts persist. Clear them to confirm the fix is working.
  • Ignoring Gigabit spec: 1000BASE-T technically requires auto-negotiation for proper operation. Some NICs tolerate forcing but behavior is undefined.