sock: expose so_timestamping options for mptcp
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>
This commit is contained in:
parent
371087aa47
commit
ced122d90f
@ -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);
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user