⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ntp_request.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 5 页
字号:
		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, &ltmp);	HTONL_FP(&ltmp, &li->last_offset);	DTOLFP(drift_comp * 1e6, &ltmp);	HTONL_FP(&ltmp, &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 + -