|
@@ -1051,11 +1051,14 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
|
|
|
return -EINVAL;
|
|
|
if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS)
|
|
|
return -EINVAL;
|
|
|
+ if (udp_sk(sk)->no_check6_tx)
|
|
|
+ return -EINVAL;
|
|
|
if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite)
|
|
|
return -EIO;
|
|
|
|
|
|
skb_shinfo(skb)->gso_size = cork->gso_size;
|
|
|
skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4;
|
|
|
+ goto csum_partial;
|
|
|
}
|
|
|
|
|
|
if (is_udplite)
|
|
@@ -1064,6 +1067,7 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
|
|
|
skb->ip_summed = CHECKSUM_NONE;
|
|
|
goto send;
|
|
|
} else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */
|
|
|
+csum_partial:
|
|
|
udp6_hwcsum_outgoing(sk, skb, &fl6->saddr, &fl6->daddr, len);
|
|
|
goto send;
|
|
|
} else
|