[libvirt] [PATCH 3/4] interface: Refactor udev backend device type id
Laine Stump
laine at laine.org
Mon Feb 18 20:37:52 UTC 2013
On 02/17/2013 08:56 PM, Doug Goldstein wrote:
> Refactored the interface device type identification to make it more
> clear about the operations.
> ---
> src/interface/interface_backend_udev.c | 43 ++++++++++++++++++++++++----------
> 1 file changed, 30 insertions(+), 13 deletions(-)
>
> diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
> index c144978..73494a6 100644
> --- a/src/interface/interface_backend_udev.c
> +++ b/src/interface/interface_backend_udev.c
> @@ -561,9 +561,6 @@ udevIfaceGetIfaceDefBridge(struct udev *udev,
> int stp;
> int i;
>
> - /* Set our type to Bridge */
> - ifacedef->type = VIR_INTERFACE_TYPE_BRIDGE;
> -
> /* Bridge specifics */
> ifacedef->data.bridge.delay =
> strdup(udev_device_get_sysattr_value(dev, "bridge/forward_delay"));
> @@ -665,9 +662,6 @@ udevIfaceGetIfaceDefVlan(struct udev *udev ATTRIBUTE_UNUSED,
> vid[0] = '\0';
> vid++;
>
> - /* Set our type to VLAN */
> - ifacedef->type = VIR_INTERFACE_TYPE_VLAN;
> -
> /* Set the VLAN specifics */
> ifacedef->data.vlan.tag = vid;
> ifacedef->data.vlan.devname = vlan_parent_dev;
> @@ -688,6 +682,7 @@ udevIfaceGetIfaceDef(struct udev *udev, const char *name)
> unsigned int mtu;
> const char *mtu_str;
> char *vlan_parent_dev = NULL;
> + const char *devtype;
>
> /* Allocate our interface definition structure */
> if (VIR_ALLOC(ifacedef) < 0) {
> @@ -697,7 +692,6 @@ udevIfaceGetIfaceDef(struct udev *udev, const char *name)
>
> /* Clear our structure and set safe defaults */
> ifacedef->startmode = VIR_INTERFACE_START_UNSPECIFIED;
> - ifacedef->type = VIR_INTERFACE_TYPE_ETHERNET;
> ifacedef->name = strdup(name);
>
> if (!ifacedef->name) {
> @@ -734,18 +728,41 @@ udevIfaceGetIfaceDef(struct udev *udev, const char *name)
> ifacedef->nprotos = 0;
> ifacedef->protos = NULL;
>
> - /* Check if its a VLAN since we can have a VLAN of any of the
> - * other devices */
> + /* Check the type of device we are working with based on the devtype */
> + devtype = udev_device_get_devtype(dev);
> +
> + /* Set our type to ethernet as the default case */
> + ifacedef->type = VIR_INTERFACE_TYPE_ETHERNET;
> +
> + if (STREQ_NULLABLE(devtype, "vlan")) {
> + /* This only works on modern kernels (3.7 and newer)
> + * e949b09b71d975a82f13ac88ce4ad338fed213da
> + */
> + ifacedef->type = VIR_INTERFACE_TYPE_VLAN;
> + } else if (STREQ_NULLABLE(devtype, "bridge")) {
> + ifacedef->type = VIR_INTERFACE_TYPE_BRIDGE;
> + }
> +
> + /* Fallback checks if the devtype check didn't work, first
> + * check if its a VLAN based on the name containing a dot,
> + * to prevent false positives
> + */
> vlan_parent_dev = strrchr(name, '.');
> if (vlan_parent_dev) {
> + ifacedef->type = VIR_INTERFACE_TYPE_VLAN;
> + }
So on kernels prior to 3.7, the devtype would still be, e.g. "ethernet",
but the "." in the name would just imply that it's a vlan device?
ACK if my understanding is correct.
> +
> + switch (ifacedef->type) {
> + case VIR_INTERFACE_TYPE_VLAN:
> if (udevIfaceGetIfaceDefVlan(udev, dev, name, ifacedef))
> goto cleanup;
> - } else if (STREQ_NULLABLE(udev_device_get_devtype(dev), "bridge")) {
> + break;
> + case VIR_INTERFACE_TYPE_BRIDGE:
> if (udevIfaceGetIfaceDefBridge(udev, dev, name, ifacedef))
> goto cleanup;
> - } else {
> - /* Set our type to ethernet */
> - ifacedef->type = VIR_INTERFACE_TYPE_ETHERNET;
> + break;
> + case VIR_INTERFACE_TYPE_ETHERNET:
> + break;
> }
>
> udev_device_unref(dev);
More information about the libvir-list
mailing list