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

时间:2018-10-04 19:06:41

标签: linux linux-kernel linux-device-driver

我正在编写一个用于发送和接收Internet数据包的内核模块,并且正在使用Generic Netlink在内核和用户空间之间进行通信。

当应用程序要发送Internet消息时(不管协议是什么),我可以通过我在通用netlink系列中定义的功能之一将其毫无问题地发送到内核,模块将其发送通过电线。一切都很好。

但是当模块接收到数据包时,如何达到适当的过程来传递消息?我的麻烦不是确定正确的过程:这是通过自定义协议(例如IP表)完成的;但是它包含我应该存储哪些信息以通知正确的过程?

到目前为止,我仅保留流程的portid(因为它启动了通信),并且我一直在尝试使用功能genlmsg_unicast(),但是在2009年的Kernel版本中已对其进行了更改这样,它需要一个附加参数(除了skb *bufferportid之外)是指向结构网的指针。我没有找到可解决此问题的教程。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

发现了引起问题的原因: 原来,我在函数末尾释放了缓冲区。 #facepalm

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

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