mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-22 13:45:38 +00:00
util: add MTU arg to virNetDevTapCreateInBridgePort()
virNetDevTapCreateInBridgePort() has always set the new tap device to the current MTU of the bridge it's being attached to. There is one case where we will want to set the new tap device to a different (usually larger) MTU - if that's done with the very first device added to the bridge, the bridge's MTU will be set to the device's MTU. This patch allows for that possibility by adding "int mtu" to the arg list for virNetDevTapCreateInBridgePort(), but all callers are sending -1, so it doesn't yet have any effect. Since the requested MTU isn't necessarily what is used in the end (for example, if there is no MTU requested, the tap device will be set to the current MTU of the bridge), and the hypervisor may want to know the actual MTU used, we also return the actual MTU to the caller (if actualMTU is non-NULL).
This commit is contained in:
parent
c2e60ad0e5
commit
dd8ac030fb
@ -78,6 +78,7 @@ bhyveBuildNetArgStr(const virDomainDef *def,
|
||||
def->uuid, NULL, NULL, 0,
|
||||
virDomainNetGetActualVirtPortProfile(net),
|
||||
virDomainNetGetActualVlan(net),
|
||||
0, NULL,
|
||||
VIR_NETDEV_TAP_CREATE_IFUP | VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -2301,6 +2301,7 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
|
||||
if (virNetDevTapCreateInBridgePort(network->def->bridge,
|
||||
&macTapIfName, &network->def->mac,
|
||||
NULL, NULL, &tapfd, 1, NULL, NULL,
|
||||
0, NULL,
|
||||
VIR_NETDEV_TAP_CREATE_USE_MAC_FOR_BRIDGE |
|
||||
VIR_NETDEV_TAP_CREATE_IFUP |
|
||||
VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
|
||||
|
@ -544,6 +544,7 @@ qemuInterfaceBridgeConnect(virDomainDefPtr def,
|
||||
def->uuid, tunpath, tapfd, *tapfdSize,
|
||||
virDomainNetGetActualVirtPortProfile(net),
|
||||
virDomainNetGetActualVlan(net),
|
||||
0, NULL,
|
||||
tap_create_flags) < 0) {
|
||||
virDomainAuditNetDevice(def, net, tunpath, false);
|
||||
goto cleanup;
|
||||
|
@ -126,6 +126,7 @@ umlConnectTapDevice(virDomainDefPtr vm,
|
||||
vm->uuid, net->backend.tap, &tapfd, 1,
|
||||
virDomainNetGetActualVirtPortProfile(net),
|
||||
virDomainNetGetActualVlan(net),
|
||||
0, NULL,
|
||||
VIR_NETDEV_TAP_CREATE_IFUP |
|
||||
VIR_NETDEV_TAP_CREATE_PERSIST) < 0) {
|
||||
if (template_ifname)
|
||||
|
@ -513,6 +513,8 @@ int virNetDevTapDelete(const char *ifname ATTRIBUTE_UNUSED,
|
||||
* @tapfd: array of file descriptor return value for the new tap device
|
||||
* @tapfdSize: number of file descriptors in @tapfd
|
||||
* @virtPortProfile: bridge/port specific configuration
|
||||
* @mtu: requested MTU for port (or 0 for "default")
|
||||
* @actualMTU: MTU actually set for port (after accounting for bridge's MTU)
|
||||
* @flags: OR of virNetDevTapCreateFlags:
|
||||
|
||||
* VIR_NETDEV_TAP_CREATE_IFUP
|
||||
@ -543,6 +545,8 @@ int virNetDevTapCreateInBridgePort(const char *brname,
|
||||
size_t tapfdSize,
|
||||
virNetDevVPortProfilePtr virtPortProfile,
|
||||
virNetDevVlanPtr virtVlan,
|
||||
unsigned int mtu,
|
||||
unsigned int *actualMTU,
|
||||
unsigned int flags)
|
||||
{
|
||||
virMacAddr tapmac;
|
||||
@ -578,12 +582,30 @@ int virNetDevTapCreateInBridgePort(const char *brname,
|
||||
if (virNetDevSetMAC(*ifname, &tapmac) < 0)
|
||||
goto error;
|
||||
|
||||
/* We need to set the interface MTU before adding it
|
||||
* to the bridge, because the bridge will have its
|
||||
* MTU adjusted automatically when we add the new interface.
|
||||
/* If an MTU is specified for the new device, set it before
|
||||
* attaching the device to the bridge, as it may affect the MTU of
|
||||
* the bridge (in particular if it is the first device attached to
|
||||
* the bridge, or if it is smaller than the current MTU of the
|
||||
* bridge). If MTU isn't specified for the new device (i.e. 0),
|
||||
* we need to set the interface MTU to the current MTU of the
|
||||
* bridge (to avoid inadvertantly changing the bridge's MTU).
|
||||
*/
|
||||
if (mtu > 0) {
|
||||
if (virNetDevSetMTU(*ifname, mtu) < 0)
|
||||
goto error;
|
||||
} else {
|
||||
if (virNetDevSetMTUFromDevice(*ifname, brname) < 0)
|
||||
goto error;
|
||||
}
|
||||
if (actualMTU) {
|
||||
int retMTU = virNetDevGetMTU(*ifname);
|
||||
|
||||
if (retMTU < 0)
|
||||
goto error;
|
||||
|
||||
*actualMTU = retMTU;
|
||||
}
|
||||
|
||||
|
||||
if (virtPortProfile) {
|
||||
if (virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) {
|
||||
|
@ -71,6 +71,8 @@ int virNetDevTapCreateInBridgePort(const char *brname,
|
||||
size_t tapfdSize,
|
||||
virNetDevVPortProfilePtr virtPortProfile,
|
||||
virNetDevVlanPtr virtVlan,
|
||||
unsigned int mtu,
|
||||
unsigned int *actualMTU,
|
||||
unsigned int flags)
|
||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
|
||||
ATTRIBUTE_RETURN_CHECK;
|
||||
|
@ -28,6 +28,8 @@ int virNetDevTapCreateInBridgePort(const char *brname ATTRIBUTE_UNUSED,
|
||||
size_t tapfdSize ATTRIBUTE_UNUSED,
|
||||
virNetDevVPortProfilePtr virtPortProfile ATTRIBUTE_UNUSED,
|
||||
virNetDevVlanPtr virtVlan ATTRIBUTE_UNUSED,
|
||||
unsigned int mtu ATTRIBUTE_UNUSED,
|
||||
unsigned int *actualMTU ATTRIBUTE_UNUSED,
|
||||
unsigned int fakeflags ATTRIBUTE_UNUSED)
|
||||
{
|
||||
VIR_FREE(*ifname);
|
||||
|
Loading…
Reference in New Issue
Block a user