Получил следующий ответ из списка рассылки tcpdump-worker от Гая Харриса.
«Любое» устройство Linux использует заголовок канального уровня DLT_LINUX_SLL / LINKTYPE_LINUX_SLL, который включает в себя информацию, которую вы получаете из «recvfrom () "вызов на сокете PF_PACKET, который включает в себя адрес источника, но не адрес назначения пакета, поэтому единственным адресом канального уровня, который вы видите, является адрес источника.
Он также включает некоторые флаги, которыеукажите, как был получен пакет:
"In" - пакет был одноадресным к хосту;
"B" - пакет былшироковещательный;
"M" - пакет не был передан, но был многоадресным;
"P" - пакет был одноадресным для некоторых другой хост и этот хост получил его, потому что сетевой адаптер находился в случайном режиме;
"Out" - пакет был отправлен хостом и "обернут"и доставлено в гнездо PF_PACKET.
Способ, которым сетевой стек Linux определяет разницу между "In", "B", "M" и "P", я думаю, просматривая адрес назначения пакета и выясняя, является ли он широковещательным адресом.(ff: ff: ff: ff: ff: ff в сетях, использующих адреса IEEE MAC-48), многоадресный адрес (с установленным битом «group», в сетях, использующих адреса IEEE MAC-48), или адрес адаптерана котором это получено. бит удивительно, что он обнаружил случайный пакет на «любом» устройстве, поскольку само «любое» устройство не может быть переведено в случайный режим, но, возможно, конкретный интерфейс, с которого этот пакетбыл получен в случайном режиме по какой-то другой причине.