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

How to identify and send messages to application from Kernel?

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

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

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

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

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

感谢任何帮助。

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

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

现在它适用于 &init_net