#ifndef __NET_UDP_TUNNEL_H #define __NET_UDP_TUNNEL_H struct udp_port_cfg { u8 family; /* Used only for kernel-created sockets */ union { struct in_addr local_ip; #if IS_ENABLED(CONFIG_IPV6) struct in6_addr local_ip6; #endif }; union { struct in_addr peer_ip; #if IS_ENABLED(CONFIG_IPV6) struct in6_addr peer_ip6; #endif }; __be16 local_udp_port; __be16 peer_udp_port; unsigned int use_udp_checksums:1, use_udp6_tx_checksums:1, use_udp6_rx_checksums:1; }; static inline void udp_tunnel_gro_complete(struct sk_buff *skb, int nhoff) { struct udphdr *uh; uh = (struct udphdr *)(skb->data + nhoff - sizeof(struct udphdr)); skb_shinfo(skb)->gso_type |= uh->check ? SKB_GSO_UDP_TUNNEL_CSUM : SKB_GSO_UDP_TUNNEL; } int udp_sock_create(struct net *net, struct udp_port_cfg *cfg, struct socket **sockp); #endif