diff options
-rw-r--r-- | net/ipv4/udp.c | 4 | ||||
-rw-r--r-- | net/ipv6/udp.c | 4 |
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 */ |
808 | csum_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 */ |
1070 | csum_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 |