#include <linux/init.h>
 #include <linux/moduleparam.h>
 #include <linux/rtnetlink.h>
+#include <linux/net_tstamp.h>
 #include <net/rtnetlink.h>
 #include <linux/u64_stats_sync.h>
 
        dstats->tx_bytes += skb->len;
        u64_stats_update_end(&dstats->syncp);
 
+       skb_tx_timestamp(skb);
        dev_kfree_skb(skb);
        return NETDEV_TX_OK;
 }
        strlcpy(info->version, DRV_VERSION, sizeof(info->version));
 }
 
+static int dummy_get_ts_info(struct net_device *dev,
+                             struct ethtool_ts_info *ts_info)
+{
+       ts_info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
+                                  SOF_TIMESTAMPING_RX_SOFTWARE |
+                                  SOF_TIMESTAMPING_SOFTWARE;
+
+       ts_info->phc_index = -1;
+
+       return 0;
+};
+
 static const struct ethtool_ops dummy_ethtool_ops = {
        .get_drvinfo            = dummy_get_drvinfo,
+       .get_ts_info            = dummy_get_ts_info,
 };
 
 static void dummy_free_netdev(struct net_device *dev)
 
 #include <linux/ip.h>
 #include <linux/tcp.h>
 #include <linux/percpu.h>
+#include <linux/net_tstamp.h>
 #include <net/net_namespace.h>
 #include <linux/u64_stats_sync.h>
 
        struct pcpu_lstats *lb_stats;
        int len;
 
+       skb_tx_timestamp(skb);
        skb_orphan(skb);
 
        /* Before queueing this packet to netif_rx(),
        return 1;
 }
 
+static int loopback_get_ts_info(struct net_device *netdev,
+                               struct ethtool_ts_info *ts_info)
+{
+       ts_info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
+                                  SOF_TIMESTAMPING_RX_SOFTWARE |
+                                  SOF_TIMESTAMPING_SOFTWARE;
+
+       ts_info->phc_index = -1;
+
+       return 0;
+};
+
 static const struct ethtool_ops loopback_ethtool_ops = {
        .get_link               = always_on,
+       .get_ts_info            = loopback_get_ts_info,
 };
 
 static int loopback_dev_init(struct net_device *dev)