3

我刚刚成功打开了一个 RAW 套接字,我正在尝试使用以下功能导出内核 TX 和 RX 环。然而,当试图告诉内核导出第二个环时,setsockopt() 返回 EBUSY(设备或资源忙)。也就是说,执行下面的代码一次可以正常工作,所以我可以获得第一个环(对于 TX 或对于 RX)。当我尝试导出第二个环时出现问题(如果第一个环用于 RX,则用于 TX,反之亦然)。

应用程序不能使用带有 mmap()ed 内存的 TX 和 RX 使用相同的套接字吗?也就是说,我必须为 TX 开一个插槽,为 RX 开一个插槽吗?

/* init_ring */
void *init_ring(ll_socket_t *ll_socket, int type)
{

    void *ring = NULL;
int ring_len = 0;
int ring_access_flags = PROT_READ | PROT_WRITE;
struct tpacket_req tp;

// 1) tell kernel to export data through mmap()ped ring
tp.tp_block_size = FRAMES_PER_RING * getpagesize();
tp.tp_block_nr = 1;
tp.tp_frame_size = getpagesize();
tp.tp_frame_nr = FRAMES_PER_RING;

ring_len = tp.tp_block_size * tp.tp_block_nr;

if ( setsockopt(ll_socket->socket_fd, SOL_PACKET, type, &tp, sizeof(struct tpacket_req) ) < 0 )
    { handle_sys_error("Setting socket options for this ring"); }

// 2) open ring
if ( ( ring = mmap(NULL, ring_len, ring_access_flags, MAP_SHARED, ll_socket->socket_fd, 0) ) == NULL )
    { handle_sys_error("mmap()ing error"); }

return(ring);

}

4

0 回答 0