From: Linux Karlsson Date: Mon, 2 Aug 2010 18:36:02 +0000 (+0200) Subject: Refactoring of packet parsing for unit testing. X-Git-Tag: NTP_4_2_7P43~3^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7ef3039556d173e57cd3ea1c4961a18c94e375a2;p=thirdparty%2Fntp.git Refactoring of packet parsing for unit testing. Moved packet parsing to a new function. bk: 4c571012rY_fhVtYjeCHpPl73r9tkA --- diff --git a/sntp/main.c b/sntp/main.c index 43c601169..e8564a69c 100644 --- a/sntp/main.c +++ b/sntp/main.c @@ -168,6 +168,143 @@ generate_pkt ( return pkt_len; } +int +handle_pkt ( + int rpktl, + struct pkt *rpkt, + struct addrinfo *host + ) +{ + struct timeval tv_dst; + int sw_case, digits; + char *hostname = NULL, *log_str, *ref, *ts_str = NULL; + double t21, t34, delta, offset, precision, root_dispersion; + l_fp p_rec, p_xmt, p_ref, p_org, tmp, dst; + u_fp p_rdly, p_rdsp; + char addr_buf[INET6_ADDRSTRLEN]; + + if(rpktl > 0) + sw_case = 1; + else + sw_case = rpktl; + + switch(sw_case) { + case SERVER_UNUSEABLE: + return -1; + break; + + case PACKET_UNUSEABLE: + break; + + case SERVER_AUTH_FAIL: + break; + + case KOD_DEMOBILIZE: + /* Received a DENY or RESTR KOD packet */ + hostname = addrinfo_to_str(host); + ref = (char *)&rpkt->refid; + add_entry(hostname, ref); + + if (ENABLED_OPT(NORMALVERBOSE)) + printf("sntp on_wire: Received KOD packet with code: %c%c%c%c from %s, demobilizing all connections\n", + ref[0], ref[1], ref[2], ref[3], + hostname); + + log_str = emalloc(INET6_ADDRSTRLEN + 72); + snprintf(log_str, INET6_ADDRSTRLEN + 72, + "Received a KOD packet with code %c%c%c%c from %s, demobilizing all connections", + ref[0], ref[1], ref[2], ref[3], + hostname); + log_msg(log_str, 2); + free(log_str); + break; + + case KOD_RATE: + /* Hmm... probably we should sleep a bit here */ + break; + + case 1: + /* Convert timestamps from network to host byte order */ + p_rdly = NTOHS_FP(rpkt->rootdelay); + p_rdsp = NTOHS_FP(rpkt->rootdisp); + NTOHL_FP(&rpkt->reftime, &p_ref); + NTOHL_FP(&rpkt->org, &p_org); + NTOHL_FP(&rpkt->rec, &p_rec); + NTOHL_FP(&rpkt->xmt, &p_xmt); + + if (ENABLED_OPT(NORMALVERBOSE)) { + getnameinfo(host->ai_addr, host->ai_addrlen, addr_buf, + sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); + printf("sntp on_wire: Received %i bytes from %s\n", rpktl, addr_buf); + } + + precision = LOGTOD(rpkt->precision); +#ifdef DEBUG + printf("sntp precision: %f\n", precision); +#endif /* DEBUG */ + for (digits = 0; (precision *= 10.) < 1.; ++digits) + /* empty */ ; + if (digits > 6) + digits = 6; + + root_dispersion = FPTOD(p_rdsp); + +#ifdef DEBUG + printf("sntp rootdelay: %f\n", FPTOD(p_rdly)); + printf("sntp rootdisp: %f\n", root_dispersion); + + pkt_output(rpkt, rpktl, stdout); + + printf("sntp on_wire: rpkt->reftime:\n"); + l_fp_output(&(rpkt->reftime), stdout); + printf("sntp on_wire: rpkt->org:\n"); + l_fp_output(&(rpkt->org), stdout); + printf("sntp on_wire: rpkt->rec:\n"); + l_fp_output(&(rpkt->rec), stdout); + printf("sntp on_wire: rpkt->rec:\n"); + l_fp_output_bin(&(rpkt->rec), stdout); + printf("sntp on_wire: rpkt->rec:\n"); + l_fp_output_dec(&(rpkt->rec), stdout); + printf("sntp on_wire: rpkt->xmt:\n"); + l_fp_output(&(rpkt->xmt), stdout); +#endif + + /* Compute offset etc. */ + GETTIMEOFDAY(&tv_dst, (struct timezone *)NULL); + tv_dst.tv_sec += JAN_1970; + tmp = p_rec; + L_SUB(&tmp, &p_org); + LFPTOD(&tmp, t21); + TVTOTS(&tv_dst, &dst); + tmp = dst; + L_SUB(&tmp, &p_xmt); + LFPTOD(&tmp, t34); + offset = (t21 + t34) / 2.; + delta = t21 - t34; + + if(ENABLED_OPT(NORMALVERBOSE)) + printf("sntp on_wire:\tt21: %.6f\t\t t34: %.6f\n\t\tdelta: %.6f\t offset: %.6f\n", + t21, t34, delta, offset); + + ts_str = tv_to_str(&tv_dst); + printf("%s ", ts_str); + if(offset > 0) + printf("+"); + printf("%.*f", digits, offset); + if (root_dispersion > 0.) + printf(" +/- %f secs", root_dispersion); + printf("\n"); + free(ts_str); + + if(ENABLED_OPT(SETTOD) || ENABLED_OPT(ADJTIME)) + return set_time(offset); + + return 0; + } + + return 1; +} + /* The heart of (S)NTP, exchange NTP packets and compute values to correct the local clock */ int on_wire ( @@ -179,7 +316,6 @@ on_wire ( char addr_buf[INET6_ADDRSTRLEN]; register int try; SOCKET sock; - char *ref; struct key *pkt_key = NULL; int key_id = 0; @@ -188,14 +324,9 @@ on_wire ( get_key(key_id, &pkt_key); } for(try=0; try<5; try++) { - struct timeval tv_xmt, tv_dst; + struct timeval tv_xmt; struct pkt x_pkt; - double t21, t34, delta, offset, precision, root_dispersion; - int digits, error, rpktl, sw_case; - char *hostname = NULL, *ts_str = NULL; - char *log_str; - u_fp p_rdly, p_rdsp; - l_fp p_rec, p_xmt, p_ref, p_org, tmp, dst; + int error, rpktl, handle_pkt_res; memset(&r_pkt, 0, sizeof rbuf); @@ -220,124 +351,9 @@ on_wire ( closesocket(sock); } - if(rpktl > 0) - sw_case = 1; - else - sw_case = rpktl; - - switch(sw_case) { - case SERVER_UNUSEABLE: - return -1; - break; - - case PACKET_UNUSEABLE: - break; - - case SERVER_AUTH_FAIL: - break; - - case KOD_DEMOBILIZE: - /* Received a DENY or RESTR KOD packet */ - hostname = addrinfo_to_str(host); - ref = (char *)&r_pkt.refid; - add_entry(hostname, ref); - - if (ENABLED_OPT(NORMALVERBOSE)) - printf("sntp on_wire: Received KOD packet with code: %c%c%c%c from %s, demobilizing all connections\n", - ref[0], ref[1], ref[2], ref[3], - hostname); - - log_str = emalloc(INET6_ADDRSTRLEN + 72); - snprintf(log_str, INET6_ADDRSTRLEN + 72, - "Received a KOD packet with code %c%c%c%c from %s, demobilizing all connections", - ref[0], ref[1], ref[2], ref[3], - hostname); - log_msg(log_str, 2); - free(log_str); - break; - - case KOD_RATE: - /* Hmm... probably we should sleep a bit here */ - break; - - case 1: - /* Convert timestamps from network to host byte order */ - p_rdly = NTOHS_FP(r_pkt.rootdelay); - p_rdsp = NTOHS_FP(r_pkt.rootdisp); - NTOHL_FP(&r_pkt.reftime, &p_ref); - NTOHL_FP(&r_pkt.org, &p_org); - NTOHL_FP(&r_pkt.rec, &p_rec); - NTOHL_FP(&r_pkt.xmt, &p_xmt); - - if (ENABLED_OPT(NORMALVERBOSE)) { - getnameinfo(host->ai_addr, host->ai_addrlen, addr_buf, - sizeof(addr_buf), NULL, 0, NI_NUMERICHOST); - printf("sntp on_wire: Received %i bytes from %s\n", rpktl, addr_buf); - } - - precision = LOGTOD(r_pkt.precision); -#ifdef DEBUG - printf("sntp precision: %f\n", precision); -#endif /* DEBUG */ - for (digits = 0; (precision *= 10.) < 1.; ++digits) - /* empty */ ; - if (digits > 6) - digits = 6; - - root_dispersion = FPTOD(p_rdsp); - -#ifdef DEBUG - printf("sntp rootdelay: %f\n", FPTOD(p_rdly)); - printf("sntp rootdisp: %f\n", root_dispersion); - - pkt_output(&r_pkt, rpktl, stdout); - - printf("sntp on_wire: r_pkt.reftime:\n"); - l_fp_output(&(r_pkt.reftime), stdout); - printf("sntp on_wire: r_pkt.org:\n"); - l_fp_output(&(r_pkt.org), stdout); - printf("sntp on_wire: r_pkt.rec:\n"); - l_fp_output(&(r_pkt.rec), stdout); - printf("sntp on_wire: r_pkt.rec:\n"); - l_fp_output_bin(&(r_pkt.rec), stdout); - printf("sntp on_wire: r_pkt.rec:\n"); - l_fp_output_dec(&(r_pkt.rec), stdout); - printf("sntp on_wire: r_pkt.xmt:\n"); - l_fp_output(&(r_pkt.xmt), stdout); -#endif - - /* Compute offset etc. */ - GETTIMEOFDAY(&tv_dst, (struct timezone *)NULL); - tv_dst.tv_sec += JAN_1970; - tmp = p_rec; - L_SUB(&tmp, &p_org); - LFPTOD(&tmp, t21); - TVTOTS(&tv_dst, &dst); - tmp = dst; - L_SUB(&tmp, &p_xmt); - LFPTOD(&tmp, t34); - offset = (t21 + t34) / 2.; - delta = t21 - t34; - - if(ENABLED_OPT(NORMALVERBOSE)) - printf("sntp on_wire:\tt21: %.6f\t\t t34: %.6f\n\t\tdelta: %.6f\t offset: %.6f\n", - t21, t34, delta, offset); - - ts_str = tv_to_str(&tv_dst); - printf("%s ", ts_str); - if(offset > 0) - printf("+"); - printf("%.*f", digits, offset); - if (root_dispersion > 0.) - printf(" +/- %f secs", root_dispersion); - printf("\n"); - free(ts_str); - - if(ENABLED_OPT(SETTOD) || ENABLED_OPT(ADJTIME)) - return set_time(offset); - - return 0; - } + handle_pkt_res = handle_pkt(rpktl, &r_pkt, host); + if (handle_pkt_res < 1) + return handle_pkt_res; } getnameinfo(host->ai_addr, host->ai_addrlen, addr_buf, sizeof(addr_buf), NULL, 0, NI_NUMERICHOST);