[libvirt] [PATCH 6/7] Introduce virNetDevBandwidthUpdateFilter

Laine Stump laine at laine.org
Thu Apr 16 18:16:55 UTC 2015


On 04/14/2015 12:59 PM, Michal Privoznik wrote:
> This is practically a wrapper over

"This is a simple wrapper around"

> virNetDevBandwidthManipulateFilter() that will update the desired
> filter on an interface (usually a network bridge) with a new MAC
> address. Although, the MAC address in question usually refers to
> some other interface - the one that the filter is constructed
> for. Yeah, hard to parse. Thing is, our NATed network has a

Again with the extra unnecessary verbiage :-)

> bridge where some part of QoS takes place. And vNICs from guests
> are plugged into the bridge. However, if a guest decides to
> change the MAC of its vNIC, corresponding qemu process emits an

s/corresponding/the corresponding/

> event to which we respond somehow. 

"... an event which we can use to update the QoS configuration based on
the new MAC address."

> However, our QoS hierarchy is
> currently not notified, therefore it falls apart.

"falls apart" is a bit lacking on the details :-)

>  This function
> (when called from the correct place)

(when called in response to the aforementioned event)

>  will update our QoS
> hierarchy and duck tape it together again.

Technically, it's "duct" tape (although there is one company that
capitalizes on the mispronunciation by calling theirs "Duck(tm) Tape".

>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/libvirt_private.syms      |  1 +
>  src/util/virnetdevbandwidth.c | 38 ++++++++++++++++++++++++++++++++++++++
>  src/util/virnetdevbandwidth.h |  6 ++++++
>  3 files changed, 45 insertions(+)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 7166283..547a919 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1753,6 +1753,7 @@ virNetDevBandwidthFree;
>  virNetDevBandwidthPlug;
>  virNetDevBandwidthSet;
>  virNetDevBandwidthUnplug;
> +virNetDevBandwidthUpdateFilter;
>  virNetDevBandwidthUpdateRate;
>  
>  
> diff --git a/src/util/virnetdevbandwidth.c b/src/util/virnetdevbandwidth.c
> index c57c8c0..0c49b41 100644
> --- a/src/util/virnetdevbandwidth.c
> +++ b/src/util/virnetdevbandwidth.c
> @@ -680,3 +680,41 @@ virNetDevBandwidthUpdateRate(const char *ifname,
>      VIR_FREE(ceil);
>      return ret;
>  }
> +
> +/**
> + * virNetDevBandwidthUpdateFilter:
> + * @ifname: interface to operate on
> + * @ifmac_ptr: new MAC to update the filter with
> + * @id: filter ID
> + *
> + * Sometimes the host environment is so dynamic, that even
> + * guest's MAC addresses change on the fly. That's when we must

s/guest's/a guest's/

s/That's when/When that happens/

> + * update our QoS hierarchy so that guest's traffic is placed

s/guest's/the guest's/

> + * into correct QDiscs.

s/correct/the correct/

>  This function does exactly that. On the
> + * interface @ifname (usually a bridge) updates filter with
> + * unique identifier @id so that it reflects fact, that new
> + * address corresponding to the filter has changed to @ifmac_ptr.

This function updates the filter for the interface @ifname with the
unique identifier @id so that it uses the new MAC address of the guest
interface @ifmac_ptr.

> + *
> + * Returns: 0 on success,
> + *         -1 on failure (with error reported).
> + */
> +int
> +virNetDevBandwidthUpdateFilter(const char *ifname,
> +                               const virMacAddr *ifmac_ptr,
> +                               unsigned int id)
> +{
> +    int ret = -1;
> +    char *class_id = NULL;
> +
> +    if (virAsprintf(&class_id, "1:%x", id) < 0)
> +        goto cleanup;
> +
> +    if (virNetDevBandwidthManipulateFilter(ifname, ifmac_ptr, id,
> +                                           class_id, true, true) < 0)
> +        goto cleanup;
> +
> +    ret = 0;
> + cleanup:
> +    VIR_FREE(class_id);
> +    return ret;
> +}
> diff --git a/src/util/virnetdevbandwidth.h b/src/util/virnetdevbandwidth.h
> index efcf95a..9b1d2a6 100644
> --- a/src/util/virnetdevbandwidth.h
> +++ b/src/util/virnetdevbandwidth.h
> @@ -73,4 +73,10 @@ int virNetDevBandwidthUpdateRate(const char *ifname,
>                                   unsigned long long new_rate)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
>      ATTRIBUTE_RETURN_CHECK;
> +
> +int virNetDevBandwidthUpdateFilter(const char *ifname,
> +                                   const virMacAddr *ifmac_ptr,
> +                                   unsigned int id)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
> +    ATTRIBUTE_RETURN_CHECK;
>  #endif /* __VIR_NETDEV_BANDWIDTH_H__ */

ACK with the description cleaned up a bit.




More information about the libvir-list mailing list