/* generate software time stamp when entering packet scheduling */
        SKBTX_SCHED_TSTAMP = 1 << 6,
+
+       /* generate software timestamp on peer data acknowledgment */
+       SKBTX_ACK_TSTAMP = 1 << 7,
 };
 
-#define SKBTX_ANY_SW_TSTAMP    (SKBTX_SW_TSTAMP | SKBTX_SCHED_TSTAMP)
+#define SKBTX_ANY_SW_TSTAMP    (SKBTX_SW_TSTAMP    | \
+                                SKBTX_SCHED_TSTAMP | \
+                                SKBTX_ACK_TSTAMP)
 #define SKBTX_ANY_TSTAMP       (SKBTX_HW_TSTAMP | SKBTX_ANY_SW_TSTAMP)
 
 /*
 
 enum {
        SCM_TSTAMP_SND,         /* driver passed skb to NIC, or HW */
        SCM_TSTAMP_SCHED,       /* data entered the packet scheduler */
+       SCM_TSTAMP_ACK,         /* data acknowledged by peer */
 };
 
 #endif /* _UAPI_LINUX_ERRQUEUE_H */
 
        SOF_TIMESTAMPING_RAW_HARDWARE = (1<<6),
        SOF_TIMESTAMPING_OPT_ID = (1<<7),
        SOF_TIMESTAMPING_TX_SCHED = (1<<8),
+       SOF_TIMESTAMPING_TX_ACK = (1<<9),
 
-       SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_TX_SCHED,
+       SOF_TIMESTAMPING_LAST = SOF_TIMESTAMPING_TX_ACK,
        SOF_TIMESTAMPING_MASK = (SOF_TIMESTAMPING_LAST - 1) |
                                 SOF_TIMESTAMPING_LAST
 };
 
 #include <linux/ipsec.h>
 #include <asm/unaligned.h>
 #include <net/netdma.h>
+#include <linux/errqueue.h>
 
 int sysctl_tcp_timestamps __read_mostly = 1;
 int sysctl_tcp_window_scaling __read_mostly = 1;
                        tp->retrans_stamp = 0;
                }
 
+               if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_ACK_TSTAMP) &&
+                   between(skb_shinfo(skb)->tskey, prior_snd_una,
+                           tp->snd_una + 1))
+                       __skb_tstamp_tx(skb, NULL, sk, SCM_TSTAMP_ACK);
+
                if (!fully_acked)
                        break;
 
 
                *tx_flags |= SKBTX_SW_TSTAMP;
        if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_SCHED)
                *tx_flags |= SKBTX_SCHED_TSTAMP;
+       if (sk->sk_tsflags & SOF_TIMESTAMPING_TX_ACK)
+               *tx_flags |= SKBTX_ACK_TSTAMP;
 
        if (sock_flag(sk, SOCK_WIFI_STATUS))
                *tx_flags |= SKBTX_WIFI_STATUS;