On 01/25/2017 03:46 PM, Laine Stump wrote:
On 01/24/2017 10:40 AM, Michal Privoznik wrote:
> So far we allow to set MTU for libvirt networks. However, not all
> domain interfaces have to be plugged into a libvirt network and
> even if they are, they might want to have a different MTU (e.g.
> for testing purposes).
... although setting an MTU larger than a bridge's current MTU will
result in the tap device MTU being lowered back to the bridge's MTU
anyway, and setting an MTU smaller than the bridge's current MTU will
result in the bridge's MTU being clamped to that new lower value.
(Still, I think it's reasonable to expect someone someday will want to
do that for some reason, so might as well allow it...)
>
> Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
> ---
> docs/formatdomain.html.in | 19 ++++++++
> docs/schemas/domaincommon.rng | 3 ++
> docs/schemas/networkcommon.rng | 9 ++++
> src/conf/domain_conf.c | 10 +++++
> src/conf/domain_conf.h | 1 +
> src/qemu/qemu_domain.c | 29 ++++++++++++
> src/qemu/qemu_domain.h | 2 +
> tests/qemuxml2argvdata/qemuxml2argv-net-mtu.xml | 60
> +++++++++++++++++++++++++
> 8 files changed, 133 insertions(+)
> create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-mtu.xml
>
> diff --git a/docs/schemas/networkcommon.rng
> b/docs/schemas/networkcommon.rng
> index a334b83e3..26995556d 100644
> --- a/docs/schemas/networkcommon.rng
> +++ b/docs/schemas/networkcommon.rng
> @@ -260,10 +260,19 @@
> </optional>
> </element>
> </define>
> +
> <define name="macTableManager">
> <choice>
> <value>kernel</value>
> <value>libvirt</value>
> </choice>
> </define>
> +
> + <define name="mtu">
> + <element name="mtu">
> + <attribute name="size">
> + <ref name="unsignedShort"/>
> + </attribute>
> + </element>
> + </define>
Well, if you're going to add this, then I should use it in my patches,
or I should do it and you use it in yours. Our relative timezones (and
the fact that I haven't respun my patches yet) dictate that you should
push first (anyway, I'm realizing I'll need to add an extra patch to
mine for another issue - retrieving the MTU from the network in the
case that it's not specified in the domain's interface element directly,
similar to what we do with vlan tags).
I think we are already doing that: virNetDevTapCreateInBridgePort()
calls virNetDevSetMTUFromDevice() which sets MTU on the new tap
interface from the one that bridge has.
> </grammar>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 26bb0fdd0..a2b72cb9c 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -10050,6 +10050,12 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr
> xmlopt,
> goto error;
> }
> + if (virXPathUInt("string(./mtu/@size)", ctxt, &def->mtu) <
-1) {
> + virReportError(VIR_ERR_XML_ERROR, "%s",
> + _("malformed mtu size"));
> + goto error;
> + }
> +
> cleanup:
> ctxt->node = oldnode;
> VIR_FREE(macaddr);
> @@ -21769,6 +21775,10 @@ virDomainNetDefFormat(virBufferPtr buf,
> virBufferAsprintf(buf, "<link state='%s'/>\n",
>
> virDomainNetInterfaceLinkStateTypeToString(def->linkstate));
> }
> +
> + if (def->mtu)
> + virBufferAsprintf(buf, "<mtu size='%u'/>\n",
def->mtu);
> +
> if (virDomainDeviceInfoFormat(buf, &def->info,
> flags |
> VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT
> | VIR_DOMAIN_DEF_FORMAT_ALLOW_ROM)
> < 0)
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 78a3db4e1..4d830c51d 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1009,6 +1009,7 @@ struct _virDomainNetDef {
> virNetDevVlan vlan;
> int trustGuestRxFilters; /* enum virTristateBool */
> int linkstate;
> + unsigned int mtu;
> };
> /* Used for prefix of ifname of any network name generated
> dynamically
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 2ed45ab17..26ca89930 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -2868,6 +2868,14 @@ qemuDomainDeviceDefValidate(const
> virDomainDeviceDef *dev,
> _("rx_queue_size has to be a power of
> two"));
> goto cleanup;
> }
> +
> + if (net->mtu &&
> + !qemuDomainNetSupportsMTU(net->type)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("setting MTU on interface type %s is not
> supported yet"),
> + virDomainNetTypeToString(net->type));
> + goto cleanup;
> + }
> }
> ret = 0;
> @@ -6529,6 +6537,27 @@ qemuDomainSupportsNetdev(virDomainDefPtr def,
> return virQEMUCapsGet(qemuCaps, QEMU_CAPS_NETDEV);
> }
> +bool
> +qemuDomainNetSupportsMTU(virDomainNetType type)
> +{
> + switch (type) {
> + case VIR_DOMAIN_NET_TYPE_USER:
> + case VIR_DOMAIN_NET_TYPE_ETHERNET:
> + case VIR_DOMAIN_NET_TYPE_VHOSTUSER:
> + case VIR_DOMAIN_NET_TYPE_SERVER:
> + case VIR_DOMAIN_NET_TYPE_CLIENT:
> + case VIR_DOMAIN_NET_TYPE_MCAST:
> + case VIR_DOMAIN_NET_TYPE_NETWORK:
> + case VIR_DOMAIN_NET_TYPE_BRIDGE:
> + case VIR_DOMAIN_NET_TYPE_INTERNAL:
> + case VIR_DOMAIN_NET_TYPE_DIRECT:
> + case VIR_DOMAIN_NET_TYPE_HOSTDEV:
> + case VIR_DOMAIN_NET_TYPE_UDP:
> + case VIR_DOMAIN_NET_TYPE_LAST:
> + break;
> + }
> + return false;
> +}
> int
> qemuDomainNetVLAN(virDomainNetDefPtr def)
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 88b586972..041149167 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -708,6 +708,8 @@ bool qemuDomainSupportsNetdev(virDomainDefPtr def,
> virQEMUCapsPtr qemuCaps,
> virDomainNetDefPtr net);
> +bool qemuDomainNetSupportsMTU(virDomainNetType type);
> +
> int qemuDomainNetVLAN(virDomainNetDefPtr def);
> int qemuDomainSetPrivatePaths(virQEMUDriverPtr driver,
> diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-mtu.xml
> b/tests/qemuxml2argvdata/qemuxml2argv-net-mtu.xml
> new file mode 100644
> index 000000000..606322463
> --- /dev/null
> +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-mtu.xml
You added this test case, but didn't reference it in qemuxml2xmltest.c
(or add the corresponding file in qemuxml2xmloutdata).
Ah, I see you did add it in patch 4/4, but I think the xml2xml test
should be added in the same patch that the conf changes are made.
True and usually I require the xml2xml test to be in the same patch as
the conf/ changes. However, this is an exception: because in the post
parse callback I check whether there's an implementation available for
given interface type. Since there is no implementation available in this
patch, <mtu size=''/> is not allowed and xml2xml test would just error out.
ACK, if you move the xml2xml test case to this patch.
Michal