EDK2 PXE driver creates two child devices - IPv4 and IPv6 - with bound SNP 
instances.
When VLAN is configured, VLAN device path nodes will be added to these two 
child devices.

Example of device hierarchy is

 PciRoot(0x0)/Pci(0x2,0x0)/Pci(0x0,0x0)/MAC(525400123456,0x1)
   
PciRoot(0x0)/Pci(0x2,0x0)/Pci(0x0,0x0)/MAC(525400123456,0x1)/Vlan(4084)/IPv4(0.0.0.0)
   
PciRoot(0x0)/Pci(0x2,0x0)/Pci(0x0,0x0)/MAC(525400123456,0x1)/Vlan(4084)/IPv6(0000:0000:0000:0000:0000:0000:0000:0000)

This means we should skip PXE created virtual devices when enumerating cards. 
Make sure to
find real card when applying initial autoconfiguration during PXE boot, this 
information is
associated with one of child devices.

Signed-off-by: Qiumiao Zhang <zhangqiumi...@huawei.com>
---
 grub-core/net/drivers/efi/efinet.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/grub-core/net/drivers/efi/efinet.c 
b/grub-core/net/drivers/efi/efinet.c
index 3ea25cf98..ffeb99dfc 100644
--- a/grub-core/net/drivers/efi/efinet.c
+++ b/grub-core/net/drivers/efi/efinet.c
@@ -276,7 +276,8 @@ grub_efinet_findcards (void)
              || GRUB_EFI_DEVICE_PATH_SUBTYPE (child) == 
GRUB_EFI_IPV6_DEVICE_PATH_SUBTYPE)
          && parent
          && GRUB_EFI_DEVICE_PATH_TYPE (parent) == 
GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE
-         && GRUB_EFI_DEVICE_PATH_SUBTYPE (parent) == 
GRUB_EFI_MAC_ADDRESS_DEVICE_PATH_SUBTYPE)
+         && (GRUB_EFI_DEVICE_PATH_SUBTYPE (parent) == 
GRUB_EFI_MAC_ADDRESS_DEVICE_PATH_SUBTYPE
+             || GRUB_EFI_DEVICE_PATH_SUBTYPE (parent) == 
GRUB_EFI_VLAN_DEVICE_PATH_SUBTYPE))
        continue;
 
       net = grub_efi_open_protocol (*handle, &net_io_guid,
@@ -389,6 +390,14 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char 
**device,
        dup_ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
        dup_ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
        dup_ldp->length = sizeof (*dup_ldp);
+
+       dup_ldp = grub_efi_find_last_device_path (dup_dp);
+       if (GRUB_EFI_DEVICE_PATH_SUBTYPE (dup_ldp) == 
GRUB_EFI_VLAN_DEVICE_PATH_SUBTYPE)
+         {
+           dup_ldp->type = GRUB_EFI_END_DEVICE_PATH_TYPE;
+           dup_ldp->subtype = GRUB_EFI_END_ENTIRE_DEVICE_PATH_SUBTYPE;
+           dup_ldp->length = sizeof (*dup_ldp);
+         }
        match = grub_efi_compare_device_paths (dup_dp, cdp) == 0;
        grub_free (dup_dp);
        if (!match)
-- 
2.28.0.windows.1


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to