^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) .. SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) Timestamping
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) 1. Control Interfaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) =====================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) The interfaces for receiving network packages timestamps are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) SO_TIMESTAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) Generates a timestamp for each incoming packet in (not necessarily
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) monotonic) system time. Reports the timestamp via recvmsg() in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) control message in usec resolution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) SO_TIMESTAMP is defined as SO_TIMESTAMP_NEW or SO_TIMESTAMP_OLD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) based on the architecture type and time_t representation of libc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) Control message format is in struct __kernel_old_timeval for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) SO_TIMESTAMP_OLD and in struct __kernel_sock_timeval for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) SO_TIMESTAMP_NEW options respectively.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) SO_TIMESTAMPNS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) Same timestamping mechanism as SO_TIMESTAMP, but reports the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) timestamp as struct timespec in nsec resolution.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) SO_TIMESTAMPNS is defined as SO_TIMESTAMPNS_NEW or SO_TIMESTAMPNS_OLD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) based on the architecture type and time_t representation of libc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) Control message format is in struct timespec for SO_TIMESTAMPNS_OLD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) and in struct __kernel_timespec for SO_TIMESTAMPNS_NEW options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) respectively.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) IP_MULTICAST_LOOP + SO_TIMESTAMP[NS]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) Only for multicast:approximate transmit timestamp obtained by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) reading the looped packet receive timestamp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) SO_TIMESTAMPING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) Generates timestamps on reception, transmission or both. Supports
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) multiple timestamp sources, including hardware. Supports generating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) timestamps for stream sockets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 1.1 SO_TIMESTAMP (also SO_TIMESTAMP_OLD and SO_TIMESTAMP_NEW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) -------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) This socket option enables timestamping of datagrams on the reception
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) path. Because the destination socket, if any, is not known early in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) the network stack, the feature has to be enabled for all packets. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) same is true for all early receive timestamp options.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) For interface details, see `man 7 socket`.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) Always use SO_TIMESTAMP_NEW timestamp to always get timestamp in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct __kernel_sock_timeval format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) SO_TIMESTAMP_OLD returns incorrect timestamps after the year 2038
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) on 32 bit machines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) 1.2 SO_TIMESTAMPNS (also SO_TIMESTAMPNS_OLD and SO_TIMESTAMPNS_NEW):
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) This option is identical to SO_TIMESTAMP except for the returned data type.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) Its struct timespec allows for higher resolution (ns) timestamps than the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) timeval of SO_TIMESTAMP (ms).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) Always use SO_TIMESTAMPNS_NEW timestamp to always get timestamp in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct __kernel_timespec format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) SO_TIMESTAMPNS_OLD returns incorrect timestamps after the year 2038
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) on 32 bit machines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) 1.3 SO_TIMESTAMPING (also SO_TIMESTAMPING_OLD and SO_TIMESTAMPING_NEW)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ----------------------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) Supports multiple types of timestamp requests. As a result, this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) socket option takes a bitmap of flags, not a boolean. In::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) err = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, &val, sizeof(val));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) val is an integer with any of the following bits set. Setting other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) bit returns EINVAL and does not change the current state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) The socket option configures timestamp generation for individual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) sk_buffs (1.3.1), timestamp reporting to the socket's error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) queue (1.3.2) and options (1.3.3). Timestamp generation can also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) be enabled for individual sendmsg calls using cmsg (1.3.4).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) 1.3.1 Timestamp Generation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) ^^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) Some bits are requests to the stack to try to generate timestamps. Any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) combination of them is valid. Changes to these bits apply to newly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) created packets, not to packets already in the stack. As a result, it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) is possible to selectively request timestamps for a subset of packets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) (e.g., for sampling) by embedding an send() call within two setsockopt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) calls, one to enable timestamp generation and one to disable it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) Timestamps may also be generated for reasons other than being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) requested by a particular socket, such as when receive timestamping is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) enabled system wide, as explained earlier.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) SOF_TIMESTAMPING_RX_HARDWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) Request rx timestamps generated by the network adapter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) SOF_TIMESTAMPING_RX_SOFTWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) Request rx timestamps when data enters the kernel. These timestamps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) are generated just after a device driver hands a packet to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) kernel receive stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) SOF_TIMESTAMPING_TX_HARDWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) Request tx timestamps generated by the network adapter. This flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) can be enabled via both socket options and control messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) SOF_TIMESTAMPING_TX_SOFTWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) Request tx timestamps when data leaves the kernel. These timestamps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) are generated in the device driver as close as possible, but always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) prior to, passing the packet to the network interface. Hence, they
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) require driver support and may not be available for all devices.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) This flag can be enabled via both socket options and control messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) SOF_TIMESTAMPING_TX_SCHED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) Request tx timestamps prior to entering the packet scheduler. Kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) transmit latency is, if long, often dominated by queuing delay. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) difference between this timestamp and one taken at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) SOF_TIMESTAMPING_TX_SOFTWARE will expose this latency independent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) of protocol processing. The latency incurred in protocol
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) processing, if any, can be computed by subtracting a userspace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) timestamp taken immediately before send() from this timestamp. On
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) machines with virtual devices where a transmitted packet travels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) through multiple devices and, hence, multiple packet schedulers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) a timestamp is generated at each layer. This allows for fine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) grained measurement of queuing delay. This flag can be enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) via both socket options and control messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) SOF_TIMESTAMPING_TX_ACK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) Request tx timestamps when all data in the send buffer has been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) acknowledged. This only makes sense for reliable protocols. It is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) currently only implemented for TCP. For that protocol, it may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) over-report measurement, because the timestamp is generated when all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) data up to and including the buffer at send() was acknowledged: the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) cumulative acknowledgment. The mechanism ignores SACK and FACK.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) This flag can be enabled via both socket options and control messages.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 1.3.2 Timestamp Reporting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) ^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) The other three bits control which timestamps will be reported in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) generated control message. Changes to the bits take immediate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) effect at the timestamp reporting locations in the stack. Timestamps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) are only reported for packets that also have the relevant timestamp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) generation request set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) SOF_TIMESTAMPING_SOFTWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) Report any software timestamps when available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) SOF_TIMESTAMPING_SYS_HARDWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) This option is deprecated and ignored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) SOF_TIMESTAMPING_RAW_HARDWARE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) Report hardware timestamps as generated by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) SOF_TIMESTAMPING_TX_HARDWARE when available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 1.3.3 Timestamp Options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) ^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) The interface supports the options
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) SOF_TIMESTAMPING_OPT_ID:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) Generate a unique identifier along with each packet. A process can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) have multiple concurrent timestamping requests outstanding. Packets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) can be reordered in the transmit path, for instance in the packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) scheduler. In that case timestamps will be queued onto the error
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) queue out of order from the original send() calls. It is not always
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) possible to uniquely match timestamps to the original send() calls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) based on timestamp order or payload inspection alone, then.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) This option associates each packet at send() with a unique
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) identifier and returns that along with the timestamp. The identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) is derived from a per-socket u32 counter (that wraps). For datagram
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) sockets, the counter increments with each sent packet. For stream
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) sockets, it increments with every byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) The counter starts at zero. It is initialized the first time that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) the socket option is enabled. It is reset each time the option is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) enabled after having been disabled. Resetting the counter does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) change the identifiers of existing packets in the system.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) This option is implemented only for transmit timestamps. There, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) timestamp is always looped along with a struct sock_extended_err.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) The option modifies field ee_data to pass an id that is unique
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) among all possibly concurrently outstanding timestamp requests for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) that socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) SOF_TIMESTAMPING_OPT_CMSG:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) Support recv() cmsg for all timestamped packets. Control messages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) are already supported unconditionally on all packets with receive
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) timestamps and on IPv6 packets with transmit timestamp. This option
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) extends them to IPv4 packets with transmit timestamp. One use case
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) is to correlate packets with their egress device, by enabling socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) option IP_PKTINFO simultaneously.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) SOF_TIMESTAMPING_OPT_TSONLY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) Applies to transmit timestamps only. Makes the kernel return the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) timestamp as a cmsg alongside an empty packet, as opposed to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) alongside the original packet. This reduces the amount of memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) charged to the socket's receive budget (SO_RCVBUF) and delivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) the timestamp even if sysctl net.core.tstamp_allow_data is 0.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) This option disables SOF_TIMESTAMPING_OPT_CMSG.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) SOF_TIMESTAMPING_OPT_STATS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) Optional stats that are obtained along with the transmit timestamps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) It must be used together with SOF_TIMESTAMPING_OPT_TSONLY. When the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) transmit timestamp is available, the stats are available in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) separate control message of type SCM_TIMESTAMPING_OPT_STATS, as a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) list of TLVs (struct nlattr) of types. These stats allow the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) application to associate various transport layer stats with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) the transmit timestamps, such as how long a certain block of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) data was limited by peer's receiver window.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) SOF_TIMESTAMPING_OPT_PKTINFO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) Enable the SCM_TIMESTAMPING_PKTINFO control message for incoming
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) packets with hardware timestamps. The message contains struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) scm_ts_pktinfo, which supplies the index of the real interface which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) received the packet and its length at layer 2. A valid (non-zero)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) interface index will be returned only if CONFIG_NET_RX_BUSY_POLL is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) enabled and the driver is using NAPI. The struct contains also two
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) other fields, but they are reserved and undefined.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) SOF_TIMESTAMPING_OPT_TX_SWHW:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) Request both hardware and software timestamps for outgoing packets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) when SOF_TIMESTAMPING_TX_HARDWARE and SOF_TIMESTAMPING_TX_SOFTWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) are enabled at the same time. If both timestamps are generated,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) two separate messages will be looped to the socket's error queue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) each containing just one timestamp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) New applications are encouraged to pass SOF_TIMESTAMPING_OPT_ID to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) disambiguate timestamps and SOF_TIMESTAMPING_OPT_TSONLY to operate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) regardless of the setting of sysctl net.core.tstamp_allow_data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) An exception is when a process needs additional cmsg data, for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) instance SOL_IP/IP_PKTINFO to detect the egress network interface.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) Then pass option SOF_TIMESTAMPING_OPT_CMSG. This option depends on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) having access to the contents of the original packet, so cannot be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) combined with SOF_TIMESTAMPING_OPT_TSONLY.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 1.3.4. Enabling timestamps via control messages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) In addition to socket options, timestamp generation can be requested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) per write via cmsg, only for SOF_TIMESTAMPING_TX_* (see Section 1.3.1).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) Using this feature, applications can sample timestamps per sendmsg()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) without paying the overhead of enabling and disabling timestamps via
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) setsockopt::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) struct msghdr *msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) cmsg = CMSG_FIRSTHDR(msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) cmsg->cmsg_level = SOL_SOCKET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) cmsg->cmsg_type = SO_TIMESTAMPING;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) cmsg->cmsg_len = CMSG_LEN(sizeof(__u32));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) *((__u32 *) CMSG_DATA(cmsg)) = SOF_TIMESTAMPING_TX_SCHED |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) SOF_TIMESTAMPING_TX_SOFTWARE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) SOF_TIMESTAMPING_TX_ACK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) err = sendmsg(fd, msg, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) The SOF_TIMESTAMPING_TX_* flags set via cmsg will override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) the SOF_TIMESTAMPING_TX_* flags set via setsockopt.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) Moreover, applications must still enable timestamp reporting via
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) setsockopt to receive timestamps::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) __u32 val = SOF_TIMESTAMPING_SOFTWARE |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) SOF_TIMESTAMPING_OPT_ID /* or any other flag */;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) err = setsockopt(fd, SOL_SOCKET, SO_TIMESTAMPING, &val, sizeof(val));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 1.4 Bytestream Timestamps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) -------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) The SO_TIMESTAMPING interface supports timestamping of bytes in a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) bytestream. Each request is interpreted as a request for when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) entire contents of the buffer has passed a timestamping point. That
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) is, for streams option SOF_TIMESTAMPING_TX_SOFTWARE will record
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) when all bytes have reached the device driver, regardless of how
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) many packets the data has been converted into.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) In general, bytestreams have no natural delimiters and therefore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) correlating a timestamp with data is non-trivial. A range of bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) may be split across segments, any segments may be merged (possibly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) coalescing sections of previously segmented buffers associated with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) independent send() calls). Segments can be reordered and the same
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) byte range can coexist in multiple segments for protocols that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) implement retransmissions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) It is essential that all timestamps implement the same semantics,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) regardless of these possible transformations, as otherwise they are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) incomparable. Handling "rare" corner cases differently from the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) simple case (a 1:1 mapping from buffer to skb) is insufficient
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) because performance debugging often needs to focus on such outliers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) In practice, timestamps can be correlated with segments of a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) bytestream consistently, if both semantics of the timestamp and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) timing of measurement are chosen correctly. This challenge is no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) different from deciding on a strategy for IP fragmentation. There, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) definition is that only the first fragment is timestamped. For
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) bytestreams, we chose that a timestamp is generated only when all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) bytes have passed a point. SOF_TIMESTAMPING_TX_ACK as defined is easy to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) implement and reason about. An implementation that has to take into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) account SACK would be more complex due to possible transmission holes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) and out of order arrival.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) On the host, TCP can also break the simple 1:1 mapping from buffer to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) skbuff as a result of Nagle, cork, autocork, segmentation and GSO. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) implementation ensures correctness in all cases by tracking the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) individual last byte passed to send(), even if it is no longer the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) last byte after an skbuff extend or merge operation. It stores the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) relevant sequence number in skb_shinfo(skb)->tskey. Because an skbuff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) has only one such field, only one timestamp can be generated.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) In rare cases, a timestamp request can be missed if two requests are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) collapsed onto the same skb. A process can detect this situation by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) enabling SOF_TIMESTAMPING_OPT_ID and comparing the byte offset at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) send time with the value returned for each timestamp. It can prevent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) the situation by always flushing the TCP stack in between requests,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) for instance by enabling TCP_NODELAY and disabling TCP_CORK and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) autocork.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) These precautions ensure that the timestamp is generated only when all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) bytes have passed a timestamp point, assuming that the network stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) itself does not reorder the segments. The stack indeed tries to avoid
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) reordering. The one exception is under administrator control: it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) possible to construct a packet scheduler configuration that delays
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) segments from the same stream differently. Such a setup would be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) unusual.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 2 Data Interfaces
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ==================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) Timestamps are read using the ancillary data feature of recvmsg().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) See `man 3 cmsg` for details of this interface. The socket manual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) page (`man 7 socket`) describes how timestamps generated with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) SO_TIMESTAMP and SO_TIMESTAMPNS records can be retrieved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 2.1 SCM_TIMESTAMPING records
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) ----------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) These timestamps are returned in a control message with cmsg_level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) SOL_SOCKET, cmsg_type SCM_TIMESTAMPING, and payload of type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) For SO_TIMESTAMPING_OLD::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) struct scm_timestamping {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) struct timespec ts[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) For SO_TIMESTAMPING_NEW::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) struct scm_timestamping64 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) struct __kernel_timespec ts[3];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) Always use SO_TIMESTAMPING_NEW timestamp to always get timestamp in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) struct scm_timestamping64 format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) SO_TIMESTAMPING_OLD returns incorrect timestamps after the year 2038
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) on 32 bit machines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) The structure can return up to three timestamps. This is a legacy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) feature. At least one field is non-zero at any time. Most timestamps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) are passed in ts[0]. Hardware timestamps are passed in ts[2].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) ts[1] used to hold hardware timestamps converted to system time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) Instead, expose the hardware clock device on the NIC directly as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) a HW PTP clock source, to allow time conversion in userspace and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) optionally synchronize system time with a userspace PTP stack such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) as linuxptp. For the PTP clock API, see Documentation/driver-api/ptp.rst.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) Note that if the SO_TIMESTAMP or SO_TIMESTAMPNS option is enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) together with SO_TIMESTAMPING using SOF_TIMESTAMPING_SOFTWARE, a false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) software timestamp will be generated in the recvmsg() call and passed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) in ts[0] when a real software timestamp is missing. This happens also
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) on hardware transmit timestamps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 2.1.1 Transmit timestamps with MSG_ERRQUEUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) For transmit timestamps the outgoing packet is looped back to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) socket's error queue with the send timestamp(s) attached. A process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) receives the timestamps by calling recvmsg() with flag MSG_ERRQUEUE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) set and with a msg_control buffer sufficiently large to receive the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) relevant metadata structures. The recvmsg call returns the original
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) outgoing data packet with two ancillary messages attached.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) A message of cm_level SOL_IP(V6) and cm_type IP(V6)_RECVERR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) embeds a struct sock_extended_err. This defines the error type. For
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) timestamps, the ee_errno field is ENOMSG. The other ancillary message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) will have cm_level SOL_SOCKET and cm_type SCM_TIMESTAMPING. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) embeds the struct scm_timestamping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 2.1.1.2 Timestamp types
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) ~~~~~~~~~~~~~~~~~~~~~~~
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) The semantics of the three struct timespec are defined by field
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) ee_info in the extended error structure. It contains a value of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) type SCM_TSTAMP_* to define the actual timestamp passed in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) scm_timestamping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) The SCM_TSTAMP_* types are 1:1 matches to the SOF_TIMESTAMPING_*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) control fields discussed previously, with one exception. For legacy
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) reasons, SCM_TSTAMP_SND is equal to zero and can be set for both
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) SOF_TIMESTAMPING_TX_HARDWARE and SOF_TIMESTAMPING_TX_SOFTWARE. It
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) is the first if ts[2] is non-zero, the second otherwise, in which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) case the timestamp is stored in ts[0].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 2.1.1.3 Fragmentation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) ~~~~~~~~~~~~~~~~~~~~~
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) Fragmentation of outgoing datagrams is rare, but is possible, e.g., by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) explicitly disabling PMTU discovery. If an outgoing packet is fragmented,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) then only the first fragment is timestamped and returned to the sending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) socket.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 2.1.1.4 Packet Payload
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) ~~~~~~~~~~~~~~~~~~~~~~
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) The calling application is often not interested in receiving the whole
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) packet payload that it passed to the stack originally: the socket
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) error queue mechanism is just a method to piggyback the timestamp on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) In this case, the application can choose to read datagrams with a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) smaller buffer, possibly even of length 0. The payload is truncated
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) accordingly. Until the process calls recvmsg() on the error queue,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) however, the full packet is queued, taking up budget from SO_RCVBUF.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 2.1.1.5 Blocking Read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) ~~~~~~~~~~~~~~~~~~~~~
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) Reading from the error queue is always a non-blocking operation. To
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) block waiting on a timestamp, use poll or select. poll() will return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) POLLERR in pollfd.revents if any data is ready on the error queue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) There is no need to pass this flag in pollfd.events. This flag is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) ignored on request. See also `man 2 poll`.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 2.1.2 Receive timestamps
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) ^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) On reception, there is no reason to read from the socket error queue.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) The SCM_TIMESTAMPING ancillary data is sent along with the packet data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) on a normal recvmsg(). Since this is not a socket error, it is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) accompanied by a message SOL_IP(V6)/IP(V6)_RECVERROR. In this case,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) the meaning of the three fields in struct scm_timestamping is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) implicitly defined. ts[0] holds a software timestamp if set, ts[1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) is again deprecated and ts[2] holds a hardware timestamp if set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 3. Hardware Timestamping configuration: SIOCSHWTSTAMP and SIOCGHWTSTAMP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) =======================================================================
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) Hardware time stamping must also be initialized for each device driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) that is expected to do hardware time stamping. The parameter is defined in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) include/uapi/linux/net_tstamp.h as::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) struct hwtstamp_config {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) int flags; /* no flags defined right now, must be zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) int tx_type; /* HWTSTAMP_TX_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) int rx_filter; /* HWTSTAMP_FILTER_* */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) Desired behavior is passed into the kernel and to a specific device by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) calling ioctl(SIOCSHWTSTAMP) with a pointer to a struct ifreq whose
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) ifr_data points to a struct hwtstamp_config. The tx_type and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) rx_filter are hints to the driver what it is expected to do. If
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) the requested fine-grained filtering for incoming packets is not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) supported, the driver may time stamp more than just the requested types
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) of packets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) Drivers are free to use a more permissive configuration than the requested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) configuration. It is expected that drivers should only implement directly the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) most generic mode that can be supported. For example if the hardware can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) support HWTSTAMP_FILTER_V2_EVENT, then it should generally always upscale
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) HWTSTAMP_FILTER_V2_L2_SYNC_MESSAGE, and so forth, as HWTSTAMP_FILTER_V2_EVENT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) is more generic (and more useful to applications).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) A driver which supports hardware time stamping shall update the struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) with the actual, possibly more permissive configuration. If the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) requested packets cannot be time stamped, then nothing should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) changed and ERANGE shall be returned (in contrast to EINVAL, which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) indicates that SIOCSHWTSTAMP is not supported at all).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) Only a processes with admin rights may change the configuration. User
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) space is responsible to ensure that multiple processes don't interfere
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) with each other and that the settings are reset.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) Any process can read the actual configuration by passing this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) structure to ioctl(SIOCGHWTSTAMP) in the same way. However, this has
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) not been implemented in all drivers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) ::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) /* possible values for hwtstamp_config->tx_type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) * no outgoing packet will need hardware time stamping;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) * should a packet arrive which asks for it, no hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) * time stamping will be done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) HWTSTAMP_TX_OFF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) * enables hardware time stamping for outgoing packets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) * the sender of the packet decides which are to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * time stamped by setting SOF_TIMESTAMPING_TX_SOFTWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * before sending the packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) HWTSTAMP_TX_ON,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) /* possible values for hwtstamp_config->rx_filter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) /* time stamp no incoming packet at all */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) HWTSTAMP_FILTER_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) /* time stamp any incoming packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) HWTSTAMP_FILTER_ALL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) /* return value: time stamp all packets requested plus some others */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) HWTSTAMP_FILTER_SOME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) /* PTP v1, UDP, any kind of event packet */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) HWTSTAMP_FILTER_PTP_V1_L4_EVENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) /* for the complete list of values, please check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) * the include file include/uapi/linux/net_tstamp.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 3.1 Hardware Timestamping Implementation: Device Drivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) --------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) A driver which supports hardware time stamping must support the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) SIOCSHWTSTAMP ioctl and update the supplied struct hwtstamp_config with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) the actual values as described in the section on SIOCSHWTSTAMP. It
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) should also support SIOCGHWTSTAMP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) Time stamps for received packets must be stored in the skb. To get a pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) to the shared time stamp structure of the skb call skb_hwtstamps(). Then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) set the time stamps in the structure::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) struct skb_shared_hwtstamps {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) /* hardware time stamp transformed into duration
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) * since arbitrary point in time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) ktime_t hwtstamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) Time stamps for outgoing packets are to be generated as follows:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) - In hard_start_xmit(), check if (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) is set no-zero. If yes, then the driver is expected to do hardware time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) stamping.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) - If this is possible for the skb and requested, then declare
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) that the driver is doing the time stamping by setting the flag
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) SKBTX_IN_PROGRESS in skb_shinfo(skb)->tx_flags , e.g. with::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) You might want to keep a pointer to the associated skb for the next step
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) and not free the skb. A driver not supporting hardware time stamping doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) do that. A driver must never touch sk_buff::tstamp! It is used to store
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) software generated time stamps by the network subsystem.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) - Driver should call skb_tx_timestamp() as close to passing sk_buff to hardware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) as possible. skb_tx_timestamp() provides a software time stamp if requested
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) and hardware timestamping is not possible (SKBTX_IN_PROGRESS not set).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) - As soon as the driver has sent the packet and/or obtained a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) hardware time stamp for it, it passes the time stamp back by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) calling skb_hwtstamp_tx() with the original skb, the raw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) hardware time stamp. skb_hwtstamp_tx() clones the original skb and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) adds the timestamps, therefore the original skb has to be freed now.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) If obtaining the hardware time stamp somehow fails, then the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) should not fall back to software time stamping. The rationale is that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) this would occur at a later time in the processing pipeline than other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) software time stamping and therefore could lead to unexpected deltas
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) between time stamps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 3.2 Special considerations for stacked PTP Hardware Clocks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) ----------------------------------------------------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) There are situations when there may be more than one PHC (PTP Hardware Clock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) in the data path of a packet. The kernel has no explicit mechanism to allow the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) user to select which PHC to use for timestamping Ethernet frames. Instead, the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) assumption is that the outermost PHC is always the most preferable, and that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) kernel drivers collaborate towards achieving that goal. Currently there are 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) cases of stacked PHCs, detailed below:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 3.2.1 DSA (Distributed Switch Architecture) switches
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) These are Ethernet switches which have one of their ports connected to an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) (otherwise completely unaware) host Ethernet interface, and perform the role of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) a port multiplier with optional forwarding acceleration features. Each DSA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) switch port is visible to the user as a standalone (virtual) network interface,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) and its network I/O is performed, under the hood, indirectly through the host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) interface (redirecting to the host port on TX, and intercepting frames on RX).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) When a DSA switch is attached to a host port, PTP synchronization has to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) suffer, since the switch's variable queuing delay introduces a path delay
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) jitter between the host port and its PTP partner. For this reason, some DSA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) switches include a timestamping clock of their own, and have the ability to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) perform network timestamping on their own MAC, such that path delays only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) measure wire and PHY propagation latencies. Timestamping DSA switches are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) supported in Linux and expose the same ABI as any other network interface (save
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) for the fact that the DSA interfaces are in fact virtual in terms of network
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) I/O, they do have their own PHC). It is typical, but not mandatory, for all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) interfaces of a DSA switch to share the same PHC.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) By design, PTP timestamping with a DSA switch does not need any special
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) handling in the driver for the host port it is attached to. However, when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) host port also supports PTP timestamping, DSA will take care of intercepting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) the ``.ndo_do_ioctl`` calls towards the host port, and block attempts to enable
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) hardware timestamping on it. This is because the SO_TIMESTAMPING API does not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) allow the delivery of multiple hardware timestamps for the same packet, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) anybody else except for the DSA switch port must be prevented from doing so.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) In code, DSA provides for most of the infrastructure for timestamping already,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) in generic code: a BPF classifier (``ptp_classify_raw``) is used to identify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) PTP event messages (any other packets, including PTP general messages, are not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) timestamped), and provides two hooks to drivers:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) - ``.port_txtstamp()``: The driver is passed a clone of the timestampable skb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) to be transmitted, before actually transmitting it. Typically, a switch will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) have a PTP TX timestamp register (or sometimes a FIFO) where the timestamp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) becomes available. There may be an IRQ that is raised upon this timestamp's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) availability, or the driver might have to poll after invoking
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) ``dev_queue_xmit()`` towards the host interface. Either way, in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) ``.port_txtstamp()`` method, the driver only needs to save the clone for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) later use (when the timestamp becomes available). Each skb is annotated with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) a pointer to its clone, in ``DSA_SKB_CB(skb)->clone``, to ease the driver's
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) job of keeping track of which clone belongs to which skb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) - ``.port_rxtstamp()``: The original (and only) timestampable skb is provided
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) to the driver, for it to annotate it with a timestamp, if that is immediately
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) available, or defer to later. On reception, timestamps might either be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) available in-band (through metadata in the DSA header, or attached in other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) ways to the packet), or out-of-band (through another RX timestamping FIFO).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) Deferral on RX is typically necessary when retrieving the timestamp needs a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) sleepable context. In that case, it is the responsibility of the DSA driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) to call ``netif_rx_ni()`` on the freshly timestamped skb.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) 3.2.2 Ethernet PHYs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) ^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) These are devices that typically fulfill a Layer 1 role in the network stack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) hence they do not have a representation in terms of a network interface as DSA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) switches do. However, PHYs may be able to detect and timestamp PTP packets, for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) performance reasons: timestamps taken as close as possible to the wire have the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) potential to yield a more stable and precise synchronization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) A PHY driver that supports PTP timestamping must create a ``struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) mii_timestamper`` and add a pointer to it in ``phydev->mii_ts``. The presence
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) of this pointer will be checked by the networking stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) Since PHYs do not have network interface representations, the timestamping and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) ethtool ioctl operations for them need to be mediated by their respective MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) driver. Therefore, as opposed to DSA switches, modifications need to be done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) to each individual MAC driver for PHY timestamping support. This entails:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) - Checking, in ``.ndo_do_ioctl``, whether ``phy_has_hwtstamp(netdev->phydev)``
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) is true or not. If it is, then the MAC driver should not process this request
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) but instead pass it on to the PHY using ``phy_mii_ioctl()``.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) - On RX, special intervention may or may not be needed, depending on the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) function used to deliver skb's up the network stack. In the case of plain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) ``netif_rx()`` and similar, MAC drivers must check whether
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) ``skb_defer_rx_timestamp(skb)`` is necessary or not - and if it is, don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) call ``netif_rx()`` at all. If ``CONFIG_NETWORK_PHY_TIMESTAMPING`` is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) enabled, and ``skb->dev->phydev->mii_ts`` exists, its ``.rxtstamp()`` hook
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) will be called now, to determine, using logic very similar to DSA, whether
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) deferral for RX timestamping is necessary. Again like DSA, it becomes the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) responsibility of the PHY driver to send the packet up the stack when the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) timestamp is available.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) For other skb receive functions, such as ``napi_gro_receive`` and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) ``netif_receive_skb``, the stack automatically checks whether
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) ``skb_defer_rx_timestamp()`` is necessary, so this check is not needed inside
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) the driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) - On TX, again, special intervention might or might not be needed. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) function that calls the ``mii_ts->txtstamp()`` hook is named
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) ``skb_clone_tx_timestamp()``. This function can either be called directly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) (case in which explicit MAC driver support is indeed needed), but the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) function also piggybacks from the ``skb_tx_timestamp()`` call, which many MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) drivers already perform for software timestamping purposes. Therefore, if a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) MAC supports software timestamping, it does not need to do anything further
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) at this stage.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) 3.2.3 MII bus snooping devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) These perform the same role as timestamping Ethernet PHYs, save for the fact
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) that they are discrete devices and can therefore be used in conjunction with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) any PHY even if it doesn't support timestamping. In Linux, they are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) discoverable and attachable to a ``struct phy_device`` through Device Tree, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) for the rest, they use the same mii_ts infrastructure as those. See
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) Documentation/devicetree/bindings/ptp/timestamper.txt for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) 3.2.4 Other caveats for MAC drivers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) Stacked PHCs, especially DSA (but not only) - since that doesn't require any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) modification to MAC drivers, so it is more difficult to ensure correctness of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) all possible code paths - is that they uncover bugs which were impossible to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) trigger before the existence of stacked PTP clocks. One example has to do with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) this line of code, already presented earlier::
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) Any TX timestamping logic, be it a plain MAC driver, a DSA switch driver, a PHY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) driver or a MII bus snooping device driver, should set this flag.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) But a MAC driver that is unaware of PHC stacking might get tripped up by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) somebody other than itself setting this flag, and deliver a duplicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) timestamp.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) For example, a typical driver design for TX timestamping might be to split the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) transmission part into 2 portions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) 1. "TX": checks whether PTP timestamping has been previously enabled through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) the ``.ndo_do_ioctl`` ("``priv->hwtstamp_tx_enabled == true``") and the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) current skb requires a TX timestamp ("``skb_shinfo(skb)->tx_flags &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) SKBTX_HW_TSTAMP``"). If this is true, it sets the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) "``skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS``" flag. Note: as
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) described above, in the case of a stacked PHC system, this condition should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) never trigger, as this MAC is certainly not the outermost PHC. But this is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) not where the typical issue is. Transmission proceeds with this packet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) 2. "TX confirmation": Transmission has finished. The driver checks whether it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) is necessary to collect any TX timestamp for it. Here is where the typical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) issues are: the MAC driver takes a shortcut and only checks whether
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) "``skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS``" was set. With a stacked
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) PHC system, this is incorrect because this MAC driver is not the only entity
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) in the TX data path who could have enabled SKBTX_IN_PROGRESS in the first
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) place.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) The correct solution for this problem is for MAC drivers to have a compound
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) check in their "TX confirmation" portion, not only for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) "``skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS``", but also for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) "``priv->hwtstamp_tx_enabled == true``". Because the rest of the system ensures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) that PTP timestamping is not enabled for anything other than the outermost PHC,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) this enhanced check will avoid delivering a duplicated TX timestamp to user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) space.