forked from mirrors/linux
		
	udp: add gso support to virtual devices
Virtual devices such as tunnels and bonding can handle large packets. Only segment packets when reaching a physical or loopback device. Signed-off-by: Willem de Bruijn <willemb@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									2e8de85763
								
							
						
					
					
						commit
						83aa025f53
					
				
					 4 changed files with 13 additions and 1 deletions
				
			
		|  | @ -113,6 +113,13 @@ whatever headers there might be. | |||
| NETIF_F_TSO_ECN means that hardware can properly split packets with CWR bit | ||||
| set, be it TCPv4 (when NETIF_F_TSO is enabled) or TCPv6 (NETIF_F_TSO6). | ||||
| 
 | ||||
|  * Transmit UDP segmentation offload | ||||
| 
 | ||||
| NETIF_F_GSO_UDP_GSO_L4 accepts a single UDP header with a payload that exceeds | ||||
| gso_size. On segmentation, it segments the payload on gso_size boundaries and | ||||
| replicates the network and UDP headers (fixing up the last one if less than | ||||
| gso_size). | ||||
| 
 | ||||
|  * Transmit DMA from high memory | ||||
| 
 | ||||
| On platforms where this is relevant, NETIF_F_HIGHDMA signals that | ||||
|  |  | |||
|  | @ -55,8 +55,9 @@ enum { | |||
| 	NETIF_F_GSO_SCTP_BIT,		/* ... SCTP fragmentation */ | ||||
| 	NETIF_F_GSO_ESP_BIT,		/* ... ESP with TSO */ | ||||
| 	NETIF_F_GSO_UDP_BIT,		/* ... UFO, deprecated except tuntap */ | ||||
| 	NETIF_F_GSO_UDP_L4_BIT,		/* ... UDP payload GSO (not UFO) */ | ||||
| 	/**/NETIF_F_GSO_LAST =		/* last bit, see GSO_MASK */ | ||||
| 		NETIF_F_GSO_UDP_BIT, | ||||
| 		NETIF_F_GSO_UDP_L4_BIT, | ||||
| 
 | ||||
| 	NETIF_F_FCOE_CRC_BIT,		/* FCoE CRC32 */ | ||||
| 	NETIF_F_SCTP_CRC_BIT,		/* SCTP checksum offload */ | ||||
|  | @ -147,6 +148,7 @@ enum { | |||
| #define NETIF_F_HW_ESP_TX_CSUM	__NETIF_F(HW_ESP_TX_CSUM) | ||||
| #define	NETIF_F_RX_UDP_TUNNEL_PORT  __NETIF_F(RX_UDP_TUNNEL_PORT) | ||||
| #define NETIF_F_HW_TLS_RECORD	__NETIF_F(HW_TLS_RECORD) | ||||
| #define NETIF_F_GSO_UDP_L4	__NETIF_F(GSO_UDP_L4) | ||||
| 
 | ||||
| #define for_each_netdev_feature(mask_addr, bit)	\ | ||||
| 	for_each_set_bit(bit, (unsigned long *)mask_addr, NETDEV_FEATURE_COUNT) | ||||
|  | @ -216,6 +218,7 @@ enum { | |||
| 				 NETIF_F_GSO_GRE_CSUM |			\ | ||||
| 				 NETIF_F_GSO_IPXIP4 |			\ | ||||
| 				 NETIF_F_GSO_IPXIP6 |			\ | ||||
| 				 NETIF_F_GSO_UDP_L4 |			\ | ||||
| 				 NETIF_F_GSO_UDP_TUNNEL |		\ | ||||
| 				 NETIF_F_GSO_UDP_TUNNEL_CSUM) | ||||
| 
 | ||||
|  |  | |||
|  | @ -4186,6 +4186,7 @@ static inline bool net_gso_ok(netdev_features_t features, int gso_type) | |||
| 	BUILD_BUG_ON(SKB_GSO_SCTP    != (NETIF_F_GSO_SCTP >> NETIF_F_GSO_SHIFT)); | ||||
| 	BUILD_BUG_ON(SKB_GSO_ESP != (NETIF_F_GSO_ESP >> NETIF_F_GSO_SHIFT)); | ||||
| 	BUILD_BUG_ON(SKB_GSO_UDP != (NETIF_F_GSO_UDP >> NETIF_F_GSO_SHIFT)); | ||||
| 	BUILD_BUG_ON(SKB_GSO_UDP_L4 != (NETIF_F_GSO_UDP_L4 >> NETIF_F_GSO_SHIFT)); | ||||
| 
 | ||||
| 	return (features & feature) == feature; | ||||
| } | ||||
|  |  | |||
|  | @ -92,6 +92,7 @@ static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] | |||
| 	[NETIF_F_GSO_PARTIAL_BIT] =	 "tx-gso-partial", | ||||
| 	[NETIF_F_GSO_SCTP_BIT] =	 "tx-sctp-segmentation", | ||||
| 	[NETIF_F_GSO_ESP_BIT] =		 "tx-esp-segmentation", | ||||
| 	[NETIF_F_GSO_UDP_L4_BIT] =	 "tx-udp-segmentation", | ||||
| 
 | ||||
| 	[NETIF_F_FCOE_CRC_BIT] =         "tx-checksum-fcoe-crc", | ||||
| 	[NETIF_F_SCTP_CRC_BIT] =        "tx-checksum-sctp", | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Willem de Bruijn
						Willem de Bruijn