diff --git a/man/systemd.net-naming-scheme.xml b/man/systemd.net-naming-scheme.xml index bb78990145..f825a841a1 100644 --- a/man/systemd.net-naming-scheme.xml +++ b/man/systemd.net-naming-scheme.xml @@ -534,6 +534,9 @@ PCI slot number is now read from firmware_node/sun sysfs file. + The naming scheme based on devicetree aliases was extended to support aliases for individual + interfaces of controllers with multiple ports. + diff --git a/src/shared/netif-naming-scheme.h b/src/shared/netif-naming-scheme.h index 45a5329185..3ab1d752c8 100644 --- a/src/shared/netif-naming-scheme.h +++ b/src/shared/netif-naming-scheme.h @@ -40,10 +40,11 @@ typedef enum NamingSchemeFlags { NAMING_XEN_VIF = 1 << 13, /* Generate names for Xen netfront devices */ NAMING_BRIDGE_MULTIFUNCTION_SLOT = 1 << 14, /* Use PCI hotplug slot information associated with bridge, but only if PCI device is multifunction. * This is disabled since v255, as it seems not to work at least for some setups. See issue #28929. */ - NAMING_DEVICETREE_ALIASES = 1 << 15, /* Generate names from devicetree aliases */ + NAMING_DEVICETREE_ALIASES = 1 << 15, /* Generate names from devicetree aliases of a netdev's parent's OF node */ NAMING_USB_HOST = 1 << 16, /* Generate names for usb host */ NAMING_SR_IOV_R = 1 << 17, /* Use "r" suffix for SR-IOV VF representors */ NAMING_FIRMWARE_NODE_SUN = 1 << 18, /* Use firmware_node/sun to get PCI slot number */ + NAMING_DEVICETREE_PORT_ALIASES = 1 << 19, /* Include aliases of OF nodes of a netdev itself, not just its parent. See PR #33958. */ /* And now the masks that combine the features above */ NAMING_V238 = 0, @@ -63,7 +64,7 @@ typedef enum NamingSchemeFlags { * patch later. NAMING_SR_IOV_R is enabled by default in * systemd version 255, naming scheme "v255". */ NAMING_V255 = NAMING_V254 & ~NAMING_BRIDGE_MULTIFUNCTION_SLOT, - NAMING_V257 = NAMING_V255 | NAMING_FIRMWARE_NODE_SUN, + NAMING_V257 = NAMING_V255 | NAMING_FIRMWARE_NODE_SUN | NAMING_DEVICETREE_PORT_ALIASES, EXTRA_NET_NAMING_SCHEMES diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c index d34357fdb2..5094b95373 100644 --- a/src/udev/udev-builtin-net_id.c +++ b/src/udev/udev-builtin-net_id.c @@ -822,7 +822,6 @@ static int names_platform(sd_device *dev, const char *prefix, EventMode mode) { static int names_devicetree(sd_device *dev, const char *prefix, EventMode mode) { _cleanup_(sd_device_unrefp) sd_device *aliases_dev = NULL, *ofnode_dev = NULL, *devicetree_dev = NULL; const char *ofnode_path, *ofnode_syspath, *devicetree_syspath; - sd_device *parent; int r; assert(dev); @@ -835,14 +834,24 @@ static int names_devicetree(sd_device *dev, const char *prefix, EventMode mode) if (!streq(prefix, "en")) return -EOPNOTSUPP; - /* check if our direct parent has an of_node */ - r = sd_device_get_parent(dev, &parent); - if (r < 0) - return log_device_debug_errno(dev, r, "Failed to get parent device: %m"); + /* check if the device itself has an of_node */ + if (naming_scheme_has(NAMING_DEVICETREE_PORT_ALIASES)) { + r = sd_device_new_child(&ofnode_dev, dev, "of_node"); + if (r < 0) + log_device_debug_errno(dev, r, "Failed to get device of_node, ignoring: %m"); + } + if (!ofnode_dev) { + sd_device *parent; - r = sd_device_new_child(&ofnode_dev, parent, "of_node"); - if (r < 0) - return log_device_debug_errno(parent, r, "Failed to get 'of_node' child device: %m"); + /* check if our direct parent has an of_node as a fallback */ + r = sd_device_get_parent(dev, &parent); + if (r < 0) + return log_device_debug_errno(dev, r, "Failed to get parent device: %m"); + + r = sd_device_new_child(&ofnode_dev, parent, "of_node"); + if (r < 0) + return log_device_debug_errno(parent, r, "Failed to get device of_node: %m"); + } r = sd_device_get_syspath(ofnode_dev, &ofnode_syspath); if (r < 0)