[libvirt] [PATCH] [PATCH v13-pre1] add 802.1Qbh and 802.1Qbg handling

Stefan Berger stefanb at linux.vnet.ibm.com
Sat May 29 12:20:52 UTC 2010


On Sat, 2010-05-29 at 01:20 -0700, Scott Feldman wrote:
> From: Scott Feldman <scofeldm at cisco.com>
> 
> Stefan, I was doing more testing and have some fixes for the bh paths. This
> patch is on top of your V12 patch...

Applying it.

> 
> - some minor cleanups
> - if association fails due to timeout, disassociate the port profile,
>   otherwise association state-machine will be "in-progress" potentially
>   forever.

Interesting...

Arnd, Vivek, does the lldpad statemachine need this as well?

   Stefan


> - don't pass mac/vlan/uuids/profile when disassociating.  ifindex and vf
>   are enough
> 
> Signed-off-by: Scott Feldman <scofeldm at cisco.com>
> ---
>  src/util/macvtap.c |   75 ++++++++++++++++++++++++++++++----------------------
>  1 files changed, 43 insertions(+), 32 deletions(-)
> 
> 
> diff --git a/src/util/macvtap.c b/src/util/macvtap.c
> index 71c6169..9ca6203 100644
> --- a/src/util/macvtap.c
> +++ b/src/util/macvtap.c
> @@ -963,11 +963,11 @@ getPortProfileStatus(struct nlattr **tb, int32_t vf,
>          if (tb[IFLA_PORT_SELF]) {
>              if (nla_parse_nested(tb_port, IFLA_PORT_MAX, tb[IFLA_PORT_SELF],
>                                   ifla_port_policy)) {
> -                msg = _("error parsing IFLA_VF_SELF part");
> +                msg = _("error parsing IFLA_PORT_SELF part");
>                  goto err_exit;
>              }
>          } else {
> -            msg = _("IFLA_VF_SELF is missing");
> +            msg = _("IFLA_PORT_SELF is missing");
>              goto err_exit;
>          }
>      } else {
> @@ -1266,7 +1266,7 @@ doPortProfileOpCommon(bool nltarget_kernel,
>                                  vf,
>                                  op);
> 
> -    if (rc != 0) {
> +    if (rc) {
>          macvtapError(VIR_ERR_INTERNAL_ERROR, "%s",
>                       _("sending of PortProfileRequest failed."));
>          return rc;
> @@ -1278,7 +1278,7 @@ doPortProfileOpCommon(bool nltarget_kernel,
>              goto err_exit;
>          rc = getPortProfileStatus(tb, vf, instanceId, nltarget_kernel,
>                                    is8021Qbg, &status);
> -        if (rc != 0)
> +        if (rc)
>              goto err_exit;
>          if (status == PORT_PROFILE_RESPONSE_SUCCESS ||
>              status == PORT_VDP_RESPONSE_SUCCESS) {
> @@ -1478,16 +1478,11 @@ doPortProfileOp8021Qbh(const char *ifname,
>      char *physfndev;
>      unsigned char hostuuid[VIR_UUID_BUFLEN];
>      int32_t vf;
> -    int op = PORT_REQUEST_ASSOCIATE;
>      bool nltarget_kernel = true;
>      int ifindex;
>      int vlanid = -1;
>      const unsigned char *macaddr = NULL;
> 
> -    rc = virGetHostUUID(hostuuid);
> -    if (rc)
> -        goto err_exit;
> -
>      rc = getPhysfn(ifname, &vf, &physfndev);
>      if (rc)
>          goto err_exit;
> @@ -1499,35 +1494,51 @@ doPortProfileOp8021Qbh(const char *ifname,
> 
>      switch (virtPortOp) {
>      case ASSOCIATE:
> -        op = PORT_REQUEST_ASSOCIATE;
> +        rc = virGetHostUUID(hostuuid);
> +        if (rc)
> +            goto err_exit;
> +
> +        rc = doPortProfileOpCommon(nltarget_kernel, NULL, ifindex,
> +                                   macaddr,
> +                                   vlanid,
> +                                   virtPort->u.virtPort8021Qbh.profileID,
> +                                   NULL,
> +                                   vm_uuid,
> +                                   hostuuid,
> +                                   vf,
> +                                   PORT_REQUEST_ASSOCIATE);
> +        if (rc == -ETIMEDOUT)
> +            /* Association timed out, disassociate */
> +            doPortProfileOpCommon(nltarget_kernel, NULL, ifindex,
> +                                  NULL,
> +                                  0,
> +                                  NULL,
> +                                  NULL,
> +                                  NULL,
> +                                  NULL,
> +                                  vf,
> +                                  PORT_REQUEST_DISASSOCIATE);
> +        if (!rc)
> +            ifaceUp(ifname);
>          break;
> +
>      case DISASSOCIATE:
> -        op = PORT_REQUEST_DISASSOCIATE;
> +        rc = doPortProfileOpCommon(nltarget_kernel, NULL, ifindex,
> +                                   NULL,
> +                                   0,
> +                                   NULL,
> +                                   NULL,
> +                                   NULL,
> +                                   NULL,
> +                                   vf,
> +                                   PORT_REQUEST_DISASSOCIATE);
> +        ifaceDown(ifname);
>          break;
> +
>      default:
>          macvtapError(VIR_ERR_INTERNAL_ERROR,
> -                     _("operation type %d not supported"), op);
> +                     _("operation type %d not supported"), virtPortOp);
>          rc = 1;
> -        goto err_exit;
> -    }
> -
> -    rc = doPortProfileOpCommon(nltarget_kernel, NULL, ifindex,
> -                               macaddr,
> -                               vlanid,
> -                               virtPort->u.virtPort8021Qbh.profileID,
> -                               NULL,
> -                               vm_uuid,
> -                               hostuuid,
> -                               vf,
> -                               op);
> -
> -    switch (virtPortOp) {
> -    case ASSOCIATE:
> -        ifaceUp(ifname);
> -        break;
> -    case DISASSOCIATE:
> -        ifaceDown(ifname);
> -        break;
>      }
> 
>  err_exit:
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list





More information about the libvir-list mailing list