syn_smc:1;      /* SYN includes SMC */
        u32     tlp_high_seq;   /* snd_nxt at the time of TLP retransmit. */
 
+       u32     tcp_tx_delay;   /* delay (in usec) added to TX packets */
        u64     tcp_wstamp_ns;  /* departure time for next sent data packet */
        u64     tcp_clock_cache; /* cache last tcp_clock_ns() (see tcp_mstamp_refresh()) */
 
        u32                       tw_last_oow_ack_time;
 
        int                       tw_ts_recent_stamp;
+       u32                       tw_tx_delay;
 #ifdef CONFIG_TCP_MD5SIG
        struct tcp_md5sig_key     *tw_md5_key;
 #endif
 
 void clean_acked_data_flush(void);
 #endif
 
+DECLARE_STATIC_KEY_FALSE(tcp_tx_delay_enabled);
+static inline void tcp_add_tx_delay(struct sk_buff *skb,
+                                   const struct tcp_sock *tp)
+{
+       if (static_branch_unlikely(&tcp_tx_delay_enabled))
+               skb->skb_mstamp_ns += (u64)tp->tcp_tx_delay * NSEC_PER_USEC;
+}
+
+static inline void tcp_set_tx_time(struct sk_buff *skb,
+                                  const struct sock *sk)
+{
+       if (static_branch_unlikely(&tcp_tx_delay_enabled)) {
+               u32 delay = (sk->sk_state == TCP_TIME_WAIT) ?
+                       tcp_twsk(sk)->tw_tx_delay : tcp_sk(sk)->tcp_tx_delay;
+
+               skb->skb_mstamp_ns = tcp_clock_ns() + (u64)delay * NSEC_PER_USEC;
+       }
+}
+
 #endif /* _TCP_H */
 
 
 #define TCP_CM_INQ             TCP_INQ
 
+#define TCP_TX_DELAY           37      /* delay outgoing packets by XX usec */
+
+
 #define TCP_REPAIR_ON          1
 #define TCP_REPAIR_OFF         0
 #define TCP_REPAIR_OFF_NO_WP   -1      /* Turn off without window probes */
 
        return 0;
 }
 
+DEFINE_STATIC_KEY_FALSE(tcp_tx_delay_enabled);
+EXPORT_SYMBOL(tcp_tx_delay_enabled);
+
+static void tcp_enable_tx_delay(void)
+{
+       if (!static_branch_unlikely(&tcp_tx_delay_enabled)) {
+               static int __tcp_tx_delay_enabled = 0;
+
+               if (cmpxchg(&__tcp_tx_delay_enabled, 0, 1) == 0) {
+                       static_branch_enable(&tcp_tx_delay_enabled);
+                       pr_info("TCP_TX_DELAY enabled\n");
+               }
+       }
+}
+
 /*
  *     Socket option code for TCP.
  */
                else
                        tp->recvmsg_inq = val;
                break;
+       case TCP_TX_DELAY:
+               if (val)
+                       tcp_enable_tx_delay();
+               tp->tcp_tx_delay = val;
+               break;
        default:
                err = -ENOPROTOOPT;
                break;
                val = tp->fastopen_no_cookie;
                break;
 
+       case TCP_TX_DELAY:
+               val = tp->tcp_tx_delay;
+               break;
+
        case TCP_TIMESTAMP:
                val = tcp_time_stamp_raw() + tp->tsoffset;
                break;
 
        arg.uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL);
        local_bh_disable();
        ctl_sk = this_cpu_read(*net->ipv4.tcp_sk);
-       if (sk)
+       if (sk) {
                ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ?
                                   inet_twsk(sk)->tw_mark : sk->sk_mark;
+               tcp_set_tx_time(skb, sk);
+       }
        ip_send_unicast_reply(ctl_sk,
                              skb, &TCP_SKB_CB(skb)->header.h4.opt,
                              ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
        arg.uid = sock_net_uid(net, sk_fullsock(sk) ? sk : NULL);
        local_bh_disable();
        ctl_sk = this_cpu_read(*net->ipv4.tcp_sk);
-       if (sk)
-               ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ?
-                                  inet_twsk(sk)->tw_mark : sk->sk_mark;
+       ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ?
+                          inet_twsk(sk)->tw_mark : sk->sk_mark;
+       tcp_set_tx_time(skb, sk);
        ip_send_unicast_reply(ctl_sk,
                              skb, &TCP_SKB_CB(skb)->header.h4.opt,
                              ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
 
                tcptw->tw_ts_recent_stamp = tp->rx_opt.ts_recent_stamp;
                tcptw->tw_ts_offset     = tp->tsoffset;
                tcptw->tw_last_oow_ack_time = 0;
-
+               tcptw->tw_tx_delay      = tp->tcp_tx_delay;
 #if IS_ENABLED(CONFIG_IPV6)
                if (tw->tw_family == PF_INET6) {
                        struct ipv6_pinfo *np = inet6_sk(sk);
 
        memset(skb->cb, 0, max(sizeof(struct inet_skb_parm),
                               sizeof(struct inet6_skb_parm)));
 
+       tcp_add_tx_delay(skb, tp);
+
        err = icsk->icsk_af_ops->queue_xmit(sk, skb, &inet->cork.fl);
 
        if (unlikely(err > 0)) {
                              sock_net(sk)->ipv4.sysctl_tcp_limit_output_bytes);
        limit <<= factor;
 
+       if (static_branch_unlikely(&tcp_tx_delay_enabled) &&
+           tcp_sk(sk)->tcp_tx_delay) {
+               u64 extra_bytes = (u64)sk->sk_pacing_rate * tcp_sk(sk)->tcp_tx_delay;
+
+               /* TSQ is based on skb truesize sum (sk_wmem_alloc), so we
+                * approximate our needs assuming an ~100% skb->truesize overhead.
+                * USEC_PER_SEC is approximated by 2^20.
+                * do_div(extra_bytes, USEC_PER_SEC/2) is replaced by a right shift.
+                */
+               extra_bytes >>= (20 - 1);
+               limit += extra_bytes;
+       }
        if (refcount_read(&sk->sk_wmem_alloc) > limit) {
                /* Always send skb if rtx queue is empty.
                 * No need to wait for TX completion to call us back,
        int tcp_header_size;
        struct tcphdr *th;
        int mss;
+       u64 now;
 
        skb = alloc_skb(MAX_TCP_HEADER, GFP_ATOMIC);
        if (unlikely(!skb)) {
        mss = tcp_mss_clamp(tp, dst_metric_advmss(dst));
 
        memset(&opts, 0, sizeof(opts));
+       now = tcp_clock_ns();
 #ifdef CONFIG_SYN_COOKIES
        if (unlikely(req->cookie_ts))
                skb->skb_mstamp_ns = cookie_init_timestamp(req);
        else
 #endif
        {
-               skb->skb_mstamp_ns = tcp_clock_ns();
+               skb->skb_mstamp_ns = now;
                if (!tcp_rsk(req)->snt_synack) /* Timestamp first SYNACK */
                        tcp_rsk(req)->snt_synack = tcp_skb_timestamp_us(skb);
        }
        rcu_read_unlock();
 #endif
 
-       /* Do not fool tcpdump (if any), clean our debris */
-       skb->tstamp = 0;
+       skb->skb_mstamp_ns = now;
+       tcp_add_tx_delay(skb, tp);
+
        return skb;
 }
 EXPORT_SYMBOL(tcp_make_synack);
 
                } else {
                        mark = sk->sk_mark;
                }
+               tcp_set_tx_time(buff, sk);
        }
        fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark) ?: mark;
        fl6.fl6_dport = t1->dest;