From patchwork Thu Aug 29 20:49:22 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadim Fedorenko X-Patchwork-Id: 13783866 X-Patchwork-Delegate: kuba@kernel.org Received: from mx0a-00082601.pphosted.com (mx0b-00082601.pphosted.com [67.231.153.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C106C18A92B for ; Thu, 29 Aug 2024 20:49:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=67.231.153.30 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724964588; cv=none; b=AnqAuBfpI9BK8Je7rbXc8WVkQPTqyWeX4SmV1A+l6ZjPF5ZPaMiKEChKc9nz5sMCbsIfIR/9WMPfuUsg0faxj0tp1BZlKq5lliKmTILaWaNX1ZaEn4SGIrZcCpIpdqiRmPW/nad2ynfuyUXE2zcgICMacOkSLcNrkGUNTLKS8eU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1724964588; c=relaxed/simple; bh=e/QBwlg4bd3jXNofdvd0gk6DuucCiYF4CgzYuOY9uk4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XeoatnrGPuVBW6BWfMBKb2ixFmiJPD1wlbOLbg5ds+kmNFN1x+TtHXr5arpr+Swx8HZ02iMtCBsy6ylgImS4Hf+oWlT8xNZbeRzRNifOLxaYwSzMAitC0Y22WflEXzRRLpTMhrdT2EznSHdbVBjL89n1u5+LwCNzXcNai7OCoWA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=meta.com; spf=pass smtp.mailfrom=meta.com; dkim=pass (2048-bit key) header.d=meta.com header.i=@meta.com header.b=AqXZ3HrE; arc=none smtp.client-ip=67.231.153.30 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=meta.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=meta.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=meta.com header.i=@meta.com header.b="AqXZ3HrE" Received: from pps.filterd (m0001303.ppops.net [127.0.0.1]) by m0001303.ppops.net (8.18.1.2/8.18.1.2) with ESMTP id 47TJOnG0006749; Thu, 29 Aug 2024 13:49:36 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=meta.com; h=from :to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding:content-type; s= s2048-2021-q4; bh=8ZgV0ouObOTgPUGVXOafkmiJ9bimlunCYI+l9w4Fzic=; b= AqXZ3HrEwfOi4xLWLNRyE6rP/TeIQTPMLwG0f9P9sqSj5KcZdPwRV2zwcLpxw7LN I/om22dgrz6cqW6mbFq2aiQCfvNdOrzDRl4cpTzhUejM6KpHgNEcge04eZ40+GB8 zVXzXxn+O9RgVkXXqJEAdA6xuDPp+tCqshmLdbay2hcrhbyOJlh2yI34vTil0H4v iMUYxYHWbrCXkR8hsA71y5U4Sz1NUihQrRxzDPJr9FCNknCmUOoT+/v4d/hXszZ6 gSwYx+ljTuf+vzt+czrDJXdip+M8RwIraKgw3Fcb8gZZ0BQKvKsQo/JeL/7oChjv zSduWeuTev9iXn32V2npYA== Received: from maileast.thefacebook.com ([163.114.130.16]) by m0001303.ppops.net (PPS) with ESMTPS id 41axcg0xde-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Thu, 29 Aug 2024 13:49:36 -0700 (PDT) Received: from devvm4158.cln0.facebook.com (2620:10d:c0a8:1b::2d) by mail.thefacebook.com (2620:10d:c0a9:6f::237c) with Microsoft SMTP Server id 15.2.1544.11; Thu, 29 Aug 2024 20:49:35 +0000 From: Vadim Fedorenko To: Vadim Fedorenko , Willem de Bruijn , Jakub Kicinski , Paolo Abeni , David Ahern CC: Vadim Fedorenko , Subject: [PATCH net-next 2/2] selftests: txtimestamp: add SCM_TS_OPT_ID test Date: Thu, 29 Aug 2024 13:49:22 -0700 Message-ID: <20240829204922.1674865-2-vadfed@meta.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20240829204922.1674865-1-vadfed@meta.com> References: <20240829204922.1674865-1-vadfed@meta.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Proofpoint-GUID: sIccqrKzSE8-NElMoSBeeP7vf8yEamKO X-Proofpoint-ORIG-GUID: sIccqrKzSE8-NElMoSBeeP7vf8yEamKO X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1039,Hydra:6.0.680,FMLib:17.12.28.16 definitions=2024-08-29_06,2024-08-29_02,2024-05-17_01 X-Patchwork-Delegate: kuba@kernel.org Extend txtimestamp udp test to run with fixed tskey using SCM_TS_OPT_ID control message. Signed-off-by: Vadim Fedorenko Reviewed-by: Willem de Bruijn --- tools/include/uapi/asm-generic/socket.h | 2 + tools/testing/selftests/net/txtimestamp.c | 48 +++++++++++++++++----- tools/testing/selftests/net/txtimestamp.sh | 1 + 3 files changed, 41 insertions(+), 10 deletions(-) diff --git a/tools/include/uapi/asm-generic/socket.h b/tools/include/uapi/asm-generic/socket.h index 54d9c8bf7c55..281df9139d2b 100644 --- a/tools/include/uapi/asm-generic/socket.h +++ b/tools/include/uapi/asm-generic/socket.h @@ -124,6 +124,8 @@ #define SO_PASSPIDFD 76 #define SO_PEERPIDFD 77 +#define SCM_TS_OPT_ID 78 + #if !defined(__KERNEL__) #if __BITS_PER_LONG == 64 || (defined(__x86_64__) && defined(__ILP32__)) diff --git a/tools/testing/selftests/net/txtimestamp.c b/tools/testing/selftests/net/txtimestamp.c index ec60a16c9307..3a8f716e72ae 100644 --- a/tools/testing/selftests/net/txtimestamp.c +++ b/tools/testing/selftests/net/txtimestamp.c @@ -54,6 +54,10 @@ #define USEC_PER_SEC 1000000L #define NSEC_PER_SEC 1000000000LL +#ifndef SCM_TS_OPT_ID +# define SCM_TS_OPT_ID 78 +#endif + /* command line parameters */ static int cfg_proto = SOCK_STREAM; static int cfg_ipproto = IPPROTO_TCP; @@ -77,6 +81,8 @@ static bool cfg_epollet; static bool cfg_do_listen; static uint16_t dest_port = 9000; static bool cfg_print_nsec; +static uint32_t ts_opt_id; +static bool cfg_use_cmsg_opt_id; static struct sockaddr_in daddr; static struct sockaddr_in6 daddr6; @@ -136,12 +142,13 @@ static void validate_key(int tskey, int tstype) /* compare key for each subsequent request * must only test for one type, the first one requested */ - if (saved_tskey == -1) + if (saved_tskey == -1 || cfg_use_cmsg_opt_id) saved_tskey_type = tstype; else if (saved_tskey_type != tstype) return; stepsize = cfg_proto == SOCK_STREAM ? cfg_payload_len : 1; + stepsize = cfg_use_cmsg_opt_id ? 0 : stepsize; if (tskey != saved_tskey + stepsize) { fprintf(stderr, "ERROR: key %d, expected %d\n", tskey, saved_tskey + stepsize); @@ -480,7 +487,7 @@ static void fill_header_udp(void *p, bool is_ipv4) static void do_test(int family, unsigned int report_opt) { - char control[CMSG_SPACE(sizeof(uint32_t))]; + char control[2 * CMSG_SPACE(sizeof(uint32_t))]; struct sockaddr_ll laddr; unsigned int sock_opt; struct cmsghdr *cmsg; @@ -620,18 +627,32 @@ static void do_test(int family, unsigned int report_opt) msg.msg_iov = &iov; msg.msg_iovlen = 1; - if (cfg_use_cmsg) { + if (cfg_use_cmsg || cfg_use_cmsg_opt_id) { memset(control, 0, sizeof(control)); msg.msg_control = control; - msg.msg_controllen = sizeof(control); + msg.msg_controllen = cfg_use_cmsg * CMSG_SPACE(sizeof(uint32_t)); + msg.msg_controllen += cfg_use_cmsg_opt_id * CMSG_SPACE(sizeof(uint32_t)); - cmsg = CMSG_FIRSTHDR(&msg); - cmsg->cmsg_level = SOL_SOCKET; - cmsg->cmsg_type = SO_TIMESTAMPING; - cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); + cmsg = NULL; + if (cfg_use_cmsg) { + cmsg = CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SO_TIMESTAMPING; + cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); + + *((uint32_t *)CMSG_DATA(cmsg)) = report_opt; + } + if (cfg_use_cmsg_opt_id) { + cmsg = cmsg ? CMSG_NXTHDR(&msg, cmsg) : CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_TS_OPT_ID; + cmsg->cmsg_len = CMSG_LEN(sizeof(uint32_t)); + + *((uint32_t *)CMSG_DATA(cmsg)) = ts_opt_id; + saved_tskey = ts_opt_id; + } - *((uint32_t *) CMSG_DATA(cmsg)) = report_opt; } val = sendmsg(fd, &msg, 0); @@ -681,6 +702,7 @@ static void __attribute__((noreturn)) usage(const char *filepath) " -L listen on hostname and port\n" " -n: set no-payload option\n" " -N: print timestamps and durations in nsec (instead of usec)\n" + " -o N: use SCM_TS_OPT_ID control message to provide N as tskey\n" " -p N: connect to port N\n" " -P: use PF_PACKET\n" " -r: use raw\n" @@ -701,7 +723,7 @@ static void parse_opt(int argc, char **argv) int c; while ((c = getopt(argc, argv, - "46bc:CeEFhIl:LnNp:PrRS:t:uv:V:x")) != -1) { + "46bc:CeEFhIl:LnNo:p:PrRS:t:uv:V:x")) != -1) { switch (c) { case '4': do_ipv6 = 0; @@ -742,6 +764,10 @@ static void parse_opt(int argc, char **argv) case 'N': cfg_print_nsec = true; break; + case 'o': + ts_opt_id = strtoul(optarg, NULL, 10); + cfg_use_cmsg_opt_id = true; + break; case 'p': dest_port = strtoul(optarg, NULL, 10); break; @@ -799,6 +825,8 @@ static void parse_opt(int argc, char **argv) error(1, 0, "cannot ask for pktinfo over pf_packet"); if (cfg_busy_poll && cfg_use_epoll) error(1, 0, "pass epoll or busy_poll, not both"); + if (cfg_proto != SOCK_DGRAM && cfg_use_cmsg_opt_id) + error(1, 0, "control message TS_OPT_ID can only be used with udp socket"); if (optind != argc - 1) error(1, 0, "missing required hostname argument"); diff --git a/tools/testing/selftests/net/txtimestamp.sh b/tools/testing/selftests/net/txtimestamp.sh index 25baca4b148e..7894628a9355 100755 --- a/tools/testing/selftests/net/txtimestamp.sh +++ b/tools/testing/selftests/net/txtimestamp.sh @@ -39,6 +39,7 @@ run_test_tcpudpraw() { run_test_v4v6 ${args} # tcp run_test_v4v6 ${args} -u # udp + run_test_v4v6 ${args} -u -o 5 # udp with fixed tskey run_test_v4v6 ${args} -r # raw run_test_v4v6 ${args} -R # raw (IPPROTO_RAW) run_test_v4v6 ${args} -P # pf_packet