net_device数据结构简单总结
介绍
net_device 结构体用于表示和管理系统中的每一个网络接口,无论是物理的还是虚拟的。它封装了网络设备的所有相关信息和操作,是连接硬件驱动和网络协议栈的关键纽带。
net_device 结构是 Linux 网络子系统的核心之一,它为上层协议栈提供了一个统一的接口来访问和控制网络设备,同时也为网络设备驱动程序提供了一个标准的框架。
主要数据项
-
设备标识:
- char name[IFNAMSIZ]:设备名称(如 eth0, wlan0 等)
- unsigned int dev_id:设备 ID
- unsigned long mem_end, mem_start:设备内存范围
- unsigned long base_addr:I/O 基地址
- int irq:中断请求号
-
硬件信息:
- unsigned char *dev_addr:设备的硬件地址(如 MAC 地址)
- unsigned char addr_len:硬件地址长度
- unsigned short type:接口类型(如以太网、SLIP 等)
- unsigned int mtu:最大传输单元
-
状态信息:
- unsigned long state:设备状态(如 up, down 等)
- unsigned long flags:设备标志(如 IFF_UP, IFF_RUNNING 等)
-
统计信息:
- struct net_device_stats stats:包含了收发包数量、错误数等统计信息
-
队列管理:
- struct Qdisc *qdisc:输出队列规则
- struct Qdisc *qdisc_sleeping:非活跃状态的队列规则
-
协议特定信息:
- void *atalk_ptr, *ip_ptr, *dn_ptr 等:各种协议的私有数据
-
功能操作函数:
- struct net_device_ops *netdev_ops:网络设备操作函数集合,包括:
- ndo_open:打开设备
- ndo_stop:关闭设备
- ndo_start_xmit:发送数据包
- ndo_get_stats:获取统计信息
- ndo_do_ioctl:执行 ioctl 操作
- struct net_device_ops *netdev_ops:网络设备操作函数集合,包括:
-
功能标志:
- netdev_features_t features:支持的功能(如 NETIF_F_SG 表示支持分散/聚集 I/O)
-
网络命名空间:
- struct net *nd_net:设备所属的网络命名空间
-
链路层信息:
- unsigned int gso_max_size:GSO(Generic Segmentation Offload)最大大小
- unsigned short gso_max_segs:GSO 最大分段数
-
队列控制:
- unsigned int num_tx_queues:发送队列数量
- unsigned int real_num_tx_queues:实际发送队列数量
- struct netdev_queue *_tx:发送队列数组
-
RX 处理:
- struct netdev_rx_queue *_rx:接收队列数组
-
杂项:
- unsigned int promiscuity:混杂模式计数器
- unsigned int allmulti:多播模式计数器
特点
-
设备注册:
当一个网络驱动程序被加载时,它会创建一个 net_device 结构并通过 register_netdev() 函数注册到系统中。 -
协议无关性:
net_device 结构设计为协议无关的,这使得它可以支持多种网络协议。 -
操作函数:
通过 net_device_ops 结构,驱动程序可以定义设备特定的操作函数,如发送数据包、改变 MTU 等。 -
队列管理:
net_device 支持多队列操作,这对于现代多核系统的网络性能优化非常重要。 -
特性标志:
通过 features 字段,内核可以了解设备支持哪些硬件特性(如校验和计算、TSO 等),从而优化网络栈的行为。 -
命名空间支持:
通过 nd_net 字段,net_device 支持网络命名空间,这是实现网络虚拟化的基础。 -
统计信息:
net_device 结构维护了详细的统计信息,这对于网络监控和故障排查非常有用。