我刚刚成功打开了一个RAW套接字,我正在尝试使用下面的函数导出内核TX和RX环。但是,setsockopt()在尝试告诉内核导出第二个环时会返回EBUSY(设备或资源忙)。这样,执行下面的代码一旦正常工作,所以我可以获得第一个响铃(TX或RX)。当我尝试导出第二个环时出现问题(对于TX,如果第一个环用于RX或反向输出)。
对于使用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);
}