diff options
Diffstat (limited to 'src/udev')
-rw-r--r-- | src/udev/udev-builtin-net_id.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c index b91ca9df5b..c3220565ed 100644 --- a/src/udev/udev-builtin-net_id.c +++ b/src/udev/udev-builtin-net_id.c @@ -101,6 +101,7 @@ enum netname_type{ NET_PCI, NET_USB, NET_BCMA, + NET_VIRTIO, }; struct netnames { @@ -118,6 +119,8 @@ struct netnames { char usb_ports[IFNAMSIZ]; char bcma_core[IFNAMSIZ]; + + char virtio_core[IFNAMSIZ]; }; /* retrieve on-board index number and label from firmware */ @@ -344,6 +347,25 @@ static int names_bcma(struct udev_device *dev, struct netnames *names) { return 0; } +static int names_virtio(struct udev_device *dev, struct netnames *names) { + struct udev_device *virtdev; + unsigned int core; + + virtdev = udev_device_get_parent_with_subsystem_devtype(dev, "virtio", NULL); + if (!virtdev) + return -ENOENT; + + /* core num */ + if (sscanf(udev_device_get_sysname(virtdev), "virtio%u", &core) != 1) + return -EINVAL; + /* suppress the common core == 0 */ + if (core > 0) + snprintf(names->virtio_core, sizeof(names->virtio_core), "v%u", core); + + names->type = NET_VIRTIO; + return 0; +} + static int names_mac(struct udev_device *dev, struct netnames *names) { const char *s; unsigned int i; @@ -497,6 +519,21 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool goto out; } + /* virtio bus */ + err = names_virtio(dev, &names); + if (err >= 0 && names.type == NET_VIRTIO) { + char str[IFNAMSIZ]; + + if (names.pci_path[0]) + if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_path, names.virtio_core) < (int)sizeof(str)) + udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str); + + if (names.pci_slot[0]) + if (snprintf(str, sizeof(str), "%s%s%s", prefix, names.pci_slot, names.virtio_core) < (int)sizeof(str)) + udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str); + goto out; + } + out: return EXIT_SUCCESS; } |