《TCP/IP详解 卷2:实现》 —3.8 以太网初始化
3.8 以太网初始化
作为cpu_startup的一部分,内核查找任何连接的网络设备。这个进程的细节超出了本书的范围。一旦一个设备被识别,一个设备专用的初始化函数就被调用。图3-24显示的是我们的3个例子接口的初始化函数。
每个设备驱动程序为一个网络接口初始化一个专用化的ifnet结构,并调用if_attach把这个结构插入接口链表中。显示在图3-25中的结构le_softc是我们的例子以太网驱动程序的专用化ifnet结构(图3-20)。
1. le_softc结构
69-95 在if_le.c中声明了一个le_softc结构(有NLE成员)的数组。每个结构的第一个成员是sc_ac,arpcom结构对于所有以太网接口都是通用的,接下来是设备专用成员。宏sc_if和sc_addr简化了对结构ifnet及存储在结构arpcom(sc_ac)中的以太网地址的访问,如图3-26所示。
图3-25 结构le_softc
图3-26 结构arpcom
2. arpcom结构
95-101 结构arpcom的第一个成员ac_if是一个ifnet结构,如图3-20所示。ac_enaddr是以太网硬件地址,它是在cpu_startup期间内核检测设备时由LANCE设备驱动程序从硬件上复制的。对于我们的例子驱动程序,这发生在函数leattach中(图3-27)。ac_ipaddr是上一个分配给此设备的IP地址。我们在6.6节讨论地址的分配,可以看到一个接口可以有多个IP地址。也可参见习题6.3。ac_multiaddrs是一个用结构ether_multi表示的以太网多播地址的列表。ac_multicnt统计这个列表的项数。多播列表在第12章讨论。
图3-27所示的是LANCE以太网驱动程序的初始化代码。
106-115 内核在系统中每发现一个LANCE卡都调用一次leattach。
只有一个指向hp_device结构的参数,它包含了HP专用信息,因为它是专为HP工作站编写的驱动程序。
le指向此卡的专用化ifnet结构(图3-20),ifp指向这个结构的第一个成员sc_if—一个通用的ifnet结构。图3-27并不包括设备专用初始化代码,它在本书中不予讨论。
3. 从设备复制硬件地址
126-137 对于LANCE设备,由厂商指派的以太网地址在这个循环中以每次半个字节(4位)从设备复制到sc_addr(即sc_ac.ac_enaddr,见图3-26)。
lestd是一个设备专用的位移表,用于定位hp_addr的相关信息,hp_addr指向LANCE专用信息。
通过printf语句将完整的地址输出到控制台,用来指示此设备存在并且可操作。
4. 初始化ifnet结构
150-157 leattach从hp_device结构把设备单元号复制到if_unit来标识同类型的多个接口。这个设备的if_name是“le”;if_mtu为1500字节(ETHERMTU),以太网的最大传输单元;if_init、if_reset、if_ioctl、if_output和it_start都指向控制网络接口的通用函数的设备专用实现。4.1节说明这些函数。
158 所有的以太网设备都支持IFF_BROADCAST。LANCE设备不接收它自己发送的数据,因此被设置为IFF_SIMPLEX。支持多播的设备和硬件还要设置IFF_MULTICAST。
159-162 bpfattach登记带BPF的接口,在图31-8中说明。函数if_attach把初始化了的ifnet结构插入接口的链表中(3.11节)。
- 点赞
- 收藏
- 关注作者
评论(0)