Turn the content of uuid_t into a union and add the fields for the v1
interpretation to it.

Signed-off-by: Christoph Hellwig <[email protected]>
---
 include/uapi/linux/uuid.h | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/uuid.h b/include/uapi/linux/uuid.h
index 1a2914d8b225..1039d2f3e114 100644
--- a/include/uapi/linux/uuid.h
+++ b/include/uapi/linux/uuid.h
@@ -25,7 +25,34 @@ typedef struct {
 } guid_t;
 
 typedef struct {
-       __u8 b[16];
+       union {
+               __u8                    b[16];
+
+               /*
+                * V1 (time-based) UUID definition [RFC 4122]:
+                * - the timestamp is a 60-bit value, split 32/16/12, and goes
+                *   in 100ns increments since midnight 15th October 1582
+                *   - add UUID_TO_UNIX_TIME to convert unix time in 100ns
+                *     units to UUID time
+                * - the clock sequence is a 14-bit counter to avoid duplicate
+                *   times
+                */
+               struct {
+                       __be32          time_low;
+                       __be16          time_mid;
+                       __be16          time_hi_and_version;
+#define UUID_TO_UNIX_TIME      0x01b21dd213814000ULL
+#define UUID_TIMEHI_MASK       0x0fff
+#define UUID_VERSION_TIME      0x1000  /* time-based UUID */
+#define UUID_VERSION_NAME      0x3000  /* name-based UUID */
+#define UUID_VERSION_RANDOM    0x4000  /* (pseudo-)random generated UUID */
+                       u8              clock_seq_hi_and_reserved;
+#define UUID_CLOCKHI_MASK      0x3f
+#define UUID_VARIANT_STD       0x80
+                       u8              clock_seq_low;
+                       u8              node[6];
+               } v1;
+       };
 } uuid_t;
 
 #define GUID(a, b, c, d0, d1, d2, d3, d4, d5, d6, d7)                  \
-- 
2.11.0

Reply via email to