forked from mirrors/linux
		
	 6a674e9c75
			
		
	
	
		6a674e9c75
		
	
	
	
	
		
			
			This patch adds support in the kernel for offloading in the NIC Tx and Rx checksumming for encapsulated packets (such as VXLAN and IP GRE). For Tx encapsulation offload, the driver will need to set the right bits in netdev->hw_enc_features. The protocol driver will have to set the skb->encapsulation bit and populate the inner headers, so the NIC driver will use those inner headers to calculate the csum in hardware. For Rx encapsulation offload, the driver will need to set again the skb->encapsulation flag and the skb->ip_csum to CHECKSUM_UNNECESSARY. In that case the protocol driver should push the decapsulated packet up to the stack, again with CHECKSUM_UNNECESSARY. In ether case, the protocol driver should set the skb->encapsulation flag back to zero. Finally the protocol driver should have NETIF_F_RXCSUM flag set in its features. Signed-off-by: Joseph Gasparakis <joseph.gasparakis@intel.com> Signed-off-by: Peter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com> Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			86 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * INET		An implementation of the TCP/IP protocol suite for the LINUX
 | |
|  *		operating system.  INET is implemented using the  BSD Socket
 | |
|  *		interface as the means of communication with the user level.
 | |
|  *
 | |
|  *		Definitions for the UDP protocol.
 | |
|  *
 | |
|  * Version:	@(#)udp.h	1.0.2	04/28/93
 | |
|  *
 | |
|  * Author:	Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 | |
|  *
 | |
|  *		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 _LINUX_UDP_H
 | |
| #define _LINUX_UDP_H
 | |
| 
 | |
| #include <net/inet_sock.h>
 | |
| #include <linux/skbuff.h>
 | |
| #include <net/netns/hash.h>
 | |
| #include <uapi/linux/udp.h>
 | |
| 
 | |
| static inline struct udphdr *udp_hdr(const struct sk_buff *skb)
 | |
| {
 | |
| 	return (struct udphdr *)skb_transport_header(skb);
 | |
| }
 | |
| 
 | |
| static inline struct udphdr *inner_udp_hdr(const struct sk_buff *skb)
 | |
| {
 | |
| 	return (struct udphdr *)skb_inner_transport_header(skb);
 | |
| }
 | |
| 
 | |
| #define UDP_HTABLE_SIZE_MIN		(CONFIG_BASE_SMALL ? 128 : 256)
 | |
| 
 | |
| static inline int udp_hashfn(struct net *net, unsigned num, unsigned mask)
 | |
| {
 | |
| 	return (num + net_hash_mix(net)) & mask;
 | |
| }
 | |
| 
 | |
| struct udp_sock {
 | |
| 	/* inet_sock has to be the first member */
 | |
| 	struct inet_sock inet;
 | |
| #define udp_port_hash		inet.sk.__sk_common.skc_u16hashes[0]
 | |
| #define udp_portaddr_hash	inet.sk.__sk_common.skc_u16hashes[1]
 | |
| #define udp_portaddr_node	inet.sk.__sk_common.skc_portaddr_node
 | |
| 	int		 pending;	/* Any pending frames ? */
 | |
| 	unsigned int	 corkflag;	/* Cork is required */
 | |
|   	__u16		 encap_type;	/* Is this an Encapsulation socket? */
 | |
| 	/*
 | |
| 	 * Following member retains the information to create a UDP header
 | |
| 	 * when the socket is uncorked.
 | |
| 	 */
 | |
| 	__u16		 len;		/* total length of pending frames */
 | |
| 	/*
 | |
| 	 * Fields specific to UDP-Lite.
 | |
| 	 */
 | |
| 	__u16		 pcslen;
 | |
| 	__u16		 pcrlen;
 | |
| /* indicator bits used by pcflag: */
 | |
| #define UDPLITE_BIT      0x1  		/* set by udplite proto init function */
 | |
| #define UDPLITE_SEND_CC  0x2  		/* set via udplite setsockopt         */
 | |
| #define UDPLITE_RECV_CC  0x4		/* set via udplite setsocktopt        */
 | |
| 	__u8		 pcflag;        /* marks socket as UDP-Lite if > 0    */
 | |
| 	__u8		 unused[3];
 | |
| 	/*
 | |
| 	 * For encapsulation sockets.
 | |
| 	 */
 | |
| 	int (*encap_rcv)(struct sock *sk, struct sk_buff *skb);
 | |
| };
 | |
| 
 | |
| static inline struct udp_sock *udp_sk(const struct sock *sk)
 | |
| {
 | |
| 	return (struct udp_sock *)sk;
 | |
| }
 | |
| 
 | |
| #define udp_portaddr_for_each_entry(__sk, node, list) \
 | |
| 	hlist_nulls_for_each_entry(__sk, node, list, __sk_common.skc_portaddr_node)
 | |
| 
 | |
| #define udp_portaddr_for_each_entry_rcu(__sk, node, list) \
 | |
| 	hlist_nulls_for_each_entry_rcu(__sk, node, list, __sk_common.skc_portaddr_node)
 | |
| 
 | |
| #define IS_UDPLITE(__sk) (udp_sk(__sk)->pcflag)
 | |
| 
 | |
| #endif	/* _LINUX_UDP_H */
 |