3

RAW ソケットを正常に開いたばかりで、以下の関数を使用してカーネル TX および RX リングをエクスポートしようとしています。ただし、setsockopt() は、カーネルにリングの 2 番目をエクスポートするように指示しようとすると、EBUSY (デバイスまたはリソースがビジー) を返します。つまり、以下のコードを 1 回実行すると正常に動作するため、最初のリング (TX または RX のいずれか) を取得できます。問題は、2 番目のリングをエクスポートしようとしたときに発生します (最初のリングが RX の場合は TX の場合、またはその逆の場合)。

アプリケーションは、mmap()ed メモリを使用する TX と RX の両方に同じソケットを使用できませんか? つまり、TX 用に 1 つのソケットと RX 用に 1 つのソケットを開く必要がありますか?

/* 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