diff options
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r-- | net/ipv4/udp.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index cf755156a684..14bc654b6842 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -821,6 +821,7 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, | |||
821 | int is_udplite = IS_UDPLITE(sk); | 821 | int is_udplite = IS_UDPLITE(sk); |
822 | int offset = skb_transport_offset(skb); | 822 | int offset = skb_transport_offset(skb); |
823 | int len = skb->len - offset; | 823 | int len = skb->len - offset; |
824 | int datalen = len - sizeof(*uh); | ||
824 | __wsum csum = 0; | 825 | __wsum csum = 0; |
825 | 826 | ||
826 | /* | 827 | /* |
@@ -854,10 +855,12 @@ static int udp_send_skb(struct sk_buff *skb, struct flowi4 *fl4, | |||
854 | return -EIO; | 855 | return -EIO; |
855 | } | 856 | } |
856 | 857 | ||
857 | skb_shinfo(skb)->gso_size = cork->gso_size; | 858 | if (datalen > cork->gso_size) { |
858 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; | 859 | skb_shinfo(skb)->gso_size = cork->gso_size; |
859 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(len - sizeof(uh), | 860 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP_L4; |
860 | cork->gso_size); | 861 | skb_shinfo(skb)->gso_segs = DIV_ROUND_UP(datalen, |
862 | cork->gso_size); | ||
863 | } | ||
861 | goto csum_partial; | 864 | goto csum_partial; |
862 | } | 865 | } |
863 | 866 | ||
@@ -1969,7 +1972,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb) | |||
1969 | */ | 1972 | */ |
1970 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) | 1973 | if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) |
1971 | goto drop; | 1974 | goto drop; |
1972 | nf_reset(skb); | 1975 | nf_reset_ct(skb); |
1973 | 1976 | ||
1974 | if (static_branch_unlikely(&udp_encap_needed_key) && up->encap_type) { | 1977 | if (static_branch_unlikely(&udp_encap_needed_key) && up->encap_type) { |
1975 | int (*encap_rcv)(struct sock *sk, struct sk_buff *skb); | 1978 | int (*encap_rcv)(struct sock *sk, struct sk_buff *skb); |
@@ -2298,7 +2301,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | |||
2298 | 2301 | ||
2299 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) | 2302 | if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) |
2300 | goto drop; | 2303 | goto drop; |
2301 | nf_reset(skb); | 2304 | nf_reset_ct(skb); |
2302 | 2305 | ||
2303 | /* No socket. Drop packet silently, if checksum is wrong */ | 2306 | /* No socket. Drop packet silently, if checksum is wrong */ |
2304 | if (udp_lib_checksum_complete(skb)) | 2307 | if (udp_lib_checksum_complete(skb)) |