什么是linux中的net_generic函数包括/ net/net_namespace.h?

use*_*949 2 linux linux-device-driver linux-kernel

我是Linux开发的新手.我正在研究一个示例Linux网络驱动程序教程,并遇到了net_generic(const struct net*net,int id)函数.有人可以解释一下net_generic(const struct net*net,int id)的使用我谷歌为它但只找到了头文件.任何人都可以在我可以参考的资源(网站或书籍)上指向我.谢谢

小智 5

在创建或销毁新的网络命名空间时,有一种方法可以通过网络核心获得通知.例如,作为设备驱动程序开发人员或其他内核代码开发人员,您的模块希望在创建或销毁新网络命名空间时通过网络核心获得通知.为此,您需要创建struct pernet_operations的对象,并且必须使用register_pernet_subsys()函数向网络子系统注册.在您的驱动程序中,您可能希望将一些驱动程序私有数据存储在struct net对象中,该对象是网络命名空间的对象,并且每当您收到有关命名空间事件的通知时都希望访问该私有数据.这就像在net_device对象中拥有驱动程序私有数据一样.

所以你可以做的是,在pernet_operations结构中有两个字段,'id'和'size'.id是指向整数的指针,size是一个整数.您需要在驱动程序中有一个全局整数变量,并将该地址存储在结构的"id"字段中,并告诉您所需的私有数据的大小.

例如这样:

  static struct pernet_operations bond_net_ops = {
       .init = bond_net_init,
       .exit = bond_net_exit, 
       .id   = &bond_net_id,
       .size = sizeof(struct bond_net),
  };    
Run Code Online (Sandbox Code Playgroud)

在此之后,当您调用register_pernet_subsys()函数向网络子系统注册时,network subsytem将分配所需的内存大小并在struct net结构内部进行维护.并创建一个唯一的id并将其存储在'id'指向的指针中,这意味着在上述情况下的bond_net_id中.此ID类似于分配的私有数据的锚点.

在此之后,只要您想访问指向私有数据的指针,就可以调用net_generic()函数,该函数返回已分配内存的开头.例如在上述情况下这种方式;

      static void __net_exit bond_net_exit(struct net *net)
      {       
           struct bond_net *bn = net_generic(net, bond_net_id);
      }
Run Code Online (Sandbox Code Playgroud)

您可以参考驱动程序drivers/net/bonding/bond_main.c.