aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChad Kimes <chkimes@github.com>2022-03-21 18:07:32 -0400
committerDaniel Kiper <daniel.kiper@oracle.com>2022-04-20 14:20:36 +0200
commit9322a7740f7ca48d0b23a231af1c7807d9f7b5dd (patch)
tree8533f798263c83b9784ec4066c0dd6d0705b92d8
parentc143056a34b4ccc255a6ad4e96a5aa989d304760 (diff)
downloadgrub-9322a7740f7ca48d0b23a231af1c7807d9f7b5dd.tar.gz
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>
-rw-r--r--grub-core/net/drivers/efi/efinet.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/grub-core/net/drivers/efi/efinet.c b/grub-core/net/drivers/efi/efinet.c
index 24aabdab6..73343d26d 100644
--- a/grub-core/net/drivers/efi/efinet.c
+++ b/grub-core/net/drivers/efi/efinet.c
@@ -339,6 +339,10 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
{
struct grub_net_card *card;
grub_efi_device_path_t *dp;
+ 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)
@@ -387,11 +391,35 @@ grub_efi_net_config_real (grub_efi_handle_t hnd, char **device,
if (! pxe)
continue;
pxe_mode = pxe->mode;
- grub_net_configure_by_dhcp_ack (card->name, card, 0,
- (struct grub_net_bootp_packet *)
- &pxe_mode->dhcp_ack,
- sizeof (pxe_mode->dhcp_ack),
- 1, device, path);
+
+ 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),
+ 1, device, path);
+
+ 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;
}
}