xref: /freebsd/contrib/ntp/sntp/tests/packetHandling.c (revision 68ba7e87e74b00b0511b346607b464f318c91083)
1276da39aSCy Schubert #include "config.h"
2276da39aSCy Schubert #include "ntp_debug.h"
3276da39aSCy Schubert #include "ntp_stdlib.h"
4276da39aSCy Schubert #include "ntp_types.h"
5276da39aSCy Schubert 
6276da39aSCy Schubert #include "sntptest.h"
7276da39aSCy Schubert 
8276da39aSCy Schubert #include "kod_management.h"
9276da39aSCy Schubert #include "main.h"
10276da39aSCy Schubert #include "networking.h"
11276da39aSCy Schubert #include "ntp.h"
12276da39aSCy Schubert 
13276da39aSCy Schubert #include "unity.h"
14276da39aSCy Schubert 
159034852cSGleb Smirnoff void setUp(void);
169034852cSGleb Smirnoff int LfpEquality(const l_fp expected, const l_fp actual);
179034852cSGleb Smirnoff void test_GenerateUnauthenticatedPacket(void);
189034852cSGleb Smirnoff void test_GenerateAuthenticatedPacket(void);
199034852cSGleb Smirnoff void test_OffsetCalculationPositiveOffset(void);
209034852cSGleb Smirnoff void test_OffsetCalculationNegativeOffset(void);
219034852cSGleb Smirnoff void test_HandleUnusableServer(void);
229034852cSGleb Smirnoff void test_HandleUnusablePacket(void);
239034852cSGleb Smirnoff void test_HandleServerAuthenticationFailure(void);
249034852cSGleb Smirnoff void test_HandleKodDemobilize(void);
259034852cSGleb Smirnoff void test_HandleKodRate(void);
269034852cSGleb Smirnoff void test_HandleCorrectPacket(void);
27276da39aSCy Schubert 
28276da39aSCy Schubert 
299034852cSGleb Smirnoff void
30*68ba7e87SXin LI setUp(void)
31*68ba7e87SXin LI {
32276da39aSCy Schubert 	init_lib();
33276da39aSCy Schubert }
34276da39aSCy Schubert 
35276da39aSCy Schubert 
369034852cSGleb Smirnoff int
37*68ba7e87SXin LI LfpEquality(
38*68ba7e87SXin LI 	const l_fp	expected,
39*68ba7e87SXin LI 	const l_fp 	actual
40*68ba7e87SXin LI 	)
41*68ba7e87SXin LI {
42*68ba7e87SXin LI 	return !!(L_ISEQU(&expected, &actual));
43276da39aSCy Schubert }
44276da39aSCy Schubert 
459034852cSGleb Smirnoff 
469034852cSGleb Smirnoff void
47*68ba7e87SXin LI test_GenerateUnauthenticatedPacket(void)
48*68ba7e87SXin LI {
49276da39aSCy Schubert 	struct pkt	testpkt;
50276da39aSCy Schubert 	struct timeval	xmt;
51*68ba7e87SXin LI 	l_fp		expected_xmt, actual_xmt;
52*68ba7e87SXin LI 
53276da39aSCy Schubert 	GETTIMEOFDAY(&xmt, NULL);
54276da39aSCy Schubert 	xmt.tv_sec += JAN_1970;
55276da39aSCy Schubert 
56276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
57276da39aSCy Schubert 			  generate_pkt(&testpkt, &xmt, 0, NULL));
58276da39aSCy Schubert 
59276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
60276da39aSCy Schubert 	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
61276da39aSCy Schubert 	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
62276da39aSCy Schubert 
63276da39aSCy Schubert 	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
64276da39aSCy Schubert 	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
65276da39aSCy Schubert 
66276da39aSCy Schubert 	TVTOTS(&xmt, &expected_xmt);
67276da39aSCy Schubert 	NTOHL_FP(&testpkt.xmt, &actual_xmt);
68276da39aSCy Schubert 	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
69276da39aSCy Schubert }
70276da39aSCy Schubert 
719034852cSGleb Smirnoff 
729034852cSGleb Smirnoff void
73*68ba7e87SXin LI test_GenerateAuthenticatedPacket(void)
74*68ba7e87SXin LI {
75*68ba7e87SXin LI 	static const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
76*68ba7e87SXin LI 
77276da39aSCy Schubert 	struct key	testkey;
78*68ba7e87SXin LI 	struct pkt	testpkt;
79*68ba7e87SXin LI 	struct timeval	xmt;
80*68ba7e87SXin LI 	l_fp		expected_xmt, actual_xmt;
81*68ba7e87SXin LI 	char 		expected_mac[MAX_MD5_LEN];
82*68ba7e87SXin LI 
83276da39aSCy Schubert 	testkey.next = NULL;
84276da39aSCy Schubert 	testkey.key_id = 30;
85276da39aSCy Schubert 	testkey.key_len = 9;
86276da39aSCy Schubert 	memcpy(testkey.key_seq, "123456789", testkey.key_len);
87276da39aSCy Schubert 	memcpy(testkey.type, "MD5", 3);
88276da39aSCy Schubert 
89276da39aSCy Schubert 	GETTIMEOFDAY(&xmt, NULL);
90276da39aSCy Schubert 	xmt.tv_sec += JAN_1970;
91276da39aSCy Schubert 
92276da39aSCy Schubert 	TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
93276da39aSCy Schubert 			  generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
94276da39aSCy Schubert 
95276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
96276da39aSCy Schubert 	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
97276da39aSCy Schubert 	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
98276da39aSCy Schubert 
99276da39aSCy Schubert 	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
100276da39aSCy Schubert 	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
101276da39aSCy Schubert 
102276da39aSCy Schubert 	TVTOTS(&xmt, &expected_xmt);
103276da39aSCy Schubert 	NTOHL_FP(&testpkt.xmt, &actual_xmt);
104276da39aSCy Schubert 	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
105276da39aSCy Schubert 
106276da39aSCy Schubert 	TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
107276da39aSCy Schubert 
108*68ba7e87SXin LI 	TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, /* Remove the key_id, only keep the mac. */
109*68ba7e87SXin LI 			  make_mac(&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac));
1109034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4);
111276da39aSCy Schubert }
112276da39aSCy Schubert 
1139034852cSGleb Smirnoff 
1149034852cSGleb Smirnoff void
115*68ba7e87SXin LI test_OffsetCalculationPositiveOffset(void)
116*68ba7e87SXin LI {
117276da39aSCy Schubert 	struct pkt	rpkt;
118*68ba7e87SXin LI 	l_fp		reftime, tmp;
119*68ba7e87SXin LI 	struct timeval	dst;
120*68ba7e87SXin LI 	double		offset, precision, synch_distance;
121276da39aSCy Schubert 
122*68ba7e87SXin LI 	rpkt.precision = -16; /* 0,000015259 */
123276da39aSCy Schubert 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
124276da39aSCy Schubert 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
125*68ba7e87SXin LI 
126*68ba7e87SXin LI 	/* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */
127276da39aSCy Schubert 	get_systime(&reftime);
128276da39aSCy Schubert 	HTONL_FP(&reftime, &rpkt.reftime);
129276da39aSCy Schubert 
130*68ba7e87SXin LI 	/* T1 - Originate timestamp */
131276da39aSCy Schubert 	tmp.l_ui = 1000000000UL;
132276da39aSCy Schubert 	tmp.l_uf = 0UL;
133276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.org);
134276da39aSCy Schubert 
135*68ba7e87SXin LI 	/* T2 - Receive timestamp */
136276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
137276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
138276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.rec);
139276da39aSCy Schubert 
140*68ba7e87SXin LI 	/* T3 - Transmit timestamp */
141276da39aSCy Schubert 	tmp.l_ui = 1000000002UL;
142276da39aSCy Schubert 	tmp.l_uf = 0UL;
143276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.xmt);
144276da39aSCy Schubert 
145*68ba7e87SXin LI 	/* T4 - Destination timestamp as standard timeval */
146276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
147276da39aSCy Schubert 	tmp.l_uf = 0UL;
148276da39aSCy Schubert 	TSTOTV(&tmp, &dst);
149276da39aSCy Schubert 	dst.tv_sec -= JAN_1970;
150276da39aSCy Schubert 
151276da39aSCy Schubert 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
152276da39aSCy Schubert 
1539034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.25, offset);
1549034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision);
155*68ba7e87SXin LI 	/* 1.1250150000000001 ? */
1569034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance);
157276da39aSCy Schubert }
158276da39aSCy Schubert 
1599034852cSGleb Smirnoff 
1609034852cSGleb Smirnoff void
161*68ba7e87SXin LI test_OffsetCalculationNegativeOffset(void)
162*68ba7e87SXin LI {
163276da39aSCy Schubert 	struct pkt	rpkt;
164*68ba7e87SXin LI 	l_fp		reftime, tmp;
165*68ba7e87SXin LI 	struct timeval	dst;
166*68ba7e87SXin LI 	double		offset, precision, synch_distance;
167276da39aSCy Schubert 
168276da39aSCy Schubert 	rpkt.precision = -1;
169276da39aSCy Schubert 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
170276da39aSCy Schubert 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
171*68ba7e87SXin LI 
172*68ba7e87SXin LI 	/* Synch Distance is (0.5+0.5)/2.0, or 0.5 */
173276da39aSCy Schubert 	get_systime(&reftime);
174276da39aSCy Schubert 	HTONL_FP(&reftime, &rpkt.reftime);
175276da39aSCy Schubert 
176*68ba7e87SXin LI 	/* T1 - Originate timestamp */
177276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
178276da39aSCy Schubert 	tmp.l_uf = 0UL;
179276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.org);
180276da39aSCy Schubert 
181*68ba7e87SXin LI 	/* T2 - Receive timestamp */
182276da39aSCy Schubert 	tmp.l_ui = 1000000000UL;
183276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
184276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.rec);
185276da39aSCy Schubert 
186*68ba7e87SXin LI 	/*/ T3 - Transmit timestamp */
187276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
188276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
189276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.xmt);
190276da39aSCy Schubert 
191*68ba7e87SXin LI 	/* T4 - Destination timestamp as standard timeval */
192276da39aSCy Schubert 	tmp.l_ui = 1000000003UL;
193276da39aSCy Schubert 	tmp.l_uf = 0UL;
194*68ba7e87SXin LI 
195276da39aSCy Schubert 	TSTOTV(&tmp, &dst);
196276da39aSCy Schubert 	dst.tv_sec -= JAN_1970;
197276da39aSCy Schubert 
198276da39aSCy Schubert 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
199276da39aSCy Schubert 
2009034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(-1, offset);
2019034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision);
2029034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance);
203276da39aSCy Schubert }
204276da39aSCy Schubert 
2059034852cSGleb Smirnoff 
2069034852cSGleb Smirnoff void
207*68ba7e87SXin LI test_HandleUnusableServer(void)
208*68ba7e87SXin LI {
209276da39aSCy Schubert 	struct pkt	rpkt;
210276da39aSCy Schubert 	sockaddr_u	host;
211276da39aSCy Schubert 	int		rpktl;
212276da39aSCy Schubert 
213276da39aSCy Schubert 	ZERO(rpkt);
214276da39aSCy Schubert 	ZERO(host);
215276da39aSCy Schubert 	rpktl = SERVER_UNUSEABLE;
216276da39aSCy Schubert 	TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
217276da39aSCy Schubert }
218276da39aSCy Schubert 
2199034852cSGleb Smirnoff 
2209034852cSGleb Smirnoff void
221*68ba7e87SXin LI test_HandleUnusablePacket(void)
222*68ba7e87SXin LI {
223276da39aSCy Schubert 	struct pkt	rpkt;
224276da39aSCy Schubert 	sockaddr_u	host;
225276da39aSCy Schubert 	int		rpktl;
226276da39aSCy Schubert 
227276da39aSCy Schubert 	ZERO(rpkt);
228276da39aSCy Schubert 	ZERO(host);
229276da39aSCy Schubert 	rpktl = PACKET_UNUSEABLE;
230276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
231276da39aSCy Schubert }
232276da39aSCy Schubert 
2339034852cSGleb Smirnoff 
2349034852cSGleb Smirnoff void
235*68ba7e87SXin LI test_HandleServerAuthenticationFailure(void)
236*68ba7e87SXin LI {
237276da39aSCy Schubert 	struct pkt	rpkt;
238276da39aSCy Schubert 	sockaddr_u	host;
239276da39aSCy Schubert 	int		rpktl;
240276da39aSCy Schubert 
241276da39aSCy Schubert 	ZERO(rpkt);
242276da39aSCy Schubert 	ZERO(host);
243276da39aSCy Schubert 	rpktl = SERVER_AUTH_FAIL;
244276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
245276da39aSCy Schubert }
246276da39aSCy Schubert 
2479034852cSGleb Smirnoff 
2489034852cSGleb Smirnoff void
249*68ba7e87SXin LI test_HandleKodDemobilize(void)
250*68ba7e87SXin LI {
251*68ba7e87SXin LI 	static const char *	HOSTNAME = "192.0.2.1";
252*68ba7e87SXin LI 	static const char *	REASON = "DENY";
253276da39aSCy Schubert 	struct pkt		rpkt;
254276da39aSCy Schubert 	sockaddr_u		host;
255276da39aSCy Schubert 	int			rpktl;
256276da39aSCy Schubert 	struct kod_entry *	entry;
257276da39aSCy Schubert 
258276da39aSCy Schubert 	rpktl = KOD_DEMOBILIZE;
259276da39aSCy Schubert 	ZERO(rpkt);
260276da39aSCy Schubert 	memcpy(&rpkt.refid, REASON, 4);
261276da39aSCy Schubert 	ZERO(host);
262276da39aSCy Schubert 	host.sa4.sin_family = AF_INET;
263276da39aSCy Schubert 	host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
264276da39aSCy Schubert 
265*68ba7e87SXin LI 	/* Test that the KOD-entry is added to the database. */
266276da39aSCy Schubert 	kod_init_kod_db("/dev/null", TRUE);
267276da39aSCy Schubert 
268276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
269276da39aSCy Schubert 
270276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
2719034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4);
272276da39aSCy Schubert }
273276da39aSCy Schubert 
2749034852cSGleb Smirnoff 
2759034852cSGleb Smirnoff void
276*68ba7e87SXin LI test_HandleKodRate(void)
277*68ba7e87SXin LI {
278276da39aSCy Schubert 	struct 	pkt	rpkt;
279276da39aSCy Schubert 	sockaddr_u	host;
280276da39aSCy Schubert 	int		rpktl;
281276da39aSCy Schubert 
282276da39aSCy Schubert 	ZERO(rpkt);
283276da39aSCy Schubert 	ZERO(host);
284276da39aSCy Schubert 	rpktl = KOD_RATE;
285276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
286276da39aSCy Schubert }
287276da39aSCy Schubert 
2889034852cSGleb Smirnoff 
2899034852cSGleb Smirnoff void
290*68ba7e87SXin LI test_HandleCorrectPacket(void)
291*68ba7e87SXin LI {
292276da39aSCy Schubert 	struct pkt	rpkt;
293276da39aSCy Schubert 	sockaddr_u	host;
294276da39aSCy Schubert 	int		rpktl;
295276da39aSCy Schubert 	l_fp		now;
296276da39aSCy Schubert 
297*68ba7e87SXin LI 	/* We don't want our testing code to actually change the system clock. */
298276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
299276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
300276da39aSCy Schubert 
301276da39aSCy Schubert 	get_systime(&now);
302276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.reftime);
303276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.org);
304276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.rec);
305276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.xmt);
306276da39aSCy Schubert 	rpktl = LEN_PKT_NOMAC;
307276da39aSCy Schubert 	ZERO(host);
308276da39aSCy Schubert 	AF(&host) = AF_INET;
309276da39aSCy Schubert 
310276da39aSCy Schubert 	TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
311276da39aSCy Schubert }
312276da39aSCy Schubert 
313276da39aSCy Schubert /* packetHandling.c */
314