You can add MTU advice to the virtio-net option:
bhyve .... -s X:Y:Z,virtio-net,[tapN|valeX:N],mtu=9000
I tested this patch on the following systems:
- Ubuntu 18.04 - work
- CentOS 7, 8 - work
- Windows 10 - work
- FreeBSD - not work (I have a patch)
- Ubuntu 16.04 - not work (too old)
We have been using this patch in production for more than six months.
Test net_parsemtu
```
#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
char *test_strings[] = {
"10",
"20",
"100",
"1400",
"1500",
"2000",
"9000",
"16000",
"65535",
"90000",
"-1",
"-1480",
"-50000",
"-a10",
"a10",
"abcde",
"xyz",
"17-26",
"15c4",
"12+80",
"1",
"c",
"-",
"x",
"+",
"+1500",
"\0",
"",
NULL
};
int
net_parsemtu(const char *mtu_str, unsigned long *mtu)
{
char *end;
unsigned long val;
assert(mtu_str != NULL);
if (*mtu_str == '-')
goto err;
val = strtoul(mtu_str, &end, 10);
if (*end != '\0')
goto err;
if (val == ULONG_MAX)
return (ERANGE);
if (val == 0 && errno == EINVAL)
return (EINVAL);
*mtu = val;
return (0);
err:
errno = EINVAL;
return (EINVAL);
}
int main(int argc, char **argv)
{
for (int i = 0; test_strings[i] != NULL; i++) {
unsigned long mtu = 1500;
errno = 0;
int ret = net_parsemtu(test_strings[i], &mtu);
printf("Test: '%s' \tret: %3d \tmtu: %lu \terr: %s\n",
test_strings[i], ret, mtu, strerror(errno));
}
return 0;
}
```
./test_parse_mtu
```
Test: '10' ret: 0 mtu: 10 err: No error: 0
Test: '20' ret: 0 mtu: 20 err: No error: 0
Test: '100' ret: 0 mtu: 100 err: No error: 0
Test: '1400' ret: 0 mtu: 1400 err: No error: 0
Test: '1500' ret: 0 mtu: 1500 err: No error: 0
Test: '2000' ret: 0 mtu: 2000 err: No error: 0
Test: '9000' ret: 0 mtu: 9000 err: No error: 0
Test: '16000' ret: 0 mtu: 16000 err: No error: 0
Test: '65535' ret: 0 mtu: 65535 err: No error: 0
Test: '90000' ret: 0 mtu: 90000 err: No error: 0
Test: '-1' ret: 22 mtu: 1500 err: Invalid argument
Test: '-1480' ret: 22 mtu: 1500 err: Invalid argument
Test: '-50000' ret: 22 mtu: 1500 err: Invalid argument
Test: '-a10' ret: 22 mtu: 1500 err: Invalid argument
Test: 'a10' ret: 22 mtu: 1500 err: Invalid argument
Test: 'abcde' ret: 22 mtu: 1500 err: Invalid argument
Test: 'xyz' ret: 22 mtu: 1500 err: Invalid argument
Test: '17-26' ret: 22 mtu: 1500 err: Invalid argument
Test: '15c4' ret: 22 mtu: 1500 err: Invalid argument
Test: '12+80' ret: 22 mtu: 1500 err: Invalid argument
Test: '1' ret: 0 mtu: 1 err: No error: 0
Test: 'c' ret: 22 mtu: 1500 err: Invalid argument
Test: '-' ret: 22 mtu: 1500 err: Invalid argument
Test: 'x' ret: 22 mtu: 1500 err: Invalid argument
Test: '+' ret: 22 mtu: 1500 err: Invalid argument
Test: '+1500' ret: 0 mtu: 1500 err: No error: 0
Test: '' ret: 22 mtu: 1500 err: Invalid argument
Test: '' ret: 22 mtu: 1500 err: Invalid argument
```