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; }