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

📄 refclock_parse.c

📁 网络时间协议NTP 源码 版本v4.2.0b 该源码用于linux平台下
💻 C
📖 第 1 页 / 共 5 页
字号:
 */static intlocal_setcs(	struct parseunit *parse,	parsectl_t  *tcl	){	return parse_setcs(tcl, &parse->parseio);}/*-------------------------------------------------- * local getfmt */static intlocal_getfmt(	struct parseunit *parse,	parsectl_t  *tcl	){	return parse_getfmt(tcl, &parse->parseio);}/*-------------------------------------------------- * local setfmt */static intlocal_setfmt(	struct parseunit *parse,	parsectl_t  *tcl	){	return parse_setfmt(tcl, &parse->parseio);}/*-------------------------------------------------- * local timecode */static intlocal_timecode(	struct parseunit *parse,	parsectl_t  *tcl	){	return parse_timecode(tcl, &parse->parseio);}/*-------------------------------------------------- * local input */static intlocal_input(	struct recvbuf *rbufp	){	struct parseunit *parse = (struct parseunit *)((void *)rbufp->recv_srcclock);	int count;	unsigned char *s;	timestamp_t ts;	if (!parse->peer)		return 0;	/*	 * eat all characters, parsing then and feeding complete samples	 */	count = rbufp->recv_length;	s = (unsigned char *)rbufp->recv_buffer;	ts.fp = rbufp->recv_time;	while (count--)	{		if (parse_ioread(&parse->parseio, (unsigned int)(*s++), &ts))		{			struct recvbuf buf;			/*			 * got something good to eat			 */			if (!PARSE_PPS(parse->parseio.parse_dtime.parse_state))			{#ifdef HAVE_PPSAPI				if (parse->flags & PARSE_PPSCLOCK)				{					struct timespec pps_timeout;					pps_info_t      pps_info;									pps_timeout.tv_sec  = 0;					pps_timeout.tv_nsec = 0;					if (time_pps_fetch(parse->ppshandle, PPS_TSFMT_TSPEC, &pps_info,							   &pps_timeout) == 0)					{						if (pps_info.assert_sequence + pps_info.clear_sequence != parse->ppsserial)						{							double dtemp;						        struct timespec pts;							/*							 * add PPS time stamp if available via ppsclock module							 * and not supplied already.							 */							if (parse->flags & PARSE_CLEAR)							  pts = pps_info.clear_timestamp;							else							  pts = pps_info.assert_timestamp;							parse->parseio.parse_dtime.parse_ptime.fp.l_ui = pts.tv_sec + JAN_1970;							dtemp = pts.tv_nsec / 1e9;							if (dtemp < 0.) {								dtemp += 1;								parse->parseio.parse_dtime.parse_ptime.fp.l_ui--;							}							if (dtemp > 1.) {								dtemp -= 1;								parse->parseio.parse_dtime.parse_ptime.fp.l_ui++;							}							parse->parseio.parse_dtime.parse_ptime.fp.l_uf = dtemp * FRAC;						        parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS;#ifdef DEBUG							if (debug > 3)							{								printf(								       "parse: local_receive: fd %d PPSAPI seq %ld - PPS %s\n",								       rbufp->fd,								       (long)pps_info.assert_sequence + (long)pps_info.clear_sequence,								       lfptoa(&parse->parseio.parse_dtime.parse_ptime.fp, 6));							}#endif						}#ifdef DEBUG						else						{							if (debug > 3)							{								printf(								       "parse: local_receive: fd %d PPSAPI seq assert %ld, seq clear %ld - NO PPS event\n",								       rbufp->fd,								       (long)pps_info.assert_sequence, (long)pps_info.clear_sequence);							}						}#endif						parse->ppsserial = pps_info.assert_sequence + pps_info.clear_sequence;					}#ifdef DEBUG					else					{						if (debug > 3)						{							printf(							       "parse: local_receive: fd %d PPSAPI time_pps_fetch errno = %d\n",							       rbufp->fd,							       errno);						}					}#endif				}#else#ifdef TIOCDCDTIMESTAMP				struct timeval dcd_time;								if (ioctl(rbufp->fd, TIOCDCDTIMESTAMP, &dcd_time) != -1)				{					l_fp tstmp;										TVTOTS(&dcd_time, &tstmp);					tstmp.l_ui += JAN_1970;					L_SUB(&ts.fp, &tstmp);					if (ts.fp.l_ui == 0)					{#ifdef DEBUG						if (debug)						{							printf(							       "parse: local_receive: fd %d DCDTIMESTAMP %s\n",							       rbufp->fd,							       lfptoa(&tstmp, 6));							printf(" sigio %s\n",							       lfptoa(&ts.fp, 6));						}#endif						parse->parseio.parse_dtime.parse_ptime.fp = tstmp;						parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS;					}				}#else /* TIOCDCDTIMESTAMP */#if defined(HAVE_STRUCT_PPSCLOCKEV) && (defined(HAVE_CIOGETEV) || defined(HAVE_TIOCGPPSEV))				if (parse->flags & PARSE_PPSCLOCK)				  {				    l_fp tts;				    struct ppsclockev ev;#ifdef HAVE_CIOGETEV				    if (ioctl(parse->generic->io.fd, CIOGETEV, (caddr_t)&ev) == 0)#endif#ifdef HAVE_TIOCGPPSEV				      if (ioctl(parse->generic->io.fd, TIOCGPPSEV, (caddr_t)&ev) == 0)#endif					{					  if (ev.serial != parse->ppsserial)					    {					      /*					       * add PPS time stamp if available via ppsclock module					       * and not supplied already.					       */					      if (!buftvtots((const char *)&ev.tv, &tts))						{						  ERR(ERR_BADDATA)						    msyslog(LOG_ERR,"parse: local_receive: timestamp conversion error (buftvtots) (ppsclockev.tv)");						}					      else						{						  parse->parseio.parse_dtime.parse_ptime.fp = tts;						  parse->parseio.parse_dtime.parse_state |= PARSEB_PPS|PARSEB_S_PPS;						}					    }					  parse->ppsserial = ev.serial;					}				  }#endif#endif /* TIOCDCDTIMESTAMP */#endif /* HAVE_PPSAPI */			}			if (count)			{	/* simulate receive */				memmove((caddr_t)buf.recv_buffer,					(caddr_t)&parse->parseio.parse_dtime,					sizeof(parsetime_t));				parse_iodone(&parse->parseio);				buf.recv_length = sizeof(parsetime_t);				buf.recv_time = rbufp->recv_time;				buf.srcadr = rbufp->srcadr;				buf.dstadr = rbufp->dstadr;				buf.fd     = rbufp->fd;				buf.next = 0;				buf.X_from_where = rbufp->X_from_where;				rbufp->receiver(&buf);			}			else			{				memmove((caddr_t)rbufp->recv_buffer,					(caddr_t)&parse->parseio.parse_dtime,					sizeof(parsetime_t));				parse_iodone(&parse->parseio);				rbufp->recv_length = sizeof(parsetime_t);				return 1; /* got something & in place return */			}		}	}	return 0;		/* nothing to pass up */}/*-------------------------------------------------- * local receive */static voidlocal_receive(	struct recvbuf *rbufp	){	struct parseunit *parse = (struct parseunit *)((void *)rbufp->recv_srcclock);	parsetime_t parsetime;	if (!parse->peer)	    return;	if (rbufp->recv_length != sizeof(parsetime_t))	{		ERR(ERR_BADIO)			msyslog(LOG_ERR,"PARSE receiver #%d: local_receive: bad size (got %d expected %d)",				CLK_UNIT(parse->peer), rbufp->recv_length, (int)sizeof(parsetime_t));		parse_event(parse, CEVNT_BADREPLY);		return;	}	clear_err(parse, ERR_BADIO);  	memmove((caddr_t)&parsetime,		(caddr_t)rbufp->recv_buffer,		sizeof(parsetime_t));#ifdef DEBUG	if (debug > 3)	  {	    printf("PARSE receiver #%d: status %06x, state %08x, time(fp) %lx.%08lx, stime(fp) %lx.%08lx, ptime(fp) %lx.%08lx\n",		   CLK_UNIT(parse->peer),		   (unsigned int)parsetime.parse_status,		   (unsigned int)parsetime.parse_state,		   (unsigned long)parsetime.parse_time.fp.l_ui,		   (unsigned long)parsetime.parse_time.fp.l_uf,		   (unsigned long)parsetime.parse_stime.fp.l_ui,		   (unsigned long)parsetime.parse_stime.fp.l_uf,		   (unsigned long)parsetime.parse_ptime.fp.l_ui,		   (unsigned long)parsetime.parse_ptime.fp.l_uf);	  }#endif	parse_process(parse, &parsetime);}/*-------------------------------------------------- * init_iobinding - find and initialize lower layers */static bind_t *init_iobinding(	struct parseunit *parse	){  bind_t *b = io_bindings;	while (b->bd_description != (char *)0)	{		if ((*b->bd_init)(parse))		{			return b;		}		b++;	}	return (bind_t *)0;}/**=========================================================================== ** support routines **//*-------------------------------------------------- * convert a flag field to a string */static char *parsestate(	u_long lstate,	char *buffer,	int size	){	static struct bits	{		u_long      bit;		const char *name;	} flagstrings[] =	  {		  { PARSEB_ANNOUNCE,   "DST SWITCH WARNING" },		  { PARSEB_POWERUP,    "NOT SYNCHRONIZED" },		  { PARSEB_NOSYNC,     "TIME CODE NOT CONFIRMED" },		  { PARSEB_DST,        "DST" },		  { PARSEB_UTC,        "UTC DISPLAY" },		  { PARSEB_LEAPADD,    "LEAP ADD WARNING" },		  { PARSEB_LEAPDEL,    "LEAP DELETE WARNING" },		  { PARSEB_LEAPSECOND, "LEAP SECOND" },		  { PARSEB_ALTERNATE,  "ALTERNATE ANTENNA" },		  { PARSEB_TIMECODE,   "TIME CODE" },		  { PARSEB_PPS,        "PPS" },		  { PARSEB_POSITION,   "POSITION" },		  { 0 }	  };	static struct sbits	{		u_long      bit;		const char *name;	} sflagstrings[] =	  {		  { PARSEB_S_LEAP,     "LEAP INDICATION" },		  { PARSEB_S_PPS,      "PPS SIGNAL" },		  { PARSEB_S_ANTENNA,  "ANTENNA" },		  { PARSEB_S_POSITION, "POSITION" },		  { 0 }	  };	int i;	char *s, *t;	*buffer = '\0';	s = t = buffer;	i = 0;	while (flagstrings[i].bit)	{		if (flagstrings[i].bit & lstate)		{			if (s != t)				strncpy(t, "; ", BUFFER_SIZES(buffer, t, size));			strncat(t, flagstrings[i].name, BUFFER_SIZES(buffer, t, size));			t += strlen(t);		}		i++;	}	if (lstate & (PARSEB_S_LEAP|PARSEB_S_ANTENNA|PARSEB_S_PPS|PARSEB_S_POSITION))	{		if (s != t)			strncpy(t, "; ", BUFFER_SIZES(buffer, t, size));		t += strlen(t);		strncpy(t, "(", BUFFER_SIZES(buffer, t, size));		s = t = t + strlen(t);		i = 0;		while (sflagstrings[i].bit)		{			if (sflagstrings[i].bit & lstate)			{				if (t != s)				{					strncpy(t, "; ", BUFFER_SIZES(buffer, t, size));					t += 2;				}					strncpy(t, sflagstrings[i].name, BUFFER_SIZES(buffer, t, size));				t += strlen(t);			}			i++;		}		strncpy(t, ")", BUFFER_SIZES(buffer, t, size));	}	return buffer;}/*-------------------------------------------------- * convert a status flag field to a string */static char *parsestatus(	u_long lstate,	char *buffer,	int size	){	static struct bits	{		u_long      bit;		const char *name;	} flagstrings[] =	  {		  { CVT_OK,      "CONVERSION SUCCESSFUL" },		  { CVT_NONE,    "NO CONVERSION" },		  { CVT_FAIL,    "CONVERSION FAILED" },		  { CVT_BADFMT,  "ILLEGAL FORMAT" },		  { CVT_BADDATE, "DATE ILLEGAL" },		  { CVT_BADTIME, "TIME ILLEGAL" },		  { CVT_ADDITIONAL, "ADDITIONAL DATA" },		  { 0 }	  };	int i;	*buffer = '\0';	i = 0;	while (flagstrings[i].bit)	{		if (flagstrings[i].bit & lstate)		{			if (buffer[0])				strncat(buffer, "; ", size);			strncat(buffer, flagstrings[i].name, size);		}		i++;	}	return buffer;}/*-------------------------------------------------- * convert a clock status flag field to a string */static const char *clockstatus(	u_long lstate	){	static char buffer[20];	static struct status	{		u_long      value;		const char *name;	} flagstrings[] =	  {		  { CEVNT_NOMINAL, "NOMINAL" },		  { CEVNT_TIMEOUT, "NO RESPONSE" },		  { CEVNT_BADREPLY,"BAD FORMAT" },		  { CEVNT_FAULT,   "FAULT" },		  { CEVNT_PROP,    "PROPAGATION DELAY" },		  { CEVNT_BADDATE, "ILLEGAL DAT

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -