* b<number> -- BCMA bus core number
* ccw<name> -- CCW bus group name
* o<index> -- on-board device index number
- * s<slot>[f<function>][d<dev_id>] -- hotplug slot 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_id>]
+ * [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>]
* -- PCI geographical location
* [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
* -- USB port number chain
#include <string.h>
#include <errno.h>
#include <net/if.h>
+#include <net/if_arp.h>
#include <linux/pci_regs.h>
#include "udev.h"
/* read the 256 bytes PCI configuration space to check the multi-function bit */
static bool is_pci_multifunction(struct udev_device *dev) {
- char filename[256];
- FILE *f = NULL;
- char config[64];
- bool multi = false;
+ _cleanup_fclose_ FILE *f = NULL;
+ const char *filename;
+ uint8_t config[64];
- snprintf(filename, sizeof(filename), "%s/config", udev_device_get_syspath(dev));
+ filename = strappenda(udev_device_get_syspath(dev), "/config");
f = fopen(filename, "re");
if (!f)
- goto out;
+ return false;
if (fread(&config, sizeof(config), 1, f) != 1)
- goto out;
+ return false;
/* bit 0-6 header type, bit 7 multi/single function device */
if ((config[PCI_HEADER_TYPE] & 0x80) != 0)
- multi = true;
-out:
- if (f)
- fclose(f);
- return multi;
+ return true;
+
+ return false;
}
static int dev_pci_slot(struct udev_device *dev, struct netnames *names) {
struct udev *udev = udev_device_get_udev(names->pcidev);
- unsigned domain, bus, slot, func, dev_id = 0;
+ unsigned domain, bus, slot, func, dev_port = 0;
size_t l;
char *s;
const char *attr;
return -ENOENT;
/* kernel provided multi-device index */
- attr = udev_device_get_sysattr_value(dev, "dev_id");
+ attr = udev_device_get_sysattr_value(dev, "dev_port");
if (attr)
- dev_id = strtol(attr, NULL, 16);
+ dev_port = strtol(attr, NULL, 10);
/* compose a name based on the raw kernel's PCI bus, slot numbers */
s = names->pci_path;
l = strpcpyf(&s, l, "p%ds%d", bus, slot);
if (func > 0 || is_pci_multifunction(names->pcidev))
l = strpcpyf(&s, l, "f%d", func);
- if (dev_id > 0)
- l = strpcpyf(&s, l, "d%d", dev_id);
+ if (dev_port > 0)
+ l = strpcpyf(&s, l, "d%d", dev_port);
if (l == 0)
names->pci_path[0] = '\0';
l = strpcpyf(&s, l, "s%d", hotplug_slot);
if (func > 0 || is_pci_multifunction(names->pcidev))
l = strpcpyf(&s, l, "f%d", func);
- if (dev_id > 0)
- l = strpcpyf(&s, l, "d%d", dev_id);
+ if (dev_port > 0)
+ l = strpcpyf(&s, l, "d%d", dev_port);
if (l == 0)
names->pci_path[0] = '\0';
}
return EXIT_FAILURE;
i = strtoul(s, NULL, 0);
switch (i) {
- case 1: /* ARPHRD_ETHER */
+ case ARPHRD_ETHER:
prefix = "en";
break;
- case 256: /* ARPHRD_SLIP */
+ case ARPHRD_SLIP:
prefix = "sl";
break;
default: