[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