From 68a42bf6f701515df472f0dd039a1d7429ea62a8 Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Sun, 22 Jan 2017 21:23:48 -0500 Subject: [PATCH] conf: support configuring mtu size in a virtual network Example: ... ... If mtu is unset, it's assumed that we want the default for whatever is the underlying transport (usually this is 1500). This setting isn't yet wired in, so it will have no effect. This partially resolves: https://bugzilla.redhat.com/1224348 --- docs/formatnetwork.html.in | 21 +++++++++++++++++-- docs/news.xml | 5 +++-- docs/schemas/network.rng | 5 +++++ src/conf/network_conf.c | 31 ++++++++++++++++++++++++++++- src/conf/network_conf.h | 1 + tests/networkxml2xmlin/set-mtu.xml | 12 +++++++++++ tests/networkxml2xmlout/set-mtu.xml | 12 +++++++++++ tests/networkxml2xmltest.c | 1 + 8 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 tests/networkxml2xmlin/set-mtu.xml create mode 100644 tests/networkxml2xmlout/set-mtu.xml 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; }