linux - 如何从内核识别消息并将消息发送到应用程序?

标签 linux linux-kernel linux-device-driver

我正在编写一个发送和接收互联网数据包的内核模块,我正在使用通用网络链接在内核和用户空间之间进行通信。

当应用程序想要发送互联网消息时(不管协议(protocol)是什么),我可以通过我在通用 netlink 系列中定义的函数之一毫无问题地将它发送到内核,然后模块发送它通过电线。一切都很好。

但是当模块收到一个数据包时,我怎样才能到达适当的进程来传递消息呢?我的问题不在于确定正确的过程:这是通过自定义协议(protocol)(例如 IP 表)完成的;但它包含我应该存储哪些信息以通知正确的进程?

到目前为止,我只保留进程的 portid(因为它启动了通信)并且我一直在尝试使用函数 genlmsg_unicast(),但它是在 2009 的内核版本中进行了更改,需要一个额外的参数(除了 skb *bufferportid):一个指向 struct net 的指针。我找到的所有教程都没有解决这个问题。

我尝试使用 &init_net 作为新参数,但计算机死机了,我必须通过电源按钮重新启动它。

感谢任何帮助。

最佳答案

发现导致问题的原因: 结果是我在函数结束时释放了缓冲区。 #facepalm

我不应该这样做,因为缓冲区会排队并在那里等待,直到它实际交付。因此,如果函数 genlmsg_unicast() 成功,则释放缓冲区不是调用者的责任。

现在它可以与 &init_net 一起使用。

关于linux - 如何从内核识别消息并将消息发送到应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52653556/

相关文章:

c - 具有链接到同一功能的多个设备属性的 Linux 驱动程序

linux - 强制linux只能使用4G以上的内存?

linux - 如何在 Bash 中模拟键盘按钮

python - 在进程运行时读取进程的输出

linux - 从内核空间到用户空间的事件通知

c++ - v4l2 缺少包含,linux vs uapi/linux

在 module_exit 上正确关闭结构文件 *

linux - 如何在 Linux 字符设备驱动程序中使用 FIFO,以便使用该驱动程序的两个进程可以进行通信

c - 将系统调用劫持推广到任何内核符号

c++ - 没有用户输入的gdb回溯?