Update the bhyve driver to propagate the network interface's MTU: - Configure the SLIRP backend MTU for user networking. - Configure the TAP interface MTU for bridge networking. - Advertise the MTU to the guest for virtio-net devices.
The e1000 device does not support advertising an MTU to the guest. Its backend MTU is still configured, but the guest interface must be configured separately. Signed-off-by: Roman Bogorodskiy <[email protected]> --- src/bhyve/bhyve_command.c | 19 ++++++++---- .../x86_64/bhyvexml2argv-net-mtu-bridge.args | 11 +++++++ .../bhyvexml2argv-net-mtu-bridge.ldargs | 4 +++ .../x86_64/bhyvexml2argv-net-mtu-bridge.xml | 31 +++++++++++++++++++ .../x86_64/bhyvexml2argv-net-mtu-slirp.args | 11 +++++++ .../x86_64/bhyvexml2argv-net-mtu-slirp.ldargs | 4 +++ .../x86_64/bhyvexml2argv-net-mtu-slirp.xml | 29 +++++++++++++++++ tests/bhyvexml2argvmock.c | 8 +++-- tests/bhyvexml2argvtest.c | 2 ++ 9 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.args create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.ldargs create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.xml create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.args create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.ldargs create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.xml diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index 09ef61e798..7e3d3d4553 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -49,6 +49,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, virCommand *cmd, bool dryRun) { + g_auto(virBuffer) netarg = VIR_BUFFER_INITIALIZER; char macaddr[VIR_MAC_STRING_BUFLEN]; char *realifname = NULL; const char *brname = NULL; @@ -97,8 +98,11 @@ bhyveBuildNetArgStr(const virDomainDef *def, break; case VIR_DOMAIN_NET_TYPE_USER: virCommandAddArg(cmd, "-s"); - virCommandAddArgFormat(cmd, "%d:0,%s,slirp,mac=%s,open", - net->info.addr.pci.slot, nic_model, macaddr); + virBufferAsprintf(&netarg, "%d:0,%s,slirp,mac=%s,open", + net->info.addr.pci.slot, nic_model, macaddr); + if (net->mtu) + virBufferAsprintf(&netarg, ",mtu=%u", net->mtu); + virCommandAddArgBuffer(cmd, &netarg); return 0; case VIR_DOMAIN_NET_TYPE_ETHERNET: case VIR_DOMAIN_NET_TYPE_DIRECT: @@ -125,7 +129,7 @@ bhyveBuildNetArgStr(const virDomainDef *def, virDomainNetGetActualVirtPortProfile(net), virDomainNetGetActualVlan(net), virDomainNetGetActualPortOptionsIsolated(net), - NULL, 0, NULL, + NULL, net->mtu, NULL, VIR_NETDEV_TAP_CREATE_IFUP | VIR_NETDEV_TAP_CREATE_PERSIST) < 0) { goto cleanup; } @@ -148,9 +152,12 @@ bhyveBuildNetArgStr(const virDomainDef *def, virCommandAddArg(cmd, "-s"); - virCommandAddArgFormat(cmd, "%d:0,%s,%s,mac=%s", - net->info.addr.pci.slot, nic_model, - realifname, macaddr); + virBufferAsprintf(&netarg, "%d:0,%s,%s,mac=%s", + net->info.addr.pci.slot, nic_model, + realifname, macaddr); + if (net->mtu && net->model == VIR_DOMAIN_NET_MODEL_VIRTIO) + virBufferAsprintf(&netarg, ",mtu=%u", net->mtu); + virCommandAddArgBuffer(cmd, &netarg); ret = 0; cleanup: diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.args b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.args new file mode 100644 index 0000000000..6eb2da65ed --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.args @@ -0,0 +1,11 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,faketapdev,mac=52:54:00:00:00:01,mtu=9000 \ +-s 4:0,e1000,faketapdev,mac=52:54:00:00:00:02 \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.ldargs b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.ldargs new file mode 100644 index 0000000000..5905f4b3e6 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.ldargs @@ -0,0 +1,4 @@ +bhyveload \ +-m 214 \ +-d /tmp/freebsd.img \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.xml b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.xml new file mode 100644 index 0000000000..6ed278b0d7 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-bridge.xml @@ -0,0 +1,31 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <disk type='file'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + <address type='drive' controller='0' bus='0' target='2' unit='0'/> + </disk> + <interface type='bridge'> + <mac address='52:54:00:00:00:01'/> + <source bridge='mtu-br0'/> + <model type='virtio'/> + <mtu size='9000'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </interface> + <interface type='bridge'> + <mac address='52:54:00:00:00:02'/> + <source bridge='mtu-br0'/> + <model type='e1000'/> + <mtu size='9000'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </interface> + </devices> +</domain> diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.args b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.args new file mode 100644 index 0000000000..0f67b4aa43 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.args @@ -0,0 +1,11 @@ +bhyve \ +-c 1 \ +-m 214 \ +-u \ +-H \ +-P \ +-s 0:0,hostbridge \ +-s 2:0,ahci,hd:/tmp/freebsd.img \ +-s 3:0,virtio-net,slirp,mac=52:54:00:00:00:01,open,mtu=9000 \ +-s 4:0,e1000,slirp,mac=52:54:00:00:00:02,open,mtu=9000 \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.ldargs b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.ldargs new file mode 100644 index 0000000000..5905f4b3e6 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.ldargs @@ -0,0 +1,4 @@ +bhyveload \ +-m 214 \ +-d /tmp/freebsd.img \ +bhyve diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.xml b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.xml new file mode 100644 index 0000000000..ff2467fda4 --- /dev/null +++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-net-mtu-slirp.xml @@ -0,0 +1,29 @@ +<domain type='bhyve'> + <name>bhyve</name> + <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid> + <memory>219136</memory> + <vcpu>1</vcpu> + <os> + <type>hvm</type> + </os> + <devices> + <disk type='file'> + <driver name='file' type='raw'/> + <source file='/tmp/freebsd.img'/> + <target dev='hda' bus='sata'/> + <address type='drive' controller='0' bus='0' target='2' unit='0'/> + </disk> + <interface type='user'> + <mac address='52:54:00:00:00:01'/> + <model type='virtio'/> + <mtu size='9000'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> + </interface> + <interface type='user'> + <mac address='52:54:00:00:00:02'/> + <model type='e1000'/> + <mtu size='9000'/> + <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> + </interface> + </devices> +</domain> diff --git a/tests/bhyvexml2argvmock.c b/tests/bhyvexml2argvmock.c index 2248b721d0..93289ba572 100644 --- a/tests/bhyvexml2argvmock.c +++ b/tests/bhyvexml2argvmock.c @@ -61,7 +61,7 @@ void virMacAddrGenerate(const unsigned char prefix[VIR_MAC_PREFIX_BUFLEN], addr->addr[5] = 0; } -int virNetDevTapCreateInBridgePort(const char *brname G_GNUC_UNUSED, +int virNetDevTapCreateInBridgePort(const char *brname, char **ifname, const virMacAddr *macaddr G_GNUC_UNUSED, const unsigned char *vmuuid G_GNUC_UNUSED, @@ -72,10 +72,14 @@ int virNetDevTapCreateInBridgePort(const char *brname G_GNUC_UNUSED, const virNetDevVlan *virtVlan G_GNUC_UNUSED, virTristateBool isolatedPort G_GNUC_UNUSED, virNetDevCoalesce *coalesce G_GNUC_UNUSED, - unsigned int mtu G_GNUC_UNUSED, + unsigned int mtu, unsigned int *actualMTU G_GNUC_UNUSED, unsigned int fakeflags G_GNUC_UNUSED) { + /* Validate MTU passed by the net-mtu-bridge test */ + if (STREQ(brname, "mtu-br0") && mtu != 9000) + return -1; + VIR_FREE(*ifname); *ifname = g_strdup("vnet0"); return 0; diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c index 650563821b..0b700cc5b0 100644 --- a/tests/bhyvexml2argvtest.c +++ b/tests/bhyvexml2argvtest.c @@ -260,6 +260,8 @@ mymain(void) DO_TEST("serial-grub"); DO_TEST("localtime"); DO_TEST("net-e1000"); + DO_TEST("net-mtu-bridge"); + DO_TEST("net-mtu-slirp"); DO_TEST("passthru"); DO_TEST("passthru-multiple-devs"); DO_TEST("uefi"); -- 2.55.0
