Received: by 2002:a05:6358:16cc:b0:ea:6187:17c9 with SMTP id r12csp7545892rwl; Tue, 10 Jan 2023 02:09:40 -0800 (PST) X-Google-Smtp-Source: AMrXdXuO9It8X4RbMukkjz2W3kuVxvtk4J80aDSElkoUB5ikZJUAJ1Ycw6plNlpOlWgHWh3QiFPz X-Received: by 2002:a17:902:e84c:b0:189:340c:20d2 with SMTP id t12-20020a170902e84c00b00189340c20d2mr103958842plg.23.1673345379855; Tue, 10 Jan 2023 02:09:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673345379; cv=none; d=google.com; s=arc-20160816; b=bWMtP0u4EJcAQuHlFf9iI8k9U85Co35tLBcv1vzceb7Z5+JxjYVMMnDs285GODEzHz 6B7yfvC0jGh+mLXuHC22etIUQRFAesMUera2tXqxKr1fyVVqno4vPcUGuyYgbI2J3Q82 nOG7NzV/gMKM8xQsxbyI4p+qQKbYPEBi9idKwIS5l/slASVsoNcaAt+5ccVYbGFAiBff EAflVPhz3ldmg8mRyzsH364LOFDCxUtygBeeMyKnRR7O9zwLa/p/P6ZOK1IZKwXwToEw uhpsY+vfKolIH9ps6CHnnU1BSX5BS0WX+S49g1VEDND5EF0Rkimf76d52je5u30JZwz7 5Q8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=JN9UQLJEk2XfT9b4HEUfTJ5oyBF4uZGDuTBIpEG8oeY=; b=RlxU8GkX2gctfB13KxJzDGIdQdVhiolutPzHZuN/f5mbGdy6ZDvliehcPCcTJO+QOa ESS3cGUbo5iCPidkKs4WdOVw2yfNN214nE301Jh6I4VyBMzrnrttUqdDn7NNHe5FVr5A NiOwMFNLrW2gLxWc0DRyCHyov7dX7ztZ809ww517QD6KUdu4bfaM9uR+x1AGdxPSScWD Infgik6RL5UiLENzTzidZW106TdXaa1LlOsRLBokRVLbGiDDBdUjY+u8Xlsrp3ctgF+Q XjZbiGqiyQDpwFFT8qz7/ZzroLChKbhlQLoNMR99pOgh/GtNDUSMgw7cqJRNIODjBMVh 0f/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@microchip.com header.s=mchp header.b=ZtYUBBz5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a18-20020a170902ecd200b0019260195003si12012435plh.599.2023.01.10.02.09.33; Tue, 10 Jan 2023 02:09:39 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@microchip.com header.s=mchp header.b=ZtYUBBz5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S238093AbjAJIwN (ORCPT + 53 others); Tue, 10 Jan 2023 03:52:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41016 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231796AbjAJIvI (ORCPT ); Tue, 10 Jan 2023 03:51:08 -0500 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.154.123]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 13AC7FD0; Tue, 10 Jan 2023 00:50:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1673340661; x=1704876661; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=FX01/D1Tov3qWyghtw5i8Ql6La+p7fA5lBkR/C2Q5fU=; b=ZtYUBBz5c+L6RoRJHyP2ko6/wQZpdJXMa6J5FW4EVkymUL9OcDgdHgjK 1g7H9rm25SfCAhKH369G4+JbGURYD9Iavu9NOeggnJhDxttNKyJgtZGV3 yu8NV3zBfDUSQgWGRAya7I33p0dykqPKsE9V2Cx0Y265zeZV0C3v+Ydpk +czyELKHy4tEtTkPPrqAYnNpsVUreAiZf7iujQz4aEw8O/8cHIVVFOgcV 97t6KA3HnwAd2Eoo0dQvWYKztdx7EybXY7La76w+vomlItHPtlFfvS2mm alFTEuRnVlXHS+5e4KfZTuelXA2+Ga64PDMCBR1v1GekkvHIwlEpsWu+H Q==; X-IronPort-AV: E=Sophos;i="5.96,314,1665471600"; d="scan'208";a="131614474" Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa6.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 10 Jan 2023 01:50:55 -0700 Received: from chn-vm-ex02.mchp-main.com (10.10.85.144) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.16; Tue, 10 Jan 2023 01:50:54 -0700 Received: from CHE-LT-I17769U.microchip.com (10.10.115.15) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server id 15.1.2507.16 via Frontend Transport; Tue, 10 Jan 2023 01:50:47 -0700 From: Arun Ramadoss To: , CC: , , , , , , , , , , , , , Subject: [Patch net-next v8 06/13] net: ptp: add helper for one-step P2P clocks Date: Tue, 10 Jan 2023 14:19:23 +0530 Message-ID: <20230110084930.16049-7-arun.ramadoss@microchip.com> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20230110084930.16049-1-arun.ramadoss@microchip.com> References: <20230110084930.16049-1-arun.ramadoss@microchip.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Christian Eggers For P2P delay measurement, the ingress time stamp of the PDelay_Req is required for the correction field of the PDelay_Resp. The application echoes back the correction field of the PDelay_Req when sending the PDelay_Resp. Some hardware (like the ZHAW InES PTP time stamping IP core) subtracts the ingress timestamp autonomously from the correction field, so that the hardware only needs to add the egress timestamp on tx. Other hardware (like the Microchip KSZ9563) reports the ingress time stamp via an interrupt and requires that the software provides this time stamp via tail-tag on tx. In order to avoid introducing a further application interface for this, the driver can simply emulate the behavior of the InES device and subtract the ingress time stamp in software from the correction field. On egress, the correction field can either be kept as it is (and the time stamp field in the tail-tag is set to zero) or move the value from the correction field back to the tail-tag. Changing the correction field requires updating the UDP checksum (if UDP is used as transport). Signed-off-by: Christian Eggers Co-developed-by: Arun Ramadoss Signed-off-by: Arun Ramadoss --- v7 -> v8 - set skb->ip_summed = CHECKSUM_NONE v1 -> v2 - Fixed compilation issue when PTP_CLASSIFY not selected in menuconfig as reported by kernel test robot --- include/linux/ptp_classify.h | 73 ++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/include/linux/ptp_classify.h b/include/linux/ptp_classify.h index 2b6ea36ad162..1b5a953c6bbc 100644 --- a/include/linux/ptp_classify.h +++ b/include/linux/ptp_classify.h @@ -10,8 +10,12 @@ #ifndef _PTP_CLASSIFY_H_ #define _PTP_CLASSIFY_H_ +#include #include +#include #include +#include +#include #define PTP_CLASS_NONE 0x00 /* not a PTP event message */ #define PTP_CLASS_V1 0x01 /* protocol version 1 */ @@ -129,6 +133,69 @@ static inline u8 ptp_get_msgtype(const struct ptp_header *hdr, return msgtype; } +/** + * ptp_check_diff8 - Computes new checksum (when altering a 64-bit field) + * @old: old field value + * @new: new field value + * @oldsum: previous checksum + * + * This function can be used to calculate a new checksum when only a single + * field is changed. Similar as ip_vs_check_diff*() in ip_vs.h. + * + * Return: Updated checksum + */ +static inline __wsum ptp_check_diff8(__be64 old, __be64 new, __wsum oldsum) +{ + __be64 diff[2] = { ~old, new }; + + return csum_partial(diff, sizeof(diff), oldsum); +} + +/** + * ptp_header_update_correction - Update PTP header's correction field + * @skb: packet buffer + * @type: type of the packet (see ptp_classify_raw()) + * @hdr: ptp header + * @correction: new correction value + * + * This updates the correction field of a PTP header and updates the UDP + * checksum (if UDP is used as transport). It is needed for hardware capable of + * one-step P2P that does not already modify the correction field of Pdelay_Req + * event messages on ingress. + */ +static inline +void ptp_header_update_correction(struct sk_buff *skb, unsigned int type, + struct ptp_header *hdr, s64 correction) +{ + __be64 correction_old; + struct udphdr *uhdr; + + /* previous correction value is required for checksum update. */ + memcpy(&correction_old, &hdr->correction, sizeof(correction_old)); + + /* write new correction value */ + put_unaligned_be64((u64)correction, &hdr->correction); + + switch (type & PTP_CLASS_PMASK) { + case PTP_CLASS_IPV4: + case PTP_CLASS_IPV6: + /* locate udp header */ + uhdr = (struct udphdr *)((char *)hdr - sizeof(struct udphdr)); + break; + default: + return; + } + + /* update checksum */ + uhdr->check = csum_fold(ptp_check_diff8(correction_old, + hdr->correction, + ~csum_unfold(uhdr->check))); + if (!uhdr->check) + uhdr->check = CSUM_MANGLED_0; + + skb->ip_summed = CHECKSUM_NONE; +} + /** * ptp_msg_is_sync - Evaluates whether the given skb is a PTP Sync message * @skb: packet buffer @@ -166,5 +233,11 @@ static inline bool ptp_msg_is_sync(struct sk_buff *skb, unsigned int type) { return false; } + +static inline +void ptp_header_update_correction(struct sk_buff *skb, unsigned int type, + struct ptp_header *hdr, s64 correction) +{ +} #endif #endif /* _PTP_CLASSIFY_H_ */ -- 2.36.1