感谢您抽出宝贵时间来看看这个.这是我已经处理了一个星期左右的问题,而且我傻眼了.任何输入都会很棒.
我目前使用PACKET_MMAP TX_RING V3(我试过V2和V1,但我与他们有同样的问题.我已经决定使用V3,因为我能够保持一个块多ETH帧,而不是只能够在V1和V2中每个tp_block有1帧,以避免在我的端口扫描器的发送过程中进行过多的系统调用.我没有设置RX_RING,因此这不是图片的一部分.
现在我只用一台主机测试这个,我只打了5个端口,我知道它们是活跃的.
所以...这是情况:
我有一个TX_RING:[1块| 块大小4096 | 32帧| 帧大小128]
TX_RING设置的代码:
int prepare_packetmmap_tx_ring(t_thread *thread)
{
int tpacket_v;
struct sockaddr_ll sll_loc;
/* Step 1 Create PF_PACKET socket.*/
thread->sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (thread->sock == -1)
{
toggle_thread_alive(thread);
return (hermes_error(FAILURE, "socket() %s", strerror(errno)));
}
memset(&sll_loc, 0, sizeof(struct sockaddr_ll));
memcpy(&sll_loc.sll_addr, thread->pool->iface.if_hwaddr, ETH_ALEN);
sll_loc.sll_ifindex = thread->pool->iface.inx;
sll_loc.sll_family = AF_PACKET;
sll_loc.sll_protocol = htons(ETH_P_ALL);
/* Bind our socket to the interface */
if (bind(thread->sock, (sockaddr *)&sll_loc, sizeof(struct sockaddr_ll)) == -1)
{
toggle_thread_alive(thread);
return (hermes_error(FAILURE, …Run Code Online (Sandbox Code Playgroud)