From patchwork Mon Feb 5 17:43:31 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Stephen Hemminger X-Patchwork-Id: 136390 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id BE22743A3D; Mon, 5 Feb 2024 19:04:02 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1B3FF40E36; Mon, 5 Feb 2024 19:03:44 +0100 (CET) Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) by mails.dpdk.org (Postfix) with ESMTP id 1A18C40DF6 for ; Mon, 5 Feb 2024 19:03:42 +0100 (CET) Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-1d72f71f222so37528365ad.1 for ; Mon, 05 Feb 2024 10:03:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=networkplumber-org.20230601.gappssmtp.com; s=20230601; t=1707156221; x=1707761021; darn=dpdk.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=VXOXU50fnLBP+CKN25gJEh16oaeo3cGMEGYk3PHbOHc=; b=aSymfJVEoALWCGaRQLoZ4EWuQDIS8owVR6J5vHdZTe3VJCZZ+XYk1Ky+EK9e7TAeXv rw56JUxgkD68j3105n0VxlatnXgRppApM47cY9KouuxM2xcA51nnBU1y7uL5pSJZaePe 8TRwpfJJB4UbU6ZD9ejgR8EY7pi24TFYySU4DLSJhYqKx1TTM5RhIMLxCYBQoXmNjTK4 jEWx07O7olzyhGOyjeNlgBM8T1djRWIWyWHp+jcgjtbPW0wpKye6JYK+cNKUJrnziFiR hctgcsvb5BkUzWAE9JBPoJ+jRdTOLiTt4+s5Q7SvyOiNQpcR82dLcI+ui7lBItLfaRFT 9XfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1707156221; x=1707761021; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=VXOXU50fnLBP+CKN25gJEh16oaeo3cGMEGYk3PHbOHc=; b=TBopVCOjQIVHTr2za9M+wtw2gn/Yt3UyvAjsfcW91SI/rBpdYj7X5ZE2ND4slk2jDS Tee0d7VauIC4B+T1jD8xnaVSXOyUAwy3Bsee7E2NAPObOUMPcbZYEodOvlgbib3IeG4u tTsFjV4oQ5dLbHoMiCm78qcVo+FQMRCLy4PvbusKdaeFK0BI/6EMxU23Rvg8mmDyZiJH jb4CpgF+PUXskWxgYZmo3EB+qQiOrs6UfUQznhi6Tyw9vj/kwMWCb3P7N0Dl7SP0+bJn r/+2qzUCpw8BD+s4gG+4XMZhr7QljalP2Xic05VSgPByaFZcj+9Zy7GQKXQ0Yurd/FW1 fYoA== X-Gm-Message-State: AOJu0Yx3k4rWy4CBG9MfYEhiKw0CONHqKMv6LkMk3zCI7+F3K5vrhldE 9mm+39IT7+H9PFZfHVbIBqu/ogZkpsadqrx6aZfauDcFGYWG1pieFhi2Eh8n9OJDi88Qun16AR7 rLuQ= X-Google-Smtp-Source: AGHT+IHmfRJh5jixOYf+ccKMqv4xNWDISXEJgo4fw3Ee7EOW2hnT574+4Exvfu7dinf8DnHujTBmNA== X-Received: by 2002:a17:903:189:b0:1d9:a780:393d with SMTP id z9-20020a170903018900b001d9a780393dmr367297plg.8.1707156221201; Mon, 05 Feb 2024 10:03:41 -0800 (PST) X-Forwarded-Encrypted: i=0; AJvYcCVX/NLAMgkoUE6M+vFdCU8SjRAABSNpVbB0fG/rEmHWxe/Tg3BzYBggiK6Buo5rOiopD1a2Wh2N+SsdGFrc/tBbzS4KRyg5a6IYvoS9+bdlLrIZJoHQvpmHuLHfZg7oQ+5Dbuo8GZcajqdf1BO61qsqhovP5+2JAZ53+oqaJnbw5oIfDX4= Received: from hermes.local (204-195-123-141.wavecable.com. [204.195.123.141]) by smtp.gmail.com with ESMTPSA id x8-20020a170902b40800b001d9b0a15bbfsm144867plr.262.2024.02.05.10.03.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 05 Feb 2024 10:03:40 -0800 (PST) From: Stephen Hemminger To: dev@dpdk.org Cc: Stephen Hemminger , Somnath Kotur , Ajit Khaparde , Kirill Rybalchenko Subject: [PATCH v9 03/23] examples/ptp: replace terms master and slave Date: Mon, 5 Feb 2024 09:43:31 -0800 Message-ID: <20240205180328.131019-4-stephen@networkplumber.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240205180328.131019-1-stephen@networkplumber.org> References: <0230331200824.195294-1-stephen@networkplumber.org> <20240205180328.131019-1-stephen@networkplumber.org> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The IEEE 1588 standard has been updated to remove the use of master-slave terminolgy. Use the terms recommended by IEEE 1588g-2022 amendment: In place of the term “master”, use the term “timeTransmitter”. In place of the term “slave”, use the term “timeReceiver”. Signed-off-by: Stephen Hemminger Reviewed-by: Somnath Kotur --- doc/guides/nics/bnxt.rst | 8 ++-- doc/guides/sample_app_ug/img/ptpclient.svg | 4 +- doc/guides/sample_app_ug/intro.rst | 4 +- doc/guides/sample_app_ug/ptpclient.rst | 29 ++++++------ examples/ptpclient/ptpclient.c | 54 +++++++++++----------- 5 files changed, 51 insertions(+), 48 deletions(-) diff --git a/doc/guides/nics/bnxt.rst b/doc/guides/nics/bnxt.rst index 6db880d632f8..8b9fcd25583d 100644 --- a/doc/guides/nics/bnxt.rst +++ b/doc/guides/nics/bnxt.rst @@ -538,10 +538,12 @@ Time Synchronization ~~~~~~~~~~~~~~~~~~~~ System operators may run a PTP (Precision Time Protocol) client application to -synchronize the time on the NIC (and optionally, on the system) to a PTP master. +synchronize the time on the NIC (and optionally, on the system) to a +PTP timeTransmitter. -The BNXT PMD supports a PTP client application to communicate with a PTP master -clock using DPDK IEEE1588 APIs. Note that the PTP client application needs to +The BNXT PMD supports a PTP client application to communicate with a +PTP timeTransmitter using DPDK IEEE1588 APIs. +Note that the PTP client application needs to run on PF and vector mode needs to be disabled. .. code-block:: console diff --git a/doc/guides/sample_app_ug/img/ptpclient.svg b/doc/guides/sample_app_ug/img/ptpclient.svg index fd78ef839b91..41869bc4c959 100644 --- a/doc/guides/sample_app_ug/img/ptpclient.svg +++ b/doc/guides/sample_app_ug/img/ptpclient.svg @@ -488,7 +488,7 @@ sodipodi:role="line" id="tspan7096" x="38.764343" - y="590.47479">master + y="590.47479">timeTransmitter slave + y="593.71478">timeReceiver `: The PTP client is another minimal implementation of a real world application. In this case the application is a PTP client that communicates with a PTP - master clock to synchronize time on a Network Interface Card (NIC) using the - IEEE1588 protocol. + timeTransmitter to synchronize time on a Network Interface Card (NIC) + using the IEEE1588 protocol. * :doc:`Quality of Service (QoS) Scheduler`: The QoS Scheduler application demonstrates the use of DPDK to provide QoS scheduling. diff --git a/doc/guides/sample_app_ug/ptpclient.rst b/doc/guides/sample_app_ug/ptpclient.rst index d47e942738d0..242c9628eaff 100644 --- a/doc/guides/sample_app_ug/ptpclient.rst +++ b/doc/guides/sample_app_ug/ptpclient.rst @@ -5,8 +5,9 @@ PTP Client Sample Application ============================= The PTP (Precision Time Protocol) client sample application is a simple -example of using the DPDK IEEE1588 API to communicate with a PTP master clock -to synchronize the time on the NIC and, optionally, on the Linux system. +example of using the DPDK IEEE1588 API to communicate with a PTP +timeTransmitter to synchronize the time on the NIC and, optionally, +on the Linux system. Note, PTP is a time syncing protocol and cannot be used within DPDK as a time-stamping mechanism. See the following for an explanation of the protocol: @@ -21,10 +22,10 @@ The PTP sample application is intended as a simple reference implementation of a PTP client using the DPDK IEEE1588 API. In order to keep the application simple the following assumptions are made: -* The first discovered master is the main for the session. +* The first discovered timeTransmitter is the main for the session. * Only L2 PTP packets are supported. * Only the PTP v2 protocol is supported. -* Only the slave clock is implemented. +* Only the timeReceiver clock is implemented. How the Application Works @@ -38,12 +39,12 @@ How the Application Works The PTP synchronization in the sample application works as follows: -* Master sends *Sync* message - the slave saves it as T2. -* Master sends *Follow Up* message and sends time of T1. -* Slave sends *Delay Request* frame to PTP Master and stores T3. -* Master sends *Delay Response* T4 time which is time of received T3. +* TimeTransmitter sends *Sync* message - the TimeReceiver saves it as T2. +* TimeTransmitter sends *Follow Up* message and sends time of T1. +* TimeReceiver sends *Delay Request* frame to PTP TimeTransmitter and stores T3. +* TimeTransmitter sends *Delay Response* T4 time which is time of received T3. -The adjustment for slave can be represented as: +The adjustment for timeReceiver can be represented as: adj = -[(T2-T1)-(T4 - T3)]/2 @@ -71,8 +72,8 @@ Refer to *DPDK Getting Started Guide* for general information on running applications and the Environment Abstraction Layer (EAL) options. * ``-p portmask``: Hexadecimal portmask. -* ``-T 0``: Update only the PTP slave clock. -* ``-T 1``: Update the PTP slave clock and synchronize the Linux Kernel to the PTP clock. +* ``-T 0``: Update only the PTP timeReceiver clock. +* ``-T 1``: Update the PTP timeReceiver clock and synchronize the Linux Kernel to the PTP clock. Code Explanation @@ -178,7 +179,7 @@ The forwarding loop can be interrupted and the application closed using PTP parsing ~~~~~~~~~~~ -The ``parse_ptp_frames()`` function processes PTP packets, implementing slave +The ``parse_ptp_frames()`` function processes PTP packets, implementing timeReceiver PTP IEEE1588 L2 functionality. .. literalinclude:: ../../../examples/ptpclient/ptpclient.c @@ -187,11 +188,11 @@ PTP IEEE1588 L2 functionality. :end-before: >8 End of function processes PTP packets. There are 3 types of packets on the RX path which we must parse to create a minimal -implementation of the PTP slave client: +implementation of the PTP timeReceiver client: * SYNC packet. * FOLLOW UP packet * DELAY RESPONSE packet. When we parse the *FOLLOW UP* packet we also create and send a *DELAY_REQUEST* packet. -Also when we parse the *DELAY RESPONSE* packet, and all conditions are met we adjust the PTP slave clock. +Also when we parse the *DELAY RESPONSE* packet, and all conditions are met we adjust the PTP timeReceiver clock. diff --git a/examples/ptpclient/ptpclient.c b/examples/ptpclient/ptpclient.c index 2535d848a1e9..7ba7a3cb02c0 100644 --- a/examples/ptpclient/ptpclient.c +++ b/examples/ptpclient/ptpclient.c @@ -116,14 +116,14 @@ struct ptp_message { } __rte_packed; }; -struct ptpv2_data_slave_ordinary { +struct ptpv2_timeReceiver_ordinary { struct rte_mbuf *m; struct timespec tstamp1; struct timespec tstamp2; struct timespec tstamp3; struct timespec tstamp4; struct clock_id client_clock_id; - struct clock_id master_clock_id; + struct clock_id transmitter_clock_id; struct timeval new_adj; int64_t delta; uint16_t portid; @@ -134,7 +134,7 @@ struct ptpv2_data_slave_ordinary { uint16_t current_ptp_port; }; -static struct ptpv2_data_slave_ordinary ptp_data; +static struct ptpv2_timeReceiver_ordinary ptp_data; static inline uint64_t timespec64_to_ns(const struct timespec *ts) { @@ -263,38 +263,38 @@ port_init(uint16_t port, struct rte_mempool *mbuf_pool) } static void -print_clock_info(struct ptpv2_data_slave_ordinary *ptp_data) +print_clock_info(struct ptpv2_timeReceiver_ordinary *ptp_data) { int64_t nsec; struct timespec net_time, sys_time; - printf("Master Clock id: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", - ptp_data->master_clock_id.id[0], - ptp_data->master_clock_id.id[1], - ptp_data->master_clock_id.id[2], - ptp_data->master_clock_id.id[3], - ptp_data->master_clock_id.id[4], - ptp_data->master_clock_id.id[5], - ptp_data->master_clock_id.id[6], - ptp_data->master_clock_id.id[7]); - - printf("\nT2 - Slave Clock. %lds %ldns", + printf("TimeTransmitter Clock id: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x", + ptp_data->transmitter_clock_id.id[0], + ptp_data->transmitter_clock_id.id[1], + ptp_data->transmitter_clock_id.id[2], + ptp_data->transmitter_clock_id.id[3], + ptp_data->transmitter_clock_id.id[4], + ptp_data->transmitter_clock_id.id[5], + ptp_data->transmitter_clock_id.id[6], + ptp_data->transmitter_clock_id.id[7]); + + printf("\nT2 - TimeReceiver Clock. %lds %ldns", (ptp_data->tstamp2.tv_sec), (ptp_data->tstamp2.tv_nsec)); - printf("\nT1 - Master Clock. %lds %ldns ", + printf("\nT1 - TimeTransmitter Clock. %lds %ldns ", ptp_data->tstamp1.tv_sec, (ptp_data->tstamp1.tv_nsec)); - printf("\nT3 - Slave Clock. %lds %ldns", + printf("\nT3 - TimeReceiver Clock. %lds %ldns", ptp_data->tstamp3.tv_sec, (ptp_data->tstamp3.tv_nsec)); - printf("\nT4 - Master Clock. %lds %ldns ", + printf("\nT4 - TimeTransmitter Clock. %lds %ldns ", ptp_data->tstamp4.tv_sec, (ptp_data->tstamp4.tv_nsec)); - printf("\nDelta between master and slave clocks:%"PRId64"ns\n", + printf("\nDelta between timeTransmitter and timeReceiver clocks:%"PRId64"ns\n", ptp_data->delta); clock_gettime(CLOCK_REALTIME, &sys_time); @@ -328,7 +328,7 @@ print_clock_info(struct ptpv2_data_slave_ordinary *ptp_data) } static int64_t -delta_eval(struct ptpv2_data_slave_ordinary *ptp_data) +delta_eval(struct ptpv2_timeReceiver_ordinary *ptp_data) { int64_t delta; uint64_t t1 = 0; @@ -350,7 +350,7 @@ delta_eval(struct ptpv2_data_slave_ordinary *ptp_data) * Parse the PTP SYNC message. */ static void -parse_sync(struct ptpv2_data_slave_ordinary *ptp_data, uint16_t rx_tstamp_idx) +parse_sync(struct ptpv2_timeReceiver_ordinary *ptp_data, uint16_t rx_tstamp_idx) { struct ptp_header *ptp_hdr; @@ -359,7 +359,7 @@ parse_sync(struct ptpv2_data_slave_ordinary *ptp_data, uint16_t rx_tstamp_idx) ptp_data->seqID_SYNC = rte_be_to_cpu_16(ptp_hdr->seq_id); if (ptp_data->ptpset == 0) { - rte_memcpy(&ptp_data->master_clock_id, + rte_memcpy(&ptp_data->transmitter_clock_id, &ptp_hdr->source_port_id.clock_id, sizeof(struct clock_id)); ptp_data->ptpset = 1; @@ -380,7 +380,7 @@ parse_sync(struct ptpv2_data_slave_ordinary *ptp_data, uint16_t rx_tstamp_idx) * Parse the PTP FOLLOWUP message and send DELAY_REQ to the main clock. */ static void -parse_fup(struct ptpv2_data_slave_ordinary *ptp_data) +parse_fup(struct ptpv2_timeReceiver_ordinary *ptp_data) { struct rte_ether_hdr *eth_hdr; struct rte_ether_addr eth_addr; @@ -399,7 +399,7 @@ parse_fup(struct ptpv2_data_slave_ordinary *ptp_data) eth_hdr = rte_pktmbuf_mtod(m, struct rte_ether_hdr *); ptp_hdr = rte_pktmbuf_mtod_offset(m, struct ptp_header *, sizeof(struct rte_ether_hdr)); - if (memcmp(&ptp_data->master_clock_id, + if (memcmp(&ptp_data->transmitter_clock_id, &ptp_hdr->source_port_id.clock_id, sizeof(struct clock_id)) != 0) return; @@ -530,7 +530,7 @@ update_kernel_time(void) * Parse the DELAY_RESP message. */ static void -parse_drsp(struct ptpv2_data_slave_ordinary *ptp_data) +parse_drsp(struct ptpv2_timeReceiver_ordinary *ptp_data) { struct rte_mbuf *m = ptp_data->m; struct ptp_message *ptp_msg; @@ -568,7 +568,7 @@ parse_drsp(struct ptpv2_data_slave_ordinary *ptp_data) } } -/* This function processes PTP packets, implementing slave PTP IEEE1588 L2 +/* This function processes PTP packets, implementing timeReceiver PTP IEEE1588 L2 * functionality. */ @@ -753,7 +753,7 @@ main(int argc, char *argv[]) rte_exit(EXIT_FAILURE, "Error with EAL initialization\n"); /* >8 End of initialization of EAL. */ - memset(&ptp_data, '\0', sizeof(struct ptpv2_data_slave_ordinary)); + memset(&ptp_data, 0, sizeof(struct ptpv2_timeReceiver_ordinary)); /* Parse specific arguments. 8< */ argc -= ret;