列表管理
net_device 数据结构均被插入到一个全局列表和两个hash表中,对此在第八章中予以描述,下列字段用于完成这些任务。
struct net_device *next
把每个net_device 数据结构链接为全局列表中的下一个元素
struct hlist_node name_hlist
struct hlist_node index_hlist
把net_device 结构链接至两个hash表的bucket列表。
链路层多播
多播是一种把数据传递给多位接受着的机制,多播可以在L3网络层以及L2链路层Ethernet中使用,在本节我们关心的是后者。
链路层多播的传送,可以通过在链路层报头中使用特殊地址或者控制信息,Ethernet本省就支持多播,在第十三章会看到一个Ethernet地址如何划分为单播,多播或者广播。
利用一个特定位把多播地址和其他范围的地址区分开来,这意味着可能地址中有50%是多播的,而2^48的50%可是很大的数字,当一个借口背要求加入一大堆多播群组时,则该接口只简单的监听所有多播地址,这比维护一份很长的劣币哦啊,再根据该列表费时的过滤
输入的L2多播帧要更有效和快速。net_device数据结构中的flags之一就是用于表示该设备是否监听所有地址。决定何时设置或者清楚此标识,由本节说明的allmulti字段控制。
每个设备都会为其监听的每个链路层多播地址保存一个dev_mc_list结构的实例,链路层多播地址可以分别用dev_mc_add和dev_mc_delete函数添加或者删除,net_device结构中相关的字段包括。
struct dev_mc_list *mc_list
指向此设备的dev_mc_list结构列表表头的指针。
int mc_count
此设备的多播地址数目,也就是mc_list所指的列表长度。
int allmulti
为非零时,引起此设备监听所有多播地址,如同本章稍早所讨论的promiscuity, allmulti是引用计数,而非一个简单的布尔值,这是因为多台设备可能各自都需要监听所有地址,当此变量从0变为非零时,就会调用dev_set_allmulti 函数,以指示接口监听所有多播地址,当allmulti 变为0时,就会发生相反的事情。