On 5/2/2019 1:11 PM, Tom Barbette wrote: > Add rte_eth_read_clock to read the raw clock of a device. > > The main use is to get the device clock conversion co-efficients to be > able to translate the raw clock of the timestamp field of the pkt mbuf > to a local synced time value. > > This function was missing to allow users to convert the Rx timestamp field > to real time without the complexity of the rte_timesync* facility. One can > derivate the clock frequency by calling twice read_clock and then keep a > common time base. > > Signed-off-by: Tom Barbette <barbe...@kth.se>
<...> > +/** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice. > + * > + * Read the current clock counter of an Ethernet device > + * > + * This returns the current raw clock value of an Ethernet device. It is > + * a raw amount of ticks, with no given time reference. > + * The value returned here is from the same clock than the one > + * filling timestamp field of Rx packets when using hardware timestamp > + * offload. Therefore it can be used to compute a precise conversion of > + * the device clock to the real time. > + * > + * E.g, a simple heuristic to derivate the frequency would be: > + * uint64_t start, end; > + * rte_eth_read_clock(port, start); > + * rte_delay_ms(100); > + * rte_eth_read_clock(port, end); > + * double freq = (end - start) * 10; > + * > + * Compute a common reference with: > + * uint64_t base_time_sec = current_time(); > + * uint64_t base_clock; > + * rte_eth_read_clock(port, base_clock); > + * > + * Then, convert the raw mbuf timestamp with: > + * base_time_sec + (double)(mbuf->timestamp - base_clock) / freq; > + * > + * This simple example will not provide a very good accuracy. One must > + * at least measure multiple times the frequency and do a regression. > + * To avoid deviation from the system time, the common reference can > + * be repeated from time to time. The integer division can also be > + * converted by a multiplication and a shift for better performance. > + * > + * @param port_id > + * The port identifier of the Ethernet device. > + * @param time > + * Pointer to the uint64_t that holds the raw clock value. > + * > + * @return > + * - 0: Success. > + * - -ENODEV: The port ID is invalid. > + * - -ENOTSUP: The function is not supported by the Ethernet driver. > + */ > +int __rte_experimental > +rte_eth_read_clock(uint16_t port_id, uint64_t *clock); This is causing doc build error, since @param should be "clock" instead of "time". I have fixed this in the next-net repo and force pushed.