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