《TCP/IP详解 卷2:实现》 —3.8 以太网初始化

举报
华章计算机 发表于 2019/11/21 11:31:42 2019/11/21
【摘要】 本节书摘来自华章计算机《TCP/IP详解 卷2:实现》一书中第3章,第3.8节,作者是[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens),陆雪莹 蒋慧 等译 谢希仁 校。

3.8   以太网初始化

作为cpu_startup的一部分,内核查找任何连接的网络设备。这个进程的细节超出了本书的范围。一旦一个设备被识别,一个设备专用的初始化函数就被调用。图3-24显示的是我们的3个例子接口的初始化函数。

每个设备驱动程序为一个网络接口初始化一个专用化的ifnet结构,并调用if_attach把这个结构插入接口链表中。显示在图3-25中的结构le_softc是我们的例子以太网驱动程序的专用化ifnet结构(图3-20)。

image.png

1. le_softc结构

69-95   在if_le.c中声明了一个le_softc结构(有NLE成员)的数组。每个结构的第一个成员是sc_ac,arpcom结构对于所有以太网接口都是通用的,接下来是设备专用成员。宏sc_if和sc_addr简化了对结构ifnet及存储在结构arpcom(sc_ac)中的以太网地址的访问,如图3-26所示。

image.png

图3-25   结构le_softc

image.png

图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章讨论。

image.png

图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节)。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。