Index | Thread | Search

From:
Bjorn Ketelaars <bket@openbsd.org>
Subject:
Re: pppoe(4): use if_hardmtu for RFC 4638 ceilings
To:
dlg@openbsd.org
Cc:
tech@openbsd.org
Date:
Wed, 17 Jun 2026 07:19:37 +0200

Download raw body.

Thread
On Sat 06/06/2026 13:15, Bjorn Ketelaars wrote:
> As recently explained on misc@, OpenBSD interfaces operate at their
> maximum supported packet size at all times [0]. The software IP stack
> MTU does not change this. However, the current RFC4638 implementation in
> if_pppoe.c stands out as an anomaly.
> 
> Currently, if_pppoe.c enforces MTU ceilings during PPPOESETPARMS and
> SIOCSIFMTU based on the parent's software layer (eth_if->if_mtu). This
> forces administrators to manually configure the parent interface, e.g.:
> 
> # echo "up mtu 1508" > /etc/hostname.em0
> 
> This is only needed to allow pppoe0 to use `mtu 1500`. It contradicts
> the principle that the hardware is already wide open out of the box.
> 
> The diff below flips these checks to use `if_hardmtu` instead of
> `if_mtu`. This allows `hostname.pppoe0` to use `mtu 1500` during early
> boot via netstart. No arbitrary MTU manipulation on the parent interface
> is required. 
> 
> The diff also cleans up share/man/man4/pppoe.4 to remove the instruction
> to explicitly set `mtu 1508` on the physical device.
> 
> Comments or OK?
> 
> [0] https://marc.info/?l=openbsd-misc&m=178061105778390&w=2


Just a ping


diff --git share/man/man4/pppoe.4 share/man/man4/pppoe.4
index ca0cd209d5d..521b0eda358 100644
--- share/man/man4/pppoe.4
+++ share/man/man4/pppoe.4
@@ -183,9 +183,10 @@ dest 0.0.0.1
 !/sbin/route add default -ifp pppoe0 0.0.0.1
 .Ed
 .Pp
-The physical interface would also have to be configured correspondingly:
+The physical interface must also be marked
+.Ql up :
 .Bd -literal -offset indent
-# echo "up mtu 1508" > /etc/hostname.em0
+# echo "up" > /etc/hostname.em0
 .Ed
 .Pp
 However, RFC 4638 negotiation only takes into account the MTU configured
diff --git sys/net/if_pppoe.c sys/net/if_pppoe.c
index a5208d2479c..d13c91e151e 100644
--- sys/net/if_pppoe.c
+++ sys/net/if_pppoe.c
@@ -989,8 +989,8 @@ pppoe_ioctl(struct ifnet *ifp, unsigned long cmd, caddr_t data)
 			}
 
 			if (sc->sc_sppp.pp_if.if_mtu >
-			    eth_if->if_mtu - PPPOE_OVERHEAD) {
-				sc->sc_sppp.pp_if.if_mtu = eth_if->if_mtu -
+			    eth_if->if_hardmtu - PPPOE_OVERHEAD) {
+				sc->sc_sppp.pp_if.if_mtu = eth_if->if_hardmtu -
 				    PPPOE_OVERHEAD;
 			}
 			sc->sc_eth_ifidx = eth_if->if_index;
@@ -1093,7 +1093,7 @@ pppoe_ioctl(struct ifnet *ifp, unsigned long cmd, caddr_t data)
 
 		if (ifr->ifr_mtu > MIN(PPPOE_MAXMTU,
 		    (eth_if == NULL ? PPPOE_MAXMTU :
-		    (eth_if->if_mtu - PPPOE_OVERHEAD))))
+		    (eth_if->if_hardmtu - PPPOE_OVERHEAD))))
 			error = EINVAL;
 		else
 			error = 0;