Softnet_data的初始化: 每个CPU的softnet_data是在net_dev_init中初始化的,代码如下: for(i=0; i<NR_CPUS; i++) { structsoftnet_data*queue; queue=&per_cpu(softnet_data,i); skb_queue_head_init(&queue->input_pkt_queue); queue->throttle=0; queue->cng_level=0; queue->avg_blog=10;/*a...
在sys目录下创建此网络设备的目录,调用 netdev_kobject_init 为每个CPU创建一个 softnet_data 变量,这是一个收包过程的一个核心结构,包含着很多重要信息: per CPU 的 NAPI 变量列表 napi_struct 正常应该接收的网络数据 softnet_data 权重相关 RPS相关结构 input_pkt_queue,存储其他CPU传输到本CPU处理的数据包 ...
初始化struct softnet_data结构 net_dev_init为每个系统上的CPU创建了一组struct softnet_data结构。这些结构将包含处理网络数据所需的几个重要事项的指针: 用于注册到该CPU的NAPI结构的列表。 用于数据处理的backlog队列。 处理权重。 接收卸载(receive offload)结构列表。 RPS设置。 等等。
触发配置的硬中断处理函数,将 napi_struct 放入到 perCPU 的 softnet_data,其中唤醒软中断处理函数执行NAPI处理循环 在net_rx_action 中 循环调用 poll(igb poll) 接口,读取ring中的数据,然后封装成一个skb,软中断的终止逻辑较为复杂,正文再说 GRO,通过合并的包来减少传送给协议栈的包数量 RPS,软件实现的RSS,把...
*/struct softnet_data{struct Qdisc*output_queue;struct Qdisc**output_queue_tailp;struct list_head poll_list;//设备轮询列表struct sk_buff*completion_queue;struct sk_buff_head process_queue;/* 统计数据 */unsigned int processed;unsigned int time_squeeze;unsigned int cpu_collision;unsigned int recei...
net_dev_init:建立 netdevice 在 /proc/sys 相关的数据结构,并且开启网卡收发中断;为每个 CPU 初始化一个数据包接收队列(softnet_data),包接收的回调;注册本地回环操作,注册默认网络设备操作。 inet_init:注册 INET 协议族的 SOCKET 创建方法,注册 TCP、UDP、ICMP、IGMP 接口基本的收包方法。为 IPv4 协议族创建...
随后,创建 softnet_data 数据结构(前文“struct softnet_data 数据结构初始化”一节),每个 CPU 一个。此数据结构包含在网络数据处理时所需要的重要信息。另外还有一个 poll_list,下文会说。设备驱动调用 napi_schedule 或其他 NAPI APIs,将 NAPI poll 数据结构添加至 poll_list 上。
在该函数里在软中断能访问到的 softnet_data 里设置了要发送的数据队列,添加到了 output_queue 里了。紧接着触发了 NET_TX_SOFTIRQ 类型的软中断。(T 代表 transmit 传输) 软中断的入口代码我这里也不详细扒了,感兴趣的同学参考《图解 Linux 网络包接收过程》一文中的 3.2 小节 - ksoftirqd 内核线程处理软中断...
在这个函数里,会为每个CPU都申请一个softnet_data数据结构,在这个数据结构里的poll_list是等待驱动程序将其poll函数注册进来,稍后网卡驱动初始化的时候我们可以看到这一过程。 另外open_softirq注册了每一种软中断都注册一个处理函数。NET_TX_SOFTIRQ的处理函数为net_tx_action,NET_RX_SOFTIRQ的为net_rx_action。继续...
softnet_data:内核为每个 CPU 都分配一个这样的 softnet_data 数据空间。每个 CPU 都有一个这样的队列,用于接收数据包。 sk_buff:描述一个帧结构的属性,包含 socket、到达时间、到达设备、各层首部大小、下一站路由入口、帧长度、校验和等等。 sk_buff_head:数据包队列结构。