使用通用netlink和libnl从内核向用户空间发送和接收消息的正确方法是什么?

时间:2020-07-12 18:50:18

标签: linux-kernel netlink

我已经在StackOverflow上阅读了很多有关如何将消息从内核发送到用户空间的信息,包括this article on lwnthe documentation on infrared以及与此主题相关的很多问题,但我仍然坚持以正确的方式做到这一点。我现在正在做的是:

用户空间协议

  1. nl_socket_alloc()分配一个套接字
  2. 使用genl_connect()
  3. 将我的套接字连接到通用网络链接
  4. genl_ctrl_resolve()来解决这个家庭
  5. 使用nl_socket_modify_cb()配置套接字的默认回调
  6. 分配一条消息发送给内核
  7. 最后,将该消息发送到内核(这部分工作正常)
  8. 然后用nl_recvmsgs_default()等待来自内核的响应

内核协议

  1. 一旦我的消息被内核接收,它将触发带有参数struct sk_buff *buffstruct genl_info *info的回调函数(我们将其称为cb
  2. cb然后执行以下操作:
    • 使用genlmsg_new()分配新的套接字缓冲区
    • 使用genlmsg_put_reply()
    • 向该缓冲区填充所需的信息
    • genlmsg_end()完成消息
    • 然后,用genlmsg_reply()
    • 发送消息

注意

我已经进行了所有错误检查,我知道我的消息已成功发送,但是我没有在用户空间端收到这些消息,我想错误是在用户的回调函数的配置上这是因为,当我禁用libnl的auto_ack功能时,会收到来自内核的所有消息。我想知道我的接收消息的协议是否正确,如果正确,为什么在启用auto_ack的情况下不起作用?

0 个答案:

没有答案