diff options
author | Tom Gundersen <teg@jklm.no> | 2015-04-01 16:51:02 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-04-01 22:56:27 +0200 |
commit | c0a43734ca84a3c9170d4a2d7f4d329b9ef47abc (patch) | |
tree | f4f034e3a9f75b243945d9a6643e77d286ef1a0c /src | |
parent | 16f948cb208f1db9a1665f07ac9b22e416dc19d4 (diff) |
udev: net_id - support multi-port enpo* device names
I'd argue that having firmware labels for such devices makes
no sense, but they exist, so make sure we handle them as best
as we can.
Diffstat (limited to 'src')
-rw-r--r-- | src/udev/udev-builtin-net_id.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c index 71f3a5970f..0f5b11d4d1 100644 --- a/src/udev/udev-builtin-net_id.c +++ b/src/udev/udev-builtin-net_id.c @@ -35,7 +35,7 @@ * Type of names: * b<number> -- BCMA bus core number * ccw<name> -- CCW bus group name - * o<index> -- on-board device index number + * o<index>[d<dev_port>] -- on-board device index number * s<slot>[f<function>][d<dev_port>] -- hotplug slot index number * x<MAC> -- MAC address * [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>] @@ -128,22 +128,39 @@ struct netnames { /* retrieve on-board index number and label from firmware */ static int dev_pci_onboard(struct udev_device *dev, struct netnames *names) { - const char *index; + unsigned dev_port = 0; + size_t l; + char *s; + const char *attr; int idx; /* ACPI _DSM -- device specific method for naming a PCI or PCI Express device */ - index = udev_device_get_sysattr_value(names->pcidev, "acpi_index"); + attr = udev_device_get_sysattr_value(names->pcidev, "acpi_index"); /* SMBIOS type 41 -- Onboard Devices Extended Information */ - if (!index) - index = udev_device_get_sysattr_value(names->pcidev, "index"); - if (!index) + if (!attr) + attr = udev_device_get_sysattr_value(names->pcidev, "index"); + if (!attr) return -ENOENT; - idx = strtoul(index, NULL, 0); + + idx = strtoul(attr, NULL, 0); if (idx <= 0) return -EINVAL; - snprintf(names->pci_onboard, sizeof(names->pci_onboard), "o%d", idx); + + /* kernel provided multi-device index */ + attr = udev_device_get_sysattr_value(dev, "dev_port"); + if (attr) + dev_port = strtol(attr, NULL, 10); + + s = names->pci_onboard; + l = sizeof(names->pci_onboard); + l = strpcpyf(&s, l, "o%d", idx); + if (dev_port > 0) + l = strpcpyf(&s, l, "d%d", dev_port); + if (l == 0) + names->pci_onboard[0] = '\0'; names->pci_onboard_label = udev_device_get_sysattr_value(names->pcidev, "label"); + return 0; } |