linux - linux include/net/net_namespace.h 中的 net_generic 函数是什么?

标签 linux linux-kernel linux-device-driver

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

最佳答案

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

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

例如这样:

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

此后当您调用 register_pernet_subsys() 函数向网络子系统注册时,网络子系统分配所需大小的内存并在内部维护在 struct net 结构中。并创建一个唯一的 id 并将其存储在“id”指向的指针中,这意味着在上述情况下的 bond_net_id 中。这个 id 就像是你分配的私有(private)数据的 anchor 。

在此之后,无论何时您想要访问指向您的私有(private)数据的指针,您都可以调用 net_generic() 函数,该函数返回已分配内存的开始。例如在上面的例子中是这样的;

      static void __net_exit bond_net_exit(struct net *net)
      {       
           struct bond_net *bn = net_generic(net, bond_net_id);
      }

驱动可以引用drivers/net/bonding/bond_main.c。

关于linux - linux include/net/net_namespace.h 中的 net_generic 函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20189858/

相关文章:

linux - 我无法从放入 Erlang shell 的一行中得到结果

c - 在 Linux 下,如何以编程方式检查给定 NIC 是否支持传输时间戳?

linux - 中断处理和用户空间通知

linux - 获取驱动程序功能的手册页

linux - 如何在 linux 内核模块中添加周期性定时器回调

php - 永久的 cron 作业

linux - 如何在 unix 中使用 less 命令在日志文件中搜索多个字符串?

linux - 错误 : Device or resourse is busy

linux - 抑制Linux内核调度程序中的进程(不是杀死)

linux - SIGSTOP 在 Linux 内核中是如何工作的?