检索内核中未对齐的网络链接消息大小 space

Retrieve unaligned netlink message size in kernel space

我正在开发一个 Linux 内核模块,它与 netlink 提供的用户space 模块进行 bi-directional 通信 link。

我对从用户space 发送到内核space 的消息的消息长度计算不正确有问题。消息是从用户space 发送的,如下所示:

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);

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

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

然而 len 的计算值似乎总是对齐的大小,这是我不想要的。比如我从debug信息可以看出userspace进程发送了一个payload为14字节的消息(不包括netlinkheaders)。但是,当在内核模块中接收到它时,NLMSG_PAYLOAD returns 长度为 16 个字节。

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

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

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

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