[libvirt] [PATCH v3 09/36] network: move re-attach of bridge device out of network driver

Laine Stump laine at laine.org
Fri Mar 22 02:25:21 UTC 2019


On 3/19/19 8:46 AM, Daniel P. Berrangé wrote:
> During initial NIC setup the hypervisor drivers are responsible for
> attaching the TAP device to the bridge device. Any fixup after libvirtd
> restarts should thus also be their responsibility.
>
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>


*And* this fixes a bug that someone reported on IRC awhile back (and 
does it in the correct way, rather than the stupid f'ed up way I would 
have done it if I hadn't completely forgot about it until just this 
instant :-P)


Reviewed-by: Laine Stump <laine at laine.org>


> ---
>   src/conf/domain_conf.c      | 20 +++++++++++++++++++-
>   src/conf/domain_conf.h      |  2 +-
>   src/network/bridge_driver.c | 27 ++++++---------------------
>   3 files changed, 26 insertions(+), 23 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index bcd997a705..99b75e26f3 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -54,6 +54,7 @@
>   #include "virsecret.h"
>   #include "virstring.h"
>   #include "virnetdev.h"
> +#include "virnetdevtap.h"
>   #include "virnetdevmacvlan.h"
>   #include "virhostdev.h"
>   #include "virmdev.h"
> @@ -30217,8 +30218,25 @@ virDomainNetNotifyActualDevice(virConnectPtr conn,
>       if (!(net = virNetworkLookupByName(conn, iface->data.network.name)))
>           return;
>   
> -    netNotify(net, dom, iface);
> +    if (netNotify(net, dom, iface) < 0)
> +        goto cleanup;
> +
> +    if (virDomainNetGetActualType(iface) == VIR_DOMAIN_NET_TYPE_BRIDGE) {
> +        /*
> +         * NB: we can't notify the guest of any MTU change anyway,
> +         * so there is no point in trying to learn the actualMTU
> +         * (final arg to virNetDevTapReattachBridge())
> +         */
> +        if (virNetDevTapReattachBridge(iface->ifname,
> +                                       iface->data.network.actual->data.bridge.brname,
> +                                       &iface->mac, dom->uuid,
> +                                       virDomainNetGetActualVirtPortProfile(iface),
> +                                       virDomainNetGetActualVlan(iface),
> +                                       iface->mtu, NULL) < 0)
> +            goto cleanup;
> +    }
>   
> + cleanup:
>       virObjectUnref(net);
>   }
>   
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 3db319c23d..30aa985344 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -3515,7 +3515,7 @@ typedef int
>                                           virDomainDefPtr dom,
>                                           virDomainNetDefPtr iface);
>   
> -typedef void
> +typedef int
>   (*virDomainNetNotifyActualDeviceImpl)(virNetworkPtr net,
>                                         virDomainDefPtr dom,
>                                         virDomainNetDefPtr iface);
> diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
> index 7df0c0f67a..5f3371b150 100644
> --- a/src/network/bridge_driver.c
> +++ b/src/network/bridge_driver.c
> @@ -4776,12 +4776,11 @@ networkAllocateActualDevice(virNetworkPtr net,
>    * Called to notify the network driver when libvirtd is restarted and
>    * finds an already running domain. If appropriate it will force an
>    * allocation of the actual->direct.linkdev to get everything back in
> - * order, or re-attach the interface's tap device to the network's
> - * bridge.
> + * order.
>    *
> - * No return value (but does log any failures)
> + * Returns 0 on success, -1 on failure.
>    */
> -static void
> +static int
>   networkNotifyActualDevice(virNetworkPtr net,
>                             virDomainDefPtr dom,
>                             virDomainNetDefPtr iface)
> @@ -4792,6 +4791,7 @@ networkNotifyActualDevice(virNetworkPtr net,
>       virNetworkDefPtr netdef;
>       virNetworkForwardIfDefPtr dev = NULL;
>       size_t i;
> +    int ret = -1;
>   
>       obj = virNetworkObjFindByName(driver->networks, net->name);
>       if (!obj) {
> @@ -4836,22 +4836,6 @@ networkNotifyActualDevice(virNetworkPtr net,
>           actualType = VIR_DOMAIN_NET_TYPE_BRIDGE;
>       }
>   
> -    /* see if we're connected to the correct bridge */
> -    if (netdef->bridge) {
> -        /*
> -         * NB: we can't notify the guest of any MTU change anyway,
> -         * so there is no point in trying to learn the actualMTU
> -         * (final arg to virNetDevTapReattachBridge())
> -         */
> -        if (virNetDevTapReattachBridge(iface->ifname, netdef->bridge,
> -                                       &iface->mac, dom->uuid,
> -                                       virDomainNetGetActualVirtPortProfile(iface),
> -                                       virDomainNetGetActualVlan(iface),
> -                                       iface->mtu, NULL) < 0) {
> -            goto error;
> -        }
> -    }
> -
>       if (!iface->data.network.actual ||
>           (actualType != VIR_DOMAIN_NET_TYPE_DIRECT &&
>            actualType != VIR_DOMAIN_NET_TYPE_HOSTDEV)) {
> @@ -4980,10 +4964,11 @@ networkNotifyActualDevice(virNetworkPtr net,
>           goto error;
>       }
>       networkLogAllocation(netdef, actualType, dev, iface, true);
> +    ret = 0;
>   
>    cleanup:
>       virNetworkObjEndAPI(&obj);
> -    return;
> +    return ret;
>   
>    error:
>       goto cleanup;





More information about the libvir-list mailing list