| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
2
|
|
|
|
|
|
|
extern "C" { |
|
3
|
|
|
|
|
|
|
#endif |
|
4
|
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
#include "ulib/chacha.h" |
|
6
|
|
|
|
|
|
|
#include "ulib/clock.h" |
|
7
|
|
|
|
|
|
|
#include "ulib/gen.h" |
|
8
|
|
|
|
|
|
|
#include "ulib/md5.h" |
|
9
|
|
|
|
|
|
|
#include "ulib/node.h" |
|
10
|
|
|
|
|
|
|
#include "ulib/sha1.h" |
|
11
|
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
#ifdef __cplusplus |
|
13
|
|
|
|
|
|
|
} |
|
14
|
|
|
|
|
|
|
#endif |
|
15
|
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
/* randomize uu_node */ |
|
18
|
28
|
|
|
|
|
|
static void uu_gen_randomize(pUCXT) { |
|
19
|
28
|
|
|
|
|
|
cc_rand32(aUCXT, (U32*)&UCXT.gen_node[0]); |
|
20
|
28
|
|
|
|
|
|
cc_rand16(aUCXT, (U16*)&UCXT.gen_node[4]); |
|
21
|
28
|
|
|
|
|
|
UCXT.gen_node[0] |= 0x01; /* set mcast */ |
|
22
|
28
|
|
|
|
|
|
} |
|
23
|
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
/* call at boot */ |
|
25
|
156
|
|
|
|
|
|
void uu_gen_init(pUCXT) { |
|
26
|
156
|
|
|
|
|
|
UCXT.gen_epoch = (((U64) 0x01B21DD2) << 32) | 0x13814000; /* unused */ |
|
27
|
156
|
|
|
|
|
|
UCXT.gen_use_unique = 0; |
|
28
|
156
|
|
|
|
|
|
UCXT.gen_has_real_node = 0; |
|
29
|
156
|
|
|
|
|
|
UCXT.gen_node[0] = 0;; |
|
30
|
156
|
|
|
|
|
|
UCXT.gen_node[1] = 0;; |
|
31
|
156
|
|
|
|
|
|
UCXT.gen_node[2] = 0;; |
|
32
|
156
|
|
|
|
|
|
UCXT.gen_node[3] = 0;; |
|
33
|
156
|
|
|
|
|
|
UCXT.gen_node[4] = 0;; |
|
34
|
156
|
|
|
|
|
|
UCXT.gen_node[5] = 0;; |
|
35
|
156
|
|
|
|
|
|
UCXT.gen_real_node[0] = 0; |
|
36
|
156
|
|
|
|
|
|
UCXT.gen_real_node[1] = 0; |
|
37
|
156
|
|
|
|
|
|
UCXT.gen_real_node[2] = 0; |
|
38
|
156
|
|
|
|
|
|
UCXT.gen_real_node[3] = 0; |
|
39
|
156
|
|
|
|
|
|
UCXT.gen_real_node[4] = 0; |
|
40
|
156
|
|
|
|
|
|
UCXT.gen_real_node[5] = 0; |
|
41
|
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
/* get the real node or randomize it */ |
|
43
|
156
|
50
|
|
|
|
|
if (uu_get_node_id(aUCXT, (U8*)&UCXT.gen_node) == 1) { |
|
44
|
156
|
|
|
|
|
|
UCXT.gen_has_real_node = 1; |
|
45
|
156
|
|
|
|
|
|
UCXT.gen_real_node[0] = UCXT.gen_node[0]; |
|
46
|
156
|
|
|
|
|
|
UCXT.gen_real_node[1] = UCXT.gen_node[1]; |
|
47
|
156
|
|
|
|
|
|
UCXT.gen_real_node[2] = UCXT.gen_node[2]; |
|
48
|
156
|
|
|
|
|
|
UCXT.gen_real_node[3] = UCXT.gen_node[3]; |
|
49
|
156
|
|
|
|
|
|
UCXT.gen_real_node[4] = UCXT.gen_node[4]; |
|
50
|
156
|
|
|
|
|
|
UCXT.gen_real_node[5] = UCXT.gen_node[5]; |
|
51
|
|
|
|
|
|
|
} |
|
52
|
|
|
|
|
|
|
else { |
|
53
|
0
|
|
|
|
|
|
UCXT.gen_has_real_node = 0; |
|
54
|
0
|
|
|
|
|
|
uu_gen_randomize(aUCXT); |
|
55
|
|
|
|
|
|
|
} |
|
56
|
156
|
|
|
|
|
|
} |
|
57
|
|
|
|
|
|
|
|
|
58
|
8
|
|
|
|
|
|
void uu_gen_setrand(pUCXT) { |
|
59
|
8
|
|
|
|
|
|
UCXT.gen_use_unique = 0; |
|
60
|
8
|
|
|
|
|
|
uu_gen_randomize(aUCXT); |
|
61
|
8
|
|
|
|
|
|
} |
|
62
|
|
|
|
|
|
|
|
|
63
|
2
|
|
|
|
|
|
void uu_gen_setuniq(pUCXT) { |
|
64
|
2
|
|
|
|
|
|
UCXT.gen_use_unique = 1; |
|
65
|
2
|
|
|
|
|
|
} |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
/* returns 1 if has real node, or 0 */ |
|
68
|
154
|
|
|
|
|
|
int uu_realnode(pUCXT, struct_uu_t *out) { |
|
69
|
154
|
|
|
|
|
|
uu_v0gen(aUCXT, out, NULL); |
|
70
|
154
|
|
|
|
|
|
out->v1.node[0] = UCXT.gen_real_node[0]; |
|
71
|
154
|
|
|
|
|
|
out->v1.node[1] = UCXT.gen_real_node[1]; |
|
72
|
154
|
|
|
|
|
|
out->v1.node[2] = UCXT.gen_real_node[2]; |
|
73
|
154
|
|
|
|
|
|
out->v1.node[3] = UCXT.gen_real_node[3]; |
|
74
|
154
|
|
|
|
|
|
out->v1.node[4] = UCXT.gen_real_node[4]; |
|
75
|
154
|
|
|
|
|
|
out->v1.node[5] = UCXT.gen_real_node[5]; |
|
76
|
154
|
|
|
|
|
|
return UCXT.gen_has_real_node; |
|
77
|
|
|
|
|
|
|
} |
|
78
|
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
|
|
80
|
194
|
|
|
|
|
|
void uu_v0gen(pUCXT, struct_uu_t *out, char *dptr) { |
|
81
|
194
|
|
|
|
|
|
out->v0.low = 0; |
|
82
|
194
|
|
|
|
|
|
out->v0.high = 0; |
|
83
|
194
|
|
|
|
|
|
} |
|
84
|
|
|
|
|
|
|
|
|
85
|
182
|
|
|
|
|
|
void uu_v1gen(pUCXT, struct_uu_t *out, char *dptr) { |
|
86
|
|
|
|
|
|
|
U64 clock_reg; |
|
87
|
|
|
|
|
|
|
U16 clock_seq; |
|
88
|
|
|
|
|
|
|
|
|
89
|
182
|
|
|
|
|
|
uu_clock(aUCXT, &clock_reg, &clock_seq); |
|
90
|
182
|
|
|
|
|
|
clock_reg += (((U64)0x01b21dd2) << 32) + 0x13814000; |
|
91
|
|
|
|
|
|
|
|
|
92
|
182
|
|
|
|
|
|
out->v1.time_low = (U32)clock_reg; |
|
93
|
182
|
|
|
|
|
|
out->v1.time_mid = (U16)(clock_reg >> 32 & 0xffff); |
|
94
|
182
|
|
|
|
|
|
out->v1.time_high_and_version = (U16)(clock_reg >> 48 & 0x0fff | 0x1000); |
|
95
|
182
|
|
|
|
|
|
out->v1.clock_seq_and_variant = clock_seq & 0x3fff | 0x8000; |
|
96
|
|
|
|
|
|
|
|
|
97
|
182
|
100
|
|
|
|
|
if (UCXT.gen_use_unique) uu_gen_randomize(aUCXT); |
|
98
|
182
|
|
|
|
|
|
out->v1.node[0] = UCXT.gen_node[0]; |
|
99
|
182
|
|
|
|
|
|
out->v1.node[1] = UCXT.gen_node[1]; |
|
100
|
182
|
|
|
|
|
|
out->v1.node[2] = UCXT.gen_node[2]; |
|
101
|
182
|
|
|
|
|
|
out->v1.node[3] = UCXT.gen_node[3]; |
|
102
|
182
|
|
|
|
|
|
out->v1.node[4] = UCXT.gen_node[4]; |
|
103
|
182
|
|
|
|
|
|
out->v1.node[5] = UCXT.gen_node[5]; |
|
104
|
182
|
|
|
|
|
|
} |
|
105
|
|
|
|
|
|
|
|
|
106
|
152
|
|
|
|
|
|
void uu_v3gen(pUCXT, struct_uu_t *out, char *dptr) { |
|
107
|
|
|
|
|
|
|
/* out points to a v1 uuid to use as namespace. */ |
|
108
|
|
|
|
|
|
|
/* out also points to output buffer for v3 uuid. */ |
|
109
|
|
|
|
|
|
|
/* dptr points to string to use as name. */ |
|
110
|
152
|
|
|
|
|
|
uu_md5_hash(aUCXT, out, dptr); |
|
111
|
152
|
|
|
|
|
|
} |
|
112
|
|
|
|
|
|
|
|
|
113
|
1456
|
|
|
|
|
|
void uu_v4gen(pUCXT, struct_uu_t *out, char *dptr) { |
|
114
|
1456
|
|
|
|
|
|
U64 *cp = (U64*)out; |
|
115
|
|
|
|
|
|
|
|
|
116
|
1456
|
|
|
|
|
|
cc_rand64(aUCXT, cp++); |
|
117
|
1456
|
|
|
|
|
|
cc_rand64(aUCXT, cp); |
|
118
|
1456
|
|
|
|
|
|
out->v4.rand_b_and_version = out->v4.rand_b_and_version & 0xffff0fff | 0x00004000; |
|
119
|
1456
|
|
|
|
|
|
out->v4.rand_c_and_variant = out->v4.rand_c_and_variant & 0x3fffffff | 0x80000000; |
|
120
|
1456
|
|
|
|
|
|
} |
|
121
|
|
|
|
|
|
|
|
|
122
|
146
|
|
|
|
|
|
void uu_v5gen(pUCXT, struct_uu_t *out, char *dptr) { |
|
123
|
|
|
|
|
|
|
/* out points to a v1 uuid to use as namespace. */ |
|
124
|
|
|
|
|
|
|
/* out also points to output buffer for v5 uuid. */ |
|
125
|
|
|
|
|
|
|
/* dptr points to string to use as name. */ |
|
126
|
146
|
|
|
|
|
|
uu_sha_hash(aUCXT, out, dptr); |
|
127
|
146
|
|
|
|
|
|
} |
|
128
|
|
|
|
|
|
|
|
|
129
|
154
|
|
|
|
|
|
void uu_v6gen(pUCXT, struct_uu_t *out, char *dptr) { |
|
130
|
|
|
|
|
|
|
U64 clock_reg; |
|
131
|
|
|
|
|
|
|
U16 clock_seq; |
|
132
|
|
|
|
|
|
|
|
|
133
|
154
|
|
|
|
|
|
uu_clock(aUCXT, &clock_reg, &clock_seq); |
|
134
|
154
|
|
|
|
|
|
clock_reg += (((U64)0x01b21dd2) << 32) + 0x13814000; |
|
135
|
|
|
|
|
|
|
|
|
136
|
154
|
|
|
|
|
|
out->v6.time_high = (U32)(clock_reg >> 28); |
|
137
|
154
|
|
|
|
|
|
out->v6.time_mid = (U16)(clock_reg >> 12); |
|
138
|
154
|
|
|
|
|
|
out->v6.time_low_and_version = (U16)clock_reg & 0x0fff | 0x6000; |
|
139
|
154
|
|
|
|
|
|
out->v6.clock_seq_and_variant = clock_seq & 0x3fff | 0x8000; |
|
140
|
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
/* use the same node as v1 */ |
|
142
|
154
|
100
|
|
|
|
|
if (UCXT.gen_use_unique) uu_gen_randomize(aUCXT); |
|
143
|
154
|
|
|
|
|
|
out->v6.node[0] = UCXT.gen_node[0]; |
|
144
|
154
|
|
|
|
|
|
out->v6.node[1] = UCXT.gen_node[1]; |
|
145
|
154
|
|
|
|
|
|
out->v6.node[2] = UCXT.gen_node[2]; |
|
146
|
154
|
|
|
|
|
|
out->v6.node[3] = UCXT.gen_node[3]; |
|
147
|
154
|
|
|
|
|
|
out->v6.node[4] = UCXT.gen_node[4]; |
|
148
|
154
|
|
|
|
|
|
out->v6.node[5] = UCXT.gen_node[5]; |
|
149
|
154
|
|
|
|
|
|
} |
|
150
|
|
|
|
|
|
|
|
|
151
|
135
|
|
|
|
|
|
void uu_v7gen(pUCXT, struct_uu_t *out, char *dptr) { |
|
152
|
|
|
|
|
|
|
U64 clock_reg; |
|
153
|
|
|
|
|
|
|
U16 clock_seq; |
|
154
|
|
|
|
|
|
|
|
|
155
|
135
|
|
|
|
|
|
uu_clock(aUCXT, &clock_reg, &clock_seq); |
|
156
|
135
|
|
|
|
|
|
clock_reg /= 10000; |
|
157
|
|
|
|
|
|
|
|
|
158
|
135
|
|
|
|
|
|
cc_rand16(aUCXT, &out->v7.rand_a_and_version); |
|
159
|
135
|
|
|
|
|
|
cc_rand64(aUCXT, &out->v7.rand_b_and_variant); |
|
160
|
135
|
|
|
|
|
|
out->v7.time_high = (U32)(clock_reg >> 16); |
|
161
|
135
|
|
|
|
|
|
out->v7.time_low = (U16)(clock_reg & 0xffff); |
|
162
|
135
|
|
|
|
|
|
out->v7.rand_a_and_version = out->v7.rand_a_and_version & 0x0fff | 0x7000; |
|
163
|
135
|
|
|
|
|
|
out->v7.rand_b_and_variant = out->v7.rand_b_and_variant |
|
164
|
135
|
|
|
|
|
|
& 0x3fffffffffffffffULL |
|
165
|
135
|
|
|
|
|
|
| 0x8000000000000000ULL; |
|
166
|
135
|
|
|
|
|
|
} |
|
167
|
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
/* ex:set ts=2 sw=2 itab=spaces: */ |