Bootstrap

SET_NETDEV_DEV 简介

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 设备或平台设备。

功能

  1. 设置父设备

    • 将网络设备的 dev.parent 字段设置为父设备(如 PCI 或平台设备)。
    • 这种关联允许内核通过父子关系管理设备,例如在调试时可以追踪到网络设备的父设备。
  2. 关联硬件资源

    • 父设备通常表示底层硬件(如 PCI 设备),而网络设备是该硬件的逻辑表示。
    • 通过 SET_NETDEV_DEV,可以将网络设备与底层硬件资源绑定。
  3. 便于驱动管理

    • 在驱动中,父子关系使得驱动可以通过 dev_get_drvdata()dev_set_drvdata() 存取私有数据。
    • 这对复杂驱动程序(如 Mellanox 驱动)尤为重要。

使用场景

  1. 网络驱动初始化
    在初始化网络设备时,通过 SET_NETDEV_DEV 将其与硬件资源绑定。例如:

    struct net_device *netdev = alloc_etherdev(sizeof_priv);
    SET_NETDEV_DEV(netdev, &pdev->dev); // 绑定到 PCI 设备
    
  2. 平台驱动
    在平台驱动中,将网络设备与平台设备关联:

    SET_NETDEV_DEV(netdev, &platform_dev->dev);
    
  3. 调试和管理
    在调试工具(如 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;
}

优势

  1. 模块化设计:通过父子关系分离逻辑层(网络接口)和物理层(硬件资源)。
  2. 统一管理:便于使用内核提供的通用接口(如 devicesysfs)。
  3. 增强可维护性:在复杂驱动中,清晰的父子关系使代码更易于维护和扩展。

总结

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

;