From d938e50136b0bd7dbc56b250cd4363646e59c9fc Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Wed, 20 Mar 2013 15:06:40 +0000 Subject: [PATCH] [uuid] Abstract UUID mangling code out to a separate uuid_mangle() function Signed-off-by: Michael Brown --- src/include/ipxe/uuid.h | 19 +++++++++++++++++++ src/interface/smbios/smbios_settings.c | 5 +---- src/net/udp/dhcp.c | 4 +--- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/include/ipxe/uuid.h b/src/include/ipxe/uuid.h index 5de56b94..ad515d0c 100644 --- a/src/include/ipxe/uuid.h +++ b/src/include/ipxe/uuid.h @@ -9,6 +9,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include +#include /** A universally unique ID */ union uuid { @@ -28,6 +29,24 @@ union uuid { 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 char * uuid_ntoa ( const union uuid *uuid ); #endif /* _IPXE_UUID_H */ diff --git a/src/interface/smbios/smbios_settings.c b/src/interface/smbios/smbios_settings.c index 4ca14476..663da968 100644 --- a/src/interface/smbios/smbios_settings.c +++ b/src/interface/smbios/smbios_settings.c @@ -22,7 +22,6 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include #include #include -#include #include #include #include @@ -148,9 +147,7 @@ static int smbios_fetch ( struct settings *settings __unused, ( smbios_version() >= SMBIOS_VERSION ( 2, 6 ) ) ) { DBG ( "SMBIOS detected mangled UUID\n" ); memcpy ( &uuid, &buf[tag_offset], sizeof ( uuid ) ); - __bswap_32s ( &uuid.canonical.a ); - __bswap_16s ( &uuid.canonical.b ); - __bswap_16s ( &uuid.canonical.c ); + uuid_mangle ( &uuid ); raw = &uuid; } diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index 3f2c451e..762ae732 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -1049,9 +1049,7 @@ int dhcp_create_request ( struct dhcp_packet *dhcppkt, client_uuid.type = DHCP_CLIENT_UUID_TYPE; if ( ( len = fetch_uuid_setting ( NULL, &uuid_setting, &client_uuid.uuid ) ) >= 0 ) { - __bswap_32s ( &client_uuid.uuid.canonical.a ); - __bswap_16s ( &client_uuid.uuid.canonical.b ); - __bswap_16s ( &client_uuid.uuid.canonical.c ); + uuid_mangle ( &client_uuid.uuid ); if ( ( rc = dhcppkt_store ( dhcppkt, DHCP_CLIENT_UUID, &client_uuid, sizeof ( client_uuid ) ) ) != 0 ) {