| #ifndef _IPXE_UUID_H | |
| #define _IPXE_UUID_H | |
| /** @file | |
| * | |
| * Universally unique IDs | |
| */ | |
| FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); | |
| #include <stdint.h> | |
| #include <byteswap.h> | |
| /** A universally unique ID */ | |
| union uuid { | |
| /** Canonical form (00000000-0000-0000-0000-000000000000) */ | |
| struct { | |
| /** 8 hex digits, big-endian */ | |
| uint32_t a; | |
| /** 2 hex digits, big-endian */ | |
| uint16_t b; | |
| /** 2 hex digits, big-endian */ | |
| uint16_t c; | |
| /** 2 hex digits, big-endian */ | |
| uint16_t d; | |
| /** 12 hex digits, big-endian */ | |
| uint8_t e[6]; | |
| } canonical; | |
| uint8_t raw[16]; | |
| }; | |
| /** | |
| * Change UUID endianness | |
| * | |
| * @v uuid UUID | |
| * | |
| * RFC4122 defines UUIDs as being encoded in network byte order, but | |
| * leaves some wriggle room for "explicit application or presentation | |
| * protocol specification to the contrary". PXE, EFI and SMBIOS | |
| * (versions 2.6 and above) treat the first three fields as being | |
| * little-endian. | |
| */ | |
| static inline void uuid_mangle ( union uuid *uuid ) { | |
| __bswap_32s ( &uuid->canonical.a ); | |
| __bswap_16s ( &uuid->canonical.b ); | |
| __bswap_16s ( &uuid->canonical.c ); | |
| } | |
| extern const char * uuid_ntoa ( const union uuid *uuid ); | |
| #endif /* _IPXE_UUID_H */ |