return skb->tstamp;
 }
 
+static inline ktime_t skb_tstamp_cond(const struct sk_buff *skb, bool cond)
+{
+       if (!skb->mono_delivery_time && skb->tstamp)
+               return skb->tstamp;
+
+       if (static_branch_unlikely(&netstamp_needed_key) || cond)
+               return ktime_get_real();
+
+       return 0;
+}
+
 static inline u8 skb_metadata_len(const struct sk_buff *skb)
 {
        return skb_shinfo(skb)->meta_len;
 
                                    struct ioam6_schema *sc,
                                    u8 sclen, bool is_input)
 {
-       struct __kernel_sock_timeval ts;
+       struct timespec64 ts;
+       ktime_t tstamp;
        u64 raw64;
        u32 raw32;
        u16 raw16;
                if (!skb->dev) {
                        *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE);
                } else {
-                       if (!skb->tstamp)
-                               __net_timestamp(skb);
+                       tstamp = skb_tstamp_cond(skb, true);
+                       ts = ktime_to_timespec64(tstamp);
 
-                       skb_get_new_timestamp(skb, &ts);
                        *(__be32 *)data = cpu_to_be32((u32)ts.tv_sec);
                }
                data += sizeof(__be32);
                if (!skb->dev) {
                        *(__be32 *)data = cpu_to_be32(IOAM6_U32_UNAVAILABLE);
                } else {
-                       if (!skb->tstamp)
-                               __net_timestamp(skb);
+                       if (!trace->type.bit2) {
+                               tstamp = skb_tstamp_cond(skb, true);
+                               ts = ktime_to_timespec64(tstamp);
+                       }
 
-                       if (!trace->type.bit2)
-                               skb_get_new_timestamp(skb, &ts);
-
-                       *(__be32 *)data = cpu_to_be32((u32)ts.tv_usec);
+                       *(__be32 *)data = cpu_to_be32((u32)(ts.tv_nsec / NSEC_PER_USEC));
                }
                data += sizeof(__be32);
        }