1 / 14
文档名称:

PPP程序基本流程.doc

格式:doc   页数:14页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

PPP程序基本流程.doc

上传人:xxj16588 2016/5/31 文件大小:0 KB

下载得到文件列表

PPP程序基本流程.doc

文档介绍

文档介绍:void (*recv_config) __P((int, u_int32_t, int, int)); /* cleanup on error or normal exit */ void (*cleanup) __P((void)); /* close the device, called in children after fork */ void (*close) __P((void)); }; PPP 的状态转换图: 对程序流程的基本框架的说明因为程序是利用 protent 结构指针指向当前所在协议层的方法来实现的因此,每一层都要经历几个阶段,直到本层达到 OPENED 状态时才可进入下一阶段来实现下一阶段的协议。所以对每一层的协议都有相同的函数指针,只是函数指针指向的协议不同而已。整个程序的主体实现是从主函数的 LCP_OPEN() 开始的, 在这个函数里, 调用了有限状态机 FSM_OPEN(), 而在 FSM_OPEN() 中, callback 指针指向了 starting ,于是就到了 LCP_STARTING() 函数来实现一个 OPEN 事件从而使得 PPP 状态准备从 DEAD 到 ESTABLISHED 的转变。接下来, 回到主函数, 下面一步是调用 START_LINK() , 在此函数中会把一个串口设备作为 PPP 的接口,并把状态转变为 ESTABLISHED ,然后调用 lcp_lowerup() 来告诉上层底层已经 UP , lcp_lowerup() 中调用 FSM_LOWERUP() 来发送一个 configure-request 请求, 再把当前状态设置为 REQSENT 状态, 至此, 第一个 LCP 协商的报文已经发送出去。 while (phase != PHASE_DEAD) { handle_events(); get_input(); if (kill_link) lcp_close(0, "User request"); if (asked_to_quit) { bundle_terminating = 1; if (phase == PHASE_MASTER) mp_bundle_terminated(); } if (p_flag) { if (phase == WORK || phase == PHASE_RUNNING) { ccp_fsm[0].flags = OPT_RESTART; /* clears OPT_SILENT */ (*)(0); }}} 接下来的流程实现主要就是在这个 while 循环中实现了。之前说过了我们已经发送了第一个配置协商报文,所以 handle_events() 主要就是做等待接收数据包的时间处理了, 在 handle_events () 里主要调用了两个函数一个是 wait_input() , 他的任务是等待并判断是否超时。还有一个是 calltimeout() 他主要是做超时的处理。当等待并未超时而且有数据包过来, 则调用整个 PPPD 中最重要的函数 get_input() 函数。他主要接收过来的数据包并做出相应的动作。接下来就 get_input() 函数进行详细的说明。首先对包进行判断, 丢弃所有不在 LCP 阶段和没有 OPENED 状态的包, 然后 protop 指针指向当前协议的 input 函数。于是就进入了 LCP_INPUT() ,同理 LCP_INPUT() 调用了 FSM_INPUT() 对收到的包进行代码域的判断,判断收到的是什么包。假设比较顺利,我们收到的是 CONFACK 的包,于是调用 fsm_rconack() 函数,在此函数中根据当前自身的状态来决定下一步的状态如何改变, 这里我们假设也很顺利, 已经发送完了 configure-ack, 因此我们把 FSM 当前状态变成了 OPENED 状态,并把 callback 指针指向 UP. 所以我们马上就调用 LCP_UP ()在那里我们又调用了 LINK_ESTABLISHED() 函数来进入认证的协商,或者如果没有认证则直接进入网络层协议。当然这里我们还是要认证的所有在 LINK_ESTABLISHED() 里我们选择是利用何种认证方式是 PAP, 还是 EAP ,还是 CHAP. 假设我们这里采用 CHAP 而且是选择 CHAP WITH PEER , 意思是等待对端先发送 CHALLENG E 挑战报文。于是我们又调用了 chap_with_peer() 函数,并等待接收挑战报文。于是从新又来到 handle_events() 等待接收。再利用 get_input() 来接收包,在 get_input()