LINUX.ORG.RU

Не проходит ARP-запрос при AF_PACKET


0

1

Исходник: 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 =====================
Из 4-х реальных пакетов(tcpdump подтверждает) на сокет пришло 2. Ответ от 1.7 и Запрос от 1.7

НО! Если в socket() и bind() указать параметр ETH_P_ALL, то всё срабатывает как надо.

Почему так? Где ошибка? Как сделать, что бы все ARP приходили при протоколе ETH_P_ARP? Развернутые ответы приветствуются.

Ээм, проблема скорее всего на MAC-уровне, первый фрейм с запросом при чистой arp-таблице источника идёт широковещательным, а последующий обмен происходит уникастовыми фреймами. Но это догадка с потолка. Возможно, твой обработчик не ловит все пакеты, попробуй подольше подержать, хотя бы на 15-20 входящих пакетах, но мне кажется, что изменился формат входящего пакета при третьем уникастовом фрейме и твоё условие

if(ntohs(eth_hdr->eth_type) != RP_PROTO) continue;
начинает срабатывать.

nickleiten ★★★
()
Ответ на: комментарий от nickleiten

Это условие никогда не срабатывает. Также как и пропускание большего количества пакетов. Как и было: tcpdump -n -p -i eth0 arp видит 4 пакета, моё поделие 2.

PS. Кто знает в какой список рассылки можно обратиться?

greek_31 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.