1169718Skan#include "config.h"
2169718Skan#include "ntp_debug.h"
3169718Skan#include "ntp_stdlib.h"
4169718Skan#include "ntp_types.h"
5169718Skan
6169718Skan#include "sntptest.h"
7169718Skan
8169718Skan#include "kod_management.h"
9169718Skan#include "main.h"
10169718Skan#include "networking.h"
11169718Skan#include "ntp.h"
12169718Skan
13169718Skan#include "unity.h"
14169718Skan
15169718Skanvoid setUp(void);
16169718Skanint LfpEquality(const l_fp expected, const l_fp actual);
17169718Skanvoid test_GenerateUnauthenticatedPacket(void);
18169718Skanvoid test_GenerateAuthenticatedPacket(void);
19169718Skanvoid test_OffsetCalculationPositiveOffset(void);
20169718Skanvoid test_OffsetCalculationNegativeOffset(void);
21169718Skanvoid test_HandleUnusableServer(void);
22169718Skanvoid test_HandleUnusablePacket(void);
23169718Skanvoid test_HandleServerAuthenticationFailure(void);
24169718Skanvoid test_HandleKodDemobilize(void);
25169718Skanvoid test_HandleKodRate(void);
26169718Skanvoid test_HandleCorrectPacket(void);
27169718Skan
28169718Skan
29169718Skanvoid
30169718SkansetUp(void)
31169718Skan{
32169718Skan	init_lib();
33169718Skan}
34169718Skan
35169718Skan
36169718Skanint
37169718SkanLfpEquality(
38169718Skan	const l_fp	expected,
39169718Skan	const l_fp 	actual
40169718Skan	)
41169718Skan{
42169718Skan	return !!(L_ISEQU(&expected, &actual));
43169718Skan}
44169718Skan
45169718Skan
46169718Skanvoid
47169718Skantest_GenerateUnauthenticatedPacket(void)
48169718Skan{
49169718Skan	struct pkt	testpkt;
50169718Skan	struct timeval	xmt;
51169718Skan	l_fp		expected_xmt, actual_xmt;
52169718Skan
53169718Skan	GETTIMEOFDAY(&xmt, NULL);
54169718Skan	xmt.tv_sec += JAN_1970;
55169718Skan
56169718Skan	TEST_ASSERT_EQUAL(LEN_PKT_NOMAC,
57169718Skan			  generate_pkt(&testpkt, &xmt, 0, NULL));
58169718Skan
59169718Skan	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
60169718Skan	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
61169718Skan	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
62169718Skan
63169718Skan	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
64169718Skan	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
65169718Skan
66169718Skan	TVTOTS(&xmt, &expected_xmt);
67169718Skan	NTOHL_FP(&testpkt.xmt, &actual_xmt);
68169718Skan	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
69169718Skan}
70169718Skan
71169718Skan
72169718Skanvoid
73169718Skantest_GenerateAuthenticatedPacket(void)
74169718Skan{
75169718Skan	static const int EXPECTED_PKTLEN = LEN_PKT_NOMAC + MAX_MD5_LEN;
76169718Skan
77169718Skan	struct key	testkey;
78169718Skan	struct pkt	testpkt;
79169718Skan	struct timeval	xmt;
80169718Skan	l_fp		expected_xmt, actual_xmt;
81169718Skan	char 		expected_mac[MAX_MD5_LEN];
82169718Skan
83169718Skan	testkey.next = NULL;
84169718Skan	testkey.key_id = 30;
85169718Skan	testkey.key_len = 9;
86169718Skan	memcpy(testkey.key_seq, "123456789", testkey.key_len);
87169718Skan	memcpy(testkey.type, "MD5", 3);
88169718Skan
89169718Skan	GETTIMEOFDAY(&xmt, NULL);
90169718Skan	xmt.tv_sec += JAN_1970;
91169718Skan
92169718Skan	TEST_ASSERT_EQUAL(EXPECTED_PKTLEN,
93169718Skan			  generate_pkt(&testpkt, &xmt, testkey.key_id, &testkey));
94169718Skan
95169718Skan	TEST_ASSERT_EQUAL(LEAP_NOTINSYNC, PKT_LEAP(testpkt.li_vn_mode));
96169718Skan	TEST_ASSERT_EQUAL(NTP_VERSION, PKT_VERSION(testpkt.li_vn_mode));
97169718Skan	TEST_ASSERT_EQUAL(MODE_CLIENT, PKT_MODE(testpkt.li_vn_mode));
98169718Skan
99169718Skan	TEST_ASSERT_EQUAL(STRATUM_UNSPEC, PKT_TO_STRATUM(testpkt.stratum));
100169718Skan	TEST_ASSERT_EQUAL(8, testpkt.ppoll);
101169718Skan
102169718Skan	TVTOTS(&xmt, &expected_xmt);
103169718Skan	NTOHL_FP(&testpkt.xmt, &actual_xmt);
104169718Skan	TEST_ASSERT_TRUE(LfpEquality(expected_xmt, actual_xmt));
105169718Skan
106169718Skan	TEST_ASSERT_EQUAL(testkey.key_id, ntohl(testpkt.exten[0]));
107169718Skan
108169718Skan	TEST_ASSERT_EQUAL(MAX_MD5_LEN - 4, /* Remove the key_id, only keep the mac. */
109169718Skan			  make_mac(&testpkt, LEN_PKT_NOMAC, MAX_MD5_LEN, &testkey, expected_mac));
110169718Skan	TEST_ASSERT_EQUAL_MEMORY(expected_mac, (char*)&testpkt.exten[1], MAX_MD5_LEN -4);
111169718Skan}
112169718Skan
113169718Skan
114169718Skanvoid
115169718Skantest_OffsetCalculationPositiveOffset(void)
116169718Skan{
117169718Skan	struct pkt	rpkt;
118169718Skan	l_fp		reftime, tmp;
119169718Skan	struct timeval	dst;
120169718Skan	double		offset, precision, synch_distance;
121169718Skan
122169718Skan	rpkt.precision = -16; /* 0,000015259 */
123169718Skan	rpkt.rootdelay = HTONS_FP(DTOUFP(0.125));
124169718Skan	rpkt.rootdisp = HTONS_FP(DTOUFP(0.25));
125169718Skan
126169718Skan	/* Synch Distance: (0.125+0.25)/2.0 == 0.1875 */
127169718Skan	get_systime(&reftime);
128169718Skan	HTONL_FP(&reftime, &rpkt.reftime);
129169718Skan
130169718Skan	/* T1 - Originate timestamp */
131169718Skan	tmp.l_ui = 1000000000UL;
132169718Skan	tmp.l_uf = 0UL;
133169718Skan	HTONL_FP(&tmp, &rpkt.org);
134169718Skan
135169718Skan	/* T2 - Receive timestamp */
136169718Skan	tmp.l_ui = 1000000001UL;
137169718Skan	tmp.l_uf = 2147483648UL;
138169718Skan	HTONL_FP(&tmp, &rpkt.rec);
139169718Skan
140169718Skan	/* T3 - Transmit timestamp */
141169718Skan	tmp.l_ui = 1000000002UL;
142169718Skan	tmp.l_uf = 0UL;
143169718Skan	HTONL_FP(&tmp, &rpkt.xmt);
144169718Skan
145169718Skan	/* T4 - Destination timestamp as standard timeval */
146169718Skan	tmp.l_ui = 1000000001UL;
147169718Skan	tmp.l_uf = 0UL;
148169718Skan	TSTOTV(&tmp, &dst);
149169718Skan	dst.tv_sec -= JAN_1970;
150169718Skan
151169718Skan	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
152169718Skan
153169718Skan	TEST_ASSERT_EQUAL_DOUBLE(1.25, offset);
154169718Skan	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(16), precision);
155169718Skan	/* 1.1250150000000001 ? */
156169718Skan	TEST_ASSERT_EQUAL_DOUBLE(1.125015, synch_distance);
157169718Skan}
158169718Skan
159169718Skan
160169718Skanvoid
161169718Skantest_OffsetCalculationNegativeOffset(void)
162169718Skan{
163169718Skan	struct pkt	rpkt;
164169718Skan	l_fp		reftime, tmp;
165169718Skan	struct timeval	dst;
166169718Skan	double		offset, precision, synch_distance;
167169718Skan
168169718Skan	rpkt.precision = -1;
169169718Skan	rpkt.rootdelay = HTONS_FP(DTOUFP(0.5));
170169718Skan	rpkt.rootdisp = HTONS_FP(DTOUFP(0.5));
171169718Skan
172169718Skan	/* Synch Distance is (0.5+0.5)/2.0, or 0.5 */
173169718Skan	get_systime(&reftime);
174169718Skan	HTONL_FP(&reftime, &rpkt.reftime);
175169718Skan
176169718Skan	/* T1 - Originate timestamp */
177169718Skan	tmp.l_ui = 1000000001UL;
178169718Skan	tmp.l_uf = 0UL;
179169718Skan	HTONL_FP(&tmp, &rpkt.org);
180169718Skan
181169718Skan	/* T2 - Receive timestamp */
182169718Skan	tmp.l_ui = 1000000000UL;
183169718Skan	tmp.l_uf = 2147483648UL;
184169718Skan	HTONL_FP(&tmp, &rpkt.rec);
185169718Skan
186169718Skan	/*/ T3 - Transmit timestamp */
187169718Skan	tmp.l_ui = 1000000001UL;
188169718Skan	tmp.l_uf = 2147483648UL;
189169718Skan	HTONL_FP(&tmp, &rpkt.xmt);
190169718Skan
191169718Skan	/* T4 - Destination timestamp as standard timeval */
192169718Skan	tmp.l_ui = 1000000003UL;
193169718Skan	tmp.l_uf = 0UL;
194169718Skan
195169718Skan	TSTOTV(&tmp, &dst);
196169718Skan	dst.tv_sec -= JAN_1970;
197169718Skan
198169718Skan	offset_calculation(&rpkt, LEN_PKT_NOMAC, &dst, &offset, &precision, &synch_distance);
199169718Skan
200169718Skan	TEST_ASSERT_EQUAL_DOUBLE(-1, offset);
201169718Skan	TEST_ASSERT_EQUAL_DOUBLE(1. / ULOGTOD(1), precision);
202169718Skan	TEST_ASSERT_EQUAL_DOUBLE(1.3333483333333334, synch_distance);
203169718Skan}
204169718Skan
205169718Skan
206169718Skanvoid
207169718Skantest_HandleUnusableServer(void)
208169718Skan{
209169718Skan	struct pkt	rpkt;
210169718Skan	sockaddr_u	host;
211169718Skan	int		rpktl;
212169718Skan
213169718Skan	ZERO(rpkt);
214169718Skan	ZERO(host);
215169718Skan	rpktl = SERVER_UNUSEABLE;
216169718Skan	TEST_ASSERT_EQUAL(-1, handle_pkt(rpktl, &rpkt, &host, ""));
217169718Skan}
218169718Skan
219169718Skan
220169718Skanvoid
221169718Skantest_HandleUnusablePacket(void)
222169718Skan{
223169718Skan	struct pkt	rpkt;
224169718Skan	sockaddr_u	host;
225169718Skan	int		rpktl;
226169718Skan
227169718Skan	ZERO(rpkt);
228169718Skan	ZERO(host);
229169718Skan	rpktl = PACKET_UNUSEABLE;
230169718Skan	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
231169718Skan}
232169718Skan
233169718Skan
234169718Skanvoid
235169718Skantest_HandleServerAuthenticationFailure(void)
236169718Skan{
237169718Skan	struct pkt	rpkt;
238185777Skib	sockaddr_u	host;
239169718Skan	int		rpktl;
240169718Skan
241169718Skan	ZERO(rpkt);
242169718Skan	ZERO(host);
243169718Skan	rpktl = SERVER_AUTH_FAIL;
244169718Skan	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
245169718Skan}
246169718Skan
247169718Skan
248169718Skanvoid
249169718Skantest_HandleKodDemobilize(void)
250169718Skan{
251169718Skan	static const char *	HOSTNAME = "192.0.2.1";
252169718Skan	static const char *	REASON = "DENY";
253169718Skan	struct pkt		rpkt;
254169718Skan	sockaddr_u		host;
255169718Skan	int			rpktl;
256169718Skan	struct kod_entry *	entry;
257169718Skan
258169718Skan	rpktl = KOD_DEMOBILIZE;
259169718Skan	ZERO(rpkt);
260169718Skan	memcpy(&rpkt.refid, REASON, 4);
261169718Skan	ZERO(host);
262169718Skan	host.sa4.sin_family = AF_INET;
263169718Skan	host.sa4.sin_addr.s_addr = inet_addr(HOSTNAME);
264169718Skan
265169718Skan	/* Test that the KOD-entry is added to the database. */
266169718Skan	kod_init_kod_db("/dev/null", TRUE);
267169718Skan
268169718Skan	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, HOSTNAME));
269169718Skan
270169718Skan	TEST_ASSERT_EQUAL(1, search_entry(HOSTNAME, &entry));
271169718Skan	TEST_ASSERT_EQUAL_MEMORY(REASON, entry->type, 4);
272169718Skan}
273169718Skan
274169718Skan
275169718Skanvoid
276169718Skantest_HandleKodRate(void)
277169718Skan{
278169718Skan	struct 	pkt	rpkt;
279169718Skan	sockaddr_u	host;
280169718Skan	int		rpktl;
281169718Skan
282169718Skan	ZERO(rpkt);
283169718Skan	ZERO(host);
284169718Skan	rpktl = KOD_RATE;
285169718Skan	TEST_ASSERT_EQUAL(1, handle_pkt(rpktl, &rpkt, &host, ""));
286169718Skan}
287169718Skan
288169718Skan
289169718Skanvoid
290169718Skantest_HandleCorrectPacket(void)
291169718Skan{
292169718Skan	struct pkt	rpkt;
293169718Skan	sockaddr_u	host;
294169718Skan	int		rpktl;
295169718Skan	l_fp		now;
296169718Skan
297169718Skan	/* We don't want our testing code to actually change the system clock. */
298169718Skan	TEST_ASSERT_FALSE(ENABLED_OPT(STEP));
299169718Skan	TEST_ASSERT_FALSE(ENABLED_OPT(SLEW));
300169718Skan
301169718Skan	get_systime(&now);
302169718Skan	HTONL_FP(&now, &rpkt.reftime);
303169718Skan	HTONL_FP(&now, &rpkt.org);
304169718Skan	HTONL_FP(&now, &rpkt.rec);
305169718Skan	HTONL_FP(&now, &rpkt.xmt);
306169718Skan	rpktl = LEN_PKT_NOMAC;
307169718Skan	ZERO(host);
308169718Skan	AF(&host) = AF_INET;
309169718Skan
310169718Skan	TEST_ASSERT_EQUAL(0, handle_pkt(rpktl, &rpkt, &host, ""));
311169718Skan}
312169718Skan
313169718Skan/* packetHandling.c */
314169718Skan