[libvirt] [PATCH 1/9] util: new functions for setting bridge and bridge port attributes
John Ferlan
jferlan at redhat.com
Mon Nov 24 20:36:47 UTC 2014
On 11/24/2014 12:48 PM, Laine Stump wrote:
> These functions all set/get items in the sysfs for a bridge device.
Probably could have split up the "virNetDevBridgePort*" from the
virNetDevBridgeSetVlanFiltering - if only to make it a bit clearer in
the commit message that you're adding functions to manage? the
BridgePort settings.
> ---
> src/libvirt_private.syms | 6 ++
> src/util/virnetdevbridge.c | 236 ++++++++++++++++++++++++++++++++++++++++++++-
> src/util/virnetdevbridge.h | 28 +++++-
> 3 files changed, 268 insertions(+), 2 deletions(-)
>
Couple of nits follow - not necessary for a v2.
ACK w/ the changes
John
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 2647d36..6453826 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -1662,9 +1662,15 @@ virNetDevBridgeCreate;
> virNetDevBridgeDelete;
> virNetDevBridgeGetSTP;
> virNetDevBridgeGetSTPDelay;
> +virNetDevBridgeGetVlanFiltering;
> +virNetDevBridgePortGetLearning;
> +virNetDevBridgePortGetUnicastFlood;
> +virNetDevBridgePortSetLearning;
> +virNetDevBridgePortSetUnicastFlood;
> virNetDevBridgeRemovePort;
> virNetDevBridgeSetSTP;
> virNetDevBridgeSetSTPDelay;
> +virNetDevBridgeSetVlanFiltering;
>
>
> # util/virnetdevmacvlan.h
> diff --git a/src/util/virnetdevbridge.c b/src/util/virnetdevbridge.c
> index 15434de..9be835c 100644
> --- a/src/util/virnetdevbridge.c
> +++ b/src/util/virnetdevbridge.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (C) 2007-2013 Red Hat, Inc.
> + * Copyright (C) 2007-2014 Red Hat, Inc.
> *
> * This library is free software; you can redistribute it and/or
> * modify it under the terms of the GNU Lesser General Public
> @@ -217,8 +217,175 @@ static int virNetDevBridgeGet(const char *brname,
> VIR_FREE(path);
> return ret;
> }
> +
Spurrious? Or evidence of moving things around late in self review?
> #endif /* __linux__ */
>
> +#if defined(__linux__)
> +static
> +int
place on same line, eg "static int" (vs. 2 lines)
> +virNetDevBridgePortSet(const char *brname,
> + const char *ifname,
> + const char *paramname,
> + unsigned long value)
> +{
> + char *path = NULL;
> + char valuestr[INT_BUFSIZE_BOUND(value)];
> + int ret = -1;
> +
> + snprintf(valuestr, sizeof(valuestr), "%lu", value);
> +
> + if (virAsprintf(&path, "%s/%s/brif/%s/%s",
> + SYSFS_NET_DIR, brname, ifname, paramname) < 0)
> + return -1;
> +
> + if (!virFileExists(path))
> + errno = EINVAL;
> + else
> + ret = virFileWriteStr(path, valuestr, 0);
> +
> + if (ret < 0) {
> + virReportSystemError(errno,
> + _("Unable to set bridge %s port %s %s to %s"),
> + brname, ifname, paramname, valuestr);
> + }
> +
> + VIR_FREE(path);
> + return ret;
> +}
> +
> +
> +static
> +int
ditto
> +virNetDevBridgePortGet(const char *brname,
> + const char *ifname,
> + const char *paramname,
> + unsigned long *value)
> +{
> + char *path = NULL;
> + char *valuestr = NULL;
> + int ret = -1;
> +
> + if (virAsprintf(&path, "%s/%s/brif/%s/%s",
> + SYSFS_NET_DIR, brname, ifname, paramname) < 0)
> + return -1;
> +
> + if (virFileReadAll(path, INT_BUFSIZE_BOUND(unsigned long), &valuestr) < 0)
> + goto cleanup;
> +
> + if (virStrToLong_ul(valuestr, NULL, 10, value) < 0) {
> + virReportSystemError(EINVAL,
> + _("Unable to get bridge %s port %s %s"),
> + brname, ifname, paramname);
> + goto cleanup;
> + }
> +
> + ret = 0;
> + cleanup:
> + VIR_FREE(path);
> + VIR_FREE(valuestr);
> + return ret;
> +}
> +
> +
> +int
> +virNetDevBridgePortGetLearning(const char *brname,
> + const char *ifname,
> + bool *enable)
> +{
> + int ret = -1;
> + unsigned long value;
> +
> + if (virNetDevBridgePortGet(brname, ifname, "learning", &value) < 0)
> + goto cleanup;
> +
> + *enable = !!value;
Every time I see one of these "!!"...
I see virNetDevBridgeGetSTP() uses *enabled = val ? true : false; -
that's at least easier to read for me. Your call on which way to go though.
> + ret = 0;
> + cleanup:
> + return ret;
> +}
> +
> +
> +int
> +virNetDevBridgePortSetLearning(const char *brname,
> + const char *ifname,
> + bool enable)
> +{
> + return virNetDevBridgePortSet(brname, ifname, "learning", enable ? 1 : 0);
> +}
> +
> +
> +int
> +virNetDevBridgePortGetUnicastFlood(const char *brname,
> + const char *ifname,
> + bool *enable)
> +{
> + int ret = -1;
> + unsigned long value;
> +
> + if (virNetDevBridgePortGet(brname, ifname, "unicast_flood", &value) < 0)
> + goto cleanup;
> +
> + *enable = !!value;
> + ret = 0;
> + cleanup:
> + return ret;
> +}
> +
> +
> +int
> +virNetDevBridgePortSetUnicastFlood(const char *brname,
> + const char *ifname,
> + bool enable)
> +{
> + return virNetDevBridgePortSet(brname, ifname, "unicast_flood", enable ? 1 : 0);
> +}
> +
> +
> +#else
> +int
> +virNetDevBridgePortGetLearning(const char *brname ATTRIBUTE_UNUSED,
> + const char *ifname ATTRIBUTE_UNUSED,
> + bool *enable ATTRIBUTE_UNUSED)
> +{
> + virReportSystemError(ENOSYS, "%s",
> + _("Unable to get bridge port learning on this platform"));
> + return -1;
> +}
> +
> +
> +int
> +virNetDevBridgePortSetLearning(const char *brname ATTRIBUTE_UNUSED,
> + const char *ifname ATTRIBUTE_UNUSED,
> + bool enable)
> +{
> + virReportSystemError(ENOSYS, "%s",
> + _("Unable to set bridge port learning on this platform"));
> + return -1;
> +}
> +
> +
> +int
> +virNetDevBridgePortGetUnicastFlood(const char *brname ATTRIBUTE_UNUSED,
> + const char *ifname ATTRIBUTE_UNUSED,
> + bool *enable ATTRIBUTE_UNUSED)
> +{
> + virReportSystemError(ENOSYS, "%s",
> + _("Unable to get bridge port unicast_flood on this platform"));
> + return -1;
> +}
> +
> +
> +int
> +virNetDevBridgePortSetUnicastFlood(const char *brname ATTRIBUTE_UNUSED,
> + const char *ifname ATTRIBUTE_UNUSED,
> + bool enable ATTRIBUTE_UNUSED)
> +{
> + virReportSystemError(ENOSYS, "%s",
> + _("Unable to set bridge port unicast_flood on this platform"));
> + return -1;
> +}
> +#endif
> +
>
> /**
> * virNetDevBridgeCreate:
> @@ -682,3 +849,70 @@ int virNetDevBridgeGetSTP(const char *brname,
> return -1;
> }
> #endif
> +
> +#if defined(HAVE_STRUCT_IFREQ) && defined(__linux__)
> +/**
> + * virNetDevBridgeGetVlanFiltering:
> + * @brname: the bridge device name
> + * @enable: true or false
> + *
> + * Retrives the vlan_filtering setting for the bridge device @brname
s/Retrives/Retrieves/
> + * storing it in @enable.
> + *
> + * Returns 0 on success, -1 on error+
There's an extraneous "+" at the end ^
> + */
> +int
> +virNetDevBridgeGetVlanFiltering(const char *brname,
> + bool *enable)
> +{
> + int ret = -1;
> + unsigned long value;
> +
> + if (virNetDevBridgeGet(brname, "vlan_filtering", &value, -1, NULL) < 0)
> + goto cleanup;
> +
> + *enable = !!value;
> + ret = 0;
> + cleanup:
> + return ret;
> +}
> +
> +
> +/**
> + * virNetDevBridgeSetVlanFiltering:
> + * @brname: the bridge name
> + * @enable: true or false
> + *
> + * Set the bridge vlan_filtering mode
> + *
> + * Returns 0 in case of success or -1 on failure
> + */
> +
> +int
> +virNetDevBridgeSetVlanFiltering(const char *brname,
> + bool enable)
> +{
> + return virNetDevBridgeSet(brname, "vlan_filtering", enable ? 1 : 0, -1, NULL);
> +}
> +
> +
> +#else
> +int
> +virNetDevBridgeGetVlanFiltering(const char *brname ATTRIBUTE_UNUSED,
> + bool *enable ATTRIBUTE_UNUSED)
> +{
> + virReportSystemError(ENOSYS, "%s",
> + _("Unable to get bridge vlan_filtering on this platform"));
> + return -1;
> +}
> +
> +
> +int
> +virNetDevBridgeSetVlanFiltering(const char *brname ATTRIBUTE_UNUSED,
> + bool enable ATTRIBUTE_UNUSED)
> +{
> + virReportSystemError(ENOSYS, "%s",
> + _("Unable to set bridge vlan_filtering on this platform"));
> + return -1;
> +}
> +#endif
> diff --git a/src/util/virnetdevbridge.h b/src/util/virnetdevbridge.h
> index 13776d2..8188a2f 100644
> --- a/src/util/virnetdevbridge.h
> +++ b/src/util/virnetdevbridge.h
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (C) 2007-2011 Red Hat, Inc.
> + * Copyright (C) 2007-2012, 2014 Red Hat, Inc.
I forget if we're just allowed to say 2007-2014...
> *
> * This library is free software; you can redistribute it and/or
> * modify it under the terms of the GNU Lesser General Public
> @@ -51,4 +51,30 @@ int virNetDevBridgeGetSTP(const char *brname,
> bool *enable)
> ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
>
> +int virNetDevBridgeSetVlanFiltering(const char *brname,
> + bool enable)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
> +int virNetDevBridgeGetVlanFiltering(const char *brname,
> + bool *enable)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
> +
> +int virNetDevBridgePortGetLearning(const char *brname,
> + const char *ifname,
> + bool *enable)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
> + ATTRIBUTE_RETURN_CHECK;
> +int virNetDevBridgePortSetLearning(const char *brname,
> + const char *ifname,
> + bool enable)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
> +int virNetDevBridgePortGetUnicastFlood(const char *brname,
> + const char *ifname,
> + bool *enable)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
> + ATTRIBUTE_RETURN_CHECK;
> +int virNetDevBridgePortSetUnicastFlood(const char *brname,
> + const char *ifname,
> + bool enable)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
> +
> #endif /* __VIR_NETDEV_BRIDGE_H__ */
>
More information about the libvir-list
mailing list