freebsd_network: Add another MTU to attempt to set devices to.
IEEE 802.11 has its own maximum MTU which is smaller than PAGESIZE but larger than the ETHERMTU default. So we now attempt to set this as well. In doing so, refactor the set into a loop based off an array of possible MTUs.
This commit is contained in:
@@ -237,15 +237,21 @@ compat_control(void *cookie, uint32 op, void *arg, size_t length)
|
||||
if (length < 4)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
const int MTUs[] = {
|
||||
ETHERMTU_JUMBO,
|
||||
PAGESIZE - (ETHER_HDR_LEN + ETHER_CRC_LEN),
|
||||
2290, /* IEEE80211_MTU_MAX */
|
||||
0
|
||||
};
|
||||
|
||||
// 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));
|
||||
// maximum frame size. Thus we try a few common possible values,
|
||||
// as there is no way to determine what is supported (or required).
|
||||
for (int i = 0; MTUs[i] != 0; i++) {
|
||||
struct ifreq ifr;
|
||||
ifr.ifr_mtu = MTUs[i];
|
||||
if (compat_control(cookie, SIOCSIFMTU, &ifr, sizeof(ifr)) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
frameSize = ifp->if_mtu + (ETHER_HDR_LEN + ETHER_CRC_LEN);
|
||||
|
||||
Reference in New Issue
Block a user