diff options
-rw-r--r-- | src/include/ipxe/efi/efi_path.h | 1 | ||||
-rw-r--r-- | src/interface/efi/efi_path.c | 23 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/include/ipxe/efi/efi_path.h b/src/include/ipxe/efi/efi_path.h index 18810a751..9dea74b5a 100644 --- a/src/include/ipxe/efi/efi_path.h +++ b/src/include/ipxe/efi/efi_path.h @@ -26,6 +26,7 @@ efi_path_next ( EFI_DEVICE_PATH_PROTOCOL *path ); extern EFI_DEVICE_PATH_PROTOCOL * efi_path_end ( EFI_DEVICE_PATH_PROTOCOL *path ); extern size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *path ); +extern unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL *path ); extern EFI_DEVICE_PATH_PROTOCOL * efi_paths ( EFI_DEVICE_PATH_PROTOCOL *first, ... ); extern EFI_DEVICE_PATH_PROTOCOL * efi_netdev_path ( struct net_device *netdev ); diff --git a/src/interface/efi/efi_path.c b/src/interface/efi/efi_path.c index 937d3c704..fb0f3059d 100644 --- a/src/interface/efi/efi_path.c +++ b/src/interface/efi/efi_path.c @@ -95,6 +95,29 @@ size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *path ) { } /** + * Get VLAN tag from device path + * + * @v path Device path + * @ret tag VLAN tag, or 0 if not a VLAN + */ +unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL *path ) { + EFI_DEVICE_PATH_PROTOCOL *next; + VLAN_DEVICE_PATH *vlan; + + /* Search for VLAN device path */ + for ( ; ( next = efi_path_next ( path ) ) ; path = next ) { + if ( ( path->Type == MESSAGING_DEVICE_PATH ) && + ( path->SubType == MSG_VLAN_DP ) ) { + vlan = container_of ( path, VLAN_DEVICE_PATH, Header ); + return vlan->VlanId; + } + } + + /* No VLAN device path found */ + return 0; +} + +/** * Concatenate EFI device paths * * @v ... List of device paths (NULL terminated) |