From patchwork Thu Jun 11 15:16:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Keroulas X-Patchwork-Id: 71278 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 41191A0093; Thu, 11 Jun 2020 17:16:35 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5C4332C02; Thu, 11 Jun 2020 17:16:26 +0200 (CEST) Received: from mail-qv1-f65.google.com (mail-qv1-f65.google.com [209.85.219.65]) by dpdk.org (Postfix) with ESMTP id D3B211D9E for ; Thu, 11 Jun 2020 17:16:24 +0200 (CEST) Received: by mail-qv1-f65.google.com with SMTP id cv17so2760544qvb.13 for ; Thu, 11 Jun 2020 08:16:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=radio-canada-ca.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Yl+hqdmDSWH9JtqCwOV3WJU08COpubb+7rdyHhP38BQ=; b=dGTA6w9Ji99IRJ7OCDrFP/fodbmJnV0AgrR9H3BQR4NRTeXYi6Pe7Dm2vh3BxOraNh koA6nZA/OVW1NW1q7CX0HF7mCWrRF7sk/bE5miModefg6vCVAU7yz1zDi6Ghn13FPREc RgjgaKNN/Xxbk6LhI1vTCoUO/jZm7ESSMEmIfgKv5w7HbsqJId3hnHvMqF7EhEAov2aM 5OOmwaFSB/I2+kUd+8W6Yot+OdvYVP9DvffXLsoJSriRW9C8HpC/PuludXA9DD5Mhd5a 6NQw+5RrhQFgnKZWpGZyB3kxsuV0Src7dDwFDeInPRHsVIawhEpiejBPcvMe7jIgZUgO 8Ptw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Yl+hqdmDSWH9JtqCwOV3WJU08COpubb+7rdyHhP38BQ=; b=jB4Lnn681F7tZsmQs2umWQg2trHY9617hpWTGPnfS7HCDLP2UELVPPmqYXX7ac5G0C W01oA9wfLkKBKTX1dJYhirwoc3Vl8bu3hnvtdJ/ZnucGdWwYyVb0TsORSR3bPFR/0bmh zhUR34qSP5EGE70pRW/GqFZTdlsUxTogTfdOVvNhIzQOKugp9BWI73w7CxXGIbo7gUu1 rzqpGFFsuHLe5gNJx37ycpSwdDNNnZBKzSDstdCEVSEtmPffg3Eavo50B/RSSAV5+uYU t2d5cHebsXQPUioE3mDzL1gxW9vP7wNP5EfEXY0dFbOnQwJqnvB5czGQMrj3q9QRhVjl ERtQ== X-Gm-Message-State: AOAM530esg+jnN9I1so0J/6GGqIVberqDB0GaGZOWqiZEtemJ3HAb4N1 5NuC0367qluPriAZ6ThHvFju8luXRjbJ4Q== X-Google-Smtp-Source: ABdhPJzrJWL3h/0rdbAI+t0XN1hzMvC7H2MkporeyWDwXeQEQB0knXhIP+uSdND3tV7Yi3KXHBhL0g== X-Received: by 2002:ad4:4a6e:: with SMTP id cn14mr7934428qvb.79.1591888583911; Thu, 11 Jun 2020 08:16:23 -0700 (PDT) Received: from localhost.localdomain (modemcable246.10-73-45.static.videotron.ca. [45.73.10.246]) by smtp.gmail.com with ESMTPSA id h77sm2524379qke.37.2020.06.11.08.16.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2020 08:16:23 -0700 (PDT) From: Patrick Keroulas To: dev@dpdk.org Cc: Patrick Keroulas Date: Thu, 11 Jun 2020 11:16:08 -0400 Message-Id: <20200611151610.32409-2-patrick.keroulas@radio-canada.ca> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200611151610.32409-1-patrick.keroulas@radio-canada.ca> References: <20200611151610.32409-1-patrick.keroulas@radio-canada.ca> Subject: [dpdk-dev] [RFC][PATCH v2 1/3] net/mlx5: add counter-to-ns converter from libibverbs X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" While some devices update their own clock info to provide current time, mlx5dv part of libibverbs already handles this and also converts any raw counter cycle to nanoseconds. Signed-off-by: Patrick Keroulas --- drivers/common/mlx5/linux/mlx5_glue.c | 16 ++++++++++++++ drivers/common/mlx5/linux/mlx5_glue.h | 4 ++++ drivers/net/mlx5/mlx5.c | 1 + drivers/net/mlx5/mlx5.h | 1 + drivers/net/mlx5/mlx5_ethdev.c | 30 +++++++++++++++++++++++++++ 5 files changed, 52 insertions(+) diff --git a/drivers/common/mlx5/linux/mlx5_glue.c b/drivers/common/mlx5/linux/mlx5_glue.c index c91ee33bb..cac24015b 100644 --- a/drivers/common/mlx5/linux/mlx5_glue.c +++ b/drivers/common/mlx5/linux/mlx5_glue.c @@ -80,6 +80,20 @@ mlx5_glue_query_rt_values_ex(struct ibv_context *context, return ibv_query_rt_values_ex(context, values); } +static int +mlx5_glue_get_clock_info(struct ibv_context *context, + struct mlx5dv_clock_info *clock_info) +{ + return mlx5dv_get_clock_info(context, clock_info); +} + +static uint64_t +mlx5_glue_mlx5dv_ts_to_ns(struct mlx5dv_clock_info *clock_info, + uint64_t device_timestamp) +{ + return mlx5dv_ts_to_ns(clock_info, device_timestamp); +} + static int mlx5_glue_query_port(struct ibv_context *context, uint8_t port_num, struct ibv_port_attr *port_attr) @@ -1207,6 +1221,8 @@ const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue) { .query_device = mlx5_glue_query_device, .query_device_ex = mlx5_glue_query_device_ex, .query_rt_values_ex = mlx5_glue_query_rt_values_ex, + .get_clock_info = mlx5_glue_get_clock_info, + .convert_ts_to_ns = mlx5_glue_mlx5dv_ts_to_ns, .query_port = mlx5_glue_query_port, .create_comp_channel = mlx5_glue_create_comp_channel, .destroy_comp_channel = mlx5_glue_destroy_comp_channel, diff --git a/drivers/common/mlx5/linux/mlx5_glue.h b/drivers/common/mlx5/linux/mlx5_glue.h index 5d238a40a..8d05e7398 100644 --- a/drivers/common/mlx5/linux/mlx5_glue.h +++ b/drivers/common/mlx5/linux/mlx5_glue.h @@ -123,6 +123,10 @@ struct mlx5_glue { struct ibv_port_attr *port_attr); struct ibv_comp_channel *(*create_comp_channel) (struct ibv_context *context); + int (*get_clock_info)(struct ibv_context *context, + struct mlx5dv_clock_info *clock_info); + uint64_t (*convert_ts_to_ns)(struct mlx5dv_clock_info *clock_info, + uint64_t device_timestamp); int (*destroy_comp_channel)(struct ibv_comp_channel *channel); struct ibv_cq *(*create_cq)(struct ibv_context *context, int cqe, void *cq_context, diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 7c5e23d9f..c14117f5b 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -1241,6 +1241,7 @@ const struct eth_dev_ops mlx5_dev_ops = { .xstats_get_names = mlx5_xstats_get_names, .fw_version_get = mlx5_fw_version_get, .dev_infos_get = mlx5_dev_infos_get, + .convert_ts_to_ns = mlx5_convert_ts_to_ns, .read_clock = mlx5_read_clock, .dev_supported_ptypes_get = mlx5_dev_supported_ptypes_get, .vlan_filter_set = mlx5_vlan_filter_set, diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 8c4b234e5..f4906a54e 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -720,6 +720,7 @@ int mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep, unsigned int flags); int mlx5_dev_configure(struct rte_eth_dev *dev); int mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info); +int mlx5_convert_ts_to_ns(struct rte_eth_dev *dev, uint64_t *timestamp); int mlx5_read_clock(struct rte_eth_dev *dev, uint64_t *clock); int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size); const uint32_t *mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev); diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c index 6b8b30322..374c9a226 100644 --- a/drivers/net/mlx5/mlx5_ethdev.c +++ b/drivers/net/mlx5/mlx5_ethdev.c @@ -690,6 +690,36 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info) return 0; } +/** + * Convert raw clock counter to nanoseconds + * + * @param dev + * Pointer to Ethernet device structure. + * @param[in&out] timestamp + * Pointer to the timestamp to be converted. + * + * @return + * 0 if the clock has correctly been read + * The value of errno in case of error + */ +int +mlx5_convert_ts_to_ns(struct rte_eth_dev *dev, uint64_t *timestamp) +{ + struct mlx5_priv *priv = dev->data->dev_private; + struct ibv_context *ctx = priv->sh->ctx; + struct mlx5dv_clock_info clock_info; + + int err = mlx5_glue->get_clock_info(ctx, &clock_info); + if (err != 0) { + DRV_LOG(WARNING, "Could not get the clock info!"); + return err; + } + + *timestamp = mlx5_glue->convert_ts_to_ns(&clock_info, *timestamp); + + return err; +} + /** * Get device current raw clock counter * From patchwork Thu Jun 11 15:16:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Keroulas X-Patchwork-Id: 71279 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 98011A0093; Thu, 11 Jun 2020 17:16:43 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B0ECA2BAA; Thu, 11 Jun 2020 17:16:31 +0200 (CEST) Received: from mail-qk1-f195.google.com (mail-qk1-f195.google.com [209.85.222.195]) by dpdk.org (Postfix) with ESMTP id 421442BAA for ; Thu, 11 Jun 2020 17:16:30 +0200 (CEST) Received: by mail-qk1-f195.google.com with SMTP id v79so5867239qkb.10 for ; Thu, 11 Jun 2020 08:16:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=radio-canada-ca.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AgwoYj9Qly6hZDcq3zF7WnpdhQ9z9huTS/ZqiJFqpn8=; b=Wt1m3nI1pAX6jmpnDrdhdPGs6dRvLP4kLntJuyrIsQim4gl2xOXbLA6OFVkVWb6V1f wdIA+7PaxYzwXdGjPyH1VPUEqFVm94cLofa8iIqePYxCMxUcVWFwMCIukdQdf/5aNxYP jA2NZ+nDeASYVbm+PmeSpaFxn/2hJux/DG8jDb0aIv8jiCPN/f9CKxEqpFebodzD+3GE eN3jy+X5qnpyTmxK3krq8Bcyy2n6B7XOoPi9zEQX0hfrASS8am5C+w33gz0mYSlYmTKd Iedlz9pQ0ZsfAh5UTi+3nMQQgT4olbX8C0v68jyparAXwU2NVvH4fk9eF3I9DlVK5XxJ tmAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AgwoYj9Qly6hZDcq3zF7WnpdhQ9z9huTS/ZqiJFqpn8=; b=qwepfOUeuJ4O9bgbHeM1UEA9z6jl2NAHeMg7eFOZL9WbeF2BqHbLEwd1KJuD8dtKJS iRn5sXT7++A3aIyOOrgN5GNDAWkc/WXDPQAflSinArrqHhPXrSLdAVsFlP+hBSv1B1Ie 7viypud4o3dAGztY4NfXgDaT9Ys6gL9PU+UjLdS1w5Rw2MzIWadbkgtT1IkarmwSHXKL omMk91olDJJcsAvqSFNPSpkq5dJgx9j2eCWwgAjmFvG9Ty4jvgVVeGftFmcsGg9dJu0T S5IJTclXt4eduOSfvfKhInetxu/NCtGwaHc749cpAt/1B4I2QVsoumn0FyyGW9k9gjWC WllQ== X-Gm-Message-State: AOAM531I/J//NNa/sqRsDD8maH/LryFS4O1X+q2gCejGkwBnAv2cId18 v8TH4BnPVSCrTX5UhrOYkyGyluq1Z+bQ+Q== X-Google-Smtp-Source: ABdhPJycBF3IcIL/DcWDmIN92vyHUd49fNb2Syk8kVNjXkMblHfpr2TeT0iM+5yyifapWiCvJn6Hig== X-Received: by 2002:a37:644d:: with SMTP id y74mr8885426qkb.477.1591888589316; Thu, 11 Jun 2020 08:16:29 -0700 (PDT) Received: from localhost.localdomain (modemcable246.10-73-45.static.videotron.ca. [45.73.10.246]) by smtp.gmail.com with ESMTPSA id h77sm2524379qke.37.2020.06.11.08.16.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2020 08:16:29 -0700 (PDT) From: Patrick Keroulas To: dev@dpdk.org Cc: Patrick Keroulas Date: Thu, 11 Jun 2020 11:16:09 -0400 Message-Id: <20200611151610.32409-3-patrick.keroulas@radio-canada.ca> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200611151610.32409-1-patrick.keroulas@radio-canada.ca> References: <20200611151610.32409-1-patrick.keroulas@radio-canada.ca> Subject: [dpdk-dev] [RFC][PATCH v2 2/3] ethdev: add API to convert raw timestamps to nsec X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Existing ethdev functions can read/write time from/to device but they're all related to timesync and none of them can translate a raw counter in real time unit which is usefull in a pdump application. A new API is required because the conversion is derived from dev clock info. Signed-off-by: Patrick Keroulas --- lib/librte_ethdev/rte_ethdev.c | 12 ++++++++++++ lib/librte_ethdev/rte_ethdev.h | 17 +++++++++++++++++ lib/librte_ethdev/rte_ethdev_core.h | 5 +++++ lib/librte_ethdev/rte_ethdev_version.map | 2 ++ lib/librte_mbuf/rte_mbuf_core.h | 3 ++- lib/librte_pdump/rte_pdump.c | 14 +++++++++++++- 6 files changed, 51 insertions(+), 2 deletions(-) diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 8e10a6fc3..822fa6d5a 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -4810,6 +4810,18 @@ rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp) timestamp)); } +int +rte_eth_convert_ts_to_ns(uint16_t port_id, uint64_t *timestamp) +{ + struct rte_eth_dev *dev; + + RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV); + dev = &rte_eth_devices[port_id]; + + RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->convert_ts_to_ns, -ENOTSUP); + return eth_err(port_id, (*dev->dev_ops->convert_ts_to_ns)(dev, timestamp)); +} + int rte_eth_read_clock(uint16_t port_id, uint64_t *clock) { diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index a49242bcd..2d4d0bc7d 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -4103,6 +4103,23 @@ int rte_eth_timesync_read_time(uint16_t port_id, struct timespec *time); */ int rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *time); +/** + * Convert a raw clock counter to nanoseconds from device clock + * + * @param port_id + * The port identifier of the Ethernet device. + * @param[in&out] timestamp + * Pointer to the timestamp to be converted. + * + * @return + * - 0: Success. + * - -ENODEV: The port ID is invalid. + * - -ENOTSUP: The function is not supported by the Ethernet driver. + */ +__rte_experimental +int +rte_eth_convert_ts_to_ns(uint16_t port_id, uint64_t *timestamp); + /** * @warning * @b EXPERIMENTAL: this API may change without prior notice. diff --git a/lib/librte_ethdev/rte_ethdev_core.h b/lib/librte_ethdev/rte_ethdev_core.h index 32407dd41..255b41b67 100644 --- a/lib/librte_ethdev/rte_ethdev_core.h +++ b/lib/librte_ethdev/rte_ethdev_core.h @@ -464,6 +464,10 @@ typedef int (*eth_timesync_write_time)(struct rte_eth_dev *dev, const struct timespec *timestamp); /**< @internal Function used to get time from the device clock */ +typedef int (*eth_convert_ts_to_ns)(struct rte_eth_dev *dev, + uint64_t *timestamp); +/**< @internal Function used to convert timestamp from device clock */ + typedef int (*eth_read_clock)(struct rte_eth_dev *dev, uint64_t *timestamp); /**< @internal Function used to get the current value of the device clock. */ @@ -730,6 +734,7 @@ struct eth_dev_ops { eth_timesync_read_time timesync_read_time; /** Get the device clock time. */ eth_timesync_write_time timesync_write_time; /** Set the device clock time. */ + eth_convert_ts_to_ns convert_ts_to_ns; eth_read_clock read_clock; eth_xstats_get_by_id_t xstats_get_by_id; diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index 715505604..754c05630 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -241,4 +241,6 @@ EXPERIMENTAL { __rte_ethdev_trace_rx_burst; __rte_ethdev_trace_tx_burst; rte_flow_get_aged_flows; + + rte_eth_convert_ts_to_ns; }; diff --git a/lib/librte_mbuf/rte_mbuf_core.h b/lib/librte_mbuf/rte_mbuf_core.h index b9a59c879..7f51f9157 100644 --- a/lib/librte_mbuf/rte_mbuf_core.h +++ b/lib/librte_mbuf/rte_mbuf_core.h @@ -592,7 +592,8 @@ struct rte_mbuf { /** Valid if PKT_RX_TIMESTAMP is set. The unit and time reference * are not normalized but are always the same for a given port. * Some devices allow to query rte_eth_read_clock that will return the - * current device timestamp. + * current device timestamp or rte_eth_ts_to_ns that will convert raw + * counter to nanoseconds. */ uint64_t timestamp; diff --git a/lib/librte_pdump/rte_pdump.c b/lib/librte_pdump/rte_pdump.c index f96709f95..03d9ba484 100644 --- a/lib/librte_pdump/rte_pdump.c +++ b/lib/librte_pdump/rte_pdump.c @@ -100,12 +100,24 @@ pdump_copy(struct rte_mbuf **pkts, uint16_t nb_pkts, void *user_params) } } +static inline void +pdump_ts_to_ns(uint16_t port_id, 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) + rte_eth_convert_ts_to_ns(port_id, &pkts[i]->timestamp); + } +} + static uint16_t -pdump_rx(uint16_t port __rte_unused, uint16_t qidx __rte_unused, +pdump_rx(uint16_t port_id, uint16_t qidx __rte_unused, struct rte_mbuf **pkts, uint16_t nb_pkts, uint16_t max_pkts __rte_unused, void *user_params) { + pdump_ts_to_ns(port_id, pkts, nb_pkts); pdump_copy(pkts, nb_pkts, user_params); return nb_pkts; } From patchwork Thu Jun 11 15:16:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Keroulas X-Patchwork-Id: 71280 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E67F8A0093; Thu, 11 Jun 2020 17:16:52 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B88042BF7; Thu, 11 Jun 2020 17:16:43 +0200 (CEST) Received: from mail-qt1-f196.google.com (mail-qt1-f196.google.com [209.85.160.196]) by dpdk.org (Postfix) with ESMTP id 5F4C32A5D for ; Thu, 11 Jun 2020 17:16:42 +0200 (CEST) Received: by mail-qt1-f196.google.com with SMTP id w9so4814076qtv.3 for ; Thu, 11 Jun 2020 08:16:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=radio-canada-ca.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VbwQ9zgLJg84bEvioUX37HglishNU+ztxQDFz+3wF4I=; b=XvZ5nDglQ5IPBS5hJVq54KK+2Z+2kXB02OXfUSML638uY42vxJEpG2Xo/lu86e6Dh8 6ZemvmC5mZsG7mPP36ZiFyLI/32VtjuTeav37dwKk5IJn/VSTRqWyeF48bJcbsCWG5w0 yXUyr9CEKf/XJbKWk8xzsDQl64ia3fkP73ib+NuBL1ApfuaGhzyadnBZtgMoGie8EOiV 7phK4yIX4tz120lw7vKmWJNVgloQZKVqIa/nogRLvuqCByUqK3/7tXeoyoZE0+uNFQS4 BuvUxaVg5EsI3pv5j63UE8hnTUmLGlk6Y1XDKyX4POtxQiMOb6XCLTL74sbHPSg9vu8P lMww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=VbwQ9zgLJg84bEvioUX37HglishNU+ztxQDFz+3wF4I=; b=WRpOvq0xn1RjwSqkOVZhDN6ELBNRKi38N73xAQnfhymvfOhMXHCOrC4JbNIEYkv0ia vlAft34vNAx/NRlqnBMt0MgITc6+cOtzxTzr4RVV6N+tidXGlvSO4HZ/DmjxISm1MvSd uX6RvQgewLc+Vrq/OjV0zNsU+FhdNspD9YYubcXRwSTg1q9R6kyhpy6mGsz1l2HQnNVr S/b/vQ8CSR7GO/KTyVaRdf96ZSvNaYBLOOcvmm8ajrydg/6cCTGlu2IL/d1L32U4CEvG 2xShIKVWi80IqAF05/RaKB1GvbT/cggPhOS3kvwl7sEFy7wpwMk4vrfN4UdRdTtNzdoI SoXg== X-Gm-Message-State: AOAM5336lQbp9cO+y3FtWyF8cFFVcqJ6fBHthSiwrnsXzNaj1JSKS+vJ ktSIHQlQOiJBhwWzgZsjBMoLyRIwCuN8iw== X-Google-Smtp-Source: ABdhPJxTZukZYwxZvQRfCEoQiGjMdJYjie8hakv3ftubuJAgFUrHSkml0enbQ9/Jswl0gtbwmgRzIw== X-Received: by 2002:ac8:4e86:: with SMTP id 6mr9003371qtp.390.1591888601574; Thu, 11 Jun 2020 08:16:41 -0700 (PDT) Received: from localhost.localdomain (modemcable246.10-73-45.static.videotron.ca. [45.73.10.246]) by smtp.gmail.com with ESMTPSA id h77sm2524379qke.37.2020.06.11.08.16.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 11 Jun 2020 08:16:41 -0700 (PDT) From: Patrick Keroulas To: dev@dpdk.org Cc: Patrick Keroulas , Vivien Didelot Date: Thu, 11 Jun 2020 11:16:10 -0400 Message-Id: <20200611151610.32409-4-patrick.keroulas@radio-canada.ca> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200611151610.32409-1-patrick.keroulas@radio-canada.ca> References: <20200611151610.32409-1-patrick.keroulas@radio-canada.ca> Subject: [dpdk-dev] [RFC][PATCH v2 3/3] net/pcap: dump hardware timestamps X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" When hardware timestamping is activated, system time should no longer be used to timestamp dumped the packets. Instead, use value held by forwarded and assume they were converted to nanoseconds. Signed-off-by: Patrick Keroulas Signed-off-by: Vivien Didelot --- drivers/net/pcap/rte_eth_pcap.c | 35 ++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/drivers/net/pcap/rte_eth_pcap.c b/drivers/net/pcap/rte_eth_pcap.c index 13a3d0ac7..6a4ffae7b 100644 --- a/drivers/net/pcap/rte_eth_pcap.c +++ b/drivers/net/pcap/rte_eth_pcap.c @@ -45,6 +45,8 @@ #define RTE_PMD_PCAP_MAX_QUEUES 16 +#define NSEC_PER_SEC 1000000000L + static char errbuf[PCAP_ERRBUF_SIZE]; static struct timeval start_time; static uint64_t start_cycles; @@ -287,22 +289,23 @@ eth_null_rx(void *queue __rte_unused, return 0; } -#define NSEC_PER_SEC 1000000000L - static inline void -calculate_timestamp(struct timeval *ts) { - uint64_t cycles; - struct timeval cur_time; - - cycles = rte_get_timer_cycles() - start_cycles; - cur_time.tv_sec = cycles / hz; - cur_time.tv_usec = (cycles % hz) * NSEC_PER_SEC / hz; - - ts->tv_sec = start_time.tv_sec + cur_time.tv_sec; - ts->tv_usec = start_time.tv_usec + cur_time.tv_usec; - if (ts->tv_usec >= NSEC_PER_SEC) { - ts->tv_usec -= NSEC_PER_SEC; - ts->tv_sec += 1; +calculate_timestamp(const struct rte_mbuf *mbuf, struct timeval *ts) { + if (mbuf->ol_flags & PKT_RX_TIMESTAMP) { + /* timestamp unit is nanoseconds but must fit in timeval */ + ts->tv_sec = mbuf->timestamp / NSEC_PER_SEC; + ts->tv_usec = mbuf->timestamp % NSEC_PER_SEC; + } else { + uint64_t cycles = rte_get_timer_cycles() - start_cycles; + struct timeval cur_time; + cur_time.tv_sec = cycles / hz; + cur_time.tv_usec = (cycles % hz) * NSEC_PER_SEC / hz; + ts->tv_sec = start_time.tv_sec + cur_time.tv_sec; + ts->tv_usec = start_time.tv_usec + cur_time.tv_usec; + if (ts->tv_usec > NSEC_PER_SEC) { + ts->tv_usec -= NSEC_PER_SEC; + ts->tv_sec += 1; + } } } @@ -339,7 +342,7 @@ eth_pcap_tx_dumper(void *queue, struct rte_mbuf **bufs, uint16_t nb_pkts) caplen = sizeof(temp_data); } - calculate_timestamp(&header.ts); + calculate_timestamp(mbuf, &header.ts); header.len = len; header.caplen = caplen; /* rte_pktmbuf_read() returns a pointer to the data directly