if (igc_test_staterr(rx_desc, IGC_RXDADV_STAT_TSIP)) {
                        timestamp = igc_ptp_rx_pktstamp(q_vector->adapter,
                                                        pktbuf);
+                       ctx.rx_ts = timestamp;
                        pkt_offset = IGC_TS_HDR_LEN;
                        size -= IGC_TS_HDR_LEN;
                }
                if (igc_test_staterr(desc, IGC_RXDADV_STAT_TSIP)) {
                        timestamp = igc_ptp_rx_pktstamp(q_vector->adapter,
                                                        bi->xdp->data);
+                       ctx->rx_ts = timestamp;
 
                        bi->xdp->data += IGC_TS_HDR_LEN;
 
        return 0;
 }
 
+static int igc_xdp_rx_timestamp(const struct xdp_md *_ctx, u64 *timestamp)
+{
+       const struct igc_xdp_buff *ctx = (void *)_ctx;
+
+       if (igc_test_staterr(ctx->rx_desc, IGC_RXDADV_STAT_TSIP)) {
+               *timestamp = ctx->rx_ts;
+
+               return 0;
+       }
+
+       return -ENODATA;
+}
+
 static const struct xdp_metadata_ops igc_xdp_metadata_ops = {
        .xmo_rx_hash                    = igc_xdp_rx_hash,
+       .xmo_rx_timestamp               = igc_xdp_rx_timestamp,
 };
 
 /**