Blob Blame History Raw
From 19e65d172c8abe5d0dc9f49cbffa0a85f1a9ed79 Mon Sep 17 00:00:00 2001
From: Chad Kimes <chkimes@github.com>
Date: Mon, 21 Mar 2022 18:07:32 -0400
Subject: [PATCH 336/336] net/drivers/efi/efinet: Configure VLAN from UEFI
 device used for PXE

This patch handles automatic configuration of VLAN when booting from PXE
on UEFI hardware.

Signed-off-by: Chad Kimes <chkimes@github.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
---
 grub-core/net/drivers/efi/efinet.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c
index 1a24f38a2..8b039a69a 100644
--- a/grub-core/net/drivers/efi/efinet.c
+++ b/grub-core/net/drivers/efi/efinet.c
@@ -734,6 +734,10 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
 {
   struct grub_net_card *card;
   grub_efi_device_path_t *dp, *ldp = NULL;
+  struct grub_net_network_level_interface *inter;
+  grub_efi_device_path_t *vlan_dp;
+  grub_efi_uint16_t vlan_dp_len;
+  grub_efi_vlan_device_path_t *vlan;
 
   dp = grub_efi_get_device_path (hnd);
   if (! dp)
@@ -871,7 +875,7 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
               }
           }
 
-	grub_net_configure_by_dhcp_ack (card->name, card, 0,
+	inter = grub_net_configure_by_dhcp_ack (card->name, card, 0,
 					(struct grub_net_bootp_packet *)
 					&pxe_mode->dhcp_ack,
 					sizeof (pxe_mode->dhcp_ack),
@@ -882,6 +886,28 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
     if (nb)
       grub_netbuff_free (nb);
 
+    if (inter != NULL)
+      {
+    	/*
+    	 * Search the device path for any VLAN subtype and use it
+    	 * to configure the interface.
+    	 */
+    	vlan_dp = dp;
+    
+    	while (!GRUB_EFI_END_ENTIRE_DEVICE_PATH (vlan_dp))
+    	  {
+    	    if (GRUB_EFI_DEVICE_PATH_TYPE (vlan_dp) == GRUB_EFI_MESSAGING_DEVICE_PATH_TYPE &&
+    		GRUB_EFI_DEVICE_PATH_SUBTYPE (vlan_dp) == GRUB_EFI_VLAN_DEVICE_PATH_SUBTYPE)
+    	      {
+    		vlan = (grub_efi_vlan_device_path_t *) vlan_dp;
+    		inter->vlantag = vlan->vlan_id;
+    		break;
+    	      }
+    
+    	    vlan_dp_len = GRUB_EFI_DEVICE_PATH_LENGTH (vlan_dp);
+    	    vlan_dp = (grub_efi_device_path_t *) ((grub_efi_uint8_t *) vlan_dp + vlan_dp_len);
+    	  }
+      }
     return;
   }
 }
-- 
2.41.0