码迷,mamicode.com
首页 > 其他好文 > 详细

分析ntp调用过程

时间:2018-09-08 15:27:03      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:inf   struct   interface   loop   priority   mode   srand   eth   执行   

//分析ntp调用过程
//刘术河 2016.08.17

Ntp-keygen.c (util):main(
Ntpd.c (ntpd):main(
Ntpd.c (ntpd):main(
Ntpdate.c (ntpdate):main(
Ntpdc.c (ntpdc):main(
Ntpq.c (ntpq):main(
Ntptime.c (util):main(
Sntp.c (sntp):main (
Tickadj.c (util):main(
Tickadj.c (util):main(

//开发板上电只调用ntpd
\ntp-4.2.6p5\ntpd\Ntpd.c
main(
ntpdmain(argc, argv);
get_systime(&now);
ntp_srandom((int)(now.l_i * now.l_uf));
init_auth();
init_util();
init_restrict();
init_mon();
init_timer();
init_lib();
init_request();
init_control();
init_peer();
#ifdef REFCLOCK
init_refclock();
{
for (i = 0; i < (int)num_refclock_conf; i++)
if (refclock_conf[i]->clock_init != noentry)
(refclock_conf[i]->clock_init)();
//这个refclock_conf----是一个结构体,并调用结构体的clock_init,但是refclock_nmea没有init所以跳过
struct refclock * const refclock_conf[] = {
................
&refclock_nmea, /* 20 REFCLK_GPS_NMEA */
................
}


}
#endif
set_process_priority();
init_proto(); /* Call at high priority */
init_io();
init_loopfilter();
mon_start(MON_ON); /* monitor on by default now */
/* turn off in config if unwanted */

/*
* Get the configuration. This is done in a separate module
* since this will definitely be different for the gizmo board.
*/
getconfig(argc, argv);
report_event(EVNT_SYSRESTART, NULL, NULL);
loop_config(LOOP_DRIFTCOMP, old_drift);
////////////////////////////////////////////////////////////////////////////////
//ntpd\Ntp_peer.c
1.peer_config
return(newpeer(srcadr, dstadr, hmode, version, minpoll, maxpoll,
newpeer(
if (!refclock_newpeer(peer)) {
refclock_newpeer
refclock_conf[clktype]->clock_start == noentry) {
//\ntp-4.2.6p5\ntpd\Ntp_proto.c
2.receive
if ((peer = newpeer(&rbufp->recv_srcadr, rbufp->dstadr,
newpeer(
if (!refclock_newpeer(peer)) {
refclock_newpeer
refclock_conf[clktype]->clock_start == noentry) {
//先分析peer_config
//ntpd\Ntp_request.c
proc = ntp_codes;
inpkt->request == REQ_CONFIG &&
req_ack(srcadr, inter, inpkt, INFO_ERR_FMT);
static struct req_proc ntp_codes[] = {
sizeof(struct conf_peer), do_conf },
}

do_conf
if (peer_config(&peeraddr, (struct interface *)0,
//ntpd\Ntp_config.c
#ifndef SIM //如果sim没有定义,才执行,所以Ntp_config这条分之不执行
config_ntpd(ptree);
#else
config_ntpd
config_peers(ptree);
config_peers
peer_config(&peeraddr,

//再分析receive
Ntpsim.c (ntpd): rbuf.receiver = receive; /* Function to call to process the packet */
Ntptimeset.c (ntpdate): receive(rbuf);
Ntp_io.c (ntpd): rb->receiver = receive;
Ntp_iocompletionport.c (ports\winnt\ntpd): buff->receiver = receive;

0.先看Ntpsim和Ntp_io,最终调用到这里
#ifdef SIM
cc = simulate_server(dest, src, pkt);
#else

1.先看Ntptimeset.c
main
ntptimesetmain
receive(rbuf);
但是这个程序,我们不调用它,所以现在只剩下Ntp_iocompletionport.c
2.分析Ntp_iocompletionport.c
//这个SYS_WINNT没有定义,所以都不执行
#ifdef SYS_WINNT
init_io_completion_port();
#endif /* SYS_WINNT */

thread = (HANDLE)_beginthreadex(
NULL,
0,
iocompletionthread,
NULL,
CREATE_SUSPENDED,
&tid);
ResumeThread(thread);
CloseHandle(thread);

iocompletionthread
case SOCK_RECV:
OnSocketRecv(Key, lpo, BytesTransferred, errstatus);
buff->receiver = receive;

//到这里主线清楚
//ntp-4.2.6p5\ntpd\Ntp_request.c
req_ack
//ntp-4.2.6p5\ntpd\Ntp_io.c
sendpkt(srcadr, inter, -1, (struct pkt *)&rpkt, RESP_HEADER_SIZE);
#ifdef SIM
cc = simulate_server(dest, src, pkt);
#else

 

分析ntp调用过程

标签:inf   struct   interface   loop   priority   mode   srand   eth   执行   

原文地址:https://www.cnblogs.com/liushuhe1990/p/9609013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!