我想写一个Linux
2.6 netfilter
module
,它可以检查传入的IP
数据包信息,例如dest-ip,source-ip。之后,将这些信息传递给user space
应用程序(即Socket
app)将在数据包到达HOOK后立即处理这些信息。
我想尝试两种方式:
1。在netfilter
模块内部,创建fifo
结构线,每次数据包到达hook
时,将数据包信息放入fifo。并在/proc/example
文件系统的帮助下。每次用户空间应用程序读取/proc/example
文件时,都会从fifo头部获取数据包信息。
我是kernel
程序的新手,这个程序多次使我的内核崩溃。 -_-!
我想知道这种方式有可能吗?
2。在netfilter模块内部,创建一个char设备,用户空间应用程序从此char设备读取数据包信息。但我还是不知道如何确保尽快得到数据包,当数据包到达netfilter挂钩时有什么办法,内核会向info用户空间应用程序发送一些信号,然后用户空间应用程序来选择包信息?
非常感谢。
答案 0 :(得分:3)
我这样做的方式: 创建一个内核模块以吸引您的网络活动。 然后使用Netlink,它可以从内核与用户空间通信,传递数据IPC。
答案 1 :(得分:2)
选项1是可行的,可行的是什么问题?但我通常使用user-space
kernel space
和netlink
之间进行通信
nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);
netlink_kernel_release(nl_sk);
netlink_unicast
答案 2 :(得分:1)
我不确定第一种方法,但使用第二种方法,你的用户空间应用程序可以使用select()调用将char设备作为唯一目标 - 只要select()返回,你就会拥有要读取的数据。只需确保全部阅读,而不只是假设一个数据包的数据。
答案 3 :(得分:1)
你的意思是什么?你有实际的硬/软实时要求吗?
如果选择选项2,则应该能够通过打开字符设备非阻塞并选择()读取fd来快速获取新数据。我已经用内核级套接字做了类似的事情,其中套接字数据通过字符驱动程序呈现给用户级进程。只要我及时为套接字提供服务,我就看到了很短的延迟。驱动程序在具有一些软实时要求的环境中使用,并且我们在使用普通内核工具满足这些要求方面没有任何问题。
查看Linux设备驱动程序,第3版。