我试图使用内存映射I / O netlink将大量数据包从内核传输到用户空间,我遵循了Patrick McHardy 1的指南文档。但是,当我尝试使用以下方法在用户空间中设置共享环缓冲区时:
setsockopt(sock_fd, SOL_NETLINK, NETLINK_RX_RING, &req, sizeof(req));
setsockopt(sock_fd, SOL_NETLINK, NETLINK_TX_RING, &req, sizeof(req));
两个函数都返回-1,并且errno为1,这意味着描述符无效。我很困惑,因为我还提到了许多其他源代码,他们可以成功设置环。
我的代码与Patrick的1几乎相同:
int sock_fd = -1;
sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_DECODE);
if (sock_fd < 0)
return -1;
bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr));
/* init the mmap buffer */
unsigned int block_size = 16 * getpagesize();
struct nl_mmap_req req = {
.nm_block_size = block_size,
.nm_block_nr = 64,
.nm_frame_size = 16384,
.nm_frame_nr = 64 * block_size / 16384,
};
/* Configure ring parameters */
if (setsockopt(sock_fd, SOL_NETLINK, NETLINK_RX_RING, &req, sizeof(req)) < 0){
if(errno > 0)
printf("%d\n", errno);
}
if (setsockopt(sock_fd, SOL_NETLINK, NETLINK_TX_RING, &req, sizeof(req)) < 0){
if(errno > 0)
printf("%d", errno);
exit(1);
}
此代码内置于Ubuntu 14.04,内核版本为3.13.0-74-generic。
有人想过吗?非常感谢。