The cloned skb does not have the socket recorded of the original skb because skb_clone() clears sk_buff::sk. The original skb is never submitted but freed in hsr_forward_skb(). skb_tstamp_tx() will only submit timestamp information to the sender if the socket is recorded and the TS flags are available. As of the recent changes everything is available except the socket and the requested timestamp gets lost. This does not consider PRP part of the stack. The specification says that PTP-PRP packets do not have the RCT therefore these packets can be sent directly from userland skipping the stack. Assign the socket of the original skb to the clone so the timestamp is forwarded to the user. Signed-off-by: Sebastian Andrzej Siewior --- net/hsr/hsr_forward.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/net/hsr/hsr_forward.c b/net/hsr/hsr_forward.c index d2a11d4560309..85c8dd61ee6f8 100644 --- a/net/hsr/hsr_forward.c +++ b/net/hsr/hsr_forward.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "hsr_main.h" #include "hsr_framereg.h" @@ -347,6 +348,9 @@ struct sk_buff *hsr_create_tagged_frame(struct hsr_frame_info *frame, if (!skb) return NULL; + if (frame->req_tx_port != HSR_PT_NONE && frame->skb_std->sk) + skb_set_owner_w(skb, frame->skb_std->sk); + if (port->dev->features & NETIF_F_HW_HSR_TAG_INS) return skb; @@ -581,6 +585,8 @@ static void hsr_forward_do(struct hsr_frame_info *frame) */ if (frame->has_hsr_header && frame->skb_std) { skb = skb_clone(frame->skb_std, GFP_ATOMIC); + if (skb && frame->skb_std->sk) + skb_set_owner_w(skb, frame->skb_std->sk); goto inject_into_stack; } -- 2.55.0