diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 2dde34c29203..58586d56b19f 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -820,6 +820,10 @@ typedef unsigned char *sk_buff_data_t;
  *		delivery_time in mono clock base (i.e. EDT).  Otherwise, the
  *		skb->tstamp has the (rcv) timestamp at ingress and
  *		delivery_time at egress.
+ *		This bit is also set for tstamp coming from userspace which
+ *		acts as an information in the bridge forwarding path to avoid
+ *		resetting the tstamp value when user sets the timestamp using
+ *		SO_TXTIME sockopts.
  *	@napi_id: id of the NAPI struct this skb came from
  *	@sender_cpu: (aka @napi_id) source CPU in XPS
  *	@alloc_cpu: CPU which did the skb allocation.
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 5b5a0adb927f..4ae6aea8f8d6 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -1455,6 +1455,13 @@ struct sk_buff *__ip_make_skb(struct sock *sk,
 	skb->priority = (cork->tos != -1) ? cork->priority: READ_ONCE(sk->sk_priority);
 	skb->mark = cork->mark;
 	skb->tstamp = cork->transmit_time;
+	/* Timestamp coming from userspace using CMSG is stored as part
+	 * of transmit_time as part of cork. To ensure bridge does not
+	 * drop the tstamp in the forwarding path.We are reusing bit
+	 * mono_delivery_time to avoid reset of tstamp in bridge
+	 * forwarding path.
+	 */
+	skb->mono_delivery_time = !!skb->tstamp;
 	/*
 	 * Steal rt from cork.dst to avoid a pair of atomic_inc/atomic_dec
 	 * on dst refcount
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
index aea89326c697..6e67c0203be8 100644
--- a/net/ipv4/raw.c
+++ b/net/ipv4/raw.c
@@ -353,6 +353,13 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
 	skb->priority = READ_ONCE(sk->sk_priority);
 	skb->mark = sockc->mark;
 	skb->tstamp = sockc->transmit_time;
+	/* Timestamp coming from userspace using CMSG is stored as part
+	 * of transmit_time as part of sockcmcookie. To ensure bridge does not
+	 * drop the tstamp in the forwarding path. We are reusing bit
+	 * mono_delivery_time to avoid reset of tstamp in bridge
+	 * forwarding path.
+	 */
+	skb->mono_delivery_time = !!skb->tstamp;
 	skb_dst_set(skb, &rt->dst);
 	*rtp = NULL;
 
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index a722a43dd668..f5b5e13a920f 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1922,7 +1922,13 @@ struct sk_buff *__ip6_make_skb(struct sock *sk,
 	skb->priority = READ_ONCE(sk->sk_priority);
 	skb->mark = cork->base.mark;
 	skb->tstamp = cork->base.transmit_time;
-
+	/* Timestamp coming from userspace using CMSG is stored as part
+	 * of transmit_time as part of cork. To ensure bridge does not
+	 * drop the tstamp in the forwarding path. We are reusing bit
+	 * mono_delivery_time to avoid reset of tstamp in bridge
+	 * forwarding path.
+	 */
+	skb->mono_delivery_time = !!skb->tstamp;
 	ip6_cork_steal_dst(skb, cork);
 	IP6_INC_STATS(net, rt->rt6i_idev, IPSTATS_MIB_OUTREQUESTS);
 	if (proto == IPPROTO_ICMPV6) {
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c
index 03dbb874c363..d2e2a1ec3de4 100644
--- a/net/ipv6/raw.c
+++ b/net/ipv6/raw.c
@@ -616,7 +616,13 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,
 	skb->priority = READ_ONCE(sk->sk_priority);
 	skb->mark = sockc->mark;
 	skb->tstamp = sockc->transmit_time;
-
+	/* Timestamp coming from userspace using CMSG is stored as part
+	 * of transmit_time as part of sockcmcookie. To ensure bridge does not
+	 * drop the tstamp in the forwarding path.We are reusing bit
+	 * mono_delivery_time to avoid reset of tstamp in bridge
+	 * forwarding path.
+	 */
+	skb->mono_delivery_time = !!skb->tstamp;
 	skb_put(skb, length);
 	skb_reset_network_header(skb);
 	iph = ipv6_hdr(skb);
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index c9bbc2686690..949e936b5786 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -2057,7 +2057,13 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg,
 	skb->priority = READ_ONCE(sk->sk_priority);
 	skb->mark = READ_ONCE(sk->sk_mark);
 	skb->tstamp = sockc.transmit_time;
-
+	/* Timestamp coming from userspace using CMSG is stored as part
+	 * of transmit_time as part of sockcmcookie. To ensure bridge does not
+	 * drop the tstamp in the forwarding path. We are reusing bit
+	 * mono_delivery_time to avoid reset of tstamp in bridge
+	 * forwarding path.
+	 */
+	skb->mono_delivery_time = !!skb->tstamp;
 	skb_setup_tx_timestamp(skb, sockc.tsflags);
 
 	if (unlikely(extra_len == 4))
