static void make_packet(ntp_data *data) { data->status = NTP_LI_FUDGE << 6; data->stratum = NTP_STRATUM; data->reference = data->dispersion = 0.0; data->version = NTP_VERSION; data->mode = 1; data->polling = NTP_POLLING; data->precision = NTP_PRECISION; data->receive = data->originate = 0.0; data->current = data->transmit = zbx_current_time(); }
static void unpack_ntp(ntp_data *data, unsigned char *packet, int length) { /* Unpack the essential data from an NTP packet, bypassing struct layout and endian problems. Note that it ignores fields irrelevant to SNTP. */ int i; double d; memset(data, 0, sizeof(ntp_data)); if (0 == length) return; assert(length >= (NTP_TRANSMIT + 8)); data->current = zbx_current_time(); /* best to come first */ data->status = (packet[0] >> 6); data->version = (packet[0] >> 3) & 0x07; data->mode = packet[0] & 0x07; data->stratum = packet[1]; data->polling = packet[2]; data->precision = packet[3]; d = 0.0; for (i = 0; i < 4; i++) d = 256.0 * d + packet[NTP_DISP_FIELD + i]; data->dispersion = d / 65536.0; d = 0.0; for (i = 0; i < 8; i++) d = 256.0 * d + packet[NTP_REFERENCE + i]; data->reference = d / NTP_SCALE; d = 0.0; for (i = 0; i < 8; i++) d = 256.0 * d + packet[NTP_ORIGINATE + i]; data->originate = d / NTP_SCALE; d = 0.0; for (i = 0; i < 8; i++) d = 256.0 * d + packet[NTP_RECEIVE + i]; data->receive = d / NTP_SCALE; d = 0.0; for (i = 0; i < 8; i++) d = 256.0 * d + packet[NTP_TRANSMIT + i]; data->transmit = d / NTP_SCALE; }
static void make_packet(ntp_data *data) { data->version = NTP_VERSION; data->mode = NTP_MODE_CLIENT; data->transmit = zbx_current_time(); }