freebsd_network: Automatically switch to jumbo-sized MTUs if possible.

Unfortunately there is no way to ask if a device supports jumbo MTUs
besides actually activating it. But that's fine, because for now,
Haiku's own network stack does not actually support changing MTUs
at the device level! Probably that should be fixed, too, but that
is a problem for another day.

With preceding commits, this fixes #17728, and all BSD network drivers
will use jumbo frames if possible by default.
This commit is contained in:
Augustin Cavalier 2022-05-27 17:01:41 -04:00
parent 3ea7c99119
commit 44604448de

View File

@ -236,7 +236,18 @@ compat_control(void *cookie, uint32 op, void *arg, size_t length)
if (length < 4)
return B_BAD_VALUE;
frameSize = ifp->if_mtu + ETHER_HDR_LEN;
// This is (usually) only invoked during initialization to get the
// maximum frame size. Thus we try to set the largest possible one,
// as there is no way to determine what the driver might support.
struct ifreq ifr;
ifr.ifr_mtu = ETHERMTU_JUMBO;
if (compat_control(cookie, SIOCSIFMTU, &ifr, sizeof(ifr)) != 0) {
// Try again with 4K at least.
ifr.ifr_mtu = 4096 - (ETHER_HDR_LEN + ETHER_CRC_LEN);
compat_control(cookie, SIOCSIFMTU, &ifr, sizeof(ifr));
}
frameSize = ifp->if_mtu + (ETHER_HDR_LEN + ETHER_CRC_LEN);
return user_memcpy(arg, &frameSize, 4);
}