📄 ntp_request.c
字号:
if (pp->status == CTL_PST_SEL_SYNCCAND) ip->flags |= INFO_FLAG_SEL_CANDIDATE; if (pp->status >= CTL_PST_SEL_SYSPEER) ip->flags |= INFO_FLAG_SHORTLIST; ip->timereceived = htonl((u_int32)(current_time - pp->timereceived)); ip->timetosend = htonl(pp->nextdate - current_time); ip->timereachable = htonl((u_int32)(current_time - pp->timereachable)); ip->sent = htonl((u_int32)(pp->sent)); ip->processed = htonl((u_int32)(pp->processed)); ip->badauth = htonl((u_int32)(pp->badauth)); ip->bogusorg = htonl((u_int32)(pp->bogusorg)); ip->oldpkt = htonl((u_int32)(pp->oldpkt)); ip->seldisp = htonl((u_int32)(pp->seldisptoolarge)); ip->selbroken = htonl((u_int32)(pp->selbroken)); ip->candidate = pp->status; ip = (struct info_peer_stats *)more_pkt(); } flush_pkt();}/* * sys_info - return system info */static voidsys_info( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_sys *is; is = (struct info_sys *)prepare_pkt(srcadr, inter, inpkt, v6sizeof(struct info_sys)); if (sys_peer != 0) { if (sys_peer->srcadr.ss_family == AF_INET) { is->peer = GET_INADDR(sys_peer->srcadr); if (client_v6_capable) is->v6_flag = 0; } else if (client_v6_capable) { is->peer6 = GET_INADDR6(sys_peer->srcadr); is->v6_flag = 1; } is->peer_mode = sys_peer->hmode; } else { is->peer = 0; if (client_v6_capable) { is->v6_flag = 0; } is->peer_mode = 0; } is->leap = sys_leap; is->stratum = sys_stratum; is->precision = sys_precision; is->rootdelay = htonl(DTOFP(sys_rootdelay)); is->rootdispersion = htonl(DTOUFP(sys_rootdispersion)); is->frequency = htonl(DTOFP(sys_jitter)); is->stability = htonl(DTOUFP(clock_stability)); is->refid = sys_refid; HTONL_FP(&sys_reftime, &is->reftime); is->poll = sys_poll; is->flags = 0; if (sys_authenticate) is->flags |= INFO_FLAG_AUTHENTICATE; if (sys_bclient) is->flags |= INFO_FLAG_BCLIENT;#ifdef REFCLOCK if (cal_enable) is->flags |= INFO_FLAG_CAL;#endif /* REFCLOCK */ if (kern_enable) is->flags |= INFO_FLAG_KERNEL; if (mon_enabled != MON_OFF) is->flags |= INFO_FLAG_MONITOR; if (ntp_enable) is->flags |= INFO_FLAG_NTP; if (pps_enable) is->flags |= INFO_FLAG_PPS_SYNC; if (stats_control) is->flags |= INFO_FLAG_FILEGEN; is->bdelay = HTONS_FP(DTOFP(sys_bdelay)); HTONL_UF(sys_authdelay.l_f, &is->authdelay); (void) more_pkt(); flush_pkt();}/* * sys_stats - return system statistics */static voidsys_stats( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_sys_stats *ss; /* * Importations from the protocol module */ ss = (struct info_sys_stats *)prepare_pkt(srcadr, inter, inpkt, sizeof(struct info_sys_stats)); ss->timeup = htonl((u_int32)current_time); ss->timereset = htonl((u_int32)(current_time - sys_stattime)); ss->denied = htonl((u_int32)sys_restricted); ss->oldversionpkt = htonl((u_int32)sys_oldversionpkt); ss->newversionpkt = htonl((u_int32)sys_newversionpkt); ss->unknownversion = htonl((u_int32)sys_unknownversion); ss->badlength = htonl((u_int32)sys_badlength); ss->processed = htonl((u_int32)sys_processed); ss->badauth = htonl((u_int32)sys_badauth); ss->limitrejected = htonl((u_int32)sys_limitrejected); ss->received = htonl((u_int32)sys_received); (void) more_pkt(); flush_pkt();}/* * mem_stats - return memory statistics */static voidmem_stats( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_mem_stats *ms; register int i; /* * Importations from the peer module */ extern int peer_hash_count[NTP_HASH_SIZE]; extern int peer_free_count; extern u_long peer_timereset; extern u_long findpeer_calls; extern u_long peer_allocations; extern u_long peer_demobilizations; extern int total_peer_structs; ms = (struct info_mem_stats *)prepare_pkt(srcadr, inter, inpkt, sizeof(struct info_mem_stats)); ms->timereset = htonl((u_int32)(current_time - peer_timereset)); ms->totalpeermem = htons((u_short)total_peer_structs); ms->freepeermem = htons((u_short)peer_free_count); ms->findpeer_calls = htonl((u_int32)findpeer_calls); ms->allocations = htonl((u_int32)peer_allocations); ms->demobilizations = htonl((u_int32)peer_demobilizations); for (i = 0; i < NTP_HASH_SIZE; i++) { if (peer_hash_count[i] > 255) ms->hashcount[i] = 255; else ms->hashcount[i] = (u_char)peer_hash_count[i]; } (void) more_pkt(); flush_pkt();}/* * io_stats - return io statistics */static voidio_stats( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_io_stats *io; /* * Importations from the io module */ extern u_long io_timereset; io = (struct info_io_stats *)prepare_pkt(srcadr, inter, inpkt, sizeof(struct info_io_stats)); io->timereset = htonl((u_int32)(current_time - io_timereset)); io->totalrecvbufs = htons((u_short) total_recvbuffs()); io->freerecvbufs = htons((u_short) free_recvbuffs()); io->fullrecvbufs = htons((u_short) full_recvbuffs()); io->lowwater = htons((u_short) lowater_additions()); io->dropped = htonl((u_int32)packets_dropped); io->ignored = htonl((u_int32)packets_ignored); io->received = htonl((u_int32)packets_received); io->sent = htonl((u_int32)packets_sent); io->notsent = htonl((u_int32)packets_notsent); io->interrupts = htonl((u_int32)handler_calls); io->int_received = htonl((u_int32)handler_pkts); (void) more_pkt(); flush_pkt();}/* * timer_stats - return timer statistics */static voidtimer_stats( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_timer_stats *ts; /* * Importations from the timer module */ extern u_long timer_timereset; extern u_long timer_overflows; extern u_long timer_xmtcalls; ts = (struct info_timer_stats *)prepare_pkt(srcadr, inter, inpkt, sizeof(struct info_timer_stats)); ts->timereset = htonl((u_int32)(current_time - timer_timereset)); ts->alarms = htonl((u_int32)alarm_overflow); ts->overflows = htonl((u_int32)timer_overflows); ts->xmtcalls = htonl((u_int32)timer_xmtcalls); (void) more_pkt(); flush_pkt();}/* * loop_info - return the current state of the loop filter */static voidloop_info( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_loop *li; l_fp ltmp; /* * Importations from the loop filter module */ extern double last_offset; extern double drift_comp; extern int tc_counter; extern u_long sys_clocktime; li = (struct info_loop *)prepare_pkt(srcadr, inter, inpkt, sizeof(struct info_loop)); DTOLFP(last_offset, <mp); HTONL_FP(<mp, &li->last_offset); DTOLFP(drift_comp * 1e6, <mp); HTONL_FP(<mp, &li->drift_comp); li->compliance = htonl((u_int32)(tc_counter)); li->watchdog_timer = htonl((u_int32)(current_time - sys_clocktime)); (void) more_pkt(); flush_pkt();}/* * do_conf - add a peer to the configuration list */static voiddo_conf( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ int items; u_int fl; struct conf_peer *cp; struct conf_peer temp_cp; struct sockaddr_storage peeraddr; struct sockaddr_in tmp_clock; /* * Do a check of everything to see that it looks * okay. If not, complain about it. Note we are * very picky here. */ items = INFO_NITEMS(inpkt->err_nitems); cp = (struct conf_peer *)inpkt->data; memset(&temp_cp, 0, sizeof(struct conf_peer)); memcpy(&temp_cp, (char *)cp, INFO_ITEMSIZE(inpkt->mbz_itemsize)); fl = 0; while (items-- > 0 && !fl) { if (((temp_cp.version) > NTP_VERSION) || ((temp_cp.version) < NTP_OLDVERSION)) fl = 1; if (temp_cp.hmode != MODE_ACTIVE && temp_cp.hmode != MODE_CLIENT && temp_cp.hmode != MODE_BROADCAST) fl = 1; if (temp_cp.flags & ~(CONF_FLAG_AUTHENABLE | CONF_FLAG_PREFER | CONF_FLAG_BURST | CONF_FLAG_IBURST | CONF_FLAG_SKEY)) fl = 1; cp = (struct conf_peer *) ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); } if (fl) { req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } /* * Looks okay, try it out */ items = INFO_NITEMS(inpkt->err_nitems); cp = (struct conf_peer *)inpkt->data; while (items-- > 0) { memset(&temp_cp, 0, sizeof(struct conf_peer)); memcpy(&temp_cp, (char *)cp, INFO_ITEMSIZE(inpkt->mbz_itemsize)); memset((char *)&peeraddr, 0, sizeof(struct sockaddr_storage)); fl = 0; if (temp_cp.flags & CONF_FLAG_AUTHENABLE) fl |= FLAG_AUTHENABLE; if (temp_cp.flags & CONF_FLAG_PREFER) fl |= FLAG_PREFER; if (temp_cp.flags & CONF_FLAG_BURST) fl |= FLAG_BURST; if (temp_cp.flags & CONF_FLAG_IBURST) fl |= FLAG_IBURST; if (temp_cp.flags & CONF_FLAG_SKEY) fl |= FLAG_SKEY; if (client_v6_capable && temp_cp.v6_flag != 0) { peeraddr.ss_family = AF_INET6; GET_INADDR6(peeraddr) = temp_cp.peeraddr6; } else { peeraddr.ss_family = AF_INET; GET_INADDR(peeraddr) = temp_cp.peeraddr; /* * Make sure the address is valid */ tmp_clock = *CAST_V4(peeraddr); if (#ifdef REFCLOCK !ISREFCLOCKADR(&tmp_clock) &&#endif ISBADADR(&tmp_clock)) { req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } } NSRCPORT(&peeraddr) = htons(NTP_PORT);#ifdef HAVE_SA_LEN_IN_STRUCT_SOCKADDR peeraddr.ss_len = SOCKLEN(&peeraddr);#endif /* XXX W2DO? minpoll/maxpoll arguments ??? */ if (peer_config(&peeraddr, (struct interface *)0, temp_cp.hmode, temp_cp.version, temp_cp.minpoll, temp_cp.maxpoll, fl, temp_cp.ttl, temp_cp.keyid, NULL) == 0) { req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); return; } cp = (struct conf_peer *) ((char *)cp + INFO_ITEMSIZE(inpkt->mbz_itemsize)); } req_ack(srcadr, inter, inpkt, INFO_OKAY);}#if 0/* XXX *//* * dns_a - Snarf DNS info for an association ID */static voiddns_a( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct info_dns_assoc *dp; register int items; struct sockaddr_in peeraddr; /* * Do a check of everything to see that it looks * okay. If not, complain about it. Note we are * very picky here. */ items = INFO_NITEMS(inpkt->err_nitems); dp = (struct info_dns_assoc *)inpkt->data; /* * Looks okay, try it out */ items = INFO_NITEMS(inpkt->err_nitems); dp = (struct info_dns_assoc *)inpkt->data; memset((char *)&peeraddr, 0, sizeof(struct sockaddr_in)); peeraddr.sin_family = AF_INET; peeraddr.sin_port = htons(NTP_PORT); /* * Make sure the address is valid */ if (#ifdef REFCLOCK !ISREFCLOCKADR(&peeraddr) &&#endif ISBADADR(&peeraddr)) {#ifdef REFCLOCK msyslog(LOG_ERR, "dns_a: !ISREFCLOCK && ISBADADR");#else msyslog(LOG_ERR, "dns_a: ISBADADR");#endif req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } while (items-- > 0) { associd_t associd; size_t hnl; struct peer *peer; int bogon = 0; associd = dp->associd; peer = findpeerbyassoc(associd); if (peer == 0 || peer->flags & FLAG_REFCLOCK) { msyslog(LOG_ERR, "dns_a: %s", (peer == 0) ? "peer == 0" : "peer->flags & FLAG_REFCLOCK"); ++bogon; } peeraddr.sin_addr.s_addr = dp->peeraddr; for (hnl = 0; dp->hostname[hnl] && hnl < sizeof dp->hostname; ++hnl) ; if (hnl >= sizeof dp->hostname) { msyslog(LOG_ERR, "dns_a: hnl (%ld) >= %ld", (long)hnl, (long)sizeof dp->hostname); ++bogon; } msyslog(LOG_INFO, "dns_a: <%s> for %s, AssocID %d, bogon %d", dp->hostname, stoa((struct sockaddr_storage *)&peeraddr), associd, bogon); if (bogon) { /* If it didn't work */ req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); return; } else {#if 0#ifdef PUBKEY crypto_public(peer, dp->hostname);#endif /* PUBKEY */#endif } dp++; } req_ack(srcadr, inter, inpkt, INFO_OKAY);}#endif /* 0 *//* * do_unconf - remove a peer from the configuration list */static voiddo_unconf( struct sockaddr_storage *srcadr, struct interface *inter, struct req_pkt *inpkt ){ register struct conf_unpeer *cp; struct conf_unpeer temp_cp; register int items; register struct peer *peer; struct sockaddr_storage peeraddr; int bad, found;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -