我正在开发一个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()
函数派生的。
我能看到解决此问题的另一种方法是在有效载荷信息中加上实际长度的前缀,我认为这些信息可行,但并不真正感觉到#34;正确"。
答案 0 :(得分:1)
请参阅man 3 netlink:您需要使用NLMSG_LENGTH(len)
(而非NLMSG_SPACE(len)
)来计算nlmsg_len
的{{1}}字段。