[PATCH 1/2] support: Add support_socket_time64_timestamp

Michael Hudson-Doyle michael.hudson@canonical.com
Wed Sep 29 00:58:39 GMT 2021


On Wed, 29 Sept 2021 at 02:40, Adhemerval Zanella via Libc-alpha <
libc-alpha@sourceware.org> wrote:

> 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 2a0731796f..c34ef2a08b 100644
> --- a/support/Makefile
> +++ b/support/Makefile
> @@ -78,6 +78,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 837a806531..ba79271d6d 100644
> --- a/support/support.h
> +++ b/support/support.h
> @@ -176,6 +176,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
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#include <errno.h>
> +#include <unistd.h>
> +#include <sys/syscall.h>
> +#include <sys/socket.h>
> +#include <support/support.h>
> +
> +#ifdef __linux__
> +# include <socket-constants-time64.h>
> +
> +static int
> +__attribute_used__
> +getsockopt_syscall (int fd)
>

I don't find this function name explains what it does very clearly -- maybe
so_timestamp_new_supported or something like that would be better?

Cheers,
mwh


> +{
> +  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
> +}
> --
> 2.30.2
>
>


More information about the Libc-alpha mailing list