net_dev_init

Kernel: 4.12.6

网络设备初始化,主要包括初始化softnet_data,注册收发包软中断等;

 1 static int __init net_dev_init(void)
 2 {
 3     int i, rc = -ENOMEM;
 4 
 5     BUG_ON(!dev_boot_phase);
 6 
 7     //初始化统计信息的proc文件
 8     if (dev_proc_init())
 9         goto out;
10 
11     //初始化kobject
12     if (netdev_kobject_init())
13         goto out;
14 
15     //初始化协议类型链表
16     INIT_LIST_HEAD(&ptype_all);
17 
18     //初始化协议类型hash表
19     for (i = 0; i < PTYPE_HASH_SIZE; i++)
20         INIT_LIST_HEAD(&ptype_base[i]);
21 
22     //初始化offload列表
23     INIT_LIST_HEAD(&offload_base);
24 
25     //注册网络命名空间子系统
26     if (register_pernet_subsys(&netdev_net_ops))
27         goto out;
28 
29     /*
30      *    Initialise the packet receive queues.
31      */
32     //初始化数据包接收队列
33     for_each_possible_cpu(i) {
34         struct work_struct *flush = per_cpu_ptr(&flush_works, i);
35         struct softnet_data *sd = &per_cpu(softnet_data, i);
36 
37         //初始化清理backlog队列
38         INIT_WORK(flush, flush_backlog);
39 
40         //初始化非napi接口层的缓存队列
41         skb_queue_head_init(&sd->input_pkt_queue);
42 
43         //初始化数据包处理队列        
44         skb_queue_head_init(&sd->process_queue);
45 
46         //初始化网络设备轮询队列
47         INIT_LIST_HEAD(&sd->poll_list);
48 
49         //初始化输出队列尾部
50         sd->output_queue_tailp = &sd->output_queue;
51 
52         //若支持RPS
53 #ifdef CONFIG_RPS
54         sd->csd.func = rps_trigger_softirq;
55         sd->csd.info = sd;
56         sd->cpu = i;
57 #endif
58 
59         //支持非napi虚拟设备的回调和配额设置
60         sd->backlog.poll = process_backlog;
61         sd->backlog.weight = weight_p;
62     }
63 
64     dev_boot_phase = 0;
65 
66     /* The loopback device is special if any other network devices
67      * is present in a network namespace the loopback device must
68      * be present. Since we now dynamically allocate and free the
69      * loopback device ensure this invariant is maintained by
70      * keeping the loopback device as the first device on the
71      * list of network devices.  Ensuring the loopback devices
72      * is the first device that appears and the last network device
73      * that disappears.
74      */
75     //注册回环设备
76     if (register_pernet_device(&loopback_net_ops))
77         goto out;
78 
79     if (register_pernet_device(&default_device_ops))
80         goto out;
81 
82     //注册发送软中断
83     open_softirq(NET_TX_SOFTIRQ, net_tx_action);
84 
85     //注册接收软中断
86     open_softirq(NET_RX_SOFTIRQ, net_rx_action);
87 
88     //注册响应cpu状态变化的回调
89     rc = cpuhp_setup_state_nocalls(CPUHP_NET_DEV_DEAD, "net/dev:dead",
90                        NULL, dev_cpu_dead);
91     WARN_ON(rc < 0);
92 
93     //注册响应网络状态变化的回调
94     dst_subsys_init();
95     rc = 0;
96 out:
97     return rc;
98 }
原文地址:https://www.cnblogs.com/wanpengcoder/p/7414201.html