PF_PACKET прописана в ~/fpc/rtl/linux/unxsockh.inc, который вложен в unit Sockets. Достаточно в uses вписать Sockets и все находится. Возможно нужно прописать путь к *.inc файлу, но у меня он не прописан. Под Windows реализации нет, по крайней мере я ее не знаю

Для примера даю свой рабоающий код для UNIX x86_64 платформы:
- Код: Выделить всё
unit sniffer;
{Get Ethernet packets, sort and agrigate size
}
interface
uses cthreads, libc, Sockets, sysutils, BaseUnix, vartypes;
implementation
//Thrid functin for cicled geting packets from socket
function GetPackets(arg: Pointer): PtrInt;
var sockLen: socklen_t;
P: PstoreRec;
begin
P := PstoreRec(arg);
sockLen := sizeof(sockaddr_ll);
P^.sock := fpsocket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
repeat
P^.onePackRec[P^.getPoint].fullsizepack :=
fprecvfrom(P^.sock,
@PstoreRec(arg)^.onePackRec[P^.getPoint].packBuff,
MAX_PACKET_SIZE,
0,
@P^.onePackRec[P^.getPoint].fromaddr,
@sockLen);
InterLockedIncrement64(P^.sequence); //GetPackets whil increment this, DecodePackets - Decrement
if P^.sequence > P^.maxsequence then P^.maxsequence := P^.sequence;
if P^.getPoint < MAX_PACKET_REC then InterLockedIncrement64(P^.getPoint)
else P^.getPoint := 0;
until SIG_TERM;
GetPackets := 1;
end;
Добавлено спустя 5 минут 50 секунд:В принципе, можете просто подставить 17 вместо константы, не очень красиво, но проверить работу можно
Добавлено спустя 11 минут 8 секунд:Еще одно, совсем забыл, когда Вы устанавливали пакеты в Debian, то все пакеты установились? Там иногда нужно зависимости вручную ставить.