分析4 list_netdevice函数
把net_device插入到全局变量init_net的dev_base_head 链表中
static void list_netdevice(struct net_device *dev)
{struct net *net = dev_net(dev);//struct net *net = (&dev->nd_net)->netASSERT_RTNL();write_lock_bh(&dev_base_lock);list_add_tail_rcu(&dev->dev_list, &net->dev_base_head); 添加到net->dev_base_head 链表中hlist_add_head_rcu(&dev->name_hlist, dev_name_hash(net, dev->name));hlist_add_head_rcu(&dev->index_hlist,dev_index_hash(net, dev->ifindex));write_unlock_bh(&dev_base_lock);dev_base_seq_inc(net);
}
背景说明
1. 定义init_net
struct net init_net = {
.count = REFCOUNT_INIT(1),
.dev_base_head = LIST_HEAD_INIT(init_net.dev_base_head),
};2. 在 alloc_netdev_mqs 把init_net 赋值给 dev->nd_net->net
alloc_netdev_mqs(){
dev_net_set(dev, &init_net);
{(&dev->nd_net)->net = init_net;
}
}