如何在不关心 MAC 地址的情况下使用 packet_mmap 发送 SOCK_DGRAM 数据包?

How to send SOCK_DGRAM packet using packet_mmap without being concerned about MAC address?

我想使用 packet_mmap 发送数据包以获得高数据包传输率。我设法在原始模式下使用数据包套接字发送数据包,为此我在缓冲区中创建了 L2、L3 等并使用

发送它
sendto(fd_socket, NULL, 0, 0, NULL, sizeof(struct sockaddr_ll));

但是,我不想为目的地 mac 地址操心。所以我转而使用 Dgram。如果我想使用 sendto,则有一个目标 MAC 地址的参数。尽管这不是我所希望的不关心 arp 缓存和指定目的地的 MAC 地址:

sendto(fd_socket, NULL, 0, 0, (struct sockaddr *) ps_sockaddr, sizeof(struct sockaddr_ll));

不过我发现send也可以和packet socket一起使用。 http://man7.org/linux/man-pages/man7/packet.7.html 因此,我用 ip header 等填充了缓冲区。在这种情况下,发送 returns 零,因为没有发现要发送任何东西,如果数据包传输出现错误,我希望它不是零。

有没有办法使用 packet_mmap 而不用担心 L2 地址?

没有。当你使用SOCK_DGRAM模式的packet socket时,你不需要构造L2header,但你仍然需要提供L2地址,系统会为你构造header。 (这样就可以为您实际构建数据包的 L2 部分,并且您不需要指定源 MAC 地址,但您仍然需要指定要从中发送数据包的接口和目标 MAC 地址。)

否则系统如何知道将数据包发送到哪里?我相信您希望系统会查看您已经在数据包缓冲区中构建的 IP header,然后代表您进行接口选择和 ARP 查找,但是通过使用数据包套接字,您将绕过网络堆栈的那部分。 (此外,如果 IP 地址不在本地 LAN 上,则需要一个路由步骤——通常只是找到默认网关和 its MAC 地址的 ARPing。 )

现在您 可以 使用 raw 套接字 (http://man7.org/linux/man-pages/man7/raw.7.html) 获得大部分(我认为)您想要的东西。在这种情况下,您是在告诉内核您正在使用 IP 但不依赖于任何更高层 (> L3)。在这种情况下,您还可以构建自己的 IP header,并使用 IP_HDRINCL 选项根据它做出路由决策。