setsockopt()在mmaped netlink中获取EBADF

时间:2016-01-03 04:52:53

标签: sockets linux-kernel netlink

我试图使用内存映射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。

有人想过吗?非常感谢。

0 个答案:

没有答案