File Coverage

ulib/gen.c
Criterion Covered Total %
statement 105 107 98.1
branch 5 6 83.3
condition n/a
subroutine n/a
pod n/a
total 110 113 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           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: */