Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 1996, 1997 Theodore Ts'o.
3 : : */
4 : :
5 : : #include <stdio.h>
6 : : #include <string.h>
7 : : #include <stdint.h>
8 : : #include <stdlib.h>
9 : : #include <ctype.h>
10 : :
11 : : #include <eal_export.h>
12 : : #include <rte_uuid.h>
13 : :
14 : : /* UUID packed form */
15 : : struct uuid {
16 : : uint32_t time_low;
17 : : uint16_t time_mid;
18 : : uint16_t time_hi_and_version;
19 : : uint16_t clock_seq;
20 : : uint8_t node[6];
21 : : };
22 : :
23 : 0 : static void uuid_pack(const struct uuid *uu, rte_uuid_t ptr)
24 : : {
25 : : uint32_t tmp;
26 : : uint8_t *out = ptr;
27 : :
28 : 0 : tmp = uu->time_low;
29 : 0 : out[3] = (uint8_t) tmp;
30 : 0 : tmp >>= 8;
31 : 0 : out[2] = (uint8_t) tmp;
32 : 0 : tmp >>= 8;
33 : 0 : out[1] = (uint8_t) tmp;
34 : 0 : tmp >>= 8;
35 : 0 : out[0] = (uint8_t) tmp;
36 : :
37 : 0 : tmp = uu->time_mid;
38 : 0 : out[5] = (uint8_t) tmp;
39 : 0 : tmp >>= 8;
40 : 0 : out[4] = (uint8_t) tmp;
41 : :
42 : 0 : tmp = uu->time_hi_and_version;
43 : 0 : out[7] = (uint8_t) tmp;
44 : 0 : tmp >>= 8;
45 : 0 : out[6] = (uint8_t) tmp;
46 : :
47 : 0 : tmp = uu->clock_seq;
48 : 0 : out[9] = (uint8_t) tmp;
49 : 0 : tmp >>= 8;
50 : 0 : out[8] = (uint8_t) tmp;
51 : :
52 : 0 : memcpy(out+10, uu->node, 6);
53 : 0 : }
54 : :
55 : 199 : static void uuid_unpack(const rte_uuid_t in, struct uuid *uu)
56 : : {
57 : : const uint8_t *ptr = in;
58 : : uint32_t tmp;
59 : :
60 : 199 : tmp = *ptr++;
61 : 199 : tmp = (tmp << 8) | *ptr++;
62 : 199 : tmp = (tmp << 8) | *ptr++;
63 : 199 : tmp = (tmp << 8) | *ptr++;
64 : 199 : uu->time_low = tmp;
65 : :
66 : 199 : tmp = *ptr++;
67 : 199 : tmp = (tmp << 8) | *ptr++;
68 : 199 : uu->time_mid = tmp;
69 : :
70 : 199 : tmp = *ptr++;
71 : 199 : tmp = (tmp << 8) | *ptr++;
72 : 199 : uu->time_hi_and_version = tmp;
73 : :
74 : 199 : tmp = *ptr++;
75 : 199 : tmp = (tmp << 8) | *ptr++;
76 : 199 : uu->clock_seq = tmp;
77 : :
78 : 199 : memcpy(uu->node, ptr, 6);
79 : 199 : }
80 : :
81 : : RTE_EXPORT_SYMBOL(rte_uuid_is_null)
82 : 0 : bool rte_uuid_is_null(const rte_uuid_t uu)
83 : : {
84 : : const uint8_t *cp = uu;
85 : : int i;
86 : :
87 [ # # ]: 0 : for (i = 0; i < 16; i++)
88 [ # # ]: 0 : if (*cp++)
89 : : return false;
90 : : return true;
91 : : }
92 : :
93 : : /*
94 : : * rte_uuid_compare() - compare two UUIDs.
95 : : */
96 : : RTE_EXPORT_SYMBOL(rte_uuid_compare)
97 : 0 : int rte_uuid_compare(const rte_uuid_t uu1, const rte_uuid_t uu2)
98 : : {
99 : : struct uuid uuid1, uuid2;
100 : :
101 : 0 : uuid_unpack(uu1, &uuid1);
102 : 0 : uuid_unpack(uu2, &uuid2);
103 : :
104 : : #define UUCMP(u1, u2) \
105 : : do { if (u1 != u2) return (u1 < u2) ? -1 : 1; } while (0)
106 : :
107 [ # # # # ]: 0 : UUCMP(uuid1.time_low, uuid2.time_low);
108 [ # # # # ]: 0 : UUCMP(uuid1.time_mid, uuid2.time_mid);
109 [ # # # # ]: 0 : UUCMP(uuid1.time_hi_and_version, uuid2.time_hi_and_version);
110 [ # # # # ]: 0 : UUCMP(uuid1.clock_seq, uuid2.clock_seq);
111 : : #undef UUCMP
112 : :
113 : 0 : return memcmp(uuid1.node, uuid2.node, 6);
114 : : }
115 : :
116 : : RTE_EXPORT_SYMBOL(rte_uuid_parse)
117 : 15 : int rte_uuid_parse(const char *in, rte_uuid_t uu)
118 : : {
119 : : struct uuid uuid;
120 : : int i;
121 : : const char *cp;
122 : : char buf[3];
123 : :
124 [ - + ]: 15 : if (strlen(in) != 36)
125 : : return -1;
126 : :
127 [ # # ]: 0 : for (i = 0, cp = in; i <= 36; i++, cp++) {
128 [ # # # ]: 0 : if ((i == 8) || (i == 13) || (i == 18) ||
129 : : (i == 23)) {
130 [ # # ]: 0 : if (*cp == '-')
131 : 0 : continue;
132 : : else
133 : : return -1;
134 : : }
135 : : if (i == 36)
136 [ # # ]: 0 : if (*cp == 0)
137 : 0 : continue;
138 [ # # ]: 0 : if (!isxdigit(*cp))
139 : : return -1;
140 : : }
141 : :
142 : 0 : uuid.time_low = strtoul(in, NULL, 16);
143 : 0 : uuid.time_mid = strtoul(in+9, NULL, 16);
144 : 0 : uuid.time_hi_and_version = strtoul(in+14, NULL, 16);
145 : 0 : uuid.clock_seq = strtoul(in+19, NULL, 16);
146 : 0 : cp = in+24;
147 : 0 : buf[2] = 0;
148 : :
149 [ # # ]: 0 : for (i = 0; i < 6; i++) {
150 : 0 : buf[0] = *cp++;
151 : 0 : buf[1] = *cp++;
152 : 0 : uuid.node[i] = strtoul(buf, NULL, 16);
153 : : }
154 : :
155 : 0 : uuid_pack(&uuid, uu);
156 : 0 : return 0;
157 : : }
158 : :
159 : : RTE_EXPORT_SYMBOL(rte_uuid_unparse)
160 : 199 : void rte_uuid_unparse(const rte_uuid_t uu, char *out, size_t len)
161 : : {
162 : : struct uuid uuid;
163 : :
164 : 199 : uuid_unpack(uu, &uuid);
165 : :
166 : 199 : snprintf(out, len,
167 : : "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
168 : 199 : uuid.time_low, uuid.time_mid, uuid.time_hi_and_version,
169 : 199 : uuid.clock_seq >> 8, uuid.clock_seq & 0xFF,
170 : 199 : uuid.node[0], uuid.node[1], uuid.node[2],
171 : 199 : uuid.node[3], uuid.node[4], uuid.node[5]);
172 : 199 : }
|