[efi] Add efi_path_mac() to parse a MAC address from an EFI device path

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/1130/merge
Michael Brown 2024-03-26 15:16:33 +00:00
parent dcad73ca5a
commit 170bbfd487
2 changed files with 25 additions and 0 deletions

View File

@ -43,6 +43,7 @@ efi_path_prev ( 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 void * efi_path_mac ( EFI_DEVICE_PATH_PROTOCOL *path );
extern unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL *path );
extern int efi_path_guid ( EFI_DEVICE_PATH_PROTOCOL *path, union uuid *uuid );
extern struct uri * efi_path_uri ( EFI_DEVICE_PATH_PROTOCOL *path );

View File

@ -111,6 +111,30 @@ size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *path ) {
return ( ( ( void * ) end ) - ( ( void * ) path ) );
}
/**
* Get MAC address from device path
*
* @v path Device path
* @ret mac MAC address, or NULL if not found
*/
void * efi_path_mac ( EFI_DEVICE_PATH_PROTOCOL *path ) {
EFI_DEVICE_PATH_PROTOCOL *next;
MAC_ADDR_DEVICE_PATH *mac;
/* Search for MAC address path */
for ( ; ( next = efi_path_next ( path ) ) ; path = next ) {
if ( ( path->Type == MESSAGING_DEVICE_PATH ) &&
( path->SubType == MSG_MAC_ADDR_DP ) ) {
mac = container_of ( path, MAC_ADDR_DEVICE_PATH,
Header );
return &mac->MacAddress;
}
}
/* No MAC address found */
return NULL;
}
/**
* Get VLAN tag from device path
*