[libvirt] [PATCH 2/2] qemu: support setting vlan tag for <interface type='hostdev'>

Osier Yang jyang at redhat.com
Thu Aug 16 08:39:48 UTC 2012


On 2012年08月16日 12:34, Laine Stump wrote:
> The underlying function to set the vlan tag of an SR-IOV network
> device was already in place (although an extra patch to save/restore
> the original vlan tag was needed), and recent patches added the
> ability to configure a vlan tag. This patch just ties those two
> together.
>
> An SR-IOV device doesn't support vlan trunking, so if anyone tries to
> configure more than a single tag, or set the trunk flag, and error is
> logged.
> ---
>   src/qemu/qemu_hostdev.c | 40 ++++++++++++++++++++++++++++++++++------
>   1 file changed, 34 insertions(+), 6 deletions(-)
>
> diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
> index 7619fd0..46c84b5 100644
> --- a/src/qemu/qemu_hostdev.c
> +++ b/src/qemu/qemu_hostdev.c
> @@ -301,6 +301,7 @@ qemuDomainHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev,
>                                     char *stateDir)
>   {
>       char *linkdev = NULL;
> +    virNetDevVlanPtr vlan;
>       virNetDevVPortProfilePtr virtPort;
>       int ret = -1;
>       int vf = -1;
> @@ -319,19 +320,46 @@ qemuDomainHostdevNetConfigReplace(virDomainHostdevDefPtr hostdev,
>       if (qemuDomainHostdevNetDevice(hostdev,&linkdev,&vf)<  0)
>           return ret;
>
> +    vlan = virDomainNetGetActualVlan(hostdev->parent.data.net);
>       virtPort = virDomainNetGetActualVirtPortProfile(
>                                    hostdev->parent.data.net);
> -    if (virtPort)
> +    if (virtPort) {
> +        if (vlan) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("direct setting of the vlan tag is not allowed "
> +                             "for hostdev devices using %s mode"),
> +                           virNetDevVPortTypeToString(virtPort->virtPortType));
> +            goto cleanup;
> +        }
>           ret = qemuDomainHostdevNetConfigVirtPortProfile(linkdev, vf,
>                               virtPort,&hostdev->parent.data.net->mac, uuid,
>                               port_profile_associate);
> -    else
> -        /* Set only mac */
> +    } else {
> +        /* Set only mac and vlan */
> +        if (vlan) {
> +            if (vlan->nTags != 1 || vlan->trunk) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                               _("vlan trunking is not supported "
> +                                 "by SR-IOV network devices"));
> +                goto cleanup;
> +            }
> +            if (vf == -1) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                               _("vlan can only be set for SR-IOV VFs, but "
> +                                 "%s is not a VF"), linkdev);
> +                goto cleanup;
> +            }
> +            vlanid = vlan->tag[0];
> +        } else  if (vf>= 0) {
> +            vlanid = 0; /* assure any current vlan tag is reset */
> +        }
> +
>           ret = virNetDevReplaceNetConfig(linkdev, vf,
> -&hostdev->parent.data.net->mac, vlanid,
> -                                        stateDir);
> +&hostdev->parent.data.net->mac,
> +                                        vlanid, stateDir);
> +    }
> +cleanup:
>       VIR_FREE(linkdev);
> -
>       return ret;
>   }
>

ACK.




More information about the libvir-list mailing list