req.tp_block_size=96;
req.tp_frame_size=96;
req.tp_block_nr=2;
req.tp_frame_nr=2;
if ( (setsockopt(fd,
SOL_PACKET,
PACKET_RX_RING,
(char *)&req,
sizeof(req))) != 0 ) {
perror("setsockopt()");
close(fd);
return 1;
};
/* mmap() the sucker */
map=mmap(NULL,
req.tp_block_size * req.tp_block_nr,
PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED, fd, 0);
se o tamanho mínimo do quadro é 64, é o último octeto. crc. definido pelo sistema operacional? se eu definir o tamanho do quadro como 60 sem lugar crc, ele pode ser transferido com sucesso entre o roteador cisco e o switch?
pode funcionar acima da configuração mínima para configurar a alocação da opção de buffer circular (anel): PACKET_TX_RING
Exemplo tp_block_size = 4096 // Tamanho mínimo do bloco contíguo tp_frame_size = 2048 // Tamanho do quadro tp_block_nr = 4 // Número de blocos tp_frame_nr = 8 // Número total de quadros, redundantes
4096/2048 = 2, 2 * 4 = 8
qual é o tamanho de tpacket_hdr? é 32 bytes tamanho de tpacket_hdr + frame com tamanho 64
qual é o tamanho mínimo de tp_frame_size? é = 32 + 64 = 96
tp_block_size = 96 tp_frame_size = 96 tp_block_nr = 2 tp_frame_nr = 2
96/96 = 1, 1 * 2 = 2
se o número de blocos for menor, pode ter melhor desempenho? ou mais blocos é melhor?
se cada quadro tiver apenas 64, e enviar imediatamente quando tiver msg ret = sendto (meia, buffer, pkt_index- > pktlen, MSG_DONTWAIT, (struct sockaddr *) (void *) para, sizeof (struct sockaddr_in));