SET_NETDEV_DEV
是 Linux 内核中的一个宏,主要用于将网络设备 (net_device
) 与其父设备(通常是 PCI 设备或平台设备)关联起来。这在网络驱动开发中非常常见,尤其是在初始化和注册网络设备时。
定义
#define SET_NETDEV_DEV(net, pdev) ((net)->dev.parent = (pdev))
net
:指向struct net_device
的指针,表示网络设备。pdev
:指向父设备(如struct device
)的指针,通常是 PCI 设备或平台设备。
功能
-
设置父设备:
- 将网络设备的
dev.parent
字段设置为父设备(如 PCI 或平台设备)。 - 这种关联允许内核通过父子关系管理设备,例如在调试时可以追踪到网络设备的父设备。
- 将网络设备的
-
关联硬件资源:
- 父设备通常表示底层硬件(如 PCI 设备),而网络设备是该硬件的逻辑表示。
- 通过
SET_NETDEV_DEV
,可以将网络设备与底层硬件资源绑定。
-
便于驱动管理:
- 在驱动中,父子关系使得驱动可以通过
dev_get_drvdata()
和dev_set_drvdata()
存取私有数据。 - 这对复杂驱动程序(如 Mellanox 驱动)尤为重要。
- 在驱动中,父子关系使得驱动可以通过
使用场景
-
网络驱动初始化:
在初始化网络设备时,通过SET_NETDEV_DEV
将其与硬件资源绑定。例如:struct net_device *netdev = alloc_etherdev(sizeof_priv); SET_NETDEV_DEV(netdev, &pdev->dev); // 绑定到 PCI 设备
-
平台驱动:
在平台驱动中,将网络设备与平台设备关联:SET_NETDEV_DEV(netdev, &platform_dev->dev);
-
调试和管理:
在调试工具(如sysfs
)中,可以通过父子关系查看网络设备的硬件信息。
示例代码
以下是一个典型的使用场景:
struct net_device *netdev;
struct pci_dev *pdev;
netdev = alloc_etherdev(sizeof(struct priv_data));
if (!netdev)
return -ENOMEM;
// 将网络设备与 PCI 设备关联
SET_NETDEV_DEV(netdev, &pdev->dev);
// 注册网络设备
err = register_netdev(netdev);
if (err) {
dev_err(&pdev->dev, "Failed to register net device\n");
free_netdev(netdev);
return err;
}
优势
- 模块化设计:通过父子关系分离逻辑层(网络接口)和物理层(硬件资源)。
- 统一管理:便于使用内核提供的通用接口(如
device
和sysfs
)。 - 增强可维护性:在复杂驱动中,清晰的父子关系使代码更易于维护和扩展。
总结
SET_NETDEV_DEV
是一个简单但重要的工具,用于将网络设备与其底层硬件资源关联。它在 Linux 网络驱动开发中广泛使用,尤其是在初始化和注册阶段,为内核提供了清晰的父子关系管理机制。
Citations:
[1] https://blog.csdn.net/lcqlw123/article/details/45096483
[2] https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/9/html/configuring_and_managing_virtualization/live-migrating-a-virtual-machine-with-an-attached-mellanox-virtual-function_migrating-virtual-machines
[3] https://megahertz66.github.io/kernel/2020/10/03/NET-Linux-networking-stack/
[4] https://thinkdancer.net/2024/08/13/linux-kernel-switchdev-code-review/
[5] https://www.cnblogs.com/wulei0630/p/10825284.html
[6] https://www.cnblogs.com/CQzhangyu/p/18187982
[7] https://wenku.csdn.net/answer/1dec066776cf49a1b0d586be0dd2f1e4
[8] https://blog.csdn.net/essencelite/article/details/139945560