Search code examples
clinuxsocketsraw-sockets

Set IP_HDRINCL with PF_PACKET error in linux


I setup a raw Packet socket using the following:

sockFd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL) );

Then I am trying to set the socket option IP_HDRINCL using:

int one = 1;
if (setsockopt (sockFd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
    LogPrint(LOG_UNKNOWN,"Warning: Cannot set HDRINCL!\n");

But I am unable to set this option (I get an error with errno 92 and message "Protocol not available". If I change PF_PACKET to PF_INET then the options is set but I have to use PF_PACKET. So is there a way to set this option with the socket created above?

Thanks a bunch.


Solution

  • PF_PACKET sockets don't have any option that I asked in the question to be set. That option is only available on PF_INET or PF_INET6 sockets with type SOCK_RAW.

    If one wants the IP headers to be added by the kernel, the one must use the PF_INET socket.