Index | Thread | Search

From:
Jan Klemkow <jan@openbsd.org>
Subject:
ixl(4): Fix hardmtu
To:
tech@openbsd.org
Date:
Thu, 30 Jul 2026 18:16:40 +0200

Download raw body.

Thread
  • Jan Klemkow:

    ixl(4): Fix hardmtu

Hi,

Using ixl(4) with it's hardmtu is broken, because packets with hardmtu
were dropped cause they are bigger then rxmax is configured.

The Intel Ethernet Controller X710/XXV710/XL710 Datasheet said:

Table 1-3. Link layer Ethernet port features

	Maximum Transmit Unit Size (MTU) is 9728 - Ethernet header/CRC =
	9728 - 18 = 9710 bytes (jumbo frames)
	MTU can be further reduced by additional header fields such as
	Virtual Local Area Network (VLAN) tag(s), etc.

Table 8-12. LAN Rx Queue Context in the Private Host Memory

	The "rxmax" parameter defines the whole packet size starting at
	the L2 header up to including the Ethernet CRC.

The following diff sending and receiving sizes in the ixl(4) code.  The
result is a working hardmtu of 9706 and its also working with vlan(4).

ok?

bye,
jan

Index: dev/pci/if_ixl.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/if_ixl.c,v
diff -u -p -r1.117 if_ixl.c
--- dev/pci/if_ixl.c	23 Jun 2026 14:40:40 -0000	1.117
+++ dev/pci/if_ixl.c	30 Jul 2026 15:15:53 -0000
@@ -901,7 +901,8 @@ struct ixl_rx_wb_desc_32 {
 #define IXL_TX_QUEUE_ALIGN		128
 #define IXL_RX_QUEUE_ALIGN		128
 
-#define IXL_HARDMTU			9712 /* 9726 - ETHER_HDR_LEN */
+#define IXL_HARDMTU			(9728 - ETHER_HDR_LEN - EVL_ENCAPLEN \
+					    - ETHER_CRC_LEN)
 #define IXL_TSO_SIZE			((255 * 1024) - 1)
 #define IXL_MAX_DMA_SEG_SIZE		((16 * 1024) - 1)
 
@@ -3171,7 +3172,8 @@ ixl_rxr_config(struct ixl_softc *sc, str
 	rxq.crcstrip = 1;
 	rxq.l2tsel = IXL_HMC_RXQ_L2TSEL_1ST_TAG_TO_L2TAG1;
 	rxq.showiv = 0;
-	rxq.rxmax = htole16(IXL_HARDMTU);
+	rxq.rxmax = htole16(IXL_HARDMTU + ETHER_HDR_LEN + EVL_ENCAPLEN +
+	    ETHER_CRC_LEN);
 	rxq.tphrdesc_ena = 0;
 	rxq.tphwdesc_ena = 0;
 	rxq.tphdata_ena = 0;