如何编写每个网络名称空间中的新实例的Linux内核模块?

警告

使用struct pernet_operationsregister_pernet_subsys(..)有一个Linux内核模块在每个网络命名空间的状态正确的方法是什么?

还是有一种方法只是标记内核模块,并且它在每个网络名称空间中都具有独立的状态?

警告

Linux内核模块只有一种状态。网络名称空间需要在内核模块中显式处理。

关键的方法是使用register_pernet_subsysunregister_pernet_subsysnet_generic

这是一个示例内核模块:

#include <net/sock.h>
#include <net/netns/generic.h>
#include <net/net_namespace.h>
#include <linux/module.h>
#include <linux/skbuff.h>
#include <linux/pid_namespace.h>

/*
 * Per network namespace data
 */
struct ns_data {
  struct sock *sk;
};

/*
 * Index to store custom data for each network namespace.
 */
static unsigned int net_id;

/*
 * Called for every existing and added network namespaces
 */
static int __net_init ns_test_init(struct net *net)
{
  // create (if not present) and access data item in network namespace (net) using the id (net_id) 
  struct ns_data *data = net_generic(net, net_id);
  data->sk = -1; // initialize or example socket

  // ...

  return 0;
}

static void __net_exit ns_test_exit(struct net *net)
{
  // called when the network namespace is removed
  struct ns_data *data = net_generic(net, net_id);

  // close socket
  netlink_kernel_release(data->sk);
}

// callback to make the module network namespace aware
static struct pernet_operations net_ops __net_initdata = {
  .init = ns_test_init,
  .exit = ns_test_exit,
  .id = &net_id,
  .size = sizeof(struct ns_data),
};

static int __init netlink_test_init(void)
{
  printk(KERN_INFO "netlink_test: Init module\n");

  register_pernet_subsys(&net_ops);

  return 0;
}

static void __exit netlink_test_exit(void)
{
  printk(KERN_INFO "netlink_test: Exit module\n");

  unregister_pernet_subsys(&net_ops);
}

module_init(netlink_test_init);
module_exit(netlink_test_exit);

MODULE_LICENSE("GPL");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编写Linux内核模块时如何处理module_param获得的内存?

来自分类Dev

如何测试网络内核模块的tx_timeout操作?

来自分类Dev

如何测试网络内核模块的tx_timeout操作?

来自分类Dev

如何查看有关新加载的外部Linux内核模块的信息?

来自分类Dev

每个网络名称空间中的DNS配置分开

来自分类Dev

每个网络名称空间中的DNS配置分开

来自分类Dev

linux内核模块的缺点?

来自分类Dev

linux内核模块的缺点?

来自分类Dev

安装Linux内核模块

来自分类Dev

如何使用Linux内核模块中的Linux系统调用

来自分类Dev

如何编译内核模块

来自分类Dev

如何在Linux中禁用内核模块签名

来自分类Dev

Linux内核模块如何知道何时打开其文件?

来自分类Dev

如何使用Linux内核模块获取盒盖状态?

来自分类Dev

如何使用QEMU调试Linux内核模块?

来自分类Dev

如何从Linux内核模块获取主机名?

来自分类Dev

Linux 2.6.39.4如何查找可用的可加载内核模块

来自分类Dev

如何使用QEMU调试Linux内核模块?

来自分类Dev

如何知道谁启动了Linux内核模块

来自分类Dev

如何延迟 Linux 内核模块临界区

来自分类Dev

如何在 Yocto 中彻底重建 Linux 内核模块?

来自分类Dev

如何锁定共享网络名称空间中的某些资源

来自分类Dev

内核模块的makefile输出名称

来自分类Dev

如何在用户空间程序和Linux内核模块之间进行通信,以打印从用户程序发送到内核的消息

来自分类Dev

在Linux下如何为新创建的网络名称空间使用单独的内核参数?

来自分类Dev

在Linux下如何为新创建的网络名称空间使用单独的内核参数?

来自分类Dev

自动签署新的内核模块

来自分类Dev

无法打印从用户空间C应用程序发送到linux内核模块的消息

来自分类Dev

我的Linux内核模块未收到正确的用户空间应用程序PID

Related 相关文章

  1. 1

    编写Linux内核模块时如何处理module_param获得的内存?

  2. 2

    如何测试网络内核模块的tx_timeout操作?

  3. 3

    如何测试网络内核模块的tx_timeout操作?

  4. 4

    如何查看有关新加载的外部Linux内核模块的信息?

  5. 5

    每个网络名称空间中的DNS配置分开

  6. 6

    每个网络名称空间中的DNS配置分开

  7. 7

    linux内核模块的缺点?

  8. 8

    linux内核模块的缺点?

  9. 9

    安装Linux内核模块

  10. 10

    如何使用Linux内核模块中的Linux系统调用

  11. 11

    如何编译内核模块

  12. 12

    如何在Linux中禁用内核模块签名

  13. 13

    Linux内核模块如何知道何时打开其文件?

  14. 14

    如何使用Linux内核模块获取盒盖状态?

  15. 15

    如何使用QEMU调试Linux内核模块?

  16. 16

    如何从Linux内核模块获取主机名?

  17. 17

    Linux 2.6.39.4如何查找可用的可加载内核模块

  18. 18

    如何使用QEMU调试Linux内核模块?

  19. 19

    如何知道谁启动了Linux内核模块

  20. 20

    如何延迟 Linux 内核模块临界区

  21. 21

    如何在 Yocto 中彻底重建 Linux 内核模块?

  22. 22

    如何锁定共享网络名称空间中的某些资源

  23. 23

    内核模块的makefile输出名称

  24. 24

    如何在用户空间程序和Linux内核模块之间进行通信,以打印从用户程序发送到内核的消息

  25. 25

    在Linux下如何为新创建的网络名称空间使用单独的内核参数?

  26. 26

    在Linux下如何为新创建的网络名称空间使用单独的内核参数?

  27. 27

    自动签署新的内核模块

  28. 28

    无法打印从用户空间C应用程序发送到linux内核模块的消息

  29. 29

    我的Linux内核模块未收到正确的用户空间应用程序PID

热门标签

归档