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

Reply via email to