[libvirt] [PATCHv2 4/6] interface: Improve udev backend device type id
Laine Stump
laine at laine.org
Thu Feb 21 21:05:30 UTC 2013
On 02/20/2013 02:56 PM, Doug Goldstein wrote:
> Refactored the interface device type identification to make it more
> clear about the operations. Add support for udev devtype to detect
> VLANs on Linux 3.7 and newer. Move VLAN detection based on device
> name to fallback case.
> ---
> src/interface/interface_backend_udev.c | 46 +++++++++++++++++++++++++---------
> 1 file changed, 34 insertions(+), 12 deletions(-)
>
> diff --git a/src/interface/interface_backend_udev.c b/src/interface/interface_backend_udev.c
> index e5ab1a7..db4e7d1 100644
> --- a/src/interface/interface_backend_udev.c
> +++ b/src/interface/interface_backend_udev.c
> @@ -684,9 +684,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;
> @@ -707,6 +704,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) {
> @@ -716,7 +714,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) {
> @@ -753,18 +750,43 @@ 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 */
> - vlan_parent_dev = strrchr(name, '.');
> - if (vlan_parent_dev) {
> + /* 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. */
> + if (ifacedef->type == VIR_INTERFACE_TYPE_ETHERNET) {
> + /* 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;
> + }
> + }
> +
> + 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) < 0)
> 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);
ACK.
More information about the libvir-list
mailing list