xref: /netbsd-src/external/bsd/ntp/dist/sntp/tests/packetHandling.c (revision c9496f6b604074a9451a67df576a5b423068e71e)
1 /*	$NetBSD: packetHandling.c,v 1.1.1.6 2016/05/01 15:57:23 christos Exp $	*/
2 
3 #include "config.h"
4 #include "ntp_debug.h"
5 #include "ntp_stdlib.h"
6 #include "ntp_types.h"
7 
8 #include "sntptest.h"
9 
10 #include "kod_management.h"
11 #include "main.h"
12 #include "networking.h"
13 #include "ntp.h"
14 
15 #include "unity.h"
16 
17 void setUp(void);
18 int LfpEquality(const l_fp expected, const l_fp actual);
19 void test_GenerateUnauthenticatedPacket(void);
20 void test_GenerateAuthenticatedPacket(void);
21 void test_OffsetCalculationPositiveOffset(void);
22 void test_OffsetCalculationNegativeOffset(void);
23 void test_HandleUnusableServer(void);
24 void test_HandleUnusablePacket(void);
25 void test_HandleServerAuthenticationFailure(void);
26 void test_HandleKodDemobilize(void);
27 void test_HandleKodRate(void);
28 void test_HandleCorrectPacket(void);
29 
30 
31 void
32 setUp(void)
33 {
34 	init_lib();
35 }
36 
37 
38 int
39 LfpEquality(
40 	const l_fp	expected,
41 	const l_fp 	actual
42 	)
43 {
44 	return !!(L_ISEQU(&expected, &actual));
45 }
46 
47 
48 void
49 test_GenerateUnauthenticatedPacket(void)
50 {
51 	struct pkt	testpkt;
52 	struct timeval	xmt;
53 	l_fp		expected_xmt, actual_xmt;
54 
55 	GETTIMEOFDAY(&xmt, NULL);
56 	xmt.tv_sec += JAN_1970;
57 
58 	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
59 			  generate_pkt(&testpkt, &xmt, 0, NULL));
60 
61 	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
62 	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
63 	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
64 
65 	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
66 	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
67 
68 	TVTOTS(&xmt, &expected_xmt);
69 	NTOHL_FP(&testpkt.xmt, &actual_xmt);
70 	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
71 }
72 
73 
74 void
75 test_GenerateAuthenticatedPacket(void)
76 {
77 	static const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
78 
79 	struct key	testkey;
80 	struct pkt	testpkt;
81 	struct timeval	xmt;
82 	l_fp		expected_xmt, actual_xmt;
83 	char 		expected_mac[MAX_MD5_LEN];
84 
85 	testkey.next = NULL;
86 	testkey.key_id = 30;
87 	testkey.key_len = 9;
88 	memcpy(testkey.key_seq, "123456789", testkey.key_len);
89 	memcpy(testkey.type, "MD5", 3);
90 
91 	GETTIMEOFDAY(&xmt, NULL);
92 	xmt.tv_sec += JAN_1970;
93 
94 	TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
95 			  generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
96 
97 	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
98 	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
99 	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
100 
101 	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
102 	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
103 
104 	TVTOTS(&xmt, &expected_xmt);
105 	NTOHL_FP(&testpkt.xmt, &actual_xmt);
106 	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
107 
108 	TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
109 
110 	TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, /* Remove the key_id, only keep the mac. */
111 			  make_mac(&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac));
112 	TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4);
113 }
114 
115 
116 void
117 test_OffsetCalculationPositiveOffset(void)
118 {
119 	struct pkt	rpkt;
120 	l_fp		reftime, tmp;
121 	struct timeval	dst;
122 	double		offset, precision, synch_distance;
123 
124 	rpkt.precision = -16; /* 0,000015259 */
125 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
126 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
127 
128 	/* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */
129 	get_systime(&reftime);
130 	HTONL_FP(&reftime, &rpkt.reftime);
131 
132 	/* T1 - Originate timestamp */
133 	tmp.l_ui = 1000000000UL;
134 	tmp.l_uf = 0UL;
135 	HTONL_FP(&tmp, &rpkt.org);
136 
137 	/* T2 - Receive timestamp */
138 	tmp.l_ui = 1000000001UL;
139 	tmp.l_uf = 2147483648UL;
140 	HTONL_FP(&tmp, &rpkt.rec);
141 
142 	/* T3 - Transmit timestamp */
143 	tmp.l_ui = 1000000002UL;
144 	tmp.l_uf = 0UL;
145 	HTONL_FP(&tmp, &rpkt.xmt);
146 
147 	/* T4 - Destination timestamp as standard timeval */
148 	tmp.l_ui = 1000000001UL;
149 	tmp.l_uf = 0UL;
150 	TSTOTV(&tmp, &dst);
151 	dst.tv_sec -= JAN_1970;
152 
153 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
154 
155 	TEST_ASSERT_EQUAL_DOUBLE(1.25, offset);
156 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision);
157 	/* 1.1250150000000001 ? */
158 	TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance);
159 }
160 
161 
162 void
163 test_OffsetCalculationNegativeOffset(void)
164 {
165 	struct pkt	rpkt;
166 	l_fp		reftime, tmp;
167 	struct timeval	dst;
168 	double		offset, precision, synch_distance;
169 
170 	rpkt.precision = -1;
171 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
172 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
173 
174 	/* Synch Distance is (0.5+0.5)/2.0, or 0.5 */
175 	get_systime(&reftime);
176 	HTONL_FP(&reftime, &rpkt.reftime);
177 
178 	/* T1 - Originate timestamp */
179 	tmp.l_ui = 1000000001UL;
180 	tmp.l_uf = 0UL;
181 	HTONL_FP(&tmp, &rpkt.org);
182 
183 	/* T2 - Receive timestamp */
184 	tmp.l_ui = 1000000000UL;
185 	tmp.l_uf = 2147483648UL;
186 	HTONL_FP(&tmp, &rpkt.rec);
187 
188 	/*/ T3 - Transmit timestamp */
189 	tmp.l_ui = 1000000001UL;
190 	tmp.l_uf = 2147483648UL;
191 	HTONL_FP(&tmp, &rpkt.xmt);
192 
193 	/* T4 - Destination timestamp as standard timeval */
194 	tmp.l_ui = 1000000003UL;
195 	tmp.l_uf = 0UL;
196 
197 	TSTOTV(&tmp, &dst);
198 	dst.tv_sec -= JAN_1970;
199 
200 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
201 
202 	TEST_ASSERT_EQUAL_DOUBLE(-1, offset);
203 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision);
204 	TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance);
205 }
206 
207 
208 void
209 test_HandleUnusableServer(void)
210 {
211 	struct pkt	rpkt;
212 	sockaddr_u	host;
213 	int		rpktl;
214 
215 	ZERO(rpkt);
216 	ZERO(host);
217 	rpktl = SERVER_UNUSEABLE;
218 	TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
219 }
220 
221 
222 void
223 test_HandleUnusablePacket(void)
224 {
225 	struct pkt	rpkt;
226 	sockaddr_u	host;
227 	int		rpktl;
228 
229 	ZERO(rpkt);
230 	ZERO(host);
231 	rpktl = PACKET_UNUSEABLE;
232 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
233 }
234 
235 
236 void
237 test_HandleServerAuthenticationFailure(void)
238 {
239 	struct pkt	rpkt;
240 	sockaddr_u	host;
241 	int		rpktl;
242 
243 	ZERO(rpkt);
244 	ZERO(host);
245 	rpktl = SERVER_AUTH_FAIL;
246 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
247 }
248 
249 
250 void
251 test_HandleKodDemobilize(void)
252 {
253 	static const char *	HOSTNAME = "192.0.2.1";
254 	static const char *	REASON = "DENY";
255 	struct pkt		rpkt;
256 	sockaddr_u		host;
257 	int			rpktl;
258 	struct kod_entry *	entry;
259 
260 	rpktl = KOD_DEMOBILIZE;
261 	ZERO(rpkt);
262 	memcpy(&rpkt.refid, REASON, 4);
263 	ZERO(host);
264 	host.sa4.sin_family = AF_INET;
265 	host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
266 
267 	/* Test that the KOD-entry is added to the database. */
268 	kod_init_kod_db("/dev/null", TRUE);
269 
270 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
271 
272 	TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
273 	TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4);
274 }
275 
276 
277 void
278 test_HandleKodRate(void)
279 {
280 	struct 	pkt	rpkt;
281 	sockaddr_u	host;
282 	int		rpktl;
283 
284 	ZERO(rpkt);
285 	ZERO(host);
286 	rpktl = KOD_RATE;
287 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
288 }
289 
290 
291 void
292 test_HandleCorrectPacket(void)
293 {
294 	struct pkt	rpkt;
295 	sockaddr_u	host;
296 	int		rpktl;
297 	l_fp		now;
298 
299 	/* We don't want our testing code to actually change the system clock. */
300 	TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
301 	TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
302 
303 	get_systime(&now);
304 	HTONL_FP(&now, &rpkt.reftime);
305 	HTONL_FP(&now, &rpkt.org);
306 	HTONL_FP(&now, &rpkt.rec);
307 	HTONL_FP(&now, &rpkt.xmt);
308 	rpktl = LEN_PKT_NOMAC;
309 	ZERO(host);
310 	AF(&host) = AF_INET;
311 
312 	TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
313 }
314 
315 /* packetHandling.c */
316