gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:38:04 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com