|
@@ -26,6 +26,7 @@
|
|
|
#include <net/inet_ecn.h>
|
|
|
#include <net/net_namespace.h>
|
|
|
#include <net/netns/generic.h>
|
|
|
+#include <net/tun_proto.h>
|
|
|
#include <net/vxlan.h>
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
@@ -1261,19 +1262,9 @@ static bool vxlan_parse_gpe_hdr(struct vxlanhdr *unparsed,
|
|
|
if (gpe->oam_flag)
|
|
|
return false;
|
|
|
|
|
|
- switch (gpe->next_protocol) {
|
|
|
- case VXLAN_GPE_NP_IPV4:
|
|
|
- *protocol = htons(ETH_P_IP);
|
|
|
- break;
|
|
|
- case VXLAN_GPE_NP_IPV6:
|
|
|
- *protocol = htons(ETH_P_IPV6);
|
|
|
- break;
|
|
|
- case VXLAN_GPE_NP_ETHERNET:
|
|
|
- *protocol = htons(ETH_P_TEB);
|
|
|
- break;
|
|
|
- default:
|
|
|
+ *protocol = tun_p_to_eth_p(gpe->next_protocol);
|
|
|
+ if (!*protocol)
|
|
|
return false;
|
|
|
- }
|
|
|
|
|
|
unparsed->vx_flags &= ~VXLAN_GPE_USED_BITS;
|
|
|
return true;
|
|
@@ -1799,19 +1790,10 @@ static int vxlan_build_gpe_hdr(struct vxlanhdr *vxh, u32 vxflags,
|
|
|
struct vxlanhdr_gpe *gpe = (struct vxlanhdr_gpe *)vxh;
|
|
|
|
|
|
gpe->np_applied = 1;
|
|
|
-
|
|
|
- switch (protocol) {
|
|
|
- case htons(ETH_P_IP):
|
|
|
- gpe->next_protocol = VXLAN_GPE_NP_IPV4;
|
|
|
- return 0;
|
|
|
- case htons(ETH_P_IPV6):
|
|
|
- gpe->next_protocol = VXLAN_GPE_NP_IPV6;
|
|
|
- return 0;
|
|
|
- case htons(ETH_P_TEB):
|
|
|
- gpe->next_protocol = VXLAN_GPE_NP_ETHERNET;
|
|
|
- return 0;
|
|
|
- }
|
|
|
- return -EPFNOSUPPORT;
|
|
|
+ gpe->next_protocol = tun_p_from_eth_p(protocol);
|
|
|
+ if (!gpe->next_protocol)
|
|
|
+ return -EPFNOSUPPORT;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int vxlan_build_skb(struct sk_buff *skb, struct dst_entry *dst,
|