From 2c9bfec06e54f7f433321c4f87fdd415cf4fe19c Mon Sep 17 00:00:00 2001
From: Susant Sahani <susant.sahani@broadcom.com>
Date: Tue, 2 Jan 2024 14:47:07 +0000
Subject: [PATCH] enoX uses instance number for vmware hv
---
src/udev/udev-builtin-net_id.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
index 91b4008..9578919 100644
--- a/src/udev/udev-builtin-net_id.c
+++ b/src/udev/udev-builtin-net_id.c
@@ -302,6 +302,29 @@ static int pci_get_onboard_index(sd_device *dev, unsigned *ret) {
if (idx == 0 && !naming_scheme_has(NAMING_ZERO_ACPI_INDEX))
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(EINVAL),
"Naming scheme does not allow onboard index==0.");
+
+ if (idx >> 24) {
+ unsigned domain, bus, slot, func;
+ const char *device_sysname;
+ /*
+ * VMware acpi_index format:
+ * |31 instance 24|23 16|15 8|7 3|2 0|
+ * | number | domain? | bus | slot | func |
+ *
+ * Let's use instance number to get enoX human readable
+ */
+
+ r = sd_device_get_sysname(dev, &device_sysname);
+ if (r < 0)
+ return r;
+
+ if (sscanf(device_sysname, "%x:%x:%x.%u", &domain, &bus, &slot, &func) != 4)
+ return -ENOENT;
+
+ if ((idx & 0xffff) == ((bus << 8) | (slot << 3) | func))
+ idx >>= 24;
+ }
+
if (!is_valid_onboard_index(idx))
return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ENOENT),
"Not a valid onboard index: %u", idx);
--
2.39.0