summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/ipv4/udp.c4
-rw-r--r--net/ipv6/udp.c4
2 files changed, 8 insertions, 0 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 794aeafeb782..dd3102a37ef9 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -786,11 +786,14 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4,
786 return -EINVAL; 786 return -EINVAL;
787 if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS) 787 if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS)
788 return -EINVAL; 788 return -EINVAL;
789 if (sk->sk_no_check_tx)
790 return -EINVAL;
789 if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite) 791 if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite)
790 return -EIO; 792 return -EIO;
791 793
792 skb_shinfo(skb)->gso_size = cork->gso_size; 794 skb_shinfo(skb)->gso_size = cork->gso_size;
793 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; 795 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4;
796 goto csum_partial;
794 } 797 }
795 798
796 if (is_udplite) /* UDP-Lite */ 799 if (is_udplite) /* UDP-Lite */
@@ -802,6 +805,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4,
802 goto send; 805 goto send;
803 806
804 } else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */ 807 } else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */
808csum_partial:
805 809
806 udp4_hwcsum(skb, fl4->saddr, fl4->daddr); 810 udp4_hwcsum(skb, fl4->saddr, fl4->daddr);
807 goto send; 811 goto send;
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index 6acfdd3e442b..a34e28ac03a7 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -1051,11 +1051,14 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
1051 return -EINVAL; 1051 return -EINVAL;
1052 if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS) 1052 if (skb->len > cork->gso_size * UDP_MAX_SEGMENTS)
1053 return -EINVAL; 1053 return -EINVAL;
1054 if (udp_sk(sk)->no_check6_tx)
1055 return -EINVAL;
1054 if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite) 1056 if (skb->ip_summed != CHECKSUM_PARTIAL || is_udplite)
1055 return -EIO; 1057 return -EIO;
1056 1058
1057 skb_shinfo(skb)->gso_size = cork->gso_size; 1059 skb_shinfo(skb)->gso_size = cork->gso_size;
1058 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; 1060 skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4;
1061 goto csum_partial;
1059 } 1062 }
1060 1063
1061 if (is_udplite) 1064 if (is_udplite)
@@ -1064,6 +1067,7 @@ static int udp_v6_send_skb(struct sk_buff *skb, struct flowi6 *fl6,
1064 skb->ip_summed = CHECKSUM_NONE; 1067 skb->ip_summed = CHECKSUM_NONE;
1065 goto send; 1068 goto send;
1066 } else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */ 1069 } else if (skb->ip_summed == CHECKSUM_PARTIAL) { /* UDP hardware csum */
1070csum_partial:
1067 udp6_hwcsum_outgoing(sk, skb, &fl6->saddr, &fl6->daddr, len); 1071 udp6_hwcsum_outgoing(sk, skb, &fl6->saddr, &fl6->daddr, len);
1068 goto send; 1072 goto send;
1069 } else 1073 } else