diff --git a/docs/formatnetwork.html.in b/docs/formatnetwork.html.in
index 8638df96e7..777c3419b3 100644
--- a/docs/formatnetwork.html.in
+++ b/docs/formatnetwork.html.in
@@ -93,6 +93,7 @@
...
<bridge name="virbr0" stp="on" delay="5" macTableManager="libvirt"/>
+<mtu size="9000"/>
<domain name="example.com" localOnly="no"/>
<forward mode="nat" dev="eth0"/>
...
@@ -151,9 +152,25 @@
Since 1.2.11, requires kernel 3.17 or
newer
-
-
+
+ mtu
+
+ The size
attribute of the mtu>
+ element specifies the Maximum Transmission Unit (MTU) for the
+ network. Since 3.1.0. In the case
+ of a libvirt-managed network (one with forward mode
+ of nat
, route
, open
, or
+ no forward
element (i.e. an isolated network),
+ this will be the MTU assigned to the bridge device when
+ libvirt creates it, and thereafter also assigned to all tap
+ devices created to connect guest interfaces. Network types not
+ specifically mentioned here don't support having an MTU set in
+ the libvirt network config. If mtu size is unspecified, the
+ default setting for the type of device being used is assumed
+ (usually 1500).
+
+
domain
The name
attribute on the domain
diff --git a/docs/news.xml b/docs/news.xml
index ef1ed785f9..69ed6a75e6 100644
--- a/docs/news.xml
+++ b/docs/news.xml
@@ -36,10 +36,11 @@
- Introduce MTU to domain <interface/>
+ Introduce MTU to domain <interface/> and <network>
- Allow setting MTU size for some types of domain interface.
+ Allow setting MTU size for some types of domain interface
+ and network.
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 8f0a61b5bc..1048dabf3e 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -79,6 +79,11 @@
+
+
+
+
+
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 86ce311ee1..0e20dac074 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -2242,6 +2242,17 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
def->mac_specified = true;
}
+ tmp = virXPathString("string(./mtu/@size)", ctxt);
+ if (tmp) {
+ if (virStrToLong_ui(tmp, NULL, 10, &def->mtu) < 0) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("Invalid mtu size '%s' in network '%s'"),
+ tmp, def->name);
+ goto error;
+ }
+ }
+ VIR_FREE(tmp);
+
dnsNode = virXPathNode("./dns", ctxt);
if (dnsNode != NULL &&
virNetworkDNSDefParseXML(def->name, dnsNode, ctxt, &def->dns) < 0) {
@@ -2435,7 +2446,9 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
case VIR_NETWORK_FORWARD_BRIDGE:
if (def->delay || stp) {
virReportError(VIR_ERR_XML_ERROR,
- _("bridge delay/stp options only allowed in route, nat, and isolated mode, not in %s (network '%s')"),
+ _("bridge delay/stp options only allowed in "
+ "route, nat, and isolated mode, not in %s "
+ "(network '%s')"),
virNetworkForwardTypeToString(def->forward.type),
def->name);
goto error;
@@ -2454,6 +2467,19 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
VIR_FREE(stp);
+ if (def->mtu &&
+ (def->forward.type != VIR_NETWORK_FORWARD_NONE &&
+ def->forward.type != VIR_NETWORK_FORWARD_NAT &&
+ def->forward.type != VIR_NETWORK_FORWARD_ROUTE &&
+ def->forward.type != VIR_NETWORK_FORWARD_OPEN)) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("mtu size only allowed in open, route, nat, "
+ "and isolated mode, not in %s (network '%s')"),
+ virNetworkForwardTypeToString(def->forward.type),
+ def->name);
+ goto error;
+ }
+
/* Extract custom metadata */
if ((metadataNode = virXPathNode("./metadata[1]", ctxt)) != NULL) {
def->metadata = xmlCopyNode(metadataNode, 1);
@@ -2964,6 +2990,9 @@ virNetworkDefFormatBuf(virBufferPtr buf,
virBufferAddLit(buf, "/>\n");
}
+ if (def->mtu)
+ virBufferAsprintf(buf, "\n", def->mtu);
+
if (def->mac_specified) {
char macaddr[VIR_MAC_STRING_BUFLEN];
virMacAddrFormat(&def->mac, macaddr);
diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h
index b5c9ea24ec..9e4ae71618 100644
--- a/src/conf/network_conf.h
+++ b/src/conf/network_conf.h
@@ -240,6 +240,7 @@ struct _virNetworkDef {
int domainLocalOnly; /* enum virTristateBool: yes disables dns forwarding */
unsigned long delay; /* Bridge forward delay (ms) */
bool stp; /* Spanning tree protocol */
+ unsigned int mtu; /* MTU for bridge, 0 means "default" i.e. unset in config */
virMacAddr mac; /* mac address of bridge device */
bool mac_specified;
diff --git a/tests/networkxml2xmlin/set-mtu.xml b/tests/networkxml2xmlin/set-mtu.xml
new file mode 100644
index 0000000000..d1ef32a40f
--- /dev/null
+++ b/tests/networkxml2xmlin/set-mtu.xml
@@ -0,0 +1,12 @@
+
+ private
+ 81ff0d90-c91e-6742-64da-4a736edb9a9b
+
+
+
+
+
+
+
+
+
diff --git a/tests/networkxml2xmlout/set-mtu.xml b/tests/networkxml2xmlout/set-mtu.xml
new file mode 100644
index 0000000000..10e8155271
--- /dev/null
+++ b/tests/networkxml2xmlout/set-mtu.xml
@@ -0,0 +1,12 @@
+
+ private
+ 81ff0d90-c91e-6742-64da-4a736edb9a9b
+
+
+
+
+
+
+
+
+
diff --git a/tests/networkxml2xmltest.c b/tests/networkxml2xmltest.c
index 01cd6f7144..cfaf7181aa 100644
--- a/tests/networkxml2xmltest.c
+++ b/tests/networkxml2xmltest.c
@@ -158,6 +158,7 @@ mymain(void)
DO_TEST_PARSE_ERROR("hostdev-duplicate");
DO_TEST_PARSE_ERROR("passthrough-duplicate");
DO_TEST("metadata");
+ DO_TEST("set-mtu");
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}