【问题标题】:Send data to kernel using genetlink使用genetlink向内核发送数据
【发布时间】:2014-03-18 08:42:38
【问题描述】:

到目前为止,我使用Genetlink 使用户能够向我的模块发送一些基本命令,而无需任何参数。时代变了,我需要让用户向消息中添加更多数据。具体来说,我需要他们能够发送charintenum 值的数组。

在哪里可以将所需的数据添加到消息中?

到目前为止我看到的例子(如this one)更简单,没有帮助。

我看到GENL操作定义回调如下:

int (*doit)(struct sk_buff *skb, struct genl_info *info);

但我找不到任何使用 sk_buff 的示例,只有 genl_info。这可能是我要找的吗?

【问题讨论】:

  • 对于拥有超过 1500 名代表的用户:请考虑添加“genetlink”标签。谢谢。

标签: linux netlink


【解决方案1】:

这可能不是您正在寻找的最佳答案,但可以。我对 netlink 套接字做了一些工作,但我不确定我所知道的是否适用于“Genetlink”。无论如何,我认为你应该发现 skb->data 应该是你放置数据的地方。 (这就是套接字的用途。老实说,我不确定没有它你怎么能交流任何东西。)

至于发送任意数量的数据以及不同类型的数据,我发现最好使用模块和用户空间应用程序同意的结构。

例如,我使用这样的东西:

struct IntArrayMessage  {
  u_int32_t message_type;
  u_int32_t length;
  // Buffer data goes at the end
};

“message_type”基本上是一个枚举,它告诉接收程序它是一个“IntArrayMessage”,并将数据转换为一个“IntArrayMessage”。投射后,您可以读取长度以了解要从套接字读取多少内容。您读取的那些值是 int 数组。

显然,您必须确保从另一端发送额外信息。

无论如何,希望这会有所帮助,总比没有答案好。

同样,我不熟悉“Genetlink”,但如果这有帮助,那就太好了。

另外,这里有一个使用 netlink 发送“hello”的完整示例。 example

【讨论】:

  • 您如何确保每个操作系统/编译标志等的用户空间/内核空间类型完全相同?我正在考虑使用结构,但被建议不要这样做。另一方面,像我现在一样使用属性(nla_put 及其类似的东西),我无法在内核空间中解析它们。
  • 最终我使用了带有nlmsg_append 的结构,成功了!
猜你喜欢
  • 2017-10-31
  • 1970-01-01
  • 2018-02-28
  • 2021-06-25
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2011-12-29
相关资源
最近更新 更多