个人技术分享

分析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)->net
    ASSERT_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;

            }

}