Исходник: http://pastebin.com/umDeDFU2, требует прав root.
Создается AF_PACKET SOCK_RAW socket, прикрепляется к eth0 или во всем интерфейсам в системе, не суть важно. И socket() и bind() в качестве протокола назначается ETH_P_ARP - только ARP пакеты.
host: 192.168.1.2 remote_host: 192.168.1.7. Изначально arp записей этих хостов нет. Выхлоп:
...
ARP OPER: Response(0x0002)
ARP Sender HA: 50:67:F0:94:70:F5
ARP Sender PA: 192.168.1.7
ARP Target HA: 00:22:15:A2:D0:C5
ARP Target PA: 192.168.1.2
ARP DONE =====================
...
ARP OPER: Request(0x0001)
ARP Sender HA: 50:67:F0:94:70:F5
ARP Sender PA: 192.168.1.7
ARP Target HA: 00:00:00:00:00:00
ARP Target PA: 192.168.1.2
ARP DONE =====================
НО! Если в socket() и bind() указать параметр ETH_P_ALL, то всё срабатывает как надо.
Почему так? Где ошибка? Как сделать, что бы все ARP приходили при протоколе ETH_P_ARP? Развернутые ответы приветствуются.