我正在编写一个发送和接收互联网数据包的内核模块,我正在使用通用网络链接在内核和用户空间之间进行通信。
当应用程序想要发送互联网消息时(不管协议(protocol)是什么),我可以通过我在通用 netlink 系列中定义的函数之一毫无问题地将它发送到内核,然后模块发送它通过电线。一切都很好。
但是当模块收到一个数据包时,我怎样才能到达适当的进程来传递消息呢?我的问题不在于确定正确的过程:这是通过自定义协议(protocol)(例如 IP 表)完成的;但它包含我应该存储哪些信息以通知正确的进程?
到目前为止,我只保留进程的 portid
(因为它启动了通信)并且我一直在尝试使用函数 genlmsg_unicast()
,但它是在 2009 的内核版本中进行了更改,需要一个额外的参数(除了 skb *buffer
和 portid
):一个指向 struct net 的指针。我找到的所有教程都没有解决这个问题。
我尝试使用 &init_net
作为新参数,但计算机死机了,我必须通过电源按钮重新启动它。
感谢任何帮助。
最佳答案
发现导致问题的原因: 结果是我在函数结束时释放了缓冲区。 #facepalm
我不应该这样做,因为缓冲区会排队并在那里等待,直到它实际交付。因此,如果函数 genlmsg_unicast()
成功,则释放缓冲区不是调用者的责任。
现在它可以与 &init_net
一起使用。
关于linux - 如何从内核识别消息并将消息发送到应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52653556/