diff options
Diffstat (limited to 'include/net')
| -rw-r--r-- | include/net/vxlan.h | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/include/net/vxlan.h b/include/net/vxlan.h index 57cccd0052e5..903461aa5644 100644 --- a/include/net/vxlan.h +++ b/include/net/vxlan.h | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | #ifndef __NET_VXLAN_H | 1 | #ifndef __NET_VXLAN_H |
| 2 | #define __NET_VXLAN_H 1 | 2 | #define __NET_VXLAN_H 1 |
| 3 | 3 | ||
| 4 | #include <linux/ip.h> | ||
| 5 | #include <linux/ipv6.h> | ||
| 6 | #include <linux/if_vlan.h> | ||
| 4 | #include <linux/skbuff.h> | 7 | #include <linux/skbuff.h> |
| 5 | #include <linux/netdevice.h> | 8 | #include <linux/netdevice.h> |
| 6 | #include <linux/udp.h> | 9 | #include <linux/udp.h> |
| @@ -51,16 +54,33 @@ int vxlan_xmit_skb(struct vxlan_sock *vs, | |||
| 51 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, | 54 | __be32 src, __be32 dst, __u8 tos, __u8 ttl, __be16 df, |
| 52 | __be16 src_port, __be16 dst_port, __be32 vni, bool xnet); | 55 | __be16 src_port, __be16 dst_port, __be32 vni, bool xnet); |
| 53 | 56 | ||
| 54 | static inline bool vxlan_gso_check(struct sk_buff *skb) | 57 | static inline netdev_features_t vxlan_features_check(struct sk_buff *skb, |
| 58 | netdev_features_t features) | ||
| 55 | { | 59 | { |
| 56 | if ((skb_shinfo(skb)->gso_type & SKB_GSO_UDP_TUNNEL) && | 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) && | ||
| 57 | (skb->inner_protocol_type != ENCAP_TYPE_ETHER || | 77 | (skb->inner_protocol_type != ENCAP_TYPE_ETHER || |
| 58 | skb->inner_protocol != htons(ETH_P_TEB) || | 78 | skb->inner_protocol != htons(ETH_P_TEB) || |
| 59 | (skb_inner_mac_header(skb) - skb_transport_header(skb) != | 79 | (skb_inner_mac_header(skb) - skb_transport_header(skb) != |
| 60 | sizeof(struct udphdr) + sizeof(struct vxlanhdr)))) | 80 | sizeof(struct udphdr) + sizeof(struct vxlanhdr)))) |
| 61 | return false; | 81 | return features & ~(NETIF_F_ALL_CSUM | NETIF_F_GSO_MASK); |
| 62 | 82 | ||
| 63 | return true; | 83 | return features; |
| 64 | } | 84 | } |
| 65 | 85 | ||
| 66 | /* IP header + UDP + VXLAN + Ethernet header */ | 86 | /* IP header + UDP + VXLAN + Ethernet header */ |
