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