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