]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[uuid] Abstract UUID mangling code out to a separate uuid_mangle() function
authorMichael Brown <mcb30@ipxe.org>
Wed, 20 Mar 2013 15:06:40 +0000 (15:06 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 20 Mar 2013 15:06:40 +0000 (15:06 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/uuid.h
src/interface/smbios/smbios_settings.c
src/net/udp/dhcp.c

index 5de56b94e97dd83048d96e94eb19bb7d9c648ef2..ad515d0cb90dda52897d088af869199eaab36452 100644 (file)
@@ -9,6 +9,7 @@
 FILE_LICENCE ( GPL2_OR_LATER );
 
 #include <stdint.h>
+#include <byteswap.h>
 
 /** 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 */
index 4ca144760d1e8219be84c87eeae00e00554a2b43..663da96872c3d9c2e11cc17e267bd76ab55d9299 100644 (file)
@@ -22,7 +22,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <stdint.h>
 #include <string.h>
 #include <errno.h>
-#include <byteswap.h>
 #include <ipxe/settings.h>
 #include <ipxe/init.h>
 #include <ipxe/uuid.h>
@@ -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;
                }
 
index 3f2c451e12e4ffa36888fe15c72e7b178569a840..762ae732aa3a1992e6a106bb758ca52ce1009634 100644 (file)
@@ -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 ) {