Index | Thread | Search

From:
David Gwynne <david@gwynne.id.au>
Subject:
Re: pppoe(4): use if_hardmtu for RFC 4638 ceilings
To:
Bjorn Ketelaars <bket@openbsd.org>
Cc:
dlg@openbsd.org, tech@openbsd.org
Date:
Wed, 17 Jun 2026 21:18:44 +1000

Download raw body.

Thread
On Wed, Jun 17, 2026 at 07:19:37AM +0200, Bjorn Ketelaars wrote:
> 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

sorry, it's been one of those years.

i like this, so i'm keen to see it go in. however, i'm not on an ISP
that requires pppoe anymore, and the one i was on didn't support RFC4638
anyway, so i can't test it. if it works for you then it's ok by me.

dlg

> 
> 
> 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;