如何使用packet_mmap发送SOCK_DGRAM数据包而不关心MAC地址?

时间:2017-09-06 09:14:48

标签: c linux-kernel network-programming mmap ethernet

我想使用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也可以用于数据包套接字。 http://man7.org/linux/man-pages/man7/packet.7.html 因此,我用ip header填充缓冲区,依此类推。在这种情况下,发送返回零,因为发现没有发送任何内容,如果发送数据包时发生错误,我希望它不是零。

有没有办法在不关心L2地址的情况下使用packet_mmap?

1 个答案:

答案 0 :(得分:0)

没有。在SOCK_DGRAM模式下使用数据包套接字时,无需构建L2标头,但仍必须提供L2地址,然后系统将为您构建标头。 (这样可以为您实际构建数据包的L2部分,并且您不需要指定源MAC地址,但仍需要指定要从中发送数据包的接口和目标MAC地址。)

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

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