]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/tests/sandbox/smeartest.c
Upgrade NTP to 4.2.8p4.
[FreeBSD/releng/10.2.git] / contrib / ntp / tests / sandbox / smeartest.c
1 #include <config.h>
2
3 #include <ntp.h>
4 #include <ntp_fp.h>
5
6 /*
7  * we want to test a refid format of:
8  * 254.x.y.x
9  *
10  * where x.y.z are 24 bits containing 2 (signed) integer bits
11  * and 22 fractional bits.
12  *
13  * we want functions to convert to/from this format, with unit tests.
14  *
15  * Interesting test cases include:
16  * 254.0.0.0
17  * 254.0.0.1
18  * 254.127.255.255
19  * 254.128.0.0
20  * 254.255.255.255
21  */
22
23 char *progname = "";
24
25 l_fp convertRefIDToLFP(uint32_t r);
26 uint32_t convertLFPToRefID(l_fp num);
27
28
29 /*
30  * The smear data in the refid is the bottom 3 bytes of the refid,
31  * 2 bits of integer
32  * 22 bits of fraction
33  */
34 l_fp
35 convertRefIDToLFP(uint32_t r)
36 {
37         l_fp temp;
38
39         r = ntohl(r);
40
41         printf("%03d %08x: ", (r >> 24) & 0xFF, (r & 0x00FFFFFF) );
42
43         temp.l_uf = (r << 10);  /* 22 fractional bits */
44
45         temp.l_ui = (r >> 22) & 0x3;
46         temp.l_ui |= ~(temp.l_ui & 2) + 1;
47
48         return temp;
49 }
50
51
52 uint32_t
53 convertLFPToRefID(l_fp num)
54 {
55         uint32_t temp;
56
57         /* round the input with the highest bit to shift out from the
58          * fraction, then keep just two bits from the integral part.
59          *
60          * TODO: check for overflows; should we clamp/saturate or just
61          * complain?
62          */
63         L_ADDUF(&num, 0x200);
64         num.l_ui &= 3;
65
66         /* combine integral and fractional part to 24 bits */
67         temp  = (num.l_ui << 22) | (num.l_uf >> 10);
68
69         /* put in the leading 254.0.0.0 */
70         temp |= UINT32_C(0xFE000000);
71
72         printf("%03d %08x: ", (temp >> 24) & 0xFF, (temp & 0x00FFFFFF) );
73
74         return htonl(temp);
75 }
76
77 /* Tests start here */
78
79 void rtol(uint32_t r);
80
81 void
82 rtol(uint32_t r)
83 {
84         l_fp l;
85
86         printf("rtol: ");
87
88         l = convertRefIDToLFP(htonl(r));
89         printf("refid %#x, smear %s\n", r, lfptoa(&l, 8));
90
91         return;
92 }
93
94
95 void rtoltor(uint32_t r);
96
97 void
98 rtoltor(uint32_t r)
99 {
100         l_fp l;
101
102         printf("rtoltor: ");
103         l = convertRefIDToLFP(htonl(r));
104
105         r = convertLFPToRefID(l);
106         printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(r));
107
108         return;
109 }
110
111
112 void ltor(l_fp l);
113
114 void
115 ltor(l_fp l)
116 {
117         uint32_t r;
118
119         printf("ltor: ");
120
121         r = convertLFPToRefID(l);
122         printf("smear %s, refid %#.8x\n", lfptoa(&l, 8), ntohl(r));
123
124         return;
125 }
126
127
128 main()
129 {
130         l_fp l;
131         int rc;
132
133         rtol(0xfe800000);
134         rtol(0xfe800001);
135         rtol(0xfe8ffffe);
136         rtol(0xfe8fffff);
137         rtol(0xfef00000);
138         rtol(0xfef00001);
139         rtol(0xfefffffe);
140         rtol(0xfeffffff);
141
142         rtol(0xfe000000);
143         rtol(0xfe000001);
144         rtol(0xfe6ffffe);
145         rtol(0xfe6fffff);
146         rtol(0xfe700000);
147         rtol(0xfe700001);
148         rtol(0xfe7ffffe);
149         rtol(0xfe7fffff);
150
151         rtoltor(0xfe800000);
152         rtoltor(0xfe800001);
153         rtoltor(0xfe8ffffe);
154         rtoltor(0xfe8fffff);
155         rtoltor(0xfef00000);
156         rtoltor(0xfef00001);
157         rtoltor(0xfefffffe);
158         rtoltor(0xfeffffff);
159
160         rtoltor(0xfe000000);
161         rtoltor(0xfe000001);
162         rtoltor(0xfe6ffffe);
163         rtoltor(0xfe6fffff);
164         rtoltor(0xfe700000);
165         rtoltor(0xfe700001);
166         rtoltor(0xfe7ffffe);
167         rtoltor(0xfe7fffff);
168
169         rc = atolfp("-.932087", &l);
170         ltor(l);
171         rtol(0xfec458b0);
172         printf("%x -> %d.%d.%d.%d\n",
173                 0xfec458b0,
174                 0xfe,
175                   0xc4,
176                     0x58,
177                       0xb0);
178
179         return 0;
180 }