sock: expose so_timestamping options for mptcp
authorFlorian Westphal <fw@strlen.de>
Thu, 3 Jun 2021 23:24:28 +0000 (16:24 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Jun 2021 21:08:09 +0000 (14:08 -0700)
Similar to previous patch: expose SO_TIMESTAMPING helper so we do not
have to copy & paste this into the mptcp core.

Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/sock.h
net/core/sock.c

index 7e0116b..9b341c2 100644 (file)
@@ -2744,6 +2744,8 @@ void sock_def_readable(struct sock *sk);
 
 int sock_bindtoindex(struct sock *sk, int ifindex, bool lock_sk);
 void sock_set_timestamp(struct sock *sk, int optname, bool valbool);
+int sock_set_timestamping(struct sock *sk, int optname, int val);
+
 void sock_enable_timestamps(struct sock *sk);
 void sock_no_linger(struct sock *sk);
 void sock_set_keepalive(struct sock *sk);
index 5b85dd3..bd887cb 100644 (file)
@@ -794,6 +794,40 @@ void sock_set_timestamp(struct sock *sk, int optname, bool valbool)
        }
 }
 
+int sock_set_timestamping(struct sock *sk, int optname, int val)
+{
+       if (val & ~SOF_TIMESTAMPING_MASK)
+               return -EINVAL;
+
+       if (val & SOF_TIMESTAMPING_OPT_ID &&
+           !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) {
+               if (sk->sk_protocol == IPPROTO_TCP &&
+                   sk->sk_type == SOCK_STREAM) {
+                       if ((1 << sk->sk_state) &
+                           (TCPF_CLOSE | TCPF_LISTEN))
+                               return -EINVAL;
+                       sk->sk_tskey = tcp_sk(sk)->snd_una;
+               } else {
+                       sk->sk_tskey = 0;
+               }
+       }
+
+       if (val & SOF_TIMESTAMPING_OPT_STATS &&
+           !(val & SOF_TIMESTAMPING_OPT_TSONLY))
+               return -EINVAL;
+
+       sk->sk_tsflags = val;
+       sock_valbool_flag(sk, SOCK_TSTAMP_NEW, optname == SO_TIMESTAMPING_NEW);
+
+       if (val & SOF_TIMESTAMPING_RX_SOFTWARE)
+               sock_enable_timestamp(sk,
+                                     SOCK_TIMESTAMPING_RX_SOFTWARE);
+       else
+               sock_disable_timestamp(sk,
+                                      (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
+       return 0;
+}
+
 void sock_set_keepalive(struct sock *sk)
 {
        lock_sock(sk);
@@ -1012,43 +1046,10 @@ set_sndbuf:
        case SO_TIMESTAMPNS_NEW:
                sock_set_timestamp(sk, valbool, optname);
                break;
+
        case SO_TIMESTAMPING_NEW:
        case SO_TIMESTAMPING_OLD:
-               if (val & ~SOF_TIMESTAMPING_MASK) {
-                       ret = -EINVAL;
-                       break;
-               }
-
-               if (val & SOF_TIMESTAMPING_OPT_ID &&
-                   !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) {
-                       if (sk->sk_protocol == IPPROTO_TCP &&
-                           sk->sk_type == SOCK_STREAM) {
-                               if ((1 << sk->sk_state) &
-                                   (TCPF_CLOSE | TCPF_LISTEN)) {
-                                       ret = -EINVAL;
-                                       break;
-                               }
-                               sk->sk_tskey = tcp_sk(sk)->snd_una;
-                       } else {
-                               sk->sk_tskey = 0;
-                       }
-               }
-
-               if (val & SOF_TIMESTAMPING_OPT_STATS &&
-                   !(val & SOF_TIMESTAMPING_OPT_TSONLY)) {
-                       ret = -EINVAL;
-                       break;
-               }
-
-               sk->sk_tsflags = val;
-               sock_valbool_flag(sk, SOCK_TSTAMP_NEW, optname == SO_TIMESTAMPING_NEW);
-
-               if (val & SOF_TIMESTAMPING_RX_SOFTWARE)
-                       sock_enable_timestamp(sk,
-                                             SOCK_TIMESTAMPING_RX_SOFTWARE);
-               else
-                       sock_disable_timestamp(sk,
-                                              (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE));
+               ret = sock_set_timestamping(sk, optname, val);
                break;
 
        case SO_RCVLOWAT: