《TCP/IP详解 卷2:实现》 —3.9 SLIP初始化
3.9 SLIP初始化
依赖标准异步串行设备的SLIP接口在调用cpu_startup时初始化。当main直接通过SLIP的pdevinit结构中的指针pdev_attach调用slattach时,SLIP伪设备被初始化。
每个SLIP接口由图3-28中的一个sl_softc结构来描述。
图3-28 结构sl_softc
43-54 与所有接口结构一样,sl_softc有一个ifnet结构并且后面跟着设备专用信息。
除了在ifnet结构中的输出队列外,一个SLIP设备还维护另一个队列sc_fastq,它用于要求低时延服务的分组—一般由交互应用产生。
sc_ttyp指向关联的终端设备。指针sc_buf和sc_ep分别指向一个接收SLIP分组的缓存的第一个字节和最后一个字节。sc_mp指向下一个接收字节的地址,并在另一个字节到达时向前移动。
SLIP定义的4个标志显示在图3-29中。
图3-29 SLIP的if_flags和sc_flags值
SLIP在ifnet结构中定义了3个接口标志预留给设备驱动程序,另一个标志定义在结构sl_softc中。
sc_escape用于串行线的IP封装机制(5.3节),而TCP首部压缩信息(29.13节)保留在sc_comp中。
指针sc_bpf指向SLIP设备的BPF信息。
结构sl_softc由slattach初始化,如图3-30所示。
135-152 不像leattach一次仅初始化一个接口,内核只调用一次slattach,并且slattach初始化所有的SLIP接口。硬件设备在内核执行cpu_startup过程中被发现时进行初始化,而伪设备都是在main为这个设备调用pdev_attach函数时被初始化的。一个SLIP设备的if_mtu为296字节(SLMTU)。这包括标准的20字节IP首部、标准的20字节TCP首部和256字节的用户数据(5.3节)。
图3-30 函数slattach
SLIP网络由位于串行通信线两端的两个接口组成。slattach在if_flags中设置IFF_POINTOPOINT、SC_AUTOCOMP和IFF_MULTICAST。
SLIP接口限制它的输出分组队列if_snd的长度为50,并且它自己的接口队列sc_fastq的长度为32。图3-42显示,如果驱动程序没有设置长度,if_snd队列的长度默认为50(ifqmaxlen),因此这里的初始化是多余的。
以太网设备驱动程序不显式地设置它的输出队列的长度,它依赖于ifinit (图3-42)把它设置为系统的默认值。
if_attach需要一个指向ifnet结构的指针,因此slattach将sc_if的地址传递给if_attach,sc_if是一个第一个成员为结构sl_softc的ifnet结构。
专用程序slattach在内核初始化后运行(从初始化文件/etc/netstart),并通过打开串行设备和执行ioctl命令(5.3节)添加SLIP接口和异步串行设备。
153-155 对于每个SLIP设备,slattach调用bpfattach来登记带BPF的接口。
- 点赞
- 收藏
- 关注作者
评论(0)