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,
* 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
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);
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)