/*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
               "the packet will be enqueued into the rx drop-queue. "
               "If the drop-queue doesn't exist, the packet is dropped. "
               "By default drop-queue=127.\n");
+#ifdef RTE_LIBRTE_LATENCY_STATS
+       printf("  --latencystats=N: enable latency and jitter statistcs "
+              "monitoring on forwarding lcore id N.\n");
+#endif
        printf("  --crc-strip: enable CRC stripping by hardware.\n");
        printf("  --enable-lro: enable large receive offload.\n");
        printf("  --enable-rx-cksum: enable rx hardware checksum offload.\n");
                { "pkt-filter-report-hash",     1, 0, 0 },
                { "pkt-filter-size",            1, 0, 0 },
                { "pkt-filter-drop-queue",      1, 0, 0 },
+#ifdef RTE_LIBRTE_LATENCY_STATS
+               { "latencystats",               1, 0, 0 },
+#endif
                { "crc-strip",                  0, 0, 0 },
                { "enable-lro",                 0, 0, 0 },
                { "enable-rx-cksum",            0, 0, 0 },
                                                 "drop queue %d invalid - must"
                                                 "be >= 0 \n", n);
                        }
+#ifdef RTE_LIBRTE_LATENCY_STATS
+                       if (!strcmp(lgopts[opt_idx].name,
+                                   "latencystats")) {
+                               n = atoi(optarg);
+                               if (n >= 0) {
+                                       latencystats_lcore_id = (lcoreid_t) n;
+                                       latencystats_enabled = 1;
+                               } else
+                                       rte_exit(EXIT_FAILURE,
+                                                "invalid lcore id %d for latencystats"
+                                                " must be >= 0\n", n);
+                       }
+#endif
                        if (!strcmp(lgopts[opt_idx].name, "crc-strip"))
                                rx_mode.hw_strip_crc = 1;
                        if (!strcmp(lgopts[opt_idx].name, "enable-lro"))
 
 #ifdef RTE_LIBRTE_BITRATE
 #include <rte_bitrate.h>
 #endif
+#include <rte_metrics.h>
+#ifdef RTE_LIBRTE_LATENCY_STATS
+#include <rte_latencystats.h>
+#endif
 
 #include "testpmd.h"
 
 
 #endif
 
+#ifdef RTE_LIBRTE_LATENCY_STATS
+
+/*
+ * Set when latency stats is enabled in the commandline
+ */
+uint8_t latencystats_enabled;
+
+/*
+ * Lcore ID to serive latency statistics.
+ */
+lcoreid_t latencystats_lcore_id = -1;
+
+#endif
+
 /*
  * Ethernet device configuration.
  */
                        tics_datum = tics_current;
                }
 #endif
+#ifdef RTE_LIBRTE_LATENCY_STATS
+               if (latencystats_lcore_id == rte_lcore_id())
+                       rte_latencystats_update();
+#endif
+
        } while (! fc->stopped);
 }
 
 #ifdef RTE_LIBRTE_PDUMP
                /* uninitialize packet capture framework */
                rte_pdump_uninit();
+#endif
+#ifdef RTE_LIBRTE_LATENCY_STATS
+               rte_latencystats_uninit();
 #endif
                force_quit();
                /* exit with the expected status */
        /* Init metrics library */
        rte_metrics_init(rte_socket_id());
 
+#ifdef RTE_LIBRTE_LATENCY_STATS
+       if (latencystats_enabled != 0) {
+               int ret = rte_latencystats_init(1, NULL);
+               if (ret)
+                       printf("Warning: latencystats init()"
+                               " returned error %d\n", ret);
+               printf("Latencystats running on lcore %d\n",
+                       latencystats_lcore_id);
+       }
+#endif
+
        /* Setup bitrate stats */
 #ifdef RTE_LIBRTE_BITRATE
        bitrate_data = rte_stats_bitrate_create();
 
 /*-
  *   BSD LICENSE
  *
- *   Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2017 Intel Corporation. All rights reserved.
  *   All rights reserved.
  *
  *   Redistribution and use in source and binary forms, with or without
 extern uint16_t mbuf_data_size; /**< Mbuf data space size. */
 extern uint32_t param_total_num_mbufs;
 
+
+#ifdef RTE_LIBRTE_LATENCY_STATS
+extern uint8_t latencystats_enabled;
+extern lcoreid_t latencystats_lcore_id;
+#endif
+
 extern struct rte_fdir_conf fdir_conf;
 
 /*