File Coverage

ulib/gen.c
Criterion Covered Total %
statement 103 105 98.1
branch 5 6 83.3
condition n/a
subroutine n/a
pod n/a
total 108 111 97.3


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           uu_chacha_rand32(aUCXT, (U32*)&SMEM->gen_node[0]);
20 28           uu_chacha_rand16(aUCXT, (U16*)&SMEM->gen_node[4]);
21 28           SMEM->gen_node[0] |= 0x01; /* set mcast */
22 28           }
23              
24             /* call at boot */
25 215           void uu_gen_init(pUCXT) {
26 215           SMEM->gen_epoch = (((U64) 0x01B21DD2) << 32) | 0x13814000; /* unused */
27 215           SMEM->gen_use_unique = 0;
28 215           SMEM->gen_has_real_node = 0;
29 215           SMEM->gen_node[0] = 0;;
30 215           SMEM->gen_node[1] = 0;;
31 215           SMEM->gen_node[2] = 0;;
32 215           SMEM->gen_node[3] = 0;;
33 215           SMEM->gen_node[4] = 0;;
34 215           SMEM->gen_node[5] = 0;;
35 215           SMEM->gen_real_node[0] = 0;
36 215           SMEM->gen_real_node[1] = 0;
37 215           SMEM->gen_real_node[2] = 0;
38 215           SMEM->gen_real_node[3] = 0;
39 215           SMEM->gen_real_node[4] = 0;
40 215           SMEM->gen_real_node[5] = 0;
41              
42             /* get the real node or randomize it */
43 215 50         if (uu_node_getid(aUCXT, (U8*)&SMEM->gen_node) == 1) {
44 215           SMEM->gen_has_real_node = 1;
45 215           SMEM->gen_real_node[0] = SMEM->gen_node[0];
46 215           SMEM->gen_real_node[1] = SMEM->gen_node[1];
47 215           SMEM->gen_real_node[2] = SMEM->gen_node[2];
48 215           SMEM->gen_real_node[3] = SMEM->gen_node[3];
49 215           SMEM->gen_real_node[4] = SMEM->gen_node[4];
50 215           SMEM->gen_real_node[5] = SMEM->gen_node[5];
51             }
52             else {
53 0           SMEM->gen_has_real_node = 0;
54 0           uu_gen_randomize(aUCXT);
55             }
56 215           }
57              
58 8           void uu_gen_setrand(pUCXT) {
59 8           SMEM->gen_use_unique = 0;
60 8           uu_gen_randomize(aUCXT);
61 8           }
62              
63 2           void uu_gen_setuniq(pUCXT) {
64 2           SMEM->gen_use_unique = 1;
65 2           }
66              
67             /* returns 1 if has real node, or 0 */
68 213           int uu_gen_realnode(pUCXT, struct_uu_t *out) {
69 213           uu_gen_v0(aUCXT, out, NULL);
70 213           out->v1.node[0] = SMEM->gen_real_node[0];
71 213           out->v1.node[1] = SMEM->gen_real_node[1];
72 213           out->v1.node[2] = SMEM->gen_real_node[2];
73 213           out->v1.node[3] = SMEM->gen_real_node[3];
74 213           out->v1.node[4] = SMEM->gen_real_node[4];
75 213           out->v1.node[5] = SMEM->gen_real_node[5];
76 213           return SMEM->gen_has_real_node;
77             }
78              
79              
80 253           void uu_gen_v0(pUCXT, struct_uu_t *out, char *dptr) {
81 253           out->v0.low = 0;
82 253           out->v0.high = 0;
83 253           }
84              
85 14182           void uu_gen_v1(pUCXT, struct_uu_t *out, char *dptr) {
86             U64 clock_reg;
87             U16 clock_seq;
88              
89 14182           uu_clock(aUCXT, &clock_reg, &clock_seq);
90 14182           clock_reg += (((U64)0x01b21dd2) << 32) + 0x13814000;
91              
92 14182           out->v1.time_low = (U32)clock_reg;
93 14182           out->v1.time_mid = (U16)(clock_reg >> 32 & 0xffff);
94 14182           out->v1.time_high_and_version = (U16)((clock_reg >> 48 & 0x0fff) | 0x1000);
95 14182           out->v1.clock_seq_and_variant = (clock_seq & 0x3fff) | 0x8000;
96              
97 14182 100         if (SMEM->gen_use_unique) uu_gen_randomize(aUCXT);
98 14182           out->v1.node[0] = SMEM->gen_node[0];
99 14182           out->v1.node[1] = SMEM->gen_node[1];
100 14182           out->v1.node[2] = SMEM->gen_node[2];
101 14182           out->v1.node[3] = SMEM->gen_node[3];
102 14182           out->v1.node[4] = SMEM->gen_node[4];
103 14182           out->v1.node[5] = SMEM->gen_node[5];
104 14182           }
105              
106 14154           void uu_gen_v3(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 14154           uu_md5_hash(aUCXT, out, dptr);
111 14154           }
112              
113 14156           void uu_gen_v4(pUCXT, struct_uu_t *out, char *dptr) {
114 14156           U64 *cp = (U64*)out;
115              
116 14156           uu_chacha_rand64(aUCXT, cp++);
117 14156           uu_chacha_rand64(aUCXT, cp);
118 14156           out->v4.rand_b_and_version = (out->v4.rand_b_and_version & 0xffff0fff) | 0x00004000;
119 14156           out->v4.rand_c_and_variant = (out->v4.rand_c_and_variant & 0x3fffffff) | 0x80000000;
120 14156           }
121              
122 14148           void uu_gen_v5(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 14148           uu_sha1_hash(aUCXT, out, dptr);
127 14148           }
128              
129 14154           void uu_gen_v6(pUCXT, struct_uu_t *out, char *dptr) {
130             U64 clock_reg;
131             U16 clock_seq;
132              
133 14154           uu_clock(aUCXT, &clock_reg, &clock_seq);
134 14154           clock_reg += (((U64)0x01b21dd2) << 32) + 0x13814000;
135              
136 14154           out->v6.time_high = (U32)(clock_reg >> 28);
137 14154           out->v6.time_mid = (U16)(clock_reg >> 12);
138 14154           out->v6.time_low_and_version = (U16)(clock_reg & 0x0fff) | 0x6000;
139 14154           out->v6.clock_seq_and_variant = (clock_seq & 0x3fff) | 0x8000;
140              
141             /* use the same node as v1 */
142 14154 100         if (SMEM->gen_use_unique) uu_gen_randomize(aUCXT);
143 14154           out->v6.node[0] = SMEM->gen_node[0];
144 14154           out->v6.node[1] = SMEM->gen_node[1];
145 14154           out->v6.node[2] = SMEM->gen_node[2];
146 14154           out->v6.node[3] = SMEM->gen_node[3];
147 14154           out->v6.node[4] = SMEM->gen_node[4];
148 14154           out->v6.node[5] = SMEM->gen_node[5];
149 14154           }
150              
151 14135           void uu_gen_v7(pUCXT, struct_uu_t *out, char *dptr) {
152             U64 clock_reg;
153             U16 clock_seq;
154              
155 14135           uu_clock(aUCXT, &clock_reg, &clock_seq);
156 14135           clock_reg /= 10000;
157              
158 14135           uu_chacha_rand16(aUCXT, &out->v7.rand_a_and_version);
159 14135           uu_chacha_rand64(aUCXT, &out->v7.rand_b_and_variant);
160 14135           out->v7.time_high = (U32)(clock_reg >> 16);
161 14135           out->v7.time_low = (U16)(clock_reg & 0xffff);
162 14135           out->v7.rand_a_and_version = (out->v7.rand_a_and_version & 0x0fff) | 0x7000;
163 14135           out->v7.rand_b_and_variant = (out->v7.rand_b_and_variant & 0x3fffffffffffffffULL) | 0x8000000000000000ULL;
164 14135           }
165              
166             /* ex:set ts=2 sw=2 itab=spaces: */