mirror of
https://github.com/systemd/systemd.git
synced 2024-11-01 17:51:22 +03:00
udev: net_id - suppress function number for single-function devices
This commit is contained in:
parent
2ab38e24e5
commit
de892aea1c
@ -24,16 +24,20 @@
|
|||||||
* ww -- wwan
|
* ww -- wwan
|
||||||
*
|
*
|
||||||
* types:
|
* types:
|
||||||
* o<index> -- on-board device index
|
* o<index> -- on-board device index
|
||||||
* s<slot>f<function> -- hotplug slot number
|
* s<slot>[f<function>] -- hotplug slot number
|
||||||
* x<MAC> -- MAC address
|
* x<MAC> -- MAC address
|
||||||
* p<bus>s<slot>f<function> -- PCI/physical location
|
* p<bus>s<slot>[f<function>] -- PCI/physical location
|
||||||
*
|
*
|
||||||
* example:
|
* example:
|
||||||
* ID_NET_NAME_ONBOARD=eno1
|
* ID_NET_NAME_ONBOARD=eno1
|
||||||
* ID_NET_NAME_SLOT=ens1f0
|
* ID_NET_NAME_SLOT=ens1
|
||||||
|
* ID_NET_NAME_SLOT=ens2f0
|
||||||
|
* ID_NET_NAME_SLOT=ens2f1
|
||||||
* ID_NET_NAME_MAC=enxf0def180d479
|
* ID_NET_NAME_MAC=enxf0def180d479
|
||||||
* ID_NET_NAME_PATH=enp19s0f0
|
* ID_NET_NAME_PATH=enp0s25
|
||||||
|
* ID_NET_NAME_PATH=enp19s3f0
|
||||||
|
* ID_NET_NAME_PATH=enp19s3f1
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -42,6 +46,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <linux/pci_regs.h>
|
||||||
|
|
||||||
#include "udev.h"
|
#include "udev.h"
|
||||||
|
|
||||||
@ -77,6 +82,27 @@ static int dev_pci_onboard(struct udev_device *dev, struct udev_device *parent,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool is_pci_singlefunction(struct udev_device *dev) {
|
||||||
|
char filename[256];
|
||||||
|
FILE *f;
|
||||||
|
char config[256];
|
||||||
|
bool single = false;
|
||||||
|
|
||||||
|
snprintf(filename, sizeof(filename), "%s/config", udev_device_get_syspath(dev));
|
||||||
|
f = fopen(filename, "re");
|
||||||
|
if (!f)
|
||||||
|
goto out;
|
||||||
|
if (fread(&config, sizeof(config), 1, f) != 1)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
/* bit 0-6 header type, bit 7 multi/single function device */
|
||||||
|
if ((config[PCI_HEADER_TYPE] & 0x80) == 0)
|
||||||
|
single = true;
|
||||||
|
out:
|
||||||
|
fclose(f);
|
||||||
|
return single;
|
||||||
|
}
|
||||||
|
|
||||||
static int dev_pci_slot(struct udev_device *dev, struct udev_device *parent, const char *prefix, bool test) {
|
static int dev_pci_slot(struct udev_device *dev, struct udev_device *parent, const char *prefix, bool test) {
|
||||||
struct udev *udev = udev_device_get_udev(dev);
|
struct udev *udev = udev_device_get_udev(dev);
|
||||||
unsigned int bus;
|
unsigned int bus;
|
||||||
@ -93,7 +119,10 @@ static int dev_pci_slot(struct udev_device *dev, struct udev_device *parent, con
|
|||||||
/* compose a name based on the raw kernel's PCI bus, slot numbers */
|
/* compose a name based on the raw kernel's PCI bus, slot numbers */
|
||||||
if (sscanf(udev_device_get_sysname(parent), "0000:%x:%x.%d", &bus, &slot, &func) != 3)
|
if (sscanf(udev_device_get_sysname(parent), "0000:%x:%x.%d", &bus, &slot, &func) != 3)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
snprintf(str, sizeof(str), "%sp%ds%df%d", prefix, bus, slot, func);
|
if (func == 0 && is_pci_singlefunction(parent))
|
||||||
|
snprintf(str, sizeof(str), "%sp%ds%d", prefix, bus, slot);
|
||||||
|
else
|
||||||
|
snprintf(str, sizeof(str), "%sp%ds%df%d", prefix, bus, slot, func);
|
||||||
err = udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
err = udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
@ -137,7 +166,10 @@ static int dev_pci_slot(struct udev_device *dev, struct udev_device *parent, con
|
|||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
|
||||||
if (hotplug_slot > 0) {
|
if (hotplug_slot > 0) {
|
||||||
snprintf(str, sizeof(str), "%ss%df%d", prefix, hotplug_slot, func);
|
if (func == 0 && is_pci_singlefunction(parent))
|
||||||
|
snprintf(str, sizeof(str), "%ss%d", prefix, hotplug_slot);
|
||||||
|
else
|
||||||
|
snprintf(str, sizeof(str), "%ss%df%d", prefix, hotplug_slot, func);
|
||||||
err = udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
err = udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
Loading…
Reference in New Issue
Block a user