From patchwork Mon Jul 19 16:38:43 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 44404 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B43393847833 for ; Mon, 19 Jul 2021 16:39:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B43393847833 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1626712797; bh=Gzs8vCCsSfJwp9PTbCcE0NwNLqfhxvd3JnxG1eG4Jes=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=o9xT8IVcZGg3HGk7XDoh3FKB6mq3FcG/cojMR6LE+ympXOU6b/lXkb1LSWFH9s6c6 UNTfQHlT3h0HZ+Ep24zmY4wb3Kj29eckP0kvA6nNjHy6s4362wclUJF4UxDUsCy3oJ Ru9k/CTBGeRFdb7xoVgAfs+j3+B/8M3/wll7T1+Y= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [IPv6:2607:f8b0:4864:20::431]) by sourceware.org (Postfix) with ESMTPS id 81C3E3848406 for ; Mon, 19 Jul 2021 16:38:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 81C3E3848406 Received: by mail-pf1-x431.google.com with SMTP id j199so16951693pfd.7 for ; Mon, 19 Jul 2021 09:38:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Gzs8vCCsSfJwp9PTbCcE0NwNLqfhxvd3JnxG1eG4Jes=; b=KIk+1QQEJDjcMtz9mTcH9imYwGceQwaK1Gf8NX5lfs4d33nD2i0nP76fqpOXHMMt5x FMzVaUuYJaS4bzR1+IyUlaK3w4Ck1g2bi699M0InIgmkvf0XVdVCzqtut0Zw+AZxbZDb OhVCvEcd/g894zY/bdBd/od6v8HAoshrUls2JkccBQqxrSHFvaZ1RUGzzSXUH2gsjjEX P5zCzwwQzCcUGpyusA//jlqe5FXR0HBng7MDhBKSui4YY/z28QRoyZH8fFwDDM7+0hS7 ObevdbZyjBY/yj1Zy3ZOGrSNEgdog8xiIWDVL1kDY/LYnxaO/8Wtz5yl7pKab0TaCDPE LjIA== X-Gm-Message-State: AOAM531kYW1CAr35yRDIgo0TbRlhpA9rvZqsCBEurBNlVB8zlUUYjc6y v75nr9jgf1FWfHPeyf+3ft0Od94Y/XYcCg== X-Google-Smtp-Source: ABdhPJw+KD3/qSNxBxSUuF+0rSBxDIItwwAxUbAJHBU1QvcjhiTyFT/Ru3A+hN4+6T2ddy1KNgdJUQ== X-Received: by 2002:a63:1621:: with SMTP id w33mr1091839pgl.291.1626712731501; Mon, 19 Jul 2021 09:38:51 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:1133:c8a4:b05d:5ba9:3665]) by smtp.gmail.com with ESMTPSA id l2sm20074055pfc.157.2021.07.19.09.38.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jul 2021 09:38:51 -0700 (PDT) To: libc-alpha@sourceware.org, Carlos O'Donell Subject: [PATCH 1/4] io: Do not skip timestamps tests for 32-bit time_t Date: Mon, 19 Jul 2021 13:38:43 -0300 Message-Id: <20210719163846.2954193-2-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> References: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The first test in the set do not require 64-bit time_t support, so there is no need to return UNSUPPORTED for the whole test. The patch also adds another test with arbitrary date prior y2038. Checked on x86_64-linux-gnu and i686-linux-gnu. --- io/tst-utimensat-skeleton.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/io/tst-utimensat-skeleton.c b/io/tst-utimensat-skeleton.c index ad9f6763c5..2b956f1661 100644 --- a/io/tst-utimensat-skeleton.c +++ b/io/tst-utimensat-skeleton.c @@ -30,6 +30,8 @@ const static struct { int64_t v1; int64_t v2; } tests[] = { + /* Some arbitrary date before Y2038. */ + { 0x60ECA720LL, 0x60eca721LL }, /* Y2038 threshold minus 2 and 1 seconds. */ { 0x7FFFFFFELL, 0x7FFFFFFFLL }, /* Y2038 threshold plus 1 and 2 seconds. */ @@ -59,7 +61,7 @@ do_prepare (int argc, char *argv[]) static int do_test (void) { - if (!support_path_support_time64 (testfile)) + if (sizeof (time_t) == 8 && !support_path_support_time64 (testfile)) FAIL_UNSUPPORTED ("File %s does not support 64-bit timestamps", testfile); From patchwork Mon Jul 19 16:38:44 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 44405 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1AED3395B030 for ; Mon, 19 Jul 2021 16:40:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1AED3395B030 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1626712842; bh=Q31k362FMo+DsLJOdCEFrEZdZfUuzcJgr1gmwlPt70o=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=HcWOYXAzauRMowkw3F5gsOVq7lxacX0EFu22uDIndLev0GHnIBPnZWmd/92+GmFrs irko7/LYBEkZB1nYPr/lrUPRH6HbqSq4QukcjBafD0bkbJQ9Z5Q+LKamifO1VXo3r2 8Ej8yT78EyZpI3o0xtKbkCn7CaqKzV9ZOa5HNItM= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by sourceware.org (Postfix) with ESMTPS id E80E93848406 for ; Mon, 19 Jul 2021 16:38:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E80E93848406 Received: by mail-pg1-x529.google.com with SMTP id 37so19617967pgq.0 for ; Mon, 19 Jul 2021 09:38:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Q31k362FMo+DsLJOdCEFrEZdZfUuzcJgr1gmwlPt70o=; b=DxggeXSK6KLzp4+BhTuyVvRKI9hskkX36shHZgUyPKjoZ2KiRQu2TREjxIJMhNb/X0 qk8akyAK42iKC+SrKsu/+riZfuRZZA+5lOugipqYTe35LFooQnoyJa2tFr6jIQacUlvn FssQXW1w5X9/UVHVg69o9duq8iMsMXtil+lbkguJPi6jPwNmG5IVjB1DKWiUUa6OKQGG odjTMdz1kXWnxw+OXHf4hzbgyQRh9MGX3tVQsUPFn4t7cE1xNO3o7JDzIKfoYtKAJb8W Hm+S8nj+MlRSz62mjzgkfGmOx3rRY8+CW54+nGtcEdRA1KJruwZ8DVFbalJ2UeVZ7F8K fDrw== X-Gm-Message-State: AOAM531iEDlMFiJ0eF6z+z+LOclUApiNGhwZ9tEIM//QhZp1eOV1C7Fb w1rFlskaqWjE0lmMWeU2EuPMUJTi60UwNw== X-Google-Smtp-Source: ABdhPJy4/1f5aSJU6zWKGyi+CNO8PCYMKrRsYnQGZ6gGWqhqPp2Clf/bzMZX3Yd38X6lofvDFMGQ+A== X-Received: by 2002:a63:5117:: with SMTP id f23mr25987193pgb.200.1626712732962; Mon, 19 Jul 2021 09:38:52 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:1133:c8a4:b05d:5ba9:3665]) by smtp.gmail.com with ESMTPSA id l2sm20074055pfc.157.2021.07.19.09.38.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jul 2021 09:38:52 -0700 (PDT) To: libc-alpha@sourceware.org, Carlos O'Donell Subject: [PATCH 2/4] time: Ignore interval nanoseconds on tst-itimer Date: Mon, 19 Jul 2021 13:38:44 -0300 Message-Id: <20210719163846.2954193-3-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> References: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Running the test on a 4.4 kernel within KVM, the precision used on ITIMER_VIRTUAL and ITIMER_PROF seems to different than the one used for ITIMER_REAL (it seems the same used for CLOCK_REALTIME_COARSE and CLOCK_MONOTONIC_COARSE). I did not see it on other kernels, for instance 5.11 and 4.15. To avoid trying to guess the resolution used, do not check the nanosecond internal values for the specific timers. Checked on i686-linux-gnu with a 4.4 kernel. --- time/tst-itimer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/time/tst-itimer.c b/time/tst-itimer.c index 929c2b74c7..554caa75f2 100644 --- a/time/tst-itimer.c +++ b/time/tst-itimer.c @@ -74,6 +74,9 @@ do_test (void) { TEST_COMPARE (it_old.it_interval.tv_sec, 10); TEST_COMPARE (it_old.it_interval.tv_usec, 20); + /* Some systems might use a different precision for ITIMER_VIRTUAL + and ITIMER_iPROF and thus the value might be adjusted. To avoid + trying to guess the resolution, we do not check it. */ } /* Create a periodic timer and check if the return value is the one @@ -87,7 +90,8 @@ do_test (void) TEST_COMPARE (setitimer (timers[i], &(struct itimerval) { 0 }, &it_old), 0); TEST_COMPARE (it.it_interval.tv_sec, it_old.it_interval.tv_sec); - TEST_COMPARE (it.it_interval.tv_usec, it_old.it_interval.tv_usec); + if (timers[i] == ITIMER_REAL) + TEST_COMPARE (it.it_interval.tv_usec, it_old.it_interval.tv_usec); if (sizeof (time_t) == 4) continue; From patchwork Mon Jul 19 16:38:45 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 44406 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8E471395B45B for ; Mon, 19 Jul 2021 16:41:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8E471395B45B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1626712886; bh=vU5xXL7DWUL5u/TjrdH9q/IKKqVE1cHNzxJc/aSYIVw=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=We8UZqxhaeehV+4NqjbefLWJGhZ88A7LIK4vHm/v4LPk0K+5iPLytpM5pNIpVPx1/ 8mddBEGLtL0oyIf90dQmnTD1MufCZE5Djv74xiFIZwgHhJ/hsY945ohL60QVz23vqe u0Hu4S2V3qz5Jl+Yv9N7iGpwdVBAngbPPqgDKbqo= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pj1-x1034.google.com (mail-pj1-x1034.google.com [IPv6:2607:f8b0:4864:20::1034]) by sourceware.org (Postfix) with ESMTPS id 65BAE3847813 for ; Mon, 19 Jul 2021 16:38:55 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 65BAE3847813 Received: by mail-pj1-x1034.google.com with SMTP id x13-20020a17090a46cdb0290175cf22899cso353842pjg.2 for ; Mon, 19 Jul 2021 09:38:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=vU5xXL7DWUL5u/TjrdH9q/IKKqVE1cHNzxJc/aSYIVw=; b=NLRy8g3MdrnoCHQvu3rvAEUMjAwzBG3zWloo/Gz4id361PVN5XPEBEzd0CUnekn1Vh XAUG9O2Kk/T/L9ZRd986m2vEoBxTjUIRrVlz0ykdz7DlLQIjVdtEScEb7hEXJ3lnTmob J7h8YotNmxlXmwT2eNg7cFqIIKMxpSWZzoOD8sAGWwfYd3HxWkXUPghQOcqQysOPNP3e ATVD3Ym79vLlsBtjSBKWxF/oNdKfoRtEA4/M2OvJaChanySUPCK+u+/34UQZu8TuaUV4 wnJ0WZPskaqzOackbqWtM2QuN71lXdULC1gVBglDVZ9+28t4UB7YLy7NTN0IQoN8N0RH ovqg== X-Gm-Message-State: AOAM533RRmyzNIlg0ThPrJLvOmz2dSzl6eSdkj4MPkCoQN0hCLmbzv+a hYBS11iSrySZCVjAwPB/S/cSTFvk1XsbwQ== X-Google-Smtp-Source: ABdhPJw0UJvFGd9pvfZrlhkRujPhknQ2Nxm0ooNCWCHlvESm+h3K/0sBt1AP+ZIf/9w1yAKX2MwwKg== X-Received: by 2002:a17:90a:b284:: with SMTP id c4mr25827410pjr.213.1626712734348; Mon, 19 Jul 2021 09:38:54 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:1133:c8a4:b05d:5ba9:3665]) by smtp.gmail.com with ESMTPSA id l2sm20074055pfc.157.2021.07.19.09.38.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jul 2021 09:38:54 -0700 (PDT) To: libc-alpha@sourceware.org, Carlos O'Donell Subject: [PATCH 3/4] support: Add support_socket_time64_timestamp Date: Mon, 19 Jul 2021 13:38:45 -0300 Message-Id: <20210719163846.2954193-4-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> References: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Check if the socket support 64-bit network packages timestamps (SO_TIMESTAMP and SO_TIMESTAMPNS). This will be used on recvmsg and recvmmsg tests to check if the timestamp should be generated. --- support/Makefile | 1 + support/support.h | 3 ++ support/support_socket_time64_timestamp.c | 64 +++++++++++++++++++++++ 3 files changed, 68 insertions(+) create mode 100644 support/support_socket_time64_timestamp.c diff --git a/support/Makefile b/support/Makefile index a462781718..d684852373 100644 --- a/support/Makefile +++ b/support/Makefile @@ -77,6 +77,7 @@ libsupport-routines = \ support_set_small_thread_stack_size \ support_shared_allocate \ support_small_stack_thread_attribute \ + support_socket_time64_timestamp \ support_stat_nanoseconds \ support_subprocess \ support_test_compare_blob \ diff --git a/support/support.h b/support/support.h index dbd270c78d..6d7c75a3a9 100644 --- a/support/support.h +++ b/support/support.h @@ -154,6 +154,9 @@ extern bool support_select_modifies_timeout (void); tv_usec larger than 1000000. */ extern bool support_select_normalizes_timeout (void); +/* Return true if socket FD supports 64-bit timestamps. */ +extern bool support_socket_time64_timestamp (int fd); + /* Create a timer that trigger after SEC seconds and NSEC nanoseconds. If REPEAT is true the timer will repeat indefinitely. If CALLBACK is not NULL, the function will be called when the timer expires; otherwise a diff --git a/support/support_socket_time64_timestamp.c b/support/support_socket_time64_timestamp.c new file mode 100644 index 0000000000..a2b059a13d --- /dev/null +++ b/support/support_socket_time64_timestamp.c @@ -0,0 +1,64 @@ +/* Return whether socket supports 64-bit timestamps. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include + +#ifdef __linux__ +# include + +static int +__attribute_used__ +getsockopt_syscall (int fd) +{ + int level = SOL_SOCKET; + int optname = COMPAT_SO_TIMESTAMP_NEW; + int optval; + socklen_t len = sizeof (optval); + + int r = syscall (__NR_getsockopt, fd, level, optname, &optval, &len); +# ifdef __NR_socketcall + if (r == -1 && errno == ENOSYS) + { + long int args[] = { fd, level, optname, (long int) &optval, + sizeof (optval) }; + r = syscall (__NR_socketcall, 15 /* SOCKOP_getsockopt */ , args); + } +# endif + return r; +} +#endif + +bool +support_socket_time64_timestamp (int fd) +{ +#ifdef __linux__ +# if __LINUX_KERNEL_VERSION >= 0x050100 \ + || __WORDSIZE == 64 \ + || (defined __SYSCALL_WORDSIZE && __SYSCALL_WORDSIZE == 64) + return true; +# else + return getsockopt_syscall (fd) != -1; +# endif +#else + return false; +#endif +} From patchwork Mon Jul 19 16:38:46 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 44407 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 904CB3848406 for ; Mon, 19 Jul 2021 16:42:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 904CB3848406 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1626712931; bh=Rpl94JEUGlQkuXLbNXRCstW5bEfyF9/c8XyReO7qP04=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=edxmg5memzSh2NDXxUfW0HjlZGUppT93B+FxqIrYSbHYm9Prgc1sYtL2lVXLnNZZw x7IFaRtvNBjWeUa1yLN7VwaG7SxpzRhu7gmL6z5Rog/WUE1DC2WjAV/+8Fjz7K0kbH ARtNqeMNq+lCTJYNKb5TqO8nuIsnN+JB4EVDs3Dw= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id EA1C639490AF for ; Mon, 19 Jul 2021 16:38:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EA1C639490AF Received: by mail-pl1-x62f.google.com with SMTP id c15so9853823pls.13 for ; Mon, 19 Jul 2021 09:38:56 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Rpl94JEUGlQkuXLbNXRCstW5bEfyF9/c8XyReO7qP04=; b=BxEGMs4oi1BEEao43cLurEXbB/5PUNyXDO5Xu3OpNFRGWrZwT0I5ftJ3lNlzi/rpeo QnydLYSetv81DIWDJbbHk9J1BGh1Afz8hEpEGC8SRF6lf+x7ITXARGJSCCHdgT2I0hdD 8KFqmFlqWbUs7yWEhjQKbxySPWcU8bLXLtbSZq+MHc/X6InLR8xOspXtQQn6CJxdr1g5 fbRZD/kwOQIu8spY7F8s4klqpZ64OOAs3XllAppXf3qR5SsvnhEZEmmxG6RSkWHaeaRH y7ruLiSqGIpVCCBE0Xx73QQkSWFD9dyLKdzUh6EG5wqAbvx3M2gQd8Sr07+PzJ9GJTZ0 aR2w== X-Gm-Message-State: AOAM532WDHwJ7L1E7lb2lye5Mynf/eXZY7pQlWq1kcXMoxgmdHaN/dnq C+1MbzLbZyASsizziRlPeqJHq1IJ6ZrItg== X-Google-Smtp-Source: ABdhPJzaNy/MSKIsMgWpz1dxa+Dm+3esoVv2r0MD0WuWXRUM8PRZXjGNYWx0uerB3qs49BMLECYrlg== X-Received: by 2002:a17:90a:a07:: with SMTP id o7mr31057124pjo.99.1626712735793; Mon, 19 Jul 2021 09:38:55 -0700 (PDT) Received: from birita.. ([2804:431:c7ca:1133:c8a4:b05d:5ba9:3665]) by smtp.gmail.com with ESMTPSA id l2sm20074055pfc.157.2021.07.19.09.38.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Jul 2021 09:38:55 -0700 (PDT) To: libc-alpha@sourceware.org, Carlos O'Donell Subject: [PATCH 4/4] socket: Add socket timestamp test Date: Mon, 19 Jul 2021 13:38:46 -0300 Message-Id: <20210719163846.2954193-5-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> References: <20210719163846.2954193-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" The test check if SO_TIMESTAMP and SO_TIMESTAMPNS is correctly generated by recvmsg and recvmmsg for both _TIME_BITS. The recvmsg()/recvmmsg() is called with different ancilliary data buffers, to check if the conversion for 64-bit time on 32-bit legacy ABIs are handled correctly. For legacy ABI with 32-bit time_t support, depending of the remmaning ancially data space the timestamp can not be appended and MSG_TRUNC is returned instead. Checked on x86_64-linux and on i686-linux-gnu on both 5.11 and 4.15 kernel. --- sysdeps/unix/sysv/linux/Makefile | 3 + .../sysv/linux/tst-socket-timestamp-time64.c | 1 + .../unix/sysv/linux/tst-socket-timestamp.c | 203 ++++++++++++++++++ 3 files changed, 207 insertions(+) create mode 100644 sysdeps/unix/sysv/linux/tst-socket-timestamp-time64.c create mode 100644 sysdeps/unix/sysv/linux/tst-socket-timestamp.c diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index cceb16be05..9d3e08f116 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -256,6 +256,9 @@ sysdep_routines += cmsg_nxthdr CFLAGS-recvmmsg.c = -fexceptions -fasynchronous-unwind-tables CFLAGS-sendmmsg.c = -fexceptions -fasynchronous-unwind-tables +tests += tst-socket-timestamp +tests-time64 += tst-socket-timestamp-time64 + tests-special += $(objpfx)tst-socket-consts.out $(objpfx)tst-socket-consts.out: ../sysdeps/unix/sysv/linux/tst-socket-consts.py PYTHONPATH=../scripts \ diff --git a/sysdeps/unix/sysv/linux/tst-socket-timestamp-time64.c b/sysdeps/unix/sysv/linux/tst-socket-timestamp-time64.c new file mode 100644 index 0000000000..ae424c2a70 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-socket-timestamp-time64.c @@ -0,0 +1 @@ +#include "tst-socket-timestamp.c" diff --git a/sysdeps/unix/sysv/linux/tst-socket-timestamp.c b/sysdeps/unix/sysv/linux/tst-socket-timestamp.c new file mode 100644 index 0000000000..373e772189 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-socket-timestamp.c @@ -0,0 +1,203 @@ +/* Check recvmsg/recvmmsg timestamp support. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Some extra space added for ancillary data, it might be used to convert + 32-bit timestamp to 64-bit for _TIME_BITS=64 on older kernels. */ +enum { slack_max_size = 64 }; +static const int slack[] = { 0, 4, 8, 16, 32, slack_max_size }; + +static bool support_64_timestamp; + +static int +do_test_send (const struct sockaddr_in *addr, int nmsgs) +{ + int s = xsocket (AF_INET, SOCK_DGRAM | SOCK_CLOEXEC, 0); + xconnect (s, (const struct sockaddr *) addr, sizeof (*addr)); + + for (int i = 0; i < nmsgs; i++) + xsendto (s, &i, sizeof (i), 0, (const struct sockaddr *) addr, + sizeof (*addr)); + + return 0; +} + +static void +do_recvmsg (bool use_multi_call, int s, void *cmsg, size_t slack, size_t tsize, + int exp_msg) +{ + /* A timestamp is expected if 32-bit timestamp are used (support in every + configuration) or if underlying kernel support 64-bit timestamps. + Otherwise recvmsg will need extra space do add the 64-bit timestamp. */ + bool exp_timestamp; + if (sizeof (time_t) == 4 || support_64_timestamp) + exp_timestamp = true; + else + exp_timestamp = slack >= CMSG_SPACE (tsize); + + int msg; + struct iovec iov = + { + .iov_base = &msg, + .iov_len = sizeof (msg) + }; + size_t msgs = CMSG_SPACE (tsize) + slack; + struct mmsghdr mmhdr = + { + .msg_hdr = + { + .msg_name = NULL, + .msg_namelen = 0, + .msg_iov = &iov, + .msg_iovlen = 1, + .msg_controllen = msgs, + .msg_control = cmsg != NULL ? cmsg - msgs : NULL, + }, + }; + + int r; + if (use_multi_call) + { + r = recvmmsg (s, &mmhdr, 1, 0, NULL); + if (r >= 0) + r = mmhdr.msg_len; + } + else + r = recvmsg (s, &mmhdr.msg_hdr, 0); + TEST_COMPARE (r, sizeof (int)); + TEST_COMPARE (msg, exp_msg); + + if (cmsg == NULL) + return; + + int timestamp = false; + for (struct cmsghdr *cmsg = CMSG_FIRSTHDR (&mmhdr.msg_hdr); + cmsg != NULL; + cmsg = CMSG_NXTHDR (&mmhdr.msg_hdr, cmsg)) + { + if (cmsg->cmsg_level != SOL_SOCKET) + continue; + if (cmsg->cmsg_type == SCM_TIMESTAMP + && cmsg->cmsg_len == CMSG_LEN (sizeof (struct timeval))) + { + struct timeval tv; + memcpy (&tv, CMSG_DATA (cmsg), sizeof (tv)); + if (test_verbose) + printf ("SCM_TIMESTAMP: {%jd, %jd}\n", (intmax_t)tv.tv_sec, + (intmax_t)tv.tv_usec); + timestamp = true; + } + else if (cmsg->cmsg_type == SCM_TIMESTAMPNS + && cmsg->cmsg_len == CMSG_LEN (sizeof (struct timespec))) + { + struct timespec ts; + memcpy (&ts, CMSG_DATA (cmsg), sizeof (ts)); + if (test_verbose) + printf ("SCM_TIMESTAMPNS: {%jd, %jd}\n", (intmax_t)ts.tv_sec, + (intmax_t)ts.tv_nsec); + timestamp = true; + } + } + + /* If there is not timestamp in the ancilliary data, recvmsg should set + the flag inidcating it. */ + if (exp_timestamp && !timestamp) + TEST_VERIFY (mmhdr.msg_hdr.msg_flags & MSG_TRUNC); + else + TEST_COMPARE (exp_timestamp, timestamp); +} + +static int +do_test (void) +{ + int srv = xsocket (AF_INET, SOCK_DGRAM, 0); + struct sockaddr_in srv_addr = + { + .sin_family = AF_INET, + .sin_addr = {.s_addr = htonl (INADDR_LOOPBACK) }, + }; + xbind (srv, (struct sockaddr *) &srv_addr, sizeof (srv_addr)); + { + socklen_t sa_len = sizeof (srv_addr); + xgetsockname (srv, (struct sockaddr *) &srv_addr, &sa_len); + TEST_VERIFY (sa_len == sizeof (srv_addr)); + } + + TEST_COMPARE (recvmsg (-1, NULL, 0), -1); + TEST_COMPARE (errno, EBADF); + TEST_COMPARE (recvmmsg (-1, NULL, 0, 0, NULL), -1); + TEST_COMPARE (errno, EBADF); + + /* Setup the ancillary data buffer with an extra page with PROT_NONE to + check the possible timestamp conversion on some systems. */ + struct support_next_to_fault nf = + support_next_to_fault_allocate (slack_max_size); + void *msgbuf = nf.buffer + slack_max_size; + + /* If underlying kernel does not support */ + support_64_timestamp = support_socket_time64_timestamp (srv); + + /* Enable the timestamp using struct timeval precision. */ + { + int r = setsockopt (srv, SOL_SOCKET, SO_TIMESTAMP, &(int){1}, + sizeof (int)); + TEST_VERIFY_EXIT (r != -1); + } + /* Check recvmsg. */ + do_test_send (&srv_addr, array_length (slack)); + for (int s = 0; s < array_length (slack); s++) + do_recvmsg (false, srv, msgbuf, slack[s], sizeof (struct timeval), s); + /* Check recvmmsg. */ + do_test_send (&srv_addr, array_length (slack)); + for (int s = 0; s < array_length (slack); s++) + do_recvmsg (true, srv, msgbuf, slack[s], sizeof (struct timeval), s); + + /* Now enable timestamp using a higher precision, it overwrites the previous + precision. */ + { + int r = setsockopt (srv, SOL_SOCKET, SO_TIMESTAMPNS, &(int){1}, + sizeof (int)); + TEST_VERIFY_EXIT (r != -1); + } + /* Check recvmsg. */ + do_test_send (&srv_addr, array_length (slack)); + for (int s = 0; s < array_length (slack); s++) + do_recvmsg (false, srv, msgbuf, slack[s], sizeof (struct timespec), s); + /* Check recvmmsg. */ + do_test_send (&srv_addr, array_length (slack)); + for (int s = 0; s < array_length (slack); s++) + do_recvmsg (true, srv, msgbuf, slack[s], sizeof (struct timespec), s); + + support_next_to_fault_free (&nf); + + return 0; +} + +#include