Timestamp outgoing packets
Looking into the Linux kernel source code, I found that the function responsible for putting the message containing the timestamp of the packet on the error queue is skb_tx_timestamp
. This function is supposed to be called by the NIC driver and unfortunately, the e1000
driver doesn't call it (there's a similar function for hardware timestamping, but this is obviously dependent on the NIC driver supporting it).
According to this NetDev discussion from last September, "no driver calls skb_tx_timestamp()" and "You'll need to tweak your NIC driver to play with this TX timestamps". After adding a call to skb_tx_timestamp
to e1000_xmit_frame
on e1000_main.c
, I was able to obtain timestamps for outgoing packets (through an UDP socket). I wasn't able to obtain timestamps for outgoing packets on a RAW socket, though (I still get EAGAIN
).
It's hard to know what you are doing wrong, since we cannot see your code.
However:The documentation says that SO_TIMESTAMP
is for incoming packets, while SO_TIMESTAMPING
is for outgoing packets.
The kernel documentation contains a full example which you could use as a base - though it's using UDP, but you should be able to adjust it to using a RAW socket.See the linux kernel Documentation/networking/timestamping/timestamping.c
EDIT: It seems transmit timestamping isn't universally supported, see e.g. here. Even today just a handful of nic drivers implement software support, and a few have hardware support.
sock_tx_timestamp is only called for SOCK_DGRAM sockets in current kernel code.
BTW, the document Documentation/networking/timestamping/timestamping.c isn't very accurate.
SO_TIMESTAMP / SO_TIMESTAMPNS / SO_TIMESTAMPING / SIOCGSTAMP / SIOCGSTAMPNS are similar. Anyone of them will enable application getting the timestamp of a received packet.
With SOF_TIMESTAMPING_TX_SOFTWARE, any one of the above flags will also provide the application a CMSG in MSG_ERRQUEUE, indicating the timestamp of a sent packet.
But SOF_TIMESTAMPING_RX_SOFTWARE is useless at all. It can not even be used to disable the reporting of timestamp of received packets.