>> > With this change I'm getting two error messages per transmission, but >> > it looks like it may need some additional changes. >> > >> > If the first error message is received after the HW timestamp was >> > captured, >> >> When does this happen? The first timestamp is generated from >> skb_tx_timestamp in the device driver's ndo_start_xmit before >> passing the packet to the NIC, the second when the device >> driver cleans the tx descriptor on completion. > > As I understand it, it happens when the first skb (created by the > skb_tx_timestamp() call) is received by the application after the > driver called skb_tstamp_tx() with the HW timestamp. The SW timestamps > are separate, but the HW timestamp is shared between clones. It
Oh right, the conversion to struct scm_timestamping only happens on socket read in __sock_recv_timestamp. > probably doesn't happen with the TSONLY option as it allocates a new > skb. When I print timestamps from scm_timestamping I see a mix of two > cases: > > TX 1488268812.193945472 0.000000000 1488286813.273760139 > TX 0.000000000 0.000000000 1488286813.273760139 > RX 1488268812.354356188 0.000000000 1488286813.434096389 > > TX 1488268816.364407934 0.000000000 0.000000000 > TX 0.000000000 0.000000000 1488286817.444251014 > RX 1488268816.525150589 0.000000000 1488286817.604749889 > > In the first case I assume the HW timestamp was saved before the first > error message was received, so both error messages have the same HW > timestamp, but only one has the SW timestamp. In the second case, the > HW timestamp was saved later, so there is one message with SW > timestamp and one message with HW timestamp. > > From the application point of view it would make sense if in the first > case there was only one error message containing both timestamps. I'm Agreed. I just proposed something similar on the error queue for zerocopy notifications in http://patchwork.ozlabs.org/patch/731214/ > not sure how easy/safe it would be to drop the second skb. The other > approach would be to not put HW timestamp in the first message when > this "dual TX timestamping" option is enabled, so each error message > has only one timestamp. If it's possible to avoid one skb_clone completely, then that is preferable over creating both and consuming one. If either approach becomes complex, then queuing two separate messages is fine. A process can recvmmsg(), after all. As long as the behavior is consistent.