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
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 <bogorodskiy@gmail.com>
---
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
On 10/29/26 18:59, Roman Bogorodskiy wrote: > 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 <bogorodskiy@gmail.com> > --- > 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 > Reviewed-by: Michal Privoznik <mprivozn@redhat.com> Michal
© 2016 - 2026 Red Hat, Inc.