 dc01e7d344
			
		
	
	
	dc01e7d344
	
	
	
		
			
			Add GRO handlers for vxlann, by using the UDP GRO infrastructure. For single TCP session that goes through vxlan tunneling I got nice improvement from 6.8Gbs to 11.5Gbs --> UDP/VXLAN GRO disabled $ netperf -H 192.168.52.147 -c -C $ netperf -t TCP_STREAM -H 192.168.52.147 -c -C MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.52.147 () port 0 AF_INET Recv Send Send Utilization Service Demand Socket Socket Message Elapsed Send Recv Send Recv Size Size Size Time Throughput local remote local remote bytes bytes bytes secs. 10^6bits/s % S % S us/KB us/KB 87380 65536 65536 10.00 6799.75 12.54 24.79 0.604 1.195 --> UDP/VXLAN GRO enabled $ netperf -t TCP_STREAM -H 192.168.52.147 -c -C MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.52.147 () port 0 AF_INET Recv Send Send Utilization Service Demand Socket Socket Message Elapsed Send Recv Send Recv Size Size Size Time Throughput local remote local remote bytes bytes bytes secs. 10^6bits/s % S % S us/KB us/KB 87380 65536 65536 10.00 11562.72 24.90 20.34 0.706 0.577 Signed-off-by: Shlomo Pongratz <shlomop@mellanox.com> Signed-off-by: Or Gerlitz <ogerlitz@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			52 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
	
		
			1.4 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef __NET_VXLAN_H
 | |
| #define __NET_VXLAN_H 1
 | |
| 
 | |
| #include <linux/skbuff.h>
 | |
| #include <linux/netdevice.h>
 | |
| #include <linux/udp.h>
 | |
| 
 | |
| #define VNI_HASH_BITS	10
 | |
| #define VNI_HASH_SIZE	(1<<VNI_HASH_BITS)
 | |
| 
 | |
| struct vxlan_sock;
 | |
| typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb, __be32 key);
 | |
| 
 | |
| /* per UDP socket information */
 | |
| struct vxlan_sock {
 | |
| 	struct hlist_node hlist;
 | |
| 	vxlan_rcv_t	 *rcv;
 | |
| 	void		 *data;
 | |
| 	struct work_struct del_work;
 | |
| 	struct socket	 *sock;
 | |
| 	struct rcu_head	  rcu;
 | |
| 	struct hlist_head vni_list[VNI_HASH_SIZE];
 | |
| 	atomic_t	  refcnt;
 | |
| 	struct udp_offload udp_offloads;
 | |
| };
 | |
| 
 | |
| struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port,
 | |
| 				  vxlan_rcv_t *rcv, void *data,
 | |
| 				  bool no_share, bool ipv6);
 | |
| 
 | |
| void vxlan_sock_release(struct vxlan_sock *vs);
 | |
| 
 | |
| int vxlan_xmit_skb(struct vxlan_sock *vs,
 | |
| 		   struct rtable *rt, struct sk_buff *skb,
 | |
| 		   __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df,
 | |
| 		   __be16 src_port, __be16 dst_port, __be32 vni);
 | |
| 
 | |
| __be16 vxlan_src_port(__u16 port_min, __u16 port_max, struct sk_buff *skb);
 | |
| 
 | |
| /* IP header + UDP + VXLAN + Ethernet header */
 | |
| #define VXLAN_HEADROOM (20 + 8 + 8 + 14)
 | |
| /* IPv6 header + UDP + VXLAN + Ethernet header */
 | |
| #define VXLAN6_HEADROOM (40 + 8 + 8 + 14)
 | |
| 
 | |
| #if IS_ENABLED(CONFIG_VXLAN)
 | |
| void vxlan_get_rx_port(struct net_device *netdev);
 | |
| #else
 | |
| static inline void vxlan_get_rx_port(struct net_device *netdev)
 | |
| {
 | |
| }
 | |
| #endif
 | |
| #endif
 |