]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Add efi_path_mac() to parse a MAC address from an EFI device path
authorMichael Brown <mcb30@ipxe.org>
Tue, 26 Mar 2024 15:16:33 +0000 (15:16 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 26 Mar 2024 15:16:33 +0000 (15:16 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/efi/efi_path.h
src/interface/efi/efi_path.c

index 503bd4347326f1afd2e86ab5362a37e3a6c8efc9..57fce4028b8ce844af81e9cf7460c94620973809 100644 (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 );
index 4e37d248a7ff893ccd4a347297a02e23eb29cd5a..23f1bb84dbf37f965e98ce93ff561fa696d7bd33 100644 (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
  *