The maximum receive socket buffer size in bytes.
 
+tstamp_allow_data
+-----------------
+Allow processes to receive tx timestamps looped together with the original
+packet contents. If disabled, transmit timestamp requests from unprivileged
+processes are dropped unless socket option SOF_TIMESTAMPING_OPT_TSONLY is set.
+Default: 1 (on)
+
+
 wmem_default
 ------------
 
 
 extern __u32 sysctl_wmem_max;
 extern __u32 sysctl_rmem_max;
 
+extern int sysctl_tstamp_allow_data;
 extern int sysctl_optmem_max;
 
 extern __u32 sysctl_wmem_default;
 
 #include <asm/uaccess.h>
 #include <trace/events/skb.h>
 #include <linux/highmem.h>
+#include <linux/capability.h>
+#include <linux/user_namespace.h>
 
 struct kmem_cache *skbuff_head_cache __read_mostly;
 static struct kmem_cache *skbuff_fclone_cache __read_mostly;
                kfree_skb(skb);
 }
 
+static bool skb_may_tx_timestamp(struct sock *sk, bool tsonly)
+{
+       bool ret;
+
+       if (likely(sysctl_tstamp_allow_data || tsonly))
+               return true;
+
+       read_lock_bh(&sk->sk_callback_lock);
+       ret = sk->sk_socket && sk->sk_socket->file &&
+             file_ns_capable(sk->sk_socket->file, &init_user_ns, CAP_NET_RAW);
+       read_unlock_bh(&sk->sk_callback_lock);
+       return ret;
+}
+
 void skb_complete_tx_timestamp(struct sk_buff *skb,
                               struct skb_shared_hwtstamps *hwtstamps)
 {
        struct sock *sk = skb->sk;
 
+       if (!skb_may_tx_timestamp(sk, false))
+               return;
+
        /* take a reference to prevent skb_orphan() from freeing the socket */
        sock_hold(sk);
 
        struct sk_buff *skb;
        bool tsonly = sk->sk_tsflags & SOF_TIMESTAMPING_OPT_TSONLY;
 
-       if (!sk)
+       if (!sk || !skb_may_tx_timestamp(sk, tsonly))
                return;
 
        if (tsonly)
 
 int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512);
 EXPORT_SYMBOL(sysctl_optmem_max);
 
+int sysctl_tstamp_allow_data __read_mostly = 1;
+
 struct static_key memalloc_socks = STATIC_KEY_INIT_FALSE;
 EXPORT_SYMBOL_GPL(memalloc_socks);
 
                        ret = -EINVAL;
                        break;
                }
+
                if (val & SOF_TIMESTAMPING_OPT_ID &&
                    !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) {
                        if (sk->sk_protocol == IPPROTO_TCP) {
 
                .mode           = 0644,
                .proc_handler   = proc_dointvec
        },
+       {
+               .procname       = "tstamp_allow_data",
+               .data           = &sysctl_tstamp_allow_data,
+               .maxlen         = sizeof(int),
+               .mode           = 0644,
+               .proc_handler   = proc_dointvec_minmax,
+               .extra1         = &zero,
+               .extra2         = &one
+       },
 #ifdef CONFIG_RPS
        {
                .procname       = "rps_sock_flow_entries",