《TCP/IP详解 卷2:实现》 —3.12 ifinit函数
3.12 ifinit函数
接口结构被初始化并链接到一起后,main (图3-23)调用ifinit,如图3-42所示。
图3-42 函数ifinit
43-51 for循环遍历接口列表,并把没有被接口的attach函数设置的每个接口输出队列的最大长度设置为50 (ifqmaxlen)。
输出队列的大小关键要考虑的是发送最大长度数据报的分组的个数。例如以太网,若一个进程调用sendto发送65 507字节的数据,它被分为45个数据报片,并且每个数据报片被放进接口的输出队列。若队列非常小,由于队列没有空间,进程可能不能发送大的数据报。
if_slowtimo启动接口的监视(watchdog)定时器。当一个接口的定时器到期,内核会调用这个接口的监视定时器函数。一个接口可以提前重设定时器来阻止监视定时器函数的调用,或者,若不需要监视定时器函数,则可以把if_timer设置为0。图3-43所示的是函数if_slowtimo。
338-343 if_slowtimo函数有一个参数arg没有使用,但慢超时函数的原型(7.4节)要求有这个参数。
图3-43 函数if_slowtimo
344-352 if_slowtimo忽略if_timer为0的接口;若if_timer不等于0,if_slowtimo把if_timer减1,并在这个定时器到达0时调用这个接口关联的if_watchdog函数。在调用if_slowtimo时,分组处理进程被splimp阻塞。返回前,ip_slowtimo调用timeout,以hz/IFNET_SLOWHZ时钟频率调度对它自己的调用。hz是1秒内时钟滴答数(通常是100)。它在系统初始化时设置,并保持不变。因为IFNET_SLOWHZ被定义为1,因此内核每赫兹调用一次if_slowtimo,即每秒一次。
函数timeout调度的函数被内核的函数callout回调。详见[Leffler er al. 1989]。
- 点赞
- 收藏
- 关注作者
评论(0)