【问题标题】:Retrieve unaligned netlink message size in kernel space检索内核空间中未对齐的 netlink 消息大小
【发布时间】:2017-07-12 14:54:43
【问题描述】:

我正在开发一个 Linux 内核模块,它与 netlink 提供的用户空间模块具有双向通信链接。

我遇到了一个问题,即从用户空间发送到内核空间的消息的消息长度计算不正确。消息是从用户空间发送的,如下所示:

this->sendLock.lock();
this->netlinkTxHeader->nlmsg_len = NLMSG_SPACE(len);
this->netlinkTxIov.iov_len = this->netlinkTxHeader->nlmsg_len;

memcpy(NLMSG_DATA(this->netlinkTxHeader), buf, len);

int32_t status = sendmsg(this->netlinkSock, &this->netlinkTxMsg, 0);

并且像这样在内核空间中接收:

unsigned char* buf = (unsigned char*)NLMSG_DATA(nlh);
int len = NLMSG_PAYLOAD(nlh, 0);

但是len 的计算值似乎总是对齐的大小,这是我不想要的。例如,我可以从调试信息中看到,用户空间进程发送了一条有效载荷为 14 字节的消息(不包括 netlink 标头)。然而,当在内核模块中接收到它时,NLMSG_PAYLOAD 返回一个 16 字节的长度。

有什么方法可以在内核模块中获取未对齐的有效负载长度(即实际有效负载长度)?我查看了netlink.h 中的宏,但没有看到任何有用的信息。

请注意,nlmsghdr 对象是使用内核模块中的netlink_rcv_skb() 函数派生的。

我能看到解决此问题的唯一其他方法是在有效负载信息中添加我认为可行的实际长度前缀,但感觉并不“正确”。

【问题讨论】:

    标签: c linux linux-kernel netlink


    【解决方案1】:

    man 3 netlink:你需要使用NLMSG_LENGTH(len)(而不是NLMSG_SPACE(len))来计算nlmsghdrnlmsg_len字段。

    【讨论】:

    • 谢谢!这立即解决了这个问题。我想我没有正确阅读手册页!
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多