The socket timestamping option SOF_TIMESTAMPING_OPT_PKTINFO needs the skb napi_id in order to provide the index of the device that captured the receive hardware timestamp. However, wireguard resets most of the skb headers, including the napi_id, which prevents the timestamping option from working as expected and applications that rely on it (e.g. chrony) from using the captured timestamps. Preserve the napi_id in wg_reset_packet() on decapsulation in order to make the timestamping option useful with wireguard tunnels and enable highly-accurate synchronization. Cc: Jason A. Donenfeld Signed-off-by: Miroslav Lichvar --- Notes: This is a minimal change that fixes the described problem for me, but I don't really understand the code well enough to see if there are any major side effects. If there is a better way to fix the option for wg or tunnels in general, please let me know. drivers/net/wireguard/queueing.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/wireguard/queueing.h b/drivers/net/wireguard/queueing.h index 79b6d70de236..bcf03bc01992 100644 --- a/drivers/net/wireguard/queueing.h +++ b/drivers/net/wireguard/queueing.h @@ -75,6 +75,7 @@ static inline bool wg_check_packet_protocol(struct sk_buff *skb) static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating) { + unsigned int napi_id = skb_napi_id(skb); u8 l4_hash = skb->l4_hash; u8 sw_hash = skb->sw_hash; u32 hash = skb->hash; @@ -84,6 +85,10 @@ static inline void wg_reset_packet(struct sk_buff *skb, bool encapsulating) skb->l4_hash = l4_hash; skb->sw_hash = sw_hash; skb->hash = hash; + } else { +#if defined(CONFIG_NET_RX_BUSY_POLL) || defined(CONFIG_XPS) + skb->napi_id = napi_id; +#endif } skb->queue_mapping = 0; skb->nohdr = 0; -- 2.51.0