1 #ifndef __NET_VXLAN_H 2 #define __NET_VXLAN_H 1 3 4 #include <linux/ip.h> 5 #include <linux/ipv6.h> 6 #include <linux/if_vlan.h> 7 #include <linux/skbuff.h> 8 #include <linux/netdevice.h> 9 #include <linux/udp.h> 10 11 #define VNI_HASH_BITS 10 12 #define VNI_HASH_SIZE (1<<VNI_HASH_BITS) 13 14 /* VXLAN protocol header */ 15 struct vxlanhdr { 16 __be32 vx_flags; 17 __be32 vx_vni; 18 }; 19 20 struct vxlan_sock; 21 typedef void (vxlan_rcv_t)(struct vxlan_sock *vh, struct sk_buff *skb, __be32 key); 22 23 /* per UDP socket information */ 24 struct vxlan_sock { 25 struct hlist_node hlist; 26 vxlan_rcv_t *rcv; 27 void *data; 28 struct work_struct del_work; 29 struct socket *sock; 30 struct rcu_head rcu; 31 struct hlist_head vni_list[VNI_HASH_SIZE]; 32 atomic_t refcnt; 33 struct udp_offload udp_offloads; 34 }; 35 36 #define VXLAN_F_LEARN 0x01 37 #define VXLAN_F_PROXY 0x02 38 #define VXLAN_F_RSC 0x04 39 #define VXLAN_F_L2MISS 0x08 40 #define VXLAN_F_L3MISS 0x10 41 #define VXLAN_F_IPV6 0x20 42 #define VXLAN_F_UDP_CSUM 0x40 43 #define VXLAN_F_UDP_ZERO_CSUM6_TX 0x80 44 #define VXLAN_F_UDP_ZERO_CSUM6_RX 0x100 45 46 struct vxlan_sock *vxlan_sock_add(struct net *net, __be16 port, 47 vxlan_rcv_t *rcv, void *data, 48 bool no_share, u32 flags); 49 50 void vxlan_sock_release(struct vxlan_sock *vs); 51 52 int vxlan_xmit_skb(struct vxlan_sock *vs, 53 struct rtable *rt, struct sk_buff *skb, 54 __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, 55 __be16 src_port, __be16 dst_port, __be32 vni, bool xnet); 56 57 static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, 58 netdev_features_t features) 59 { 60 u8 l4_hdr = 0; 61 62 if (!skb->encapsulation) 63 return features; 64 65 switch (vlan_get_protocol(skb)) { 66 case htons(ETH_P_IP): 67 l4_hdr = ip_hdr(skb)->protocol; 68 break; 69 case htons(ETH_P_IPV6): 70 l4_hdr = ipv6_hdr(skb)->nexthdr; 71 break; 72 default: 73 return features;; 74 } 75 76 if ((l4_hdr == IPPROTO_UDP) && 77 (skb->inner_protocol_type != ENCAP_TYPE_ETHER || 78 skb->inner_protocol != htons(ETH_P_TEB) || 79 (skb_inner_mac_header(skb) - skb_transport_header(skb) != 80 sizeof(struct udphdr) + sizeof(struct vxlanhdr)))) 81 return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); 82 83 return features; 84 } 85 86 /* IP header + UDP + VXLAN + Ethernet header */ 87 #define VXLAN_HEADROOM (20 + 8 + 8 + 14) 88 /* IPv6 header + UDP + VXLAN + Ethernet header */ 89 #define VXLAN6_HEADROOM (40 + 8 + 8 + 14) 90 91 #if IS_ENABLED(CONFIG_VXLAN) 92 void vxlan_get_rx_port(struct net_device *netdev); 93 #else 94 static inline void vxlan_get_rx_port(struct net_device *netdev) 95 { 96 } 97 #endif 98 #endif 99