summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2024-03-26 16:16:33 +0100
committerMichael Brown2024-03-26 16:16:33 +0100
commit170bbfd4875b2a3479101b5f5892cdedcf857fd0 (patch)
tree36f5aed7cdabbd80b26925ae729bf33ccf4d2926
parent[efi] Add support for driving EFI_MANAGED_NETWORK_PROTOCOL devices (diff)
downloadipxe-170bbfd4875b2a3479101b5f5892cdedcf857fd0.tar.gz
ipxe-170bbfd4875b2a3479101b5f5892cdedcf857fd0.tar.xz
ipxe-170bbfd4875b2a3479101b5f5892cdedcf857fd0.zip
[efi] Add efi_path_mac() to parse a MAC address from an EFI device path
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/include/ipxe/efi/efi_path.h1
-rw-r--r--src/interface/efi/efi_path.c24
2 files changed, 25 insertions, 0 deletions
diff --git a/src/include/ipxe/efi/efi_path.h b/src/include/ipxe/efi/efi_path.h
index 503bd434..57fce402 100644
--- a/src/include/ipxe/efi/efi_path.h
+++ b/src/include/ipxe/efi/efi_path.h
@@ -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 );
diff --git a/src/interface/efi/efi_path.c b/src/interface/efi/efi_path.c
index 4e37d248..23f1bb84 100644
--- a/src/interface/efi/efi_path.c
+++ b/src/interface/efi/efi_path.c
@@ -112,6 +112,30 @@ size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *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
*
* @v path Device path