xref: /freebsd/contrib/ntp/sntp/tests/packetHandling.c (revision 091002585974d17c9533f943ec351c13a69788ab)
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
3068ba7e87SXin LI setUp(void)
3168ba7e87SXin LI {
32276da39aSCy Schubert 	init_lib();
33276da39aSCy Schubert }
34276da39aSCy Schubert 
35276da39aSCy Schubert 
369034852cSGleb Smirnoff int
3768ba7e87SXin LI LfpEquality(
3868ba7e87SXin LI 	const l_fp	expected,
3968ba7e87SXin LI 	const l_fp 	actual
4068ba7e87SXin LI 	)
4168ba7e87SXin LI {
4268ba7e87SXin LI 	return !!(L_ISEQU(&expected, &actual));
43276da39aSCy Schubert }
44276da39aSCy Schubert 
459034852cSGleb Smirnoff 
469034852cSGleb Smirnoff void
4768ba7e87SXin LI test_GenerateUnauthenticatedPacket(void)
4868ba7e87SXin LI {
49276da39aSCy Schubert 	struct pkt	testpkt;
50276da39aSCy Schubert 	struct timeval	xmt;
5168ba7e87SXin LI 	l_fp		expected_xmt, actual_xmt;
5268ba7e87SXin 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
7368ba7e87SXin LI test_GenerateAuthenticatedPacket(void)
7468ba7e87SXin LI {
7568ba7e87SXin LI 	static const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
7668ba7e87SXin LI 
77276da39aSCy Schubert 	struct key	testkey;
7868ba7e87SXin LI 	struct pkt	testpkt;
7968ba7e87SXin LI 	struct timeval	xmt;
8068ba7e87SXin LI 	l_fp		expected_xmt, actual_xmt;
8168ba7e87SXin LI 	char 		expected_mac[MAX_MD5_LEN];
8268ba7e87SXin 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);
87*09100258SXin LI 	strlcpy(testkey.typen, "MD5", sizeof(testkey.typen));
88*09100258SXin LI 	testkey.typei = keytype_from_text(testkey.typen, NULL);
89276da39aSCy Schubert 
90276da39aSCy Schubert 	GETTIMEOFDAY(&xmt, NULL);
91276da39aSCy Schubert 	xmt.tv_sec += JAN_1970;
92276da39aSCy Schubert 
93276da39aSCy Schubert 	TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
94276da39aSCy Schubert 			  generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
95276da39aSCy Schubert 
96276da39aSCy Schubert 	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
97276da39aSCy Schubert 	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
98276da39aSCy Schubert 	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
99276da39aSCy Schubert 
100276da39aSCy Schubert 	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
101276da39aSCy Schubert 	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
102276da39aSCy Schubert 
103276da39aSCy Schubert 	TVTOTS(&xmt, &expected_xmt);
104276da39aSCy Schubert 	NTOHL_FP(&testpkt.xmt, &actual_xmt);
105276da39aSCy Schubert 	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
106276da39aSCy Schubert 
107276da39aSCy Schubert 	TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
108276da39aSCy Schubert 
10968ba7e87SXin LI 	TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, /* Remove the key_id, only keep the mac. */
110*09100258SXin LI 			  make_mac(&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN-4, &testkey, expected_mac));
1119034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4);
112276da39aSCy Schubert }
113276da39aSCy Schubert 
1149034852cSGleb Smirnoff 
1159034852cSGleb Smirnoff void
11668ba7e87SXin LI test_OffsetCalculationPositiveOffset(void)
11768ba7e87SXin LI {
118276da39aSCy Schubert 	struct pkt	rpkt;
11968ba7e87SXin LI 	l_fp		reftime, tmp;
12068ba7e87SXin LI 	struct timeval	dst;
12168ba7e87SXin LI 	double		offset, precision, synch_distance;
122276da39aSCy Schubert 
12368ba7e87SXin LI 	rpkt.precision = -16; /* 0,000015259 */
124276da39aSCy Schubert 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
125276da39aSCy Schubert 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
12668ba7e87SXin LI 
12768ba7e87SXin LI 	/* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */
128276da39aSCy Schubert 	get_systime(&reftime);
129276da39aSCy Schubert 	HTONL_FP(&reftime, &rpkt.reftime);
130276da39aSCy Schubert 
13168ba7e87SXin LI 	/* T1 - Originate timestamp */
132276da39aSCy Schubert 	tmp.l_ui = 1000000000UL;
133276da39aSCy Schubert 	tmp.l_uf = 0UL;
134276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.org);
135276da39aSCy Schubert 
13668ba7e87SXin LI 	/* T2 - Receive timestamp */
137276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
138276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
139276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.rec);
140276da39aSCy Schubert 
14168ba7e87SXin LI 	/* T3 - Transmit timestamp */
142276da39aSCy Schubert 	tmp.l_ui = 1000000002UL;
143276da39aSCy Schubert 	tmp.l_uf = 0UL;
144276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.xmt);
145276da39aSCy Schubert 
14668ba7e87SXin LI 	/* T4 - Destination timestamp as standard timeval */
147276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
148276da39aSCy Schubert 	tmp.l_uf = 0UL;
149276da39aSCy Schubert 	TSTOTV(&tmp, &dst);
150276da39aSCy Schubert 	dst.tv_sec -= JAN_1970;
151276da39aSCy Schubert 
152276da39aSCy Schubert 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
153276da39aSCy Schubert 
1549034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.25, offset);
1559034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision);
15668ba7e87SXin LI 	/* 1.1250150000000001 ? */
1579034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance);
158276da39aSCy Schubert }
159276da39aSCy Schubert 
1609034852cSGleb Smirnoff 
1619034852cSGleb Smirnoff void
16268ba7e87SXin LI test_OffsetCalculationNegativeOffset(void)
16368ba7e87SXin LI {
164276da39aSCy Schubert 	struct pkt	rpkt;
16568ba7e87SXin LI 	l_fp		reftime, tmp;
16668ba7e87SXin LI 	struct timeval	dst;
16768ba7e87SXin LI 	double		offset, precision, synch_distance;
168276da39aSCy Schubert 
169276da39aSCy Schubert 	rpkt.precision = -1;
170276da39aSCy Schubert 	rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
171276da39aSCy Schubert 	rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
17268ba7e87SXin LI 
17368ba7e87SXin LI 	/* Synch Distance is (0.5+0.5)/2.0, or 0.5 */
174276da39aSCy Schubert 	get_systime(&reftime);
175276da39aSCy Schubert 	HTONL_FP(&reftime, &rpkt.reftime);
176276da39aSCy Schubert 
17768ba7e87SXin LI 	/* T1 - Originate timestamp */
178276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
179276da39aSCy Schubert 	tmp.l_uf = 0UL;
180276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.org);
181276da39aSCy Schubert 
18268ba7e87SXin LI 	/* T2 - Receive timestamp */
183276da39aSCy Schubert 	tmp.l_ui = 1000000000UL;
184276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
185276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.rec);
186276da39aSCy Schubert 
18768ba7e87SXin LI 	/*/ T3 - Transmit timestamp */
188276da39aSCy Schubert 	tmp.l_ui = 1000000001UL;
189276da39aSCy Schubert 	tmp.l_uf = 2147483648UL;
190276da39aSCy Schubert 	HTONL_FP(&tmp, &rpkt.xmt);
191276da39aSCy Schubert 
19268ba7e87SXin LI 	/* T4 - Destination timestamp as standard timeval */
193276da39aSCy Schubert 	tmp.l_ui = 1000000003UL;
194276da39aSCy Schubert 	tmp.l_uf = 0UL;
19568ba7e87SXin LI 
196276da39aSCy Schubert 	TSTOTV(&tmp, &dst);
197276da39aSCy Schubert 	dst.tv_sec -= JAN_1970;
198276da39aSCy Schubert 
199276da39aSCy Schubert 	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
200276da39aSCy Schubert 
2019034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(-1, offset);
2029034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision);
2039034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance);
204276da39aSCy Schubert }
205276da39aSCy Schubert 
2069034852cSGleb Smirnoff 
2079034852cSGleb Smirnoff void
20868ba7e87SXin LI test_HandleUnusableServer(void)
20968ba7e87SXin LI {
210276da39aSCy Schubert 	struct pkt	rpkt;
211276da39aSCy Schubert 	sockaddr_u	host;
212276da39aSCy Schubert 	int		rpktl;
213276da39aSCy Schubert 
214276da39aSCy Schubert 	ZERO(rpkt);
215276da39aSCy Schubert 	ZERO(host);
216276da39aSCy Schubert 	rpktl = SERVER_UNUSEABLE;
217276da39aSCy Schubert 	TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
218276da39aSCy Schubert }
219276da39aSCy Schubert 
2209034852cSGleb Smirnoff 
2219034852cSGleb Smirnoff void
22268ba7e87SXin LI test_HandleUnusablePacket(void)
22368ba7e87SXin LI {
224276da39aSCy Schubert 	struct pkt	rpkt;
225276da39aSCy Schubert 	sockaddr_u	host;
226276da39aSCy Schubert 	int		rpktl;
227276da39aSCy Schubert 
228276da39aSCy Schubert 	ZERO(rpkt);
229276da39aSCy Schubert 	ZERO(host);
230276da39aSCy Schubert 	rpktl = PACKET_UNUSEABLE;
231276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
232276da39aSCy Schubert }
233276da39aSCy Schubert 
2349034852cSGleb Smirnoff 
2359034852cSGleb Smirnoff void
23668ba7e87SXin LI test_HandleServerAuthenticationFailure(void)
23768ba7e87SXin LI {
238276da39aSCy Schubert 	struct pkt	rpkt;
239276da39aSCy Schubert 	sockaddr_u	host;
240276da39aSCy Schubert 	int		rpktl;
241276da39aSCy Schubert 
242276da39aSCy Schubert 	ZERO(rpkt);
243276da39aSCy Schubert 	ZERO(host);
244276da39aSCy Schubert 	rpktl = SERVER_AUTH_FAIL;
245276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
246276da39aSCy Schubert }
247276da39aSCy Schubert 
2489034852cSGleb Smirnoff 
2499034852cSGleb Smirnoff void
25068ba7e87SXin LI test_HandleKodDemobilize(void)
25168ba7e87SXin LI {
25268ba7e87SXin LI 	static const char *	HOSTNAME = "192.0.2.1";
25368ba7e87SXin LI 	static const char *	REASON = "DENY";
254276da39aSCy Schubert 	struct pkt		rpkt;
255276da39aSCy Schubert 	sockaddr_u		host;
256276da39aSCy Schubert 	int			rpktl;
257276da39aSCy Schubert 	struct kod_entry *	entry;
258276da39aSCy Schubert 
259276da39aSCy Schubert 	rpktl = KOD_DEMOBILIZE;
260276da39aSCy Schubert 	ZERO(rpkt);
261276da39aSCy Schubert 	memcpy(&rpkt.refid, REASON, 4);
262276da39aSCy Schubert 	ZERO(host);
263276da39aSCy Schubert 	host.sa4.sin_family = AF_INET;
264276da39aSCy Schubert 	host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
265276da39aSCy Schubert 
26668ba7e87SXin LI 	/* Test that the KOD-entry is added to the database. */
267276da39aSCy Schubert 	kod_init_kod_db("/dev/null", TRUE);
268276da39aSCy Schubert 
269276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
270276da39aSCy Schubert 
271276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
2729034852cSGleb Smirnoff 	TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4);
273276da39aSCy Schubert }
274276da39aSCy Schubert 
2759034852cSGleb Smirnoff 
2769034852cSGleb Smirnoff void
27768ba7e87SXin LI test_HandleKodRate(void)
27868ba7e87SXin LI {
279276da39aSCy Schubert 	struct 	pkt	rpkt;
280276da39aSCy Schubert 	sockaddr_u	host;
281276da39aSCy Schubert 	int		rpktl;
282276da39aSCy Schubert 
283276da39aSCy Schubert 	ZERO(rpkt);
284276da39aSCy Schubert 	ZERO(host);
285276da39aSCy Schubert 	rpktl = KOD_RATE;
286276da39aSCy Schubert 	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
287276da39aSCy Schubert }
288276da39aSCy Schubert 
2899034852cSGleb Smirnoff 
2909034852cSGleb Smirnoff void
29168ba7e87SXin LI test_HandleCorrectPacket(void)
29268ba7e87SXin LI {
293276da39aSCy Schubert 	struct pkt	rpkt;
294276da39aSCy Schubert 	sockaddr_u	host;
295276da39aSCy Schubert 	int		rpktl;
296276da39aSCy Schubert 	l_fp		now;
297276da39aSCy Schubert 
29868ba7e87SXin LI 	/* We don't want our testing code to actually change the system clock. */
299276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
300276da39aSCy Schubert 	TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
301276da39aSCy Schubert 
302276da39aSCy Schubert 	get_systime(&now);
303276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.reftime);
304276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.org);
305276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.rec);
306276da39aSCy Schubert 	HTONL_FP(&now, &rpkt.xmt);
307276da39aSCy Schubert 	rpktl = LEN_PKT_NOMAC;
308276da39aSCy Schubert 	ZERO(host);
309276da39aSCy Schubert 	AF(&host) = AF_INET;
310276da39aSCy Schubert 
311276da39aSCy Schubert 	TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
312276da39aSCy Schubert }
313276da39aSCy Schubert 
314276da39aSCy Schubert /* packetHandling.c */
315