Use start time and device frequency to translate raw Rx hardware
timestamps into nanoseconds.

Signed-off-by: Patrick Keroulas <patrick.kerou...@radio-canada.ca>
---
 lib/librte_pdump/rte_pdump.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c
index b3c8d5ce43..8fd7e13af5 100644
--- a/lib/librte_pdump/rte_pdump.c
+++ b/lib/librte_pdump/rte_pdump.c
@@ -2,6 +2,8 @@
  * Copyright(c) 2016-2018 Intel Corporation
  */
 
+#include <sys/time.h>
+
 #include <rte_memcpy.h>
 #include <rte_mbuf.h>
 #include <rte_ethdev.h>
@@ -69,6 +71,21 @@ static struct pdump_rxtx_cbs {
 } rx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT],
 tx_cbs[RTE_MAX_ETHPORTS][RTE_MAX_QUEUES_PER_PORT];
 
+static uint64_t hz;
+static uint64_t start_time;
+static uint64_t start_cycles;
+
+static inline void
+pdump_ts_to_ns(struct rte_mbuf **pkts, uint16_t nb_pkts)
+{
+       unsigned int i;
+
+       for (i = 0; i < nb_pkts; i++) {
+               if ((pkts[i]->ol_flags & PKT_RX_TIMESTAMP) && hz)
+                       pkts[i]->timestamp = start_time +
+                                (pkts[i]->timestamp - start_cycles) * NS_PER_S 
/ hz;
+       }
+}
 
 static inline void
 pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params)
@@ -107,6 +124,7 @@ pdump_rx(uint16_t port __rte_unused, uint16_t qidx 
__rte_unused,
        uint16_t max_pkts __rte_unused,
        void *user_params)
 {
+       pdump_ts_to_ns(pkts, nb_pkts);
        pdump_copy(pkts, nb_pkts, user_params);
        return nb_pkts;
 }
@@ -131,6 +149,13 @@ pdump_register_rx_callbacks(uint16_t end_q, uint16_t port, 
uint16_t queue,
        for (; qid < end_q; qid++) {
                cbs = &rx_cbs[port][qid];
                if (cbs && operation == ENABLE) {
+                       struct timeval now;
+
+                       rte_eth_read_clock(port, &start_cycles);
+                       rte_eth_get_clock_freq(port, &hz);
+                       gettimeofday(&now, NULL);
+                       start_time = now.tv_sec * NS_PER_S + now.tv_usec * 1000;
+
                        if (cbs->cb) {
                                PDUMP_LOG(ERR,
                                        "failed to add rx callback for port=%d "
-- 
2.17.1

Reply via email to