summaryrefslogtreecommitdiffstats
path: root/net/ipv4/udp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/udp.c')
-rw-r--r--net/ipv4/udp.c15
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))