diff options
Diffstat (limited to 'include/net/udp.h')
| -rw-r--r-- | include/net/udp.h | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/include/net/udp.h b/include/net/udp.h index d8ce937bc395..79d141d2103b 100644 --- a/include/net/udp.h +++ b/include/net/udp.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */  /*   * INET		An implementation of the TCP/IP protocol suite for the LINUX   *		operating system.  INET is implemented using the  BSD Socket @@ -13,11 +14,6 @@   * Fixes:   *		Alan Cox	: Turned on udp checksums. I don't want to   *				  chase 'memory corruption' bugs that aren't! - * - *		This program is free software; you can redistribute it and/or - *		modify it under the terms of the GNU General Public License - *		as published by the Free Software Foundation; either version - *		2 of the License, or (at your option) any later version.   */  #ifndef _UDP_H  #define _UDP_H @@ -471,12 +467,19 @@ void udpv6_encap_enable(void);  static inline struct sk_buff *udp_rcv_segment(struct sock *sk,  					      struct sk_buff *skb, bool ipv4)  { +	netdev_features_t features = NETIF_F_SG;  	struct sk_buff *segs; +	/* Avoid csum recalculation by skb_segment unless userspace explicitly +	 * asks for the final checksum values +	 */ +	if (!inet_get_convert_csum(sk)) +		features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM; +  	/* the GSO CB lays after the UDP one, no need to save and restore any  	 * CB fragment  	 */ -	segs = __skb_gso_segment(skb, NETIF_F_SG, false); +	segs = __skb_gso_segment(skb, features, false);  	if (unlikely(IS_ERR_OR_NULL(segs))) {  		int segs_nr = skb_shinfo(skb)->gso_segs;  | 
