网络驱动架构

Linux 内核网络设备驱动框架分为四个模块:网络协议接口模块、网络设备接口模块、设备驱动模块和网络设备与媒介模块。

image.png

网络协议常用数据结构

  1. 套接字缓冲区 sk_buff 结构体类型,具体核心成员如下:

image.png

  1. 存储 IP 数据 skb_shared_info 结构体类型(保存 IP 分片数据),具体成员如下:

image.png

网络设备接口模块常用的数据结构

  1. 存储网络设备全部信息,包括物理设备和虚拟设备,对应结构体类型为 net_device,具体成员如下:

image.png

  • name:网络设备名称;
  • name_node:网络设备名称节点;
  • mem_end:共享内存其实地址;
  • mem_start:共享内存的结束地址;
  • base_addr:IO 基地址,
  • irq:终断号。

网络设备驱动程序只要设备 net_device 并注册,即可实现网络通讯功能。

  1. NAPI 结构体类型,具体成员如下:

image.png

NAPI 数据包信息的循环流程如下:

数据接受中断发生–>减半接受中断–>以轮询方式接收所有数据包或轮询权重耗尽–>开启接收中断–>数据接受中断发生–>。

image.png

Linux 内核将中断分为两个部分:中断上半部分和中断下半部分。

网络协议接口模块

主要功能是给上层协议提供透明的数据包和接收接口,dev_queue_xmit() 用于发送数据包,netif_rx()/netif_receive_skb() 用于接收数据包。不管你发送还是接收数据包都会用到 sk_buff 结构体类型(套接字缓冲区),主要用在网络子系统中各层之间的传输数据。

image.png

image.png

image.png

image.png

image.png