diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 5552d13..8a27090 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1370,7 +1370,12 @@ alloc_new_skb:
 			/*
 			 *	Fill in the control structures
 			 */
-			skb->ip_summed = CHECKSUM_NONE;
+			if ((sk->sk_protocol == IPPROTO_ICMPV6 ||
+			     sk->sk_protocol == IPPROTO_UDP) &&
+			    rt->dst.dev->features & NETIF_F_HW_CSUM)
+				skb->ip_summed = CHECKSUM_PARTIAL;
+			else
+				skb->ip_summed = CHECKSUM_NONE;
 			skb->csum = 0;
 			/* reserve for fragmentation and ipsec header */
 			skb_reserve(skb, hh_len + sizeof(struct frag_hdr) +
