|
@@ -422,13 +422,25 @@ static void sock_warn_obsolete_bsdism(const char *name)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static bool sock_needs_netstamp(const struct sock *sk)
|
|
|
+{
|
|
|
+ switch (sk->sk_family) {
|
|
|
+ case AF_UNSPEC:
|
|
|
+ case AF_UNIX:
|
|
|
+ return false;
|
|
|
+ default:
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#define SK_FLAGS_TIMESTAMP ((1UL << SOCK_TIMESTAMP) | (1UL << SOCK_TIMESTAMPING_RX_SOFTWARE))
|
|
|
|
|
|
static void sock_disable_timestamp(struct sock *sk, unsigned long flags)
|
|
|
{
|
|
|
if (sk->sk_flags & flags) {
|
|
|
sk->sk_flags &= ~flags;
|
|
|
- if (!(sk->sk_flags & SK_FLAGS_TIMESTAMP))
|
|
|
+ if (sock_needs_netstamp(sk) &&
|
|
|
+ !(sk->sk_flags & SK_FLAGS_TIMESTAMP))
|
|
|
net_disable_timestamp();
|
|
|
}
|
|
|
}
|
|
@@ -1582,7 +1594,8 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
|
|
|
if (newsk->sk_prot->sockets_allocated)
|
|
|
sk_sockets_allocated_inc(newsk);
|
|
|
|
|
|
- if (newsk->sk_flags & SK_FLAGS_TIMESTAMP)
|
|
|
+ if (sock_needs_netstamp(sk) &&
|
|
|
+ newsk->sk_flags & SK_FLAGS_TIMESTAMP)
|
|
|
net_enable_timestamp();
|
|
|
}
|
|
|
out:
|
|
@@ -2510,7 +2523,8 @@ void sock_enable_timestamp(struct sock *sk, int flag)
|
|
|
* time stamping, but time stamping might have been on
|
|
|
* already because of the other one
|
|
|
*/
|
|
|
- if (!(previous_flags & SK_FLAGS_TIMESTAMP))
|
|
|
+ if (sock_needs_netstamp(sk) &&
|
|
|
+ !(previous_flags & SK_FLAGS_TIMESTAMP))
|
|
|
net_enable_timestamp();
|
|
|
}
|
|
|
}
|