net: y2038-safe socket timestamps
Subsystems (24)
v5 cover net: y2038-safe socket timestamps
The series introduces new socket timestamps that are y2038 safe.
The time data types used for the existing socket timestamp
options: SO_TIMESTAMP, SO_TIMESTAMPNS and SO_TIMESTAMPING are not y2038 safe. The series introduces SO_TIMESTAMP_NEW, SO_TIMESTAMPNS_NEW and SO_TIMESTAMPING_NEW to replace these. These new timestamps can be used on all architectures.
The alternative considered was to extend the sys_setsockopt() by using the flags. We did not receive any strong opinions about either of the approaches. Hence, this was chosen, as glibc folks preferred this.
The series does not deal with updating the internal kernel socket calls like rxrpc to make them y2038 safe. This will be dealt with separately.
Note that the timestamps behavior already does not match the man page specific behavior:
SIOCGSTAMP
This ioctl should only be used if the socket option SO_TIMESTAMP
is not set on the socket. Otherwise, it returns the timestamp of the last packet that was received while SO_TIMESTAMP was not set, or it fails if no such packet has been received, (i.e., ioctl(2) returns -1 with errno set to ENOENT).
The recommendation is to update the man page to remove the above statement.
The overview of the socket timestamp series is as below:
1. Delete asm specific socket.h when possible.
2. Support SO/SCM_TIMESTAMP* options only in userspace.
3. Rename current SO/SCM_TIMESTAMP* to SO/SCM_TIMESTAMP*_OLD.
3. Alter socket options so that SOCK_RCVTSTAMPNS does not rely on SOCK_RCVTSTAMP.
4. Introduce y2038 safe types for socket timestamp.
5. Introduce new y2038 safe socket options SO/SCM_TIMESTAMP*_NEW.
6. Intorduce new y2038 safe socket timeout options.
Changes since v4:
* Fixed the typo in calling sock_get_timeout()
Changes since v3:
* Rebased onto net-next and fixups as per review comments
* Merged the socket timeout series
* Integrated Arnd's patch to simplify compat handling of timeout syscalls
Changes since v2:
* Removed extra functions to reduce diff churn as per code review
Changes since v1:
* Dropped the change to disentangle sock flags
* Renamed sock_timeval to __kernel_sock_timeval
* Updated a few comments
* Added documentation changes
Arnd Bergmann (1):
socket: move compat timeout handling into sock.c
Deepa Dinamani (11):
selftests: add missing include unistd
arch: Use asm-generic/socket.h when possible
sockopt: Rename SO_TIMESTAMP* to SO_TIMESTAMP*_OLD
arch: sparc: Override struct __kernel_old_timeval
socket: Use old_timeval types for socket timestamps
socket: Add struct __kernel_sock_timeval
socket: Add SO_TIMESTAMP[NS]_NEW
socket: Add SO_TIMESTAMPING_NEW
socket: Update timestamping Documentation
socket: Rename SO_RCVTIMEO/ SO_SNDTIMEO with _OLD suffixes
sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW
Documentation/networking/timestamping.txt | 43 ++++- arch/alpha/include/uapi/asm/socket.h | 47 ++++-- arch/ia64/include/uapi/asm/Kbuild | 1 + arch/ia64/include/uapi/asm/socket.h | 122 -------------- arch/mips/include/uapi/asm/socket.h | 47 ++++-- arch/parisc/include/uapi/asm/socket.h | 46 ++++-- arch/powerpc/include/uapi/asm/socket.h | 4 +- arch/s390/include/uapi/asm/Kbuild | 1 + arch/s390/include/uapi/asm/socket.h | 119 -------------- arch/sparc/include/uapi/asm/posix_types.h | 10 ++ arch/sparc/include/uapi/asm/socket.h | 49 ++++-- arch/x86/include/uapi/asm/Kbuild | 1 + arch/x86/include/uapi/asm/socket.h | 1 - arch/xtensa/include/asm/Kbuild | 1 + arch/xtensa/include/uapi/asm/Kbuild | 1 + arch/xtensa/include/uapi/asm/socket.h | 124 -------------- drivers/isdn/mISDN/socket.c | 2 +- fs/dlm/lowcomms.c | 4 +- include/linux/skbuff.h | 24 ++- include/linux/socket.h | 8 + include/net/sock.h | 1 + include/uapi/asm-generic/socket.h | 48 ++++-- include/uapi/linux/errqueue.h | 4 + include/uapi/linux/time.h | 7 + net/bluetooth/hci_sock.c | 4 +- net/compat.c | 78 +-------- net/core/scm.c | 27 ++++ net/core/sock.c | 151 +++++++++++++----- net/ipv4/tcp.c | 61 ++++--- net/rds/af_rds.c | 10 +- net/rds/recv.c | 18 ++- net/rxrpc/local_object.c | 2 +- net/smc/af_smc.c | 3 +- net/socket.c | 50 ++++-- net/vmw_vsock/af_vsock.c | 4 +- .../networking/timestamping/rxtimestamp.c | 1 + 36 files changed, 541 insertions(+), 583 deletions(-) delete mode 100644 arch/ia64/include/uapi/asm/socket.h delete mode 100644 arch/s390/include/uapi/asm/socket.h delete mode 100644 arch/x86/include/uapi/asm/socket.h delete mode 100644 arch/xtensa/include/uapi/asm/socket.h
Signature · 30 lines
2.17.1 Cc: ccaulfie at redhat.com Cc: chris at zankel.net Cc: cluster-devel at redhat.com Cc: davem at davemloft.net Cc: deller at gmx.de Cc: dhowells at redhat.com Cc: fenghua.yu at intel.com Cc: isdn at linux-pingi.de Cc: jejb at parisc-linux.org Cc: linux-afs at lists.infradead.org Cc: linux-alpha at vger.kernel.org Cc: linux-arch at vger.kernel.org Cc: linux-ia64 at vger.kernel.org Cc: linux-mips at linux-mips.org Cc: linux-mips at vger.kernel.org Cc: linux-parisc at vger.kernel.org Cc: linuxppc-dev at lists.ozlabs.org Cc: linux-rdma at vger.kernel.org Cc: linux-s390 at vger.kernel.org Cc: linux-xtensa at linux-xtensa.org Cc: netdev at vger.kernel.org Cc: paulus at samba.org Cc: ralf at linux-mips.org Cc: rth at twiddle.net Cc: schwidefsky at de.ibm.com Cc: sparclinux at vger.kernel.org Cc: tglx at linutronix.de Cc: ubraun at linux.ibm.com
PATCH v5 1/12 selftests: add missing include unistd
Compiling rxtimestamp.c generates error messages due to non-existing declaration for write() library call.
Add missing unistd.h include to provide the declaration and silence the error.
--- tools/testing/selftests/networking/timestamping/rxtimestamp.c | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/networking/timestamping/rxtimestamp.c +1 -0
@@ -5,6 +5,7 @@#include <stdio.h> #include <stdlib.h> #include <string.h> +#include <unistd.h> #include <sys/time.h> #include <sys/socket.h>
Signature · 1 line
2.17.1
PATCH v5 2/12 socket: move compat timeout handling into sock.c
In reply to Deepa DinamaniFrom: Arnd Bergmann <[email protected]>
This is a cleanup to prepare for the addition of 64-bit time_t in O_SNDTIMEO/O_RCVTIMEO. The existing compat handler seems unnecessarily complex and error-prone, moving it all into the main setsockopt()/getsockopt() implementation requires half as much code and is easier to extend.
32-bit user space can now use old_timeval32 on both 32-bit and 64-bit machines, while 64-bit code can use __old_kernel_timeval.
--- net/compat.c | 66 +--------------------------------------- net/core/sock.c | 65 +++++++++++++++++++++++++-------------- net/vmw_vsock/af_vsock.c | 4 +-- 3 files changed, 46 insertions(+), 89 deletions(-)
net/compat.c +1 -65
@@ -348,28 +348,6 @@ static int do_set_attach_filter(struct socket *sock, int level, int optname, sizeof(struct sock_fprog)); } -static int do_set_sock_timeout (struct socket *sock,int level, -int optname,char __user *optval,unsigned int optlen) -{ -struct compat_timeval __user *up = (struct compat_timeval __user *)optval; -struct timeval ktime; -mm_segment_t old_fs; -int err; - -if (optlen <sizeof (*up)) -return -EINVAL ; -if (!access_ok (up,sizeof (*up)) || -__get_user (ktime.tv_sec, &up->tv_sec) || -__get_user (ktime.tv_usec, &up->tv_usec)) -return -EFAULT ; - old_fs =get_fs (); -set_fs (KERNEL_DS ); - err =sock_setsockopt (sock, level, optname, (char *)&ktime,sizeof (ktime)); -set_fs (old_fs); - -return err; -} -static int compat_sock_setsockopt (struct socket *sock,int level,int optname,char __user *optval,unsigned int optlen) {
@@ -377,10 +355,6 @@ static int compat_sock_setsockopt(struct socket *sock, int level, int optname, optname == SO_ATTACH_REUSEPORT_CBPF)return do_set_attach_filter (sock, level, optname, optval, optlen); -if (!COMPAT_USE_64BIT_TIME && - (optname ==SO_RCVTIMEO || optname ==SO_SNDTIMEO )) -return do_set_sock_timeout (sock, level, optname, optval, optlen); -return sock_setsockopt (sock, level, optname, optval, optlen); }
@@ -417,44 +391,6 @@ COMPAT_SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,return __compat_sys_setsockopt (fd, level, optname, optval, optlen); } -static int do_get_sock_timeout (struct socket *sock,int level,int optname, -char __user *optval,int __user *optlen) -{ -struct compat_timeval __user *up; -struct timeval ktime; -mm_segment_t old_fs; -int len, err; - - up = (struct compat_timeval __user *) optval; -if (get_user (len, optlen)) -return -EFAULT ; -if (len <sizeof (*up)) -return -EINVAL ; - len =sizeof (ktime); - old_fs =get_fs (); -set_fs (KERNEL_DS ); - err =sock_getsockopt (sock, level, optname, (char *) &ktime, &len); -set_fs (old_fs); - -if (!err) { -if (put_user (sizeof (*up), optlen) || - !access_ok (up,sizeof (*up)) || -__put_user (ktime.tv_sec, &up->tv_sec) || -__put_user (ktime.tv_usec, &up->tv_usec)) - err = -EFAULT ; - } -return err; -} - -static int compat_sock_getsockopt (struct socket *sock,int level,int optname, -char __user *optval,int __user *optlen) -{ -if (!COMPAT_USE_64BIT_TIME && - (optname ==SO_RCVTIMEO || optname ==SO_SNDTIMEO )) -return do_get_sock_timeout (sock, level, optname, optval, optlen); -return sock_getsockopt (sock, level, optname, optval, optlen); -} -int compat_sock_get_timestamp (struct sock *sk,struct timeval __user *userstamp) {struct compat_timeval __user *ctv;
@@ -527,7 +463,7 @@ static int __compat_sys_getsockopt(int fd, int level, int optname, }if (level ==SOL_SOCKET ) - err =compat_sock_getsockopt (sock, level, + err =sock_getsockopt (sock, level, optname, optval, optlen);else if (sock->ops->compat_getsockopt) err = sock->ops->compat_getsockopt(sock, level,
net/core/sock.c +43 -22
89 lines not on this page · raw message
net/vmw_vsock/af_vsock.c +2 -2
@@ -1439,7 +1439,7 @@ static int vsock_stream_setsockopt(struct socket *sock,break ;case SO_VM_SOCKETS_CONNECT_TIMEOUT : { -struct timeval tv; +struct __kernel_old_timeval tv;COPY_IN (tv);if (tv.tv_sec >=0 && tv.tv_usec <USEC_PER_SEC && tv.tv_sec < (MAX_SCHEDULE_TIMEOUT /HZ -1 )) {
@@ -1517,7 +1517,7 @@ static int vsock_stream_getsockopt(struct socket *sock,break ;case SO_VM_SOCKETS_CONNECT_TIMEOUT : { -struct timeval tv; +struct __kernel_old_timeval tv; tv.tv_sec = vsk->connect_timeout /HZ ; tv.tv_usec = (vsk->connect_timeout -
Signature · 1 line
2.17.1
PATCH v5 3/12 arch: Use asm-generic/socket.h when possible
In reply to Deepa DinamaniMany architectures maintain an arch specific copy of the file even though there are no differences with the asm-generic one. Allow these architectures to use the generic one instead.
--- arch/ia64/include/uapi/asm/Kbuild | 1 + arch/ia64/include/uapi/asm/socket.h | 122 ------------------------- arch/s390/include/uapi/asm/Kbuild | 1 + arch/s390/include/uapi/asm/socket.h | 119 ------------------------ arch/x86/include/uapi/asm/Kbuild | 1 + arch/x86/include/uapi/asm/socket.h | 1 - arch/xtensa/include/asm/Kbuild | 1 + arch/xtensa/include/uapi/asm/Kbuild | 1 + arch/xtensa/include/uapi/asm/socket.h | 124 -------------------------- 9 files changed, 5 insertions(+), 366 deletions(-) delete mode 100644 arch/ia64/include/uapi/asm/socket.h delete mode 100644 arch/s390/include/uapi/asm/socket.h delete mode 100644 arch/x86/include/uapi/asm/socket.h delete mode 100644 arch/xtensa/include/uapi/asm/socket.h
arch/ia64/include/uapi/asm/Kbuild +1 -0
@@ -2,3 +2,4 @@ include include/uapi/asm-generic/Kbuild.asm generated-y += unistd_64.h generic-y += kvm_para.h +generic-y += socket.h
arch/ia64/include/uapi/asm/socket.h deleted +0 -122
122 lines not on this page · raw message
arch/s390/include/uapi/asm/Kbuild +1 -0
@@ -3,3 +3,4 @@ include include/uapi/asm-generic/Kbuild.asm generated-y += unistd_32.h generated-y += unistd_64.h +generic-y += socket.h
arch/s390/include/uapi/asm/socket.h deleted +0 -119
119 lines not on this page · raw message
arch/x86/include/uapi/asm/Kbuild +1 -0
@@ -3,3 +3,4 @@ include include/uapi/asm-generic/Kbuild.asm generated-y += unistd_32.h generated-y += unistd_64.h generated-y += unistd_x32.h +generic-y += socket.h
arch/x86/include/uapi/asm/socket.h deleted +0 -1
@@ -1 +0,0 @@ -#include <asm-generic/socket.h>
arch/xtensa/include/asm/Kbuild +1 -0
@@ -25,6 +25,7 @@ generic-y += percpu.h generic-y += preempt.h generic-y += rwsem.h generic-y += sections.h +generic-y += socket.h generic-y += topology.h generic-y += trace_clock.h generic-y += vga.h
arch/xtensa/include/uapi/asm/Kbuild +1 -0
@@ -2,3 +2,4 @@ include include/uapi/asm-generic/Kbuild.asm generated-y += unistd_32.h generic-y += kvm_para.h +generic-y += socket.h
arch/xtensa/include/uapi/asm/socket.h deleted +0 -124
124 lines not on this page · raw message
Signature · 1 line
2.17.1
PATCH v5 4/12 sockopt: Rename SO_TIMESTAMP* to SO_TIMESTAMP*_OLD
In reply to Deepa DinamaniSO_TIMESTAMP, SO_TIMESTAMPNS and SO_TIMESTAMPING options, the way they are currently defined, are not y2038 safe. Subsequent patches in the series add new y2038 safe versions of these options which provide 64 bit timestamps on all architectures uniformly.
Hence, rename existing options with OLD tag suffixes.
Also note that kernel will not use the untagged SO_TIMESTAMP* and SCM_TIMESTAMP* options internally anymore.
--- arch/alpha/include/uapi/asm/socket.h | 23 ++++++++++++++++------- arch/mips/include/uapi/asm/socket.h | 23 ++++++++++++++++------- arch/parisc/include/uapi/asm/socket.h | 23 ++++++++++++++++------- arch/sparc/include/uapi/asm/socket.h | 24 ++++++++++++++++-------- include/uapi/asm-generic/socket.h | 23 ++++++++++++++++------- net/compat.c | 6 +++--- net/core/sock.c | 16 ++++++++-------- net/ipv4/tcp.c | 6 +++--- net/rds/af_rds.c | 2 +- net/rds/recv.c | 2 +- net/rxrpc/local_object.c | 2 +- net/socket.c | 8 ++++---- 12 files changed, 101 insertions(+), 57 deletions(-)
arch/alpha/include/uapi/asm/socket.h +16 -7
@@ -51,13 +51,9 @@#define SO_GET_FILTER SO_ATTACH_FILTER#define SO_PEERNAME 28 -#define SO_TIMESTAMP 29 -#define SCM_TIMESTAMP SO_TIMESTAMP#define SO_PEERSEC 30#define SO_PASSSEC 34 -#define SO_TIMESTAMPNS 35 -#define SCM_TIMESTAMPNS SO_TIMESTAMPNS/* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 19
@@ -66,9 +62,6 @@#define SO_MARK 36 -#define SO_TIMESTAMPING 37 -#define SCM_TIMESTAMPING SO_TIMESTAMPING -#define SO_RXQ_OVFL 40#define SO_WIFI_STATUS 41
@@ -117,4 +110,20 @@#define SO_BINDTOIFINDEX 62 +#define SO_TIMESTAMP_OLD 29 +#define SO_TIMESTAMPNS_OLD 35 +#define SO_TIMESTAMPING_OLD 37 + +#if !defined(__KERNEL__) + +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SCM_TIMESTAMP SO_TIMESTAMP +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS +#define SCM_TIMESTAMPING SO_TIMESTAMPING + +#endif +#endif /* _UAPI_ASM_SOCKET_H */
arch/mips/include/uapi/asm/socket.h +16 -7
@@ -65,21 +65,14 @@#define SO_GET_FILTER SO_ATTACH_FILTER#define SO_PEERNAME 28 -#define SO_TIMESTAMP 29 -#define SCM_TIMESTAMP SO_TIMESTAMP#define SO_PEERSEC 30#define SO_SNDBUFFORCE 31#define SO_RCVBUFFORCE 33#define SO_PASSSEC 34 -#define SO_TIMESTAMPNS 35 -#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SO_MARK 36 -#define SO_TIMESTAMPING 37 -#define SCM_TIMESTAMPING SO_TIMESTAMPING -#define SO_RXQ_OVFL 40#define SO_WIFI_STATUS 41
@@ -128,4 +121,20 @@#define SO_BINDTOIFINDEX 62 +#define SO_TIMESTAMP_OLD 29 +#define SO_TIMESTAMPNS_OLD 35 +#define SO_TIMESTAMPING_OLD 37 + +#if !defined(__KERNEL__) + +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SCM_TIMESTAMP SO_TIMESTAMP +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS +#define SCM_TIMESTAMPING SO_TIMESTAMPING + +#endif +#endif /* _UAPI_ASM_SOCKET_H */
arch/parisc/include/uapi/asm/socket.h +16 -7
@@ -34,10 +34,6 @@#define SO_BSDCOMPAT 0x400e#define SO_PASSCRED 0x4010#define SO_PEERCRED 0x4011 -#define SO_TIMESTAMP 0x4012 -#define SCM_TIMESTAMP SO_TIMESTAMP -#define SO_TIMESTAMPNS 0x4013 -#define SCM_TIMESTAMPNS SO_TIMESTAMPNS/* Security levels - as per NRL IPv6 - don't actually do anything */ #define SO_SECURITY_AUTHENTICATION 0x4016
@@ -58,9 +54,6 @@#define SO_MARK 0x401f -#define SO_TIMESTAMPING 0x4020 -#define SCM_TIMESTAMPING SO_TIMESTAMPING -#define SO_RXQ_OVFL 0x4021#define SO_WIFI_STATUS 0x4022
@@ -109,4 +102,20 @@#define SO_BINDTOIFINDEX 0x4037 +#define SO_TIMESTAMP_OLD 0x4012 +#define SO_TIMESTAMPNS_OLD 0x4013 +#define SO_TIMESTAMPING_OLD 0x4020 + +#if !defined(__KERNEL__) + +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SCM_TIMESTAMP SO_TIMESTAMP +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS +#define SCM_TIMESTAMPING SO_TIMESTAMPING + +#endif +#endif /* _UAPI_ASM_SOCKET_H */
arch/sparc/include/uapi/asm/socket.h +16 -8
@@ -33,7 +33,6 @@#define SO_PROTOCOL 0x1028#define SO_DOMAIN 0x1029 -/* Linux specific, keep the same. */ #define SO_NO_CHECK 0x000b#define SO_PRIORITY 0x000c
@@ -45,19 +44,12 @@#define SO_GET_FILTER SO_ATTACH_FILTER#define SO_PEERNAME 0x001c -#define SO_TIMESTAMP 0x001d -#define SCM_TIMESTAMP SO_TIMESTAMP#define SO_PEERSEC 0x001e#define SO_PASSSEC 0x001f -#define SO_TIMESTAMPNS 0x0021 -#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SO_MARK 0x0022 -#define SO_TIMESTAMPING 0x0023 -#define SCM_TIMESTAMPING SO_TIMESTAMPING -#define SO_RXQ_OVFL 0x0024#define SO_WIFI_STATUS 0x0025
@@ -111,4 +103,20 @@#define SO_SECURITY_ENCRYPTION_TRANSPORT 0x5002#define SO_SECURITY_ENCRYPTION_NETWORK 0x5004 +#define SO_TIMESTAMP_OLD 0x001d +#define SO_TIMESTAMPNS_OLD 0x0021 +#define SO_TIMESTAMPING_OLD 0x0023 + +#if !defined(__KERNEL__) + +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SCM_TIMESTAMP SO_TIMESTAMP +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS +#define SCM_TIMESTAMPING SO_TIMESTAMPING + +#endif +#endif /* _ASM_SOCKET_H */
include/uapi/asm-generic/socket.h +16 -7
@@ -46,21 +46,14 @@#define SO_GET_FILTER SO_ATTACH_FILTER#define SO_PEERNAME 28 -#define SO_TIMESTAMP 29 -#define SCM_TIMESTAMP SO_TIMESTAMP#define SO_ACCEPTCONN 30#define SO_PEERSEC 31#define SO_PASSSEC 34 -#define SO_TIMESTAMPNS 35 -#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SO_MARK 36 -#define SO_TIMESTAMPING 37 -#define SCM_TIMESTAMPING SO_TIMESTAMPING -#define SO_PROTOCOL 38#define SO_DOMAIN 39
@@ -112,4 +105,20 @@#define SO_BINDTOIFINDEX 62 +#define SO_TIMESTAMP_OLD 29 +#define SO_TIMESTAMPNS_OLD 35 +#define SO_TIMESTAMPING_OLD 37 + +#if !defined(__KERNEL__) + +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SCM_TIMESTAMP SO_TIMESTAMP +#define SCM_TIMESTAMPNS SO_TIMESTAMPNS +#define SCM_TIMESTAMPING SO_TIMESTAMPING + +#endif +#endif /* __ASM_GENERIC_SOCKET_H */
net/compat.c +3 -3
@@ -219,7 +219,7 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat }if (!COMPAT_USE_64BIT_TIME ) { -if (level ==SOL_SOCKET && type ==SCM_TIMESTAMP ) { +if (level ==SOL_SOCKET && type ==SO_TIMESTAMP_OLD ) {struct timeval *tv = (struct timeval *)data; ctv.tv_sec = tv->tv_sec; ctv.tv_usec = tv->tv_usec;
@@ -227,8 +227,8 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat len =sizeof (ctv); }if (level ==SOL_SOCKET && - (type ==SCM_TIMESTAMPNS || type ==SCM_TIMESTAMPING )) { -int count = type ==SCM_TIMESTAMPNS ?1 :3 ; + (type ==SO_TIMESTAMPNS_OLD || type ==SO_TIMESTAMPING_OLD )) { +int count = type ==SO_TIMESTAMPNS_OLD ?1 :3 ;int i;struct timespec *ts = (struct timespec *)data;for (i =0 ; i < count; i++) {
net/core/sock.c +8 -8
@@ -867,10 +867,10 @@ int sock_setsockopt(struct socket *sock, int level, int optname,clear_bit (SOCK_PASSCRED , &sock->flags);break ; -case SO_TIMESTAMP : -case SO_TIMESTAMPNS : +case SO_TIMESTAMP_OLD : +case SO_TIMESTAMPNS_OLD :if (valbool) { -if (optname ==SO_TIMESTAMP ) +if (optname ==SO_TIMESTAMP_OLD )sock_reset_flag (sk,SOCK_RCVTSTAMPNS );else sock_set_flag (sk,SOCK_RCVTSTAMPNS );
@@ -882,7 +882,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, }break ; -case SO_TIMESTAMPING : +case SO_TIMESTAMPING_OLD :if (val & ~SOF_TIMESTAMPING_MASK ) { ret = -EINVAL ;break ;
@@ -1243,16 +1243,16 @@ int sock_getsockopt(struct socket *sock, int level, int optname,sock_warn_obsolete_bsdism ("getsockopt" );break ; -case SO_TIMESTAMP : +case SO_TIMESTAMP_OLD : v.val =sock_flag (sk,SOCK_RCVTSTAMP ) && !sock_flag (sk,SOCK_RCVTSTAMPNS );break ; -case SO_TIMESTAMPNS : +case SO_TIMESTAMPNS_OLD : v.val =sock_flag (sk,SOCK_RCVTSTAMPNS );break ; -case SO_TIMESTAMPING : +case SO_TIMESTAMPING_OLD : v.val = sk->sk_tsflags;break ;
@@ -2168,7 +2168,7 @@ int __sock_cmsg_send(struct sock *sk, struct msghdr *msg, struct cmsghdr *cmsg,return -EINVAL ; sockc->mark = *(u32 *)CMSG_DATA (cmsg);break ; -case SO_TIMESTAMPING : +case SO_TIMESTAMPING_OLD :if (cmsg->cmsg_len !=CMSG_LEN (sizeof (u32)))return -EINVAL ;
net/ipv4/tcp.c +3 -3
@@ -1867,13 +1867,13 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,if (tss->ts[0 ].tv_sec || tss->ts[0 ].tv_nsec) {if (sock_flag (sk,SOCK_RCVTSTAMP )) {if (sock_flag (sk,SOCK_RCVTSTAMPNS )) { -put_cmsg (msg,SOL_SOCKET ,SCM_TIMESTAMPNS , +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_OLD ,sizeof (tss->ts[0 ]), &tss->ts[0 ]); }else { tv.tv_sec = tss->ts[0 ].tv_sec; tv.tv_usec = tss->ts[0 ].tv_nsec /1000 ; -put_cmsg (msg,SOL_SOCKET ,SCM_TIMESTAMP , +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD ,sizeof (tv), &tv); } }
@@ -1893,7 +1893,7 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,if (has_timestamping) { tss->ts[1 ] = (struct timespec ) {0 }; -put_cmsg (msg,SOL_SOCKET ,SCM_TIMESTAMPING , +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPING_OLD ,sizeof (*tss), tss); } }
net/rds/af_rds.c +1 -1
@@ -430,7 +430,7 @@ static int rds_setsockopt(struct socket *sock, int level, int optname, ret =rds_set_transport (rs, optval, optlen);release_sock (sock->sk);break ; -case SO_TIMESTAMP : +case SO_TIMESTAMP_OLD :lock_sock (sock->sk); ret =rds_enable_recvtstamp (sock->sk, optval, optlen);release_sock (sock->sk);
net/rds/recv.c +1 -1
@@ -550,7 +550,7 @@ static int rds_cmsg_recv(struct rds_incoming *inc, struct msghdr *msg,if ((inc->i_rx_tstamp !=0 ) &&sock_flag (rds_rs_to_sk (rs),SOCK_RCVTSTAMP )) {struct timeval tv =ktime_to_timeval (inc->i_rx_tstamp); - ret =put_cmsg (msg,SOL_SOCKET ,SCM_TIMESTAMP , + ret =put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD ,sizeof (tv), &tv);if (ret) goto out;
net/rxrpc/local_object.c +1 -1
@@ -202,7 +202,7 @@ static int rxrpc_open_socket(struct rxrpc_local *local, struct net *net)/* We want receive timestamps. */ opt =1 ; - ret =kernel_setsockopt (local->socket,SOL_SOCKET ,SO_TIMESTAMPNS , + ret =kernel_setsockopt (local->socket,SOL_SOCKET ,SO_TIMESTAMPNS_OLD , (char *)&opt,sizeof (opt));if (ret <0 ) {_debug ("setsockopt failed" );
net/socket.c +4 -4
@@ -669,7 +669,7 @@ static bool skb_is_err_queue(const struct sk_buff *skb)* before the software timestamp is received, a hardware TX timestamp may be * returned only if there is no software TX timestamp. Ignore false software * timestamps, which may be made in the __sock_recv_timestamp() call when the -* option SO_TIMESTAMP(NS) is enabled on the socket, even when the skb has a +* option SO_TIMESTAMP_OLD(NS) is enabled on the socket, even when the skb has a * hardware timestamp. */ static bool skb_is_swtx_tstamp (const struct sk_buff *skb,int false_tstamp)
@@ -721,12 +721,12 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,if (!sock_flag (sk,SOCK_RCVTSTAMPNS )) {struct timeval tv;skb_get_timestamp (skb, &tv); -put_cmsg (msg,SOL_SOCKET ,SCM_TIMESTAMP , +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD ,sizeof (tv), &tv); }else {struct timespec ts;skb_get_timestampns (skb, &ts); -put_cmsg (msg,SOL_SOCKET ,SCM_TIMESTAMPNS , +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_OLD ,sizeof (ts), &ts); } }
@@ -746,7 +746,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, }if (!empty) {put_cmsg (msg,SOL_SOCKET , -SCM_TIMESTAMPING ,sizeof (tss), &tss); +SO_TIMESTAMPING_OLD ,sizeof (tss), &tss);if (skb_is_err_queue (skb) && skb->len &&SKB_EXT_ERR (skb)->opt_stats)
Signature · 1 line
2.17.1
PATCH v5 5/12 arch: sparc: Override struct __kernel_old_timeval
In reply to Deepa Dinamanistruct __kernel_old_timeval is supposed to have the same layout as struct timeval. But, it was inadvarently missed that __kernel_suseconds has a different definition for sparc64.
Provide an asm-specific override that fixes it.
--- arch/sparc/include/uapi/asm/posix_types.h | 10 ++++++++++ include/uapi/linux/time.h | 2 ++ 2 files changed, 12 insertions(+)
arch/sparc/include/uapi/asm/posix_types.h +10 -0
@@ -19,6 +19,16 @@ typedef unsigned short __kernel_old_gid_t;typedef int __kernel_suseconds_t ;#define __kernel_suseconds_t __kernel_suseconds_t +typedef long __kernel_long_t ; +typedef unsigned long __kernel_ulong_t ; +#define __kernel_long_t __kernel_long_t + +struct __kernel_old_timeval { +__kernel_long_t tv_sec; +__kernel_suseconds_t tv_usec; +}; +#define __kernel_old_timeval __kernel_old_timeval +#else /* sparc 32 bit */
include/uapi/linux/time.h +2 -0
@@ -63,10 +63,12 @@ struct __kernel_itimerspec {* here, this is probably because it is not y2038 safe and needs to * be changed to use another interface. */ +#ifndef __kernel_old_timevalstruct __kernel_old_timeval {__kernel_long_t tv_sec;__kernel_long_t tv_usec; }; +#endif /* * The IDs of the various system clocks (for POSIX.1b interval timers):
Signature · 1 line
2.17.1
PATCH v5 6/12 socket: Use old_timeval types for socket timestamps
In reply to Deepa DinamaniAs part of y2038 solution, all internal uses of struct timeval are replaced by struct __kernel_old_timeval and struct compat_timeval by struct old_timeval32. Make socket timestamps use these new types.
This is mainly to be able to verify that the kernel build is y2038 safe when such non y2038 safe types are not supported anymore.
--- drivers/isdn/mISDN/socket.c | 2 +- include/linux/skbuff.h | 6 +++--- net/bluetooth/hci_sock.c | 4 ++-- net/compat.c | 6 +++--- net/ipv4/tcp.c | 2 +- net/rds/recv.c | 2 +- net/socket.c | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-)
drivers/isdn/mISDN/socket.c +1 -1
@@ -103,7 +103,7 @@ mISDN_ctrl(struct mISDNchannel *ch, u_int cmd, void *arg)static inline void mISDN_sock_cmsg (struct sock *sk,struct msghdr *msg,struct sk_buff *skb) { -struct timeval tv; +struct __kernel_old_timeval tv;if (_pms (sk)->cmask &MISDN_TIME_STAMP ) {skb_get_timestamp (skb, &tv);
include/linux/skbuff.h +3 -3
@@ -3486,16 +3486,16 @@ static inline ktime_t skb_get_ktime(const struct sk_buff *skb)/** * skb_get_timestamp - get timestamp from a skb * @skb: skb to get stamp from -* @stamp: pointer to struct timeval to store stamp in +* @stamp: pointer to struct __kernel_old_timeval to store stamp in * * Timestamps are stored in the skb as offsets to a base timestamp. * This function converts the offset back to a struct timeval and stores * it in stamp. */ static inline void skb_get_timestamp (const struct sk_buff *skb, -struct timeval *stamp) +struct __kernel_old_timeval *stamp) { - *stamp =ktime_to_timeval (skb->tstamp); + *stamp =ns_to_kernel_old_timeval (skb->tstamp); } static inline void skb_get_timestampns(const struct sk_buff *skb,
net/bluetooth/hci_sock.c +2 -2
@@ -1383,9 +1383,9 @@ static void hci_sock_cmsg(struct sock *sk, struct msghdr *msg,if (mask &HCI_CMSG_TSTAMP ) {#ifdef CONFIG_COMPAT -struct compat_timeval ctv; +struct old_timeval32 ctv;#endif -struct timeval tv; +struct __kernel_old_timeval tv;void *data;int len;
net/compat.c +3 -3
@@ -209,8 +209,8 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *dat {struct compat_cmsghdr __user *cm = (struct compat_cmsghdr __user *) kmsg->msg_control;struct compat_cmsghdr cmhdr; -struct compat_timeval ctv; -struct compat_timespec cts[3 ]; +struct old_timeval32 ctv; +struct old_timespec32 cts[3 ];int cmlen;if (cm ==NULL || kmsg->msg_controllen <sizeof (*cm)) {
@@ -220,7 +220,7 @@ int put_cmsg_compat(struct msghdr *kmsg, int level, int type, int len, void *datif (!COMPAT_USE_64BIT_TIME ) {if (level ==SOL_SOCKET && type ==SO_TIMESTAMP_OLD ) { -struct timeval *tv = (struct timeval *)data; +struct __kernel_old_timeval *tv = (struct __kernel_old_timeval *)data; ctv.tv_sec = tv->tv_sec; ctv.tv_usec = tv->tv_usec; data = &ctv;
net/ipv4/tcp.c +1 -1
@@ -1861,7 +1861,7 @@ static void tcp_update_recv_tstamps(struct sk_buff *skb,static void tcp_recv_timestamp (struct msghdr *msg,const struct sock *sk,struct scm_timestamping *tss) { -struct timeval tv; +struct __kernel_old_timeval tv;bool has_timestamping = false;if (tss->ts[0 ].tv_sec || tss->ts[0 ].tv_nsec) {
net/rds/recv.c +1 -1
@@ -549,7 +549,7 @@ static int rds_cmsg_recv(struct rds_incoming *inc, struct msghdr *msg,if ((inc->i_rx_tstamp !=0 ) &&sock_flag (rds_rs_to_sk (rs),SOCK_RCVTSTAMP )) { -struct timeval tv =ktime_to_timeval (inc->i_rx_tstamp); +struct __kernel_old_timeval tv =ns_to_kernel_old_timeval (inc->i_rx_tstamp); ret =put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD ,sizeof (tv), &tv);if (ret)
net/socket.c +1 -1
@@ -719,7 +719,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,if (need_software_tstamp) {if (!sock_flag (sk,SOCK_RCVTSTAMPNS )) { -struct timeval tv; +struct __kernel_old_timeval tv;skb_get_timestamp (skb, &tv);put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD ,sizeof (tv), &tv);
Signature · 1 line
2.17.1
PATCH v5 7/12 socket: Add struct __kernel_sock_timeval
In reply to Deepa DinamaniThe new type is meant to be used as a y2038 safe structure to be used as part of cmsg data.
Presently the SO_TIMESTAMP socket option uses struct timeval for timestamps. This is not y2038 safe.
Subsequent patches in the series add new y2038 safe socket option to be used in the place of SO_TIMESTAMP_OLD. struct __kernel_sock_timeval will be used as the timestamp format at that time.
struct __kernel_sock_timeval also maintains the same layout across 32 bit and 64 bit ABIs.
--- include/uapi/linux/time.h | 5 +++++ 1 file changed, 5 insertions(+)
include/uapi/linux/time.h +5 -0
@@ -70,6 +70,11 @@ struct __kernel_old_timeval { };#endif +struct __kernel_sock_timeval { +__s64 tv_sec; +__s64 tv_usec; +}; +/* * The IDs of the various system clocks (for POSIX.1b interval timers): */
Signature · 1 line
2.17.1
PATCH v5 8/12 socket: Add SO_TIMESTAMP[NS]_NEW
In reply to Deepa DinamaniAdd SO_TIMESTAMP_NEW and SO_TIMESTAMPNS_NEW variants of socket timestamp options.
These are the y2038 safe versions of the SO_TIMESTAMP_OLD and SO_TIMESTAMPNS_OLD for all architectures.
Note that the format of scm_timestamping.ts[0] is not changed in this patch.
--- arch/alpha/include/uapi/asm/socket.h | 14 +++++++++-- arch/mips/include/uapi/asm/socket.h | 14 +++++++++-- arch/parisc/include/uapi/asm/socket.h | 14 +++++++++-- arch/sparc/include/uapi/asm/socket.h | 14 +++++++++-- include/linux/skbuff.h | 18 ++++++++++++++ include/net/sock.h | 1 + include/uapi/asm-generic/socket.h | 15 ++++++++++-- net/core/sock.c | 21 ++++++++++++++-- net/ipv4/tcp.c | 33 +++++++++++++++++++------ net/rds/af_rds.c | 8 ++++-- net/rds/recv.c | 16 ++++++++++-- net/socket.c | 35 +++++++++++++++++++++------ 12 files changed, 171 insertions(+), 32 deletions(-)
arch/alpha/include/uapi/asm/socket.h +12 -2
@@ -3,6 +3,7 @@#define _UAPI_ASM_SOCKET_H#include <asm/sockios.h> +#include <asm/bitsperlong.h> /* For setsockopt(2) */ /*
@@ -114,10 +115,19 @@#define SO_TIMESTAMPNS_OLD 35#define SO_TIMESTAMPING_OLD 37 +#define SO_TIMESTAMP_NEW 63 +#define SO_TIMESTAMPNS_NEW 64 +#if !defined(__KERNEL__) -#define SO_TIMESTAMP SO_TIMESTAMP_OLD -#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#if __BITS_PER_LONG ==64 +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#else +#define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) +#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#endif +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#define SCM_TIMESTAMP SO_TIMESTAMP
arch/mips/include/uapi/asm/socket.h +12 -2
@@ -11,6 +11,7 @@#define _UAPI_ASM_SOCKET_H#include <asm/sockios.h> +#include <asm/bitsperlong.h> /* * For setsockopt(2)
@@ -125,10 +126,19 @@#define SO_TIMESTAMPNS_OLD 35#define SO_TIMESTAMPING_OLD 37 +#define SO_TIMESTAMP_NEW 63 +#define SO_TIMESTAMPNS_NEW 64 +#if !defined(__KERNEL__) -#define SO_TIMESTAMP SO_TIMESTAMP_OLD -#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#if __BITS_PER_LONG ==64 +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#else +#define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) +#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#endif +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#define SCM_TIMESTAMP SO_TIMESTAMP
arch/parisc/include/uapi/asm/socket.h +12 -2
@@ -3,6 +3,7 @@#define _UAPI_ASM_SOCKET_H#include <asm/sockios.h> +#include <asm/bitsperlong.h> /* For setsockopt(2) */ #define SOL_SOCKET 0xffff
@@ -106,10 +107,19 @@#define SO_TIMESTAMPNS_OLD 0x4013#define SO_TIMESTAMPING_OLD 0x4020 +#define SO_TIMESTAMP_NEW 0x4038 +#define SO_TIMESTAMPNS_NEW 0x4039 +#if !defined(__KERNEL__) -#define SO_TIMESTAMP SO_TIMESTAMP_OLD -#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#if __BITS_PER_LONG ==64 +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#else +#define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) +#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#endif +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#define SCM_TIMESTAMP SO_TIMESTAMP
arch/sparc/include/uapi/asm/socket.h +12 -2
@@ -3,6 +3,7 @@#define _ASM_SOCKET_H#include <asm/sockios.h> +#include <asm/bitsperlong.h> /* For setsockopt(2) */ #define SOL_SOCKET 0xffff
@@ -107,10 +108,19 @@#define SO_TIMESTAMPNS_OLD 0x0021#define SO_TIMESTAMPING_OLD 0x0023 +#define SO_TIMESTAMP_NEW 0x0041 +#define SO_TIMESTAMPNS_NEW 0x0042 +#if !defined(__KERNEL__) -#define SO_TIMESTAMP SO_TIMESTAMP_OLD -#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#if __BITS_PER_LONG ==64 +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#else +#define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) +#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#endif +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#define SCM_TIMESTAMP SO_TIMESTAMP
include/linux/skbuff.h +18 -0
@@ -3498,12 +3498,30 @@ static inline void skb_get_timestamp(const struct sk_buff *skb, *stamp =ns_to_kernel_old_timeval (skb->tstamp); } +static inline void skb_get_new_timestamp (const struct sk_buff *skb, +struct __kernel_sock_timeval *stamp) +{ +struct timespec64 ts =ktime_to_timespec64 (skb->tstamp); + + stamp->tv_sec = ts.tv_sec; + stamp->tv_usec = ts.tv_nsec /1000 ; +} +static inline void skb_get_timestampns (const struct sk_buff *skb,struct timespec *stamp) { *stamp =ktime_to_timespec (skb->tstamp); } +static inline void skb_get_new_timestampns (const struct sk_buff *skb, +struct __kernel_timespec *stamp) +{ +struct timespec64 ts =ktime_to_timespec64 (skb->tstamp); + + stamp->tv_sec = ts.tv_sec; + stamp->tv_nsec = ts.tv_nsec; +} +static inline void __net_timestamp (struct sk_buff *skb) { skb->tstamp =ktime_get_real ();
include/net/sock.h +1 -0
@@ -805,6 +805,7 @@ enum sock_flags {SOCK_RCU_FREE ,/* wait rcu grace period in sk_destruct() */ SOCK_TXTIME ,SOCK_XDP ,/* XDP is attached */ + SOCK_TSTAMP_NEW, /* Indicates 64 bit timestamps always */ };#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
include/uapi/asm-generic/socket.h +13 -2
@@ -3,6 +3,7 @@#define __ASM_GENERIC_SOCKET_H#include <asm/sockios.h> +#include <asm/bitsperlong.h> /* For setsockopt(2) */ #define SOL_SOCKET 1
@@ -109,10 +110,20 @@#define SO_TIMESTAMPNS_OLD 35#define SO_TIMESTAMPING_OLD 37 +#define SO_TIMESTAMP_NEW 63 +#define SO_TIMESTAMPNS_NEW 64 +#if !defined(__KERNEL__) -#define SO_TIMESTAMP SO_TIMESTAMP_OLD -#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#if __BITS_PER_LONG ==64 || (defined(__x86_64__) && defined(__ILP32__)) +/* on 64-bit and x32, avoid the ?: operator */ +#define SO_TIMESTAMP SO_TIMESTAMP_OLD +#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#else +#define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW) +#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#endif +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#define SCM_TIMESTAMP SO_TIMESTAMP
net/core/sock.c +19 -2
@@ -868,9 +868,16 @@ int sock_setsockopt(struct socket *sock, int level, int optname,break ;case SO_TIMESTAMP_OLD : +case SO_TIMESTAMP_NEW :case SO_TIMESTAMPNS_OLD : +case SO_TIMESTAMPNS_NEW :if (valbool) { -if (optname ==SO_TIMESTAMP_OLD ) +if (optname ==SO_TIMESTAMP_NEW || optname ==SO_TIMESTAMPNS_NEW ) +sock_set_flag (sk,SOCK_TSTAMP_NEW ); +else +sock_reset_flag (sk,SOCK_TSTAMP_NEW ); + +if (optname ==SO_TIMESTAMP_OLD || optname ==SO_TIMESTAMP_NEW )sock_reset_flag (sk,SOCK_RCVTSTAMPNS );else sock_set_flag (sk,SOCK_RCVTSTAMPNS );
@@ -879,6 +886,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, }else {sock_reset_flag (sk,SOCK_RCVTSTAMP );sock_reset_flag (sk,SOCK_RCVTSTAMPNS ); +sock_reset_flag (sk,SOCK_TSTAMP_NEW ); }break ;
@@ -1245,11 +1253,20 @@ int sock_getsockopt(struct socket *sock, int level, int optname,case SO_TIMESTAMP_OLD : v.val =sock_flag (sk,SOCK_RCVTSTAMP ) && + !sock_flag (sk,SOCK_TSTAMP_NEW ) && !sock_flag (sk,SOCK_RCVTSTAMPNS );break ;case SO_TIMESTAMPNS_OLD : - v.val =sock_flag (sk,SOCK_RCVTSTAMPNS ); + v.val =sock_flag (sk,SOCK_RCVTSTAMPNS ) && !sock_flag (sk,SOCK_TSTAMP_NEW ); +break ; + +case SO_TIMESTAMP_NEW : + v.val =sock_flag (sk,SOCK_RCVTSTAMP ) &&sock_flag (sk,SOCK_TSTAMP_NEW ); +break ; + +case SO_TIMESTAMPNS_NEW : + v.val =sock_flag (sk,SOCK_RCVTSTAMPNS ) &&sock_flag (sk,SOCK_TSTAMP_NEW );break ;case SO_TIMESTAMPING_OLD :
net/ipv4/tcp.c +25 -8
@@ -1861,20 +1861,37 @@ static void tcp_update_recv_tstamps(struct sk_buff *skb,static void tcp_recv_timestamp (struct msghdr *msg,const struct sock *sk,struct scm_timestamping *tss) { -struct __kernel_old_timeval tv; +int new_tstamp =sock_flag (sk,SOCK_TSTAMP_NEW );bool has_timestamping = false;if (tss->ts[0 ].tv_sec || tss->ts[0 ].tv_nsec) {if (sock_flag (sk,SOCK_RCVTSTAMP )) {if (sock_flag (sk,SOCK_RCVTSTAMPNS )) { -put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_OLD , -sizeof (tss->ts[0 ]), &tss->ts[0 ]); +if (new_tstamp) { +struct __kernel_timespec kts = {tss->ts[0 ].tv_sec, tss->ts[0 ].tv_nsec}; + +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_NEW , +sizeof (kts), &kts); + }else { +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_OLD , +sizeof (tss->ts[0 ]), &tss->ts[0 ]); + } }else { - tv.tv_sec = tss->ts[0 ].tv_sec; - tv.tv_usec = tss->ts[0 ].tv_nsec /1000 ; - -put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD , -sizeof (tv), &tv); +if (new_tstamp) { +struct __kernel_sock_timeval stv; + + stv.tv_sec = tss->ts[0 ].tv_sec; + stv.tv_usec = tss->ts[0 ].tv_nsec /1000 ; +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_NEW , +sizeof (stv), &stv); + }else { +struct __kernel_old_timeval tv; + + tv.tv_sec = tss->ts[0 ].tv_sec; + tv.tv_usec = tss->ts[0 ].tv_nsec /1000 ; +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD , +sizeof (tv), &tv); + } } }
net/rds/af_rds.c +6 -2
@@ -348,7 +348,7 @@ static int rds_set_transport(struct rds_sock *rs, char __user *optval, }static int rds_enable_recvtstamp (struct sock *sk,char __user *optval, -int optlen) +int optlen,int optname) {int val, valbool;
@@ -360,6 +360,9 @@ static int rds_enable_recvtstamp(struct sock *sk, char __user *optval, valbool = val ?1 :0 ; +if (optname ==SO_TIMESTAMP_NEW ) +sock_set_flag (sk,SOCK_TSTAMP_NEW ); +if (valbool)sock_set_flag (sk,SOCK_RCVTSTAMP );else
@@ -431,8 +434,9 @@ static int rds_setsockopt(struct socket *sock, int level, int optname,release_sock (sock->sk);break ;case SO_TIMESTAMP_OLD : +case SO_TIMESTAMP_NEW :lock_sock (sock->sk); - ret =rds_enable_recvtstamp (sock->sk, optval, optlen); + ret =rds_enable_recvtstamp (sock->sk, optval, optlen, optname);release_sock (sock->sk);break ;case SO_RDS_MSG_RXPATH_LATENCY :
net/rds/recv.c +14 -2
@@ -550,8 +550,20 @@ static int rds_cmsg_recv(struct rds_incoming *inc, struct msghdr *msg,if ((inc->i_rx_tstamp !=0 ) &&sock_flag (rds_rs_to_sk (rs),SOCK_RCVTSTAMP )) {struct __kernel_old_timeval tv =ns_to_kernel_old_timeval (inc->i_rx_tstamp); - ret =put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD , -sizeof (tv), &tv); + +if (!sock_flag (rds_rs_to_sk (rs),SOCK_TSTAMP_NEW )) { + ret =put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD , +sizeof (tv), &tv); + }else { +struct __kernel_sock_timeval sk_tv; + + sk_tv.tv_sec = tv.tv_sec; + sk_tv.tv_usec = tv.tv_usec; + + ret =put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_NEW , +sizeof (sk_tv), &sk_tv); + } +if (ret) goto out; }
net/socket.c +27 -8
@@ -705,6 +705,7 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, struct sk_buff *skb) {int need_software_tstamp =sock_flag (sk,SOCK_RCVTSTAMP ); +int new_tstamp =sock_flag (sk,SOCK_TSTAMP_NEW );struct scm_timestamping tss;int empty =1 , false_tstamp =0 ; struct skb_shared_hwtstamps *shhwtstamps =
@@ -719,15 +720,33 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,if (need_software_tstamp) {if (!sock_flag (sk,SOCK_RCVTSTAMPNS )) { -struct __kernel_old_timeval tv; -skb_get_timestamp (skb, &tv); -put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD , -sizeof (tv), &tv); +if (new_tstamp) { +struct __kernel_sock_timeval tv; + +skb_get_new_timestamp (skb, &tv); +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_NEW , +sizeof (tv), &tv); + }else { +struct __kernel_old_timeval tv; + +skb_get_timestamp (skb, &tv); +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMP_OLD , +sizeof (tv), &tv); + } }else { -struct timespec ts; -skb_get_timestampns (skb, &ts); -put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_OLD , -sizeof (ts), &ts); +if (new_tstamp) { +struct __kernel_timespec ts; + +skb_get_new_timestampns (skb, &ts); +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_NEW , +sizeof (ts), &ts); + }else { +struct timespec ts; + +skb_get_timestampns (skb, &ts); +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_OLD , +sizeof (ts), &ts); + } } }
Signature · 1 line
2.17.1
PATCH v5 9/12 socket: Add SO_TIMESTAMPING_NEW
In reply to Deepa DinamaniAdd SO_TIMESTAMPING_NEW variant of socket timestamp options. This is the y2038 safe versions of the SO_TIMESTAMPING_OLD for all architectures.
--- arch/alpha/include/uapi/asm/socket.h | 5 +++-- arch/mips/include/uapi/asm/socket.h | 5 +++-- arch/parisc/include/uapi/asm/socket.h | 5 +++-- arch/sparc/include/uapi/asm/socket.h | 5 +++-- include/linux/socket.h | 8 +++++++ include/uapi/asm-generic/socket.h | 5 +++-- include/uapi/linux/errqueue.h | 4 ++++ net/core/scm.c | 27 ++++++++++++++++++++++++ net/core/sock.c | 8 ++++++- net/ipv4/tcp.c | 30 +++++++++++++++------------ net/smc/af_smc.c | 3 ++- net/socket.c | 13 +++++++----- 12 files changed, 88 insertions(+), 30 deletions(-)
arch/alpha/include/uapi/asm/socket.h +3 -2
@@ -117,19 +117,20 @@#define SO_TIMESTAMP_NEW 63#define SO_TIMESTAMPNS_NEW 64 +#define SO_TIMESTAMPING_NEW 65#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW)#endif -#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD -#define SCM_TIMESTAMP SO_TIMESTAMP#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SCM_TIMESTAMPING SO_TIMESTAMPING
arch/mips/include/uapi/asm/socket.h +3 -2
@@ -128,19 +128,20 @@#define SO_TIMESTAMP_NEW 63#define SO_TIMESTAMPNS_NEW 64 +#define SO_TIMESTAMPING_NEW 65#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW)#endif -#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD -#define SCM_TIMESTAMP SO_TIMESTAMP#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SCM_TIMESTAMPING SO_TIMESTAMPING
arch/parisc/include/uapi/asm/socket.h +3 -2
@@ -109,19 +109,20 @@#define SO_TIMESTAMP_NEW 0x4038#define SO_TIMESTAMPNS_NEW 0x4039 +#define SO_TIMESTAMPING_NEW 0x403A#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW)#endif -#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD -#define SCM_TIMESTAMP SO_TIMESTAMP#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SCM_TIMESTAMPING SO_TIMESTAMPING
arch/sparc/include/uapi/asm/socket.h +3 -2
@@ -110,19 +110,20 @@#define SO_TIMESTAMP_NEW 0x0041#define SO_TIMESTAMPNS_NEW 0x0042 +#define SO_TIMESTAMPING_NEW 0x0043#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW)#endif -#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD -#define SCM_TIMESTAMP SO_TIMESTAMP#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SCM_TIMESTAMPING SO_TIMESTAMPING
include/linux/socket.h +8 -0
@@ -349,9 +349,17 @@ struct ucred {extern int move_addr_to_kernel (void __user *uaddr,int ulen,struct sockaddr_storage *kaddr);extern int put_cmsg (struct msghdr *,int level,int type,int len,void *data); +struct timespec64 ;struct __kernel_timespec ;struct old_timespec32 ; +struct scm_timestamping_internal { +struct timespec64 ts[3 ]; +}; + +extern void put_cmsg_scm_timestamping64 (struct msghdr *msg,struct scm_timestamping_internal *tss); +extern void put_cmsg_scm_timestamping (struct msghdr *msg,struct scm_timestamping_internal *tss); +/* The __sys_...msg variants allow MSG_CMSG_COMPAT iff * forbid_cmsg_compat==false */
include/uapi/asm-generic/socket.h +3 -2
@@ -112,6 +112,7 @@#define SO_TIMESTAMP_NEW 63#define SO_TIMESTAMPNS_NEW 64 +#define SO_TIMESTAMPING_NEW 65#if !defined(__KERNEL__)
@@ -119,13 +120,13 @@/* on 64-bit and x32, avoid the ?: operator */ #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD +#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW) +#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW)#endif -#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD -#define SCM_TIMESTAMP SO_TIMESTAMP#define SCM_TIMESTAMPNS SO_TIMESTAMPNS#define SCM_TIMESTAMPING SO_TIMESTAMPING
include/uapi/linux/errqueue.h +4 -0
@@ -41,6 +41,10 @@ struct scm_timestamping {struct timespec ts[3 ]; }; +struct scm_timestamping64 { +struct __kernel_timespec ts[3 ]; +}; +/* The type of scm_timestamping, passed in sock_extended_err ee_info. * This defines the type of ts[0]. For SCM_TSTAMP_SND only, if ts[0] * is zero, then this is a hardware timestamp and recorded in ts[2].
net/core/scm.c +27 -0
@@ -29,6 +29,7 @@#include <linux/pid.h> #include <linux/nsproxy.h> #include <linux/slab.h> +#include <linux/errqueue.h> #include <linux/uaccess.h>
@@ -252,6 +253,32 @@ int put_cmsg(struct msghdr * msg, int level, int type, int len, void *data) }EXPORT_SYMBOL (put_cmsg); +void put_cmsg_scm_timestamping64 (struct msghdr *msg,struct scm_timestamping_internal *tss_internal) +{ +struct scm_timestamping64 tss; +int i; + +for (i =0 ; i <ARRAY_SIZE (tss.ts); i++) { + tss.ts[i].tv_sec = tss_internal->ts[i].tv_sec; + tss.ts[i].tv_nsec = tss_internal->ts[i].tv_nsec; + } + +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPING_NEW ,sizeof (tss), &tss); +} +EXPORT_SYMBOL (put_cmsg_scm_timestamping64); + +void put_cmsg_scm_timestamping (struct msghdr *msg,struct scm_timestamping_internal *tss_internal) +{ +struct scm_timestamping tss; +int i; + +for (i =0 ; i <ARRAY_SIZE (tss.ts); i++) + tss.ts[i] =timespec64_to_timespec (tss_internal->ts[i]); + +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPING_OLD ,sizeof (tss), &tss); +} +EXPORT_SYMBOL (put_cmsg_scm_timestamping); +void scm_detach_fds (struct msghdr *msg,struct scm_cookie *scm) {struct cmsghdr __user *cm
net/core/sock.c +7 -1
@@ -890,6 +890,8 @@ int sock_setsockopt(struct socket *sock, int level, int optname, }break ; +case SO_TIMESTAMPING_NEW : +sock_set_flag (sk,SOCK_TSTAMP_NEW );case SO_TIMESTAMPING_OLD :if (val & ~SOF_TIMESTAMPING_MASK ) { ret = -EINVAL ;
@@ -921,9 +923,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,if (val &SOF_TIMESTAMPING_RX_SOFTWARE )sock_enable_timestamp (sk,SOCK_TIMESTAMPING_RX_SOFTWARE ); -else +else { +if (optname ==SO_TIMESTAMPING_NEW ) +sock_reset_flag (sk,SOCK_TSTAMP_NEW ); +sock_disable_timestamp (sk, (1UL <<SOCK_TIMESTAMPING_RX_SOFTWARE )); + }break ;case SO_RCVLOWAT :
net/ipv4/tcp.c +17 -13
@@ -1844,22 +1844,22 @@ static int tcp_zerocopy_receive(struct sock *sk,#endif static void tcp_update_recv_tstamps (struct sk_buff *skb, -struct scm_timestamping *tss) +struct scm_timestamping_internal *tss) {if (skb->tstamp) - tss->ts[0 ] =ktime_to_timespec (skb->tstamp); + tss->ts[0 ] =ktime_to_timespec64 (skb->tstamp);else - tss->ts[0 ] = (struct timespec ) {0 }; + tss->ts[0 ] = (struct timespec64 ) {0 };if (skb_hwtstamps (skb)->hwtstamp) - tss->ts[2 ] =ktime_to_timespec (skb_hwtstamps (skb)->hwtstamp); + tss->ts[2 ] =ktime_to_timespec64 (skb_hwtstamps (skb)->hwtstamp);else - tss->ts[2 ] = (struct timespec ) {0 }; + tss->ts[2 ] = (struct timespec64 ) {0 }; }/* Similar to __sock_recv_timestamp, but does not require an skb */ static void tcp_recv_timestamp (struct msghdr *msg,const struct sock *sk, -struct scm_timestamping *tss) +struct scm_timestamping_internal *tss) {int new_tstamp =sock_flag (sk,SOCK_TSTAMP_NEW );bool has_timestamping = false;
@@ -1873,8 +1873,10 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_NEW ,sizeof (kts), &kts); }else { +struct timespec ts_old =timespec64_to_timespec (tss->ts[0 ]); +put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPNS_OLD , -sizeof (tss->ts[0 ]), &tss->ts[0 ]); +sizeof (ts_old), &ts_old); } }else {if (new_tstamp) {
@@ -1898,20 +1900,22 @@ static void tcp_recv_timestamp(struct msghdr *msg, const struct sock *sk,if (sk->sk_tsflags &SOF_TIMESTAMPING_SOFTWARE ) has_timestamping = true;else - tss->ts[0 ] = (struct timespec ) {0 }; + tss->ts[0 ] = (struct timespec64 ) {0 }; }if (tss->ts[2 ].tv_sec || tss->ts[2 ].tv_nsec) {if (sk->sk_tsflags &SOF_TIMESTAMPING_RAW_HARDWARE ) has_timestamping = true;else - tss->ts[2 ] = (struct timespec ) {0 }; + tss->ts[2 ] = (struct timespec64 ) {0 }; }if (has_timestamping) { - tss->ts[1 ] = (struct timespec ) {0 }; -put_cmsg (msg,SOL_SOCKET ,SO_TIMESTAMPING_OLD , -sizeof (*tss), tss); + tss->ts[1 ] = (struct timespec64 ) {0 }; +if (sock_flag (sk,SOCK_TSTAMP_NEW )) +put_cmsg_scm_timestamping64 (msg, tss); +else +put_cmsg_scm_timestamping (msg, tss); } }
@@ -1952,7 +1956,7 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,long timeo;struct sk_buff *skb, *last;u32 urg_hole =0 ; -struct scm_timestamping tss; +struct scm_timestamping_internal tss;bool has_tss = false;bool has_cmsg;
net/smc/af_smc.c +2 -1
@@ -291,7 +291,8 @@ static void smc_copy_sock_settings(struct sock *nsk, struct sock *osk, (1UL <<SOCK_RXQ_OVFL ) | \ (1UL <<SOCK_WIFI_STATUS ) | \ (1UL <<SOCK_NOFCS ) | \ - (1UL << SOCK_FILTER_LOCKED)) + (1UL <<SOCK_FILTER_LOCKED ) | \ + (1UL << SOCK_TSTAMP_NEW))/* copy only relevant settings and flags of SOL_SOCKET level from smc to * clc socket (since smc is not called for these options from net/core) */
net/socket.c +8 -5
@@ -706,7 +706,8 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk, {int need_software_tstamp =sock_flag (sk,SOCK_RCVTSTAMP );int new_tstamp =sock_flag (sk,SOCK_TSTAMP_NEW ); -struct scm_timestamping tss; +struct scm_timestamping_internal tss; +int empty =1 , false_tstamp =0 ;struct skb_shared_hwtstamps *shhwtstamps =skb_hwtstamps (skb);
@@ -752,20 +753,22 @@ void __sock_recv_timestamp(struct msghdr *msg, struct sock *sk,memset (&tss,0 ,sizeof (tss));if ((sk->sk_tsflags &SOF_TIMESTAMPING_SOFTWARE ) && -ktime_to_timespec_cond (skb->tstamp, tss.ts +0 )) +ktime_to_timespec64_cond (skb->tstamp, tss.ts +0 )) empty =0 ;if (shhwtstamps && (sk->sk_tsflags &SOF_TIMESTAMPING_RAW_HARDWARE ) && !skb_is_swtx_tstamp (skb, false_tstamp) && -ktime_to_timespec_cond (shhwtstamps->hwtstamp, tss.ts +2 )) { +ktime_to_timespec64_cond (shhwtstamps->hwtstamp, tss.ts +2 )) { empty =0 ;if ((sk->sk_tsflags &SOF_TIMESTAMPING_OPT_PKTINFO ) && !skb_is_err_queue (skb))put_ts_pktinfo (msg, skb); }if (!empty) { -put_cmsg (msg,SOL_SOCKET , -SO_TIMESTAMPING_OLD ,sizeof (tss), &tss); +if (sock_flag (sk,SOCK_TSTAMP_NEW )) +put_cmsg_scm_timestamping64 (msg, &tss); +else +put_cmsg_scm_timestamping (msg, &tss);if (skb_is_err_queue (skb) && skb->len &&SKB_EXT_ERR (skb)->opt_stats)
Signature · 1 line
2.17.1
RE: [PATCH net-next v5 09/12] socket: Add SO_TIMESTAMPING_NEW
Quoted 8 lines
Subject: [PATCH net-next v5 09/12] socket: Add
SO_TIMESTAMPING_NEWAdd
SO_TIMESTAMPING_NEWvariant of socket timestamp options. This is the y2038 safe versions of theSO_TIMESTAMPING_OLDfor all architectures.Signed-off-by Deepa Dinamani <[email protected]>Acked-by Willem de Bruijn <[email protected]>
Hi,
I have app that include:
#include <linux/errqueue.h>
It now fail with this error:
In file included from timestamping.c:6:0:
/usr/include/linux/errqueue.h:46:27: error: array type has incomplete element type 'struct __kernel_timespec'
struct __kernel_timespec ts[3];
^~
I tried to do the trivial fix, to include time.h:
In include/uapi/linux/errqueue.h
#include <linux/time.h>
#include <linux/types.h>But it just add some other noises:
In file included from /usr/include/linux/errqueue.h:5:0,
from timestamping.c:6:
/usr/include/linux/time.h:10:8: error: redefinition of ?struct timespec?
struct timespec {
^~~~~~~~
In file included from /usr/include/sys/select.h:39:0,
from /usr/include/sys/types.h:197,
from /usr/include/stdlib.h:279,
from timestamping.c:2:
/usr/include/bits/types/struct_timespec.h:8:8: note: originally defined here
struct timespec
^~~~~~~~
In file included from /usr/include/linux/errqueue.h:5:0,
from timestamping.c:6:
/usr/include/linux/time.h:16:8: error: redefinition of ?struct timeval?
struct timeval {
^~~~~~~
In file included from /usr/include/sys/select.h:37:0,
from /usr/include/sys/types.h:197,
from /usr/include/stdlib.h:279,
from timestamping.c:2:
/usr/include/bits/types/struct_timeval.h:8:8: note: originally defined here
struct timeval
^~~~~~~Can you please advise how to solve it?
Thanks,
Ran
Quoted 15 lines
include/uapi/linux/errqueue.h +4
-0@@ -41,6 +41,10 @@ struct scm_timestamping {struct timespec ts[3 ]; }; +struct scm_timestamping64 { +struct __kernel_timespec ts[3 ]; +}; +/* The type of scm_timestamping, passed in sock_extended_err ee_info. * This defines the type of ts[0]. For SCM_TSTAMP_SND only, if ts[0] * is zero, then this is a hardware timestamp and recorded in ts[2].
Re: [PATCH net-next v5 09/12] socket: Add SO_TIMESTAMPING_NEW
Quoted 52 lines · Ran Rozenstein
Quoted 8 lines
Subject: [PATCH net-next v5 09/12] socket: Add
SO_TIMESTAMPING_NEWAdd
SO_TIMESTAMPING_NEWvariant of socket timestamp options. This is the y2038 safe versions of theSO_TIMESTAMPING_OLDfor all architectures.Signed-off-by Deepa Dinamani <[email protected]>Acked-by Willem de Bruijn <[email protected]>Hi,
I have app that include:
#include <linux/errqueue.h>It now fail with this error:
In file included from timestamping.c:6:0:/usr/include/linux/errqueue.h:46:27: error: array type has incomplete element type 'struct __kernel_timespec' struct __kernel_timespec ts[3]; ^~ I tried to do the trivial fix, to include time.h: In include/uapi/linux/errqueue.h #include <linux/time.h> #include <linux/types.h>But it just add some other noises:
In file included from /usr/include/linux/errqueue.h:5:0, from timestamping.c:6: /usr/include/linux/time.h:10:8: error: redefinition of ?struct timespec? struct timespec { ^~~~~~~~ In file included from /usr/include/sys/select.h:39:0, from /usr/include/sys/types.h:197, from /usr/include/stdlib.h:279, from timestamping.c:2: /usr/include/bits/types/struct_timespec.h:8:8: note: originally defined here struct timespec ^~~~~~~~ In file included from /usr/include/linux/errqueue.h:5:0, from timestamping.c:6: /usr/include/linux/time.h:16:8: error: redefinition of ?struct timeval? struct timeval { ^~~~~~~ In file included from /usr/include/sys/select.h:37:0, from /usr/include/sys/types.h:197, from /usr/include/stdlib.h:279, from timestamping.c:2: /usr/include/bits/types/struct_timeval.h:8:8: note: originally defined here struct timeval ^~~~~~~
Quoted 4 lines
Can you please advise how to solve it?
Thanks,
Ran
The errqueue.h already had the same issue reported previously:
https://lore.kernel.org/netdev/CAF=yD-L2ntuH54J_SwN9WcpBMgkV_v0e-Q2Pu2mrQ3+1RozGFQ@mail.gmail.com/
Earlier when I tested this with kernel selftests such as tools/testing/selftests/networking/timestamping/rxtimestamp(the test was broken to begin with because of missing include of unistd.h), I was using make.cross to build.
This does not put the headers in the right place (obj-$ARCH/usr/include instead of usr/include). Hence, I did not realize that this breaks the inclusion of errqueue.h due to the missing __kernel_timespec definition.
I forgot that nobody seems to be using linux/time.h.
But, if I include guards( #ifndef __KERNEL__) for struct timespec, struct timeval etc for linux/time.h, then we can include it from userspace/ errqueue.h for __kernel_timespec:
include/uapi/linux/errqueue.h +1 -1
@@ -2,7 +2,7 @@ #ifndef _UAPI_LINUX_ERRQUEUE_H #define _UAPI_LINUX_ERRQUEUE_H -#include <linux/types.h> +#include <linux/time.h> struct sock_extended_err { __u32 ee_errno;
include/uapi/linux/time.h +3 -0
@@ -5,6 +5,8 @@#include <linux/types.h> +#ifdef __KERNEL__ +#ifndef _STRUCT_TIMESPEC#define _STRUCT_TIMESPEC struct timespec {
@@ -42,6 +44,8 @@ struct itimerval { struct timeval it_value; /* current value */ }; +#endif /* __KERNEL__ */
Arnd,
I forgot how we plan to include the definition for __kernel_timespec for libc or userspace. Does this seem right to you?
Also these changes to errqueue.h needs to be reverted probably as this breaks userspace.
Thanks,
-Deepa
-Deepa
Re: [PATCH net-next v5 09/12] socket: Add SO_TIMESTAMPING_NEW
Quoted 109 lines · Deepa Dinamani
Quoted 52 lines · Ran Rozenstein
Quoted 8 lines
Subject: [PATCH net-next v5 09/12] socket: Add
SO_TIMESTAMPING_NEWAdd
SO_TIMESTAMPING_NEWvariant of socket timestamp options. This is the y2038 safe versions of theSO_TIMESTAMPING_OLDfor all architectures.Signed-off-by Deepa Dinamani <[email protected]>Acked-by Willem de Bruijn <[email protected]>Hi,
I have app that include:
#include <linux/errqueue.h>It now fail with this error:
In file included from timestamping.c:6:0:/usr/include/linux/errqueue.h:46:27: error: array type has incomplete element type 'struct __kernel_timespec' struct __kernel_timespec ts[3]; ^~ I tried to do the trivial fix, to include time.h: In include/uapi/linux/errqueue.h #include <linux/time.h> #include <linux/types.h>But it just add some other noises:
In file included from /usr/include/linux/errqueue.h:5:0, from timestamping.c:6: /usr/include/linux/time.h:10:8: error: redefinition of ?struct timespec? struct timespec { ^~~~~~~~ In file included from /usr/include/sys/select.h:39:0, from /usr/include/sys/types.h:197, from /usr/include/stdlib.h:279, from timestamping.c:2: /usr/include/bits/types/struct_timespec.h:8:8: note: originally defined here struct timespec ^~~~~~~~ In file included from /usr/include/linux/errqueue.h:5:0, from timestamping.c:6: /usr/include/linux/time.h:16:8: error: redefinition of ?struct timeval? struct timeval { ^~~~~~~ In file included from /usr/include/sys/select.h:37:0, from /usr/include/sys/types.h:197, from /usr/include/stdlib.h:279, from timestamping.c:2: /usr/include/bits/types/struct_timeval.h:8:8: note: originally defined here struct timeval ^~~~~~~Quoted 4 lines
Can you please advise how to solve it?
Thanks,
RanThe
errqueue.halready had the same issue reported previously:
https://lore.kernel.org/netdev/CAF=yD-L2ntuH54J_SwN9WcpBMgkV_v0e-Q2Pu2mrQ3+1RozGFQ@mail.gmail.com/Earlier when I tested this with kernel selftests such as tools/testing/selftests/networking/timestamping/rxtimestamp(the test was broken to begin with because of missing include of
unistd.h), I was using make.cross to build.
This does not put the headers in the right place (obj-$ARCH/usr/include instead of usr/include). Hence, I did not realize that this breaks the inclusion oferrqueue.hdue to the missing__kernel_timespecdefinition.
I forgot that nobody seems to be usinglinux/time.h.But, if I include
guards( #ifndef __KERNEL__)for struct timespec, struct timeval etc forlinux/time.h, then we can include it from userspace/errqueue.hfor__kernel_timespec:include/uapi/linux/errqueue.h +1
-1@@ -2,7 +2,7 @@ #ifndef _UAPI_LINUX_ERRQUEUE_H #define _UAPI_LINUX_ERRQUEUE_H -#include <linux/types.h> +#include <linux/time.h> struct sock_extended_err { __u32 ee_errno;include/uapi/linux/time.h +3
-0@@ -5,6 +5,8 @@#include <linux/types.h> +#ifdef __KERNEL__ +#ifndef _STRUCT_TIMESPEC#define _STRUCT_TIMESPEC struct timespec {@@ -42,6 +44,8 @@ struct itimerval {struct timeval it_value;/* current value */ }; +#endif /* __KERNEL__ */ Arnd,
Quoted 4 lines
I forgot how we plan to include the definition for
__kernel_timespecfor libc or userspace. Does this seem right to you?
Also these changes toerrqueue.hneeds to be reverted probably as this breaks userspace.
Arnd and I talked about this today morning.
We agreed that we could introduce a new time_types.h along the lines of posix_types.h. We will move all the time definitions that we plan to keep in the kernel uapi headers to this header. This header will also not have any overlap with the sys/time.h and can be included along with it from userspace.
I will post this patch shortly.
This should fix Ran's issue.
-Deepa
PATCH v5 10/12 socket: Update timestamping Documentation
In reply to Deepa DinamaniWith the new y2038 safe timestamping options added, update the documentation to reflect the changes.
--- Documentation/networking/timestamping.txt | 43 ++++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-)
Documentation/networking/timestamping.txt +38 -5
@@ -6,11 +6,21 @@ The interfaces for receiving network packages timestamps are: * SO_TIMESTAMP Generates a timestamp for each incoming packet in (not necessarily monotonic) system time. Reports the timestamp via recvmsg() in a - control message as struct timeval (usec resolution). + control message in usec resolution. + SO_TIMESTAMP is defined as SO_TIMESTAMP_NEW or SO_TIMESTAMP_OLD + based on the architecture type and time_t representation of libc. + Control message format is in struct __kernel_old_timeval for + SO_TIMESTAMP_OLD and in struct __kernel_sock_timeval for + SO_TIMESTAMP_NEW options respectively. * SO_TIMESTAMPNS Same timestamping mechanism as SO_TIMESTAMP, but reports the - timestamp as struct timespec (nsec resolution). + timestamp as struct timespec in nsec resolution. + SO_TIMESTAMPNS is defined as SO_TIMESTAMPNS_NEW or SO_TIMESTAMPNS_OLD + based on the architecture type and time_t representation of libc. + Control message format is in struct timespec for SO_TIMESTAMPNS_OLD + and in struct __kernel_timespec for SO_TIMESTAMPNS_NEW options + respectively. * IP_MULTICAST_LOOP + SO_TIMESTAMP[NS] Only for multicast:approximate transmit timestamp obtained by
@@ -22,7 +32,7 @@ The interfaces for receiving network packages timestamps are: timestamps for stream sockets. -1.1 SO_TIMESTAMP: +1.1 SO_TIMESTAMP (also SO_TIMESTAMP_OLD and SO_TIMESTAMP_NEW): This socket option enables timestamping of datagrams on the reception path. Because the destination socket, if any, is not known early in
@@ -31,15 +41,25 @@ same is true for all early receive timestamp options. For interface details, see `man 7 socket`. +Always use SO_TIMESTAMP_NEW timestamp to always get timestamp in +struct __kernel_sock_timeval format. -1.2 SO_TIMESTAMPNS: +SO_TIMESTAMP_OLD returns incorrect timestamps after the year 2038 +on 32 bit machines. + +1.2 SO_TIMESTAMPNS (also SO_TIMESTAMPNS_OLD and SO_TIMESTAMPNS_NEW): This option is identical to SO_TIMESTAMP except for the returned data type. Its struct timespec allows for higher resolution (ns) timestamps than the timeval of SO_TIMESTAMP (ms). +Always use SO_TIMESTAMPNS_NEW timestamp to always get timestamp in +struct __kernel_timespec format. + +SO_TIMESTAMPNS_OLD returns incorrect timestamps after the year 2038 +on 32 bit machines. -1.3 SO_TIMESTAMPING: +1.3 SO_TIMESTAMPING (also SO_TIMESTAMPING_OLD and SO_TIMESTAMPING_NEW): Supports multiple types of timestamp requests. As a result, this socket option takes a bitmap of flags, not a boolean. In
@@ -323,10 +343,23 @@ SO_TIMESTAMP and SO_TIMESTAMPNS records can be retrieved. These timestamps are returned in a control message with cmsg_level SOL_SOCKET, cmsg_type SCM_TIMESTAMPING, and payload of type +For SO_TIMESTAMPING_OLD: + struct scm_timestamping { struct timespec ts[3]; }; +For SO_TIMESTAMPING_NEW: + +struct scm_timestamping64 { + struct __kernel_timespec ts[3]; + +Always use SO_TIMESTAMPING_NEW timestamp to always get timestamp in +struct scm_timestamping64 format. + +SO_TIMESTAMPING_OLD returns incorrect timestamps after the year 2038 +on 32 bit machines. + The structure can return up to three timestamps. This is a legacy feature. At least one field is non-zero at any time. Most timestamps are passed in ts[0]. Hardware timestamps are passed in ts[2].
Signature · 1 line
2.17.1
PATCH v5 11/12 socket: Rename SO_RCVTIMEO/ SO_SNDTIMEO with _OLD suffixes
In reply to Deepa DinamaniSO_RCVTIMEO and SO_SNDTIMEO socket options use struct timeval as the time format. struct timeval is not y2038 safe. The subsequent patches in the series add support for new socket timeout options with _NEW suffix that will use y2038 safe data structures. Although the existing struct timeval layout is sufficiently wide to represent timeouts, because of the way libc will interpret time_t based on user defined flag, these new flags provide a way of having a structure that is the same for all architectures consistently.
Rename the existing options with _OLD suffix forms so that the right option is enabled for userspace applications according to the architecture and time_t definition of libc.
--- arch/alpha/include/uapi/asm/socket.h | 7 +++++-- arch/mips/include/uapi/asm/socket.h | 6 ++++-- arch/parisc/include/uapi/asm/socket.h | 6 ++++-- arch/powerpc/include/uapi/asm/socket.h | 4 ++-- arch/sparc/include/uapi/asm/socket.h | 7 +++++-- fs/dlm/lowcomms.c | 4 ++-- include/uapi/asm-generic/socket.h | 6 ++++-- net/core/sock.c | 4 ++-- 8 files changed, 28 insertions(+), 16 deletions(-)
arch/alpha/include/uapi/asm/socket.h +5 -2
@@ -31,8 +31,8 @@#define SO_RCVBUFFORCE 0x100b#define SO_RCVLOWAT 0x1010#define SO_SNDLOWAT 0x1011 -#define SO_RCVTIMEO 0x1012 -#define SO_SNDTIMEO 0x1013 +#define SO_RCVTIMEO_OLD 0x1012 +#define SO_SNDTIMEO_OLD 0x1013#define SO_ACCEPTCONN 0x1014#define SO_PROTOCOL 0x1028#define SO_DOMAIN 0x1029
@@ -121,6 +121,9 @@#if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD +#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD
arch/mips/include/uapi/asm/socket.h +4 -2
@@ -39,8 +39,8 @@#define SO_RCVBUF 0x1002/* Receive buffer. */ #define SO_SNDLOWAT 0x1003/* send low-water mark */ #define SO_RCVLOWAT 0x1004/* receive low-water mark */ -#define SO_SNDTIMEO 0x1005/* send timeout */ -#define SO_RCVTIMEO 0x1006/* receive timeout */ +#define SO_SNDTIMEO_OLD 0x1005/* send timeout */ +#define SO_RCVTIMEO_OLD 0x1006/* receive timeout */ #define SO_ACCEPTCONN 0x1009#define SO_PROTOCOL 0x1028/* protocol type */ #define SO_DOMAIN 0x1029/* domain/socket family */
@@ -132,6 +132,8 @@#if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD
arch/parisc/include/uapi/asm/socket.h +4 -2
@@ -22,8 +22,8 @@#define SO_RCVBUFFORCE 0x100b#define SO_SNDLOWAT 0x1003#define SO_RCVLOWAT 0x1004 -#define SO_SNDTIMEO 0x1005 -#define SO_RCVTIMEO 0x1006 +#define SO_SNDTIMEO_OLD 0x1005 +#define SO_RCVTIMEO_OLD 0x1006#define SO_ERROR 0x1007#define SO_TYPE 0x1008#define SO_PROTOCOL 0x1028
@@ -113,6 +113,8 @@#if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD
arch/powerpc/include/uapi/asm/socket.h +2 -2
@@ -11,8 +11,8 @@#define SO_RCVLOWAT 16#define SO_SNDLOWAT 17 -#define SO_RCVTIMEO 18 -#define SO_SNDTIMEO 19 +#define SO_RCVTIMEO_OLD 18 +#define SO_SNDTIMEO_OLD 19#define SO_PASSCRED 20#define SO_PEERCRED 21
arch/sparc/include/uapi/asm/socket.h +5 -2
@@ -21,8 +21,8 @@#define SO_BSDCOMPAT 0x0400#define SO_RCVLOWAT 0x0800#define SO_SNDLOWAT 0x1000 -#define SO_RCVTIMEO 0x2000 -#define SO_SNDTIMEO 0x4000 +#define SO_RCVTIMEO_OLD 0x2000 +#define SO_SNDTIMEO_OLD 0x4000#define SO_ACCEPTCONN 0x8000#define SO_SNDBUF 0x1001
@@ -114,6 +114,9 @@#if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD +#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD
fs/dlm/lowcomms.c +2 -2
@@ -1089,12 +1089,12 @@ static void sctp_connect_to_sock(struct connection *con)* since O_NONBLOCK argument in connect() function does not work here, * then, we should restore the default value of this attribute. */ -kernel_setsockopt (sock,SOL_SOCKET ,SO_SNDTIMEO , (char *)&tv, +kernel_setsockopt (sock,SOL_SOCKET ,SO_SNDTIMEO_OLD , (char *)&tv,sizeof (tv)); result = sock->ops->connect (sock, (struct sockaddr *)&daddr, addr_len,0 );memset (&tv,0 ,sizeof (tv)); -kernel_setsockopt (sock,SOL_SOCKET ,SO_SNDTIMEO , (char *)&tv, +kernel_setsockopt (sock,SOL_SOCKET ,SO_SNDTIMEO_OLD , (char *)&tv,sizeof (tv));if (result == -EINPROGRESS )
include/uapi/asm-generic/socket.h +4 -2
@@ -30,8 +30,8 @@#define SO_PEERCRED 17#define SO_RCVLOWAT 18#define SO_SNDLOWAT 19 -#define SO_RCVTIMEO 20 -#define SO_SNDTIMEO 21 +#define SO_RCVTIMEO_OLD 20 +#define SO_SNDTIMEO_OLD 21#endif /* Security levels - as per NRL IPv6 - don't actually do anything */
@@ -116,6 +116,8 @@#if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 || (defined(__x86_64__) && defined(__ILP32__))/* on 64-bit and x32, avoid the ?: operator */ #define SO_TIMESTAMP SO_TIMESTAMP_OLD
net/core/sock.c +2 -2
@@ -941,11 +941,11 @@ int sock_setsockopt(struct socket *sock, int level, int optname, sk->sk_rcvlowat = val ? :1 ;break ; -case SO_RCVTIMEO : +case SO_RCVTIMEO_OLD : ret =sock_set_timeout (&sk->sk_rcvtimeo, optval, optlen);break ; -case SO_SNDTIMEO : +case SO_SNDTIMEO_OLD : ret =sock_set_timeout (&sk->sk_sndtimeo, optval, optlen);break ;
Signature · 1 line
2.17.1
Re: [PATCH net-next v5 11/12] socket: Rename SO_RCVTIMEO/ SO_SNDTIMEO with _OLD suffixes
Quoted 27 lines · Deepa Dinamani
SO_RCVTIMEOandSO_SNDTIMEOsocket options use struct timeval as the time format. struct timeval is not y2038 safe. The subsequent patches in the series add support for new socket timeout options with_NEWsuffix that will use y2038 safe data structures. Although the existing struct timeval layout is sufficiently wide to represent timeouts, because of the way libc will interprettime_tbased on user defined flag, these new flags provide a way of having a structure that is the same for all architectures consistently.
Rename the existing options with_OLDsuffix forms so that the right option is enabled for userspace applications according to the architecture andtime_tdefinition of libc.Signed-off-by Deepa Dinamani <[email protected]>Acked-by Willem de Bruijn <[email protected]>Cc ccaulfie at redhat.comCc deller at gmx.deCc paulus at samba.orgCc ralf at linux-mips.orgCc rth at twiddle.netCc cluster-devel at redhat.comCc linuxppc-dev at lists.ozlabs.orgCc linux-alpha at vger.kernel.orgCc linux-arch at vger.kernel.orgCc linux-mips at vger.kernel.orgCc linux-parisc at vger.kernel.orgCc sparclinux at vger.kernel.org
Quoted 5 lines
--- arch/alpha/include/uapi/asm/socket.h | 7 +++++-- arch/mips/include/uapi/asm/socket.h | 6 ++++-- arch/parisc/include/uapi/asm/socket.h | 6 ++++-- arch/powerpc/include/uapi/asm/socket.h | 4 ++--
The powerpc changes look OK to me.
cheers
Quoted 39 lines
arch/powerpc/include/uapi/asm/socket.h +2
-2@@ -11,8 +11,8 @@#define SO_RCVLOWAT 16#define SO_SNDLOWAT 17 -#define SO_RCVTIMEO 18 -#define SO_SNDTIMEO 19 +#define SO_RCVTIMEO_OLD 18 +#define SO_SNDTIMEO_OLD 19#define SO_PASSCRED 20#define SO_PEERCRED 21include/uapi/asm-generic/socket.h +4
-2@@ -30,8 +30,8 @@#define SO_PEERCRED 17#define SO_RCVLOWAT 18#define SO_SNDLOWAT 19 -#define SO_RCVTIMEO 20 -#define SO_SNDTIMEO 21 +#define SO_RCVTIMEO_OLD 20 +#define SO_SNDTIMEO_OLD 21#endif /* Security levels - as per NRL IPv6 - don't actually do anything */ @@ -116,6 +116,8 @@#if !defined(__KERNEL__) +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 || (defined(__x86_64__) && defined(__ILP32__))/* on 64-bit and x32, avoid the ?: operator */ #define SO_TIMESTAMP SO_TIMESTAMP_OLD
PATCH v5 12/12 sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW
In reply to Deepa DinamaniAdd new socket timeout options that are y2038 safe.
--- arch/alpha/include/uapi/asm/socket.h | 12 ++++-- arch/mips/include/uapi/asm/socket.h | 11 +++++- arch/parisc/include/uapi/asm/socket.h | 10 ++++- arch/sparc/include/uapi/asm/socket.h | 11 +++++- include/uapi/asm-generic/socket.h | 11 +++++- net/core/sock.c | 53 ++++++++++++++++++++------- 6 files changed, 83 insertions(+), 25 deletions(-)
arch/alpha/include/uapi/asm/socket.h +9 -3
@@ -119,19 +119,25 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 -#if !defined(__KERNEL__) +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD +#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMP
arch/mips/include/uapi/asm/socket.h +9 -2
@@ -130,18 +130,25 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMP
arch/parisc/include/uapi/asm/socket.h +8 -2
@@ -111,18 +111,24 @@#define SO_TIMESTAMPNS_NEW 0x4039#define SO_TIMESTAMPING_NEW 0x403A +#define SO_RCVTIMEO_NEW 0x4040 +#define SO_SNDTIMEO_NEW 0x4041 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMP
arch/sparc/include/uapi/asm/socket.h +9 -2
@@ -112,19 +112,26 @@#define SO_TIMESTAMPNS_NEW 0x0042#define SO_TIMESTAMPING_NEW 0x0043 +#define SO_RCVTIMEO_NEW 0x0044 +#define SO_SNDTIMEO_NEW 0x0045 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMP
include/uapi/asm-generic/socket.h +9 -2
@@ -114,19 +114,26 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 || (defined(__x86_64__) && defined(__ILP32__))/* on 64-bit and x32, avoid the ?: operator */ #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMP
net/core/sock.c +39 -14
104 lines not on this page · raw message
Signature · 1 line
2.17.1
Re: [PATCH net-next v5 12/12] sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW
Hi all,
Quoted 1 line · Deepa Dinamani
Add new socket timeout options that are y2038 safe.
(..)
Quoted 14 lines
arch/alpha/include/uapi/asm/socket.h +2
-2@@ -119,19 +119,25 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 -#if !defined(__KERNEL__) +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 -#define SO_RCVTIMEO SO_RCVTIMEO_OLD
arch/alpha/include/uapi/asm/socket.h line 133
Quoted 10 lines
arch/alpha/include/uapi/asm/socket.h +4
-1-#define SO_SNDTIMEO SO_SNDTIMEO_OLD +#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD
Maybe I'm a bit late in this discussion as you are already in v5 ...
I can see patches making the transition in different steps where it might be helpful to name them *_OLD and *_NEW to understand the patches.
But in the end the naming stays in the kernel for a very long time and I remember myself (in early years) to name things 'new', 'new2', 'new3'.
In fact SO_TIMESTAMP_OLD should be named SO_TIMESTAMP32 and SO_TIMESTAMP_NEW should be named SO_TIMESTAMP64.
Especially as it tells you what is 'inside', the naming of these new introduced constants should be replaced with *32 and *64 names.
The documentation and the other comments still fit perfectly then.
Regards,
Oliver
Re: [PATCH net-next v5 12/12] sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW
Quoted 33 lines · Oliver Hartkopp
Hi all,
Quoted 1 line · Deepa Dinamani
Add new socket timeout options that are y2038 safe.
(..)
Quoted 14 lines
arch/alpha/include/uapi/asm/socket.h +2
-2@@ -119,19 +119,25 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 -#if !defined(__KERNEL__) +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 -#define SO_RCVTIMEO SO_RCVTIMEO_OLDarch/alpha/include/uapi/asm/socket.h line 133
Quoted 10 lines
arch/alpha/include/uapi/asm/socket.h +4
-1-#define SO_SNDTIMEO SO_SNDTIMEO_OLD +#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLDMaybe I'm a bit late in this discussion as you are already in v5 ...
Quoted 8 lines
I can see patches making the transition in different steps where it might be helpful to name them
*_OLDand*_NEWto understand the patches.But in the end the naming stays in the kernel for a very long time and I remember myself (in early years) to name things 'new', 'new2', 'new3'.
In fact
SO_TIMESTAMP_OLDshould be namedSO_TIMESTAMP32andSO_TIMESTAMP_NEWshould be namedSO_TIMESTAMP64.
Hmm. SO_TIMESTAMP_OLD uses 64-bit time_t on a 64 bit machine. In fact, there is no difference between the two options on a 64 bit machine. So using SO_TIMESTAMP_32 is just wrong.
Likewise, SO_TIMESTAMP_64 naming somehow indicates that the existing one was not, and that is also not true on a 64-bit machine.
Further, userspace will still continue to use SO_TIMESTAMP and the macros take care of which option to select internally.
Moreover, these macros have been there for more than ten years (introduced before 2.4) and there has been no change. I doubt you will ever have NEW2.
I think this argument is similar to saying don?t name these macros SO_TIMESTAMP because there might be SO_TIMESTAMP1 some day. There is never a perfect name. SO_TIMESTAMPING is also not really descriptive.
Quoted 2 lines
Especially as it tells you what is 'inside', the naming of these new introduced constants should be replaced with *32 and *64 names. The documentation and the other comments still fit perfectly then.
I would prefer not to do this, for reasons mentioned above. Since you point out that it is easier to use this naming for intermediate steps, I suggest that we leave the series as it is.
If you feel strongly to post a follow-on renaming patch, you could discuss it with the subsystem maintainers, if you think there is a correct but more descriptive naming.
-Deepa
Quoted 2 lines
Regards,
Oliver
Michael Ellerman
reviewerRe: [PATCH net-next v5 12/12] sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW
In reply to Deepa DinamaniQuoted 17 lines · Deepa Dinamani
Add new socket timeout options that are y2038 safe.
Signed-off-by Deepa Dinamani <[email protected]>Acked-by Willem de Bruijn <[email protected]>Cc ccaulfie at redhat.comCc davem at davemloft.netCc deller at gmx.deCc paulus at samba.orgCc ralf at linux-mips.orgCc rth at twiddle.netCc cluster-devel at redhat.comCc linuxppc-dev at lists.ozlabs.orgCc linux-alpha at vger.kernel.orgCc linux-arch at vger.kernel.orgCc linux-mips at vger.kernel.orgCc linux-parisc at vger.kernel.orgCc sparclinux at vger.kernel.org
Quoted 5 lines
--- arch/alpha/include/uapi/asm/socket.h | 12 ++++-- arch/mips/include/uapi/asm/socket.h | 11 +++++- arch/parisc/include/uapi/asm/socket.h | 10 ++++- arch/sparc/include/uapi/asm/socket.h | 11 +++++-
You touched powerpc in the previous patch but not this one.
That's because we use the asm-generic version I assume. Would be good to mention in the change log though to avoid any confusion.
cheers
Quoted 283 lines
include/uapi/asm-generic/socket.h | 11 +++++- net/core/sock.c | 53 ++++++++++++++++++++------- 6 files changed, 83 insertions(+), 25 deletions(-)arch/alpha/include/uapi/asm/socket.h +9
-3@@ -119,19 +119,25 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 -#if !defined(__KERNEL__) +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD +#if !defined(__KERNEL__)#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMParch/mips/include/uapi/asm/socket.h +9
-2@@ -130,18 +130,25 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMParch/parisc/include/uapi/asm/socket.h +8
-2@@ -111,18 +111,24 @@#define SO_TIMESTAMPNS_NEW 0x4039#define SO_TIMESTAMPING_NEW 0x403A +#define SO_RCVTIMEO_NEW 0x4040 +#define SO_SNDTIMEO_NEW 0x4041 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMParch/sparc/include/uapi/asm/socket.h +9
-2@@ -112,19 +112,26 @@#define SO_TIMESTAMPNS_NEW 0x0042#define SO_TIMESTAMPING_NEW 0x0043 +#define SO_RCVTIMEO_NEW 0x0044 +#define SO_SNDTIMEO_NEW 0x0045 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMPinclude/uapi/asm-generic/socket.h +9
-2@@ -114,19 +114,26 @@#define SO_TIMESTAMPNS_NEW 64#define SO_TIMESTAMPING_NEW 65 +#define SO_RCVTIMEO_NEW 66 +#define SO_SNDTIMEO_NEW 67 +#if !defined(__KERNEL__) -#define SO_RCVTIMEO SO_RCVTIMEO_OLD -#define SO_SNDTIMEO SO_SNDTIMEO_OLD#if __BITS_PER_LONG ==64 || (defined(__x86_64__) && defined(__ILP32__))/* on 64-bit and x32, avoid the ?: operator */ #define SO_TIMESTAMP SO_TIMESTAMP_OLD#define SO_TIMESTAMPNS SO_TIMESTAMPNS_OLD#define SO_TIMESTAMPING SO_TIMESTAMPING_OLD + +#define SO_RCVTIMEO SO_RCVTIMEO_OLD +#define SO_SNDTIMEO SO_SNDTIMEO_OLD#else #define SO_TIMESTAMP (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMP_OLD : SO_TIMESTAMP_NEW)#define SO_TIMESTAMPNS (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPNS_OLD : SO_TIMESTAMPNS_NEW)#define SO_TIMESTAMPING (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_TIMESTAMPING_OLD : SO_TIMESTAMPING_NEW) + +#define SO_RCVTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_RCVTIMEO_OLD : SO_RCVTIMEO_NEW) +#define SO_SNDTIMEO (sizeof(time_t) == sizeof(__kernel_long_t) ? SO_SNDTIMEO_OLD : SO_SNDTIMEO_NEW)#endif #define SCM_TIMESTAMP SO_TIMESTAMPnet/core/sock.c +39
-14@@ -335,9 +335,10 @@ int __sk_backlog_rcv(struct sock *sk, struct sk_buff *skb) }EXPORT_SYMBOL (__sk_backlog_rcv); -static int sock_get_timeout (long timeo,void *optval) +static int sock_get_timeout (long timeo,void *optval,bool old_timeval) { -struct __kernel_old_timeval tv; +struct __kernel_sock_timeval tv; +int size;if (timeo ==MAX_SCHEDULE_TIMEOUT ) { tv.tv_sec =0 ;@@ -353,13 +354,23 @@ static int sock_get_timeout(long timeo, void *optval)return sizeof (tv32); } - *(struct __kernel_old_timeval *)optval = tv; -return sizeof (tv); +if (old_timeval) { +struct __kernel_old_timeval old_tv; + old_tv.tv_sec = tv.tv_sec; + old_tv.tv_usec = tv.tv_usec; + *(struct __kernel_old_timeval *)optval = old_tv; + size =sizeof (old_tv); + }else { + *(struct __kernel_sock_timeval *)optval = tv; + size =sizeof (tv); + } + +return size; } -static int sock_set_timeout (long *timeo_p,char __user *optval,int optlen) +static int sock_set_timeout (long *timeo_p,char __user *optval,int optlen,bool old_timeval) { -struct __kernel_old_timeval tv; +struct __kernel_sock_timeval tv;if (in_compat_syscall () && !COMPAT_USE_64BIT_TIME ) {struct old_timeval32 tv32;@@ -371,6 +382,15 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen)return -EFAULT ; tv.tv_sec = tv32.tv_sec; tv.tv_usec = tv32.tv_usec; + }else if (old_timeval) { +struct __kernel_old_timeval old_tv; + +if (optlen <sizeof (old_tv)) +return -EINVAL ; +if (copy_from_user (&old_tv, optval,sizeof (old_tv))) +return -EFAULT ; + tv.tv_sec = old_tv.tv_sec; + tv.tv_usec = old_tv.tv_usec; }else {if (optlen <sizeof (tv))return -EINVAL ;@@ -394,8 +414,8 @@ static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) *timeo_p =MAX_SCHEDULE_TIMEOUT ;if (tv.tv_sec ==0 && tv.tv_usec ==0 )return 0 ; -if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT /HZ -1 )) - *timeo_p = tv.tv_sec *HZ +DIV_ROUND_UP (tv.tv_usec,USEC_PER_SEC /HZ ); +if (tv.tv_sec < (MAX_SCHEDULE_TIMEOUT /HZ -1 )) + *timeo_p = tv.tv_sec *HZ +DIV_ROUND_UP ((unsigned long )tv.tv_usec,USEC_PER_SEC /HZ );return 0 ; }@@ -942,11 +962,13 @@ int sock_setsockopt(struct socket *sock, int level, int optname,break ;case SO_RCVTIMEO_OLD : - ret =sock_set_timeout (&sk->sk_rcvtimeo, optval, optlen); +case SO_RCVTIMEO_NEW : + ret =sock_set_timeout (&sk->sk_rcvtimeo, optval, optlen, optname ==SO_RCVTIMEO_OLD );break ;case SO_SNDTIMEO_OLD : - ret =sock_set_timeout (&sk->sk_sndtimeo, optval, optlen); +case SO_SNDTIMEO_NEW : + ret =sock_set_timeout (&sk->sk_sndtimeo, optval, optlen, optname ==SO_SNDTIMEO_OLD );break ;case SO_ATTACH_FILTER :@@ -1171,6 +1193,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,struct linger ling;struct old_timeval32 tm32;struct __kernel_old_timeval tm; +struct __kernel_sock_timeval stm;struct sock_txtime txtime; } v;@@ -1279,12 +1302,14 @@ int sock_getsockopt(struct socket *sock, int level, int optname, v.val = sk->sk_tsflags;break ; -case SO_RCVTIMEO : - lv =sock_get_timeout (sk->sk_rcvtimeo, &v); +case SO_RCVTIMEO_OLD : +case SO_RCVTIMEO_NEW : + lv =sock_get_timeout (sk->sk_rcvtimeo, &v,SO_RCVTIMEO_OLD == optname);break ; -case SO_SNDTIMEO : - lv =sock_get_timeout (sk->sk_sndtimeo, &v); +case SO_SNDTIMEO_OLD : +case SO_SNDTIMEO_NEW : + lv =sock_get_timeout (sk->sk_sndtimeo, &v,SO_SNDTIMEO_OLD == optname);break ;case SO_RCVLOWAT :Signature · 1 line
2.17.1
Re: [PATCH net-next v5 12/12] sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW
Quoted 3 lines
You touched powerpc in the previous patch but not this one.
That's because we use the asm-generic version I assume.
That is correct.
Quoted 1 line
Would be good to mention in the change log though to avoid any confusion.
I'm not sure how to do that now. It looks like the series has already been applied to net-next with a couple of merge conflicts fixed.
-Deepa
Michael Ellerman
reviewerRe: [PATCH net-next v5 12/12] sock: Add SO_RCVTIMEO_NEW and SO_SNDTIMEO_NEW
Quoted 10 lines · Deepa Dinamani
Quoted 3 lines
You touched powerpc in the previous patch but not this one.
That's because we use the asm-generic version I assume.
That is correct.
Quoted 1 line
Would be good to mention in the change log though to avoid any confusion.
I'm not sure how to do that now. It looks like the series has already been applied to net-next with a couple of merge conflicts fixed.
That's fine, it's not that important.
cheers