199a2dd95SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause 299a2dd95SBruce Richardson * Copyright(c) 2018-2019 Intel Corporation 399a2dd95SBruce Richardson */ 499a2dd95SBruce Richardson 599a2dd95SBruce Richardson #ifndef _RTE_VXLAN_H_ 699a2dd95SBruce Richardson #define _RTE_VXLAN_H_ 799a2dd95SBruce Richardson 899a2dd95SBruce Richardson /** 999a2dd95SBruce Richardson * @file 1099a2dd95SBruce Richardson * 1199a2dd95SBruce Richardson * VXLAN-related definitions 1299a2dd95SBruce Richardson */ 1399a2dd95SBruce Richardson 1499a2dd95SBruce Richardson #include <stdint.h> 1599a2dd95SBruce Richardson 1699a2dd95SBruce Richardson #include <rte_byteorder.h> 1799a2dd95SBruce Richardson #include <rte_udp.h> 1899a2dd95SBruce Richardson 1999a2dd95SBruce Richardson /** VXLAN default port. */ 2099a2dd95SBruce Richardson #define RTE_VXLAN_DEFAULT_PORT 4789 2177cb7b18SGavin Li /** VXLAN GPE port. */ 2299a2dd95SBruce Richardson #define RTE_VXLAN_GPE_DEFAULT_PORT 4790 2399a2dd95SBruce Richardson 2499a2dd95SBruce Richardson /** 2599a2dd95SBruce Richardson * VXLAN protocol header. 2699a2dd95SBruce Richardson * Contains the 8-bit flag, 24-bit VXLAN Network Identifier and 2799a2dd95SBruce Richardson * Reserved fields (24 bits and 8 bits) 2899a2dd95SBruce Richardson */ 29f1567c73SThomas Monjalon __extension__ /* no named member in struct */ 30*fba98755SAndre Muezerie struct __rte_packed_begin rte_vxlan_hdr { 31f1567c73SThomas Monjalon union { 3277cb7b18SGavin Li rte_be32_t vx_flags; /**< flags (8 bits) + extensions (24 bits). */ 33*fba98755SAndre Muezerie struct __rte_packed_begin { 3477cb7b18SGavin Li union { 3577cb7b18SGavin Li uint8_t flags; /**< Default is I bit, others are extensions. */ 36*fba98755SAndre Muezerie struct __rte_packed_begin { 3777cb7b18SGavin Li #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 3877cb7b18SGavin Li uint8_t flag_g:1, /**< GBP bit. */ 3977cb7b18SGavin Li flag_rsvd:1, /* Reserved. */ 4077cb7b18SGavin Li flag_ver:2, /**< GPE Protocol Version. */ 4177cb7b18SGavin Li flag_i:1, /**< VNI bit. */ 4277cb7b18SGavin Li flag_p:1, /**< GPE Next Protocol bit. */ 4377cb7b18SGavin Li flag_b:1, /**< GPE Ingress-Replicated BUM. */ 4477cb7b18SGavin Li flag_o:1; /**< GPE OAM Packet bit. */ 4577cb7b18SGavin Li #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 4677cb7b18SGavin Li uint8_t flag_o:1, 4777cb7b18SGavin Li flag_b:1, 4877cb7b18SGavin Li flag_p:1, 4977cb7b18SGavin Li flag_i:1, 5077cb7b18SGavin Li flag_ver:2, 5177cb7b18SGavin Li flag_rsvd:1, 5277cb7b18SGavin Li flag_g:1; 5377cb7b18SGavin Li #endif 54*fba98755SAndre Muezerie } __rte_packed_end; 5577cb7b18SGavin Li }; /* end of 1st byte */ 5677cb7b18SGavin Li union { 5777cb7b18SGavin Li uint8_t rsvd0[3]; /* Reserved for extensions. */ 58*fba98755SAndre Muezerie struct __rte_packed_begin { 5977cb7b18SGavin Li #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 6077cb7b18SGavin Li uint8_t rsvd0_gbp1:1, /* Reserved. */ 6177cb7b18SGavin Li flag_d:1, /**< GBP Don't Learn bit. */ 6277cb7b18SGavin Li rsvd0_gbp2:2, /* Reserved. */ 6377cb7b18SGavin Li flag_a:1, /**< GBP Applied bit. */ 6477cb7b18SGavin Li rsvd0_gbp3:3; /* Reserved. */ 6577cb7b18SGavin Li #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 6677cb7b18SGavin Li uint8_t rsvd0_gbp3:3, 6777cb7b18SGavin Li flag_a:1, 6877cb7b18SGavin Li rsvd0_gbp2:2, 6977cb7b18SGavin Li flag_d:1, 7077cb7b18SGavin Li rsvd0_gbp1:1; 7177cb7b18SGavin Li #endif 7277cb7b18SGavin Li union { 7377cb7b18SGavin Li uint16_t policy_id; /**< GBP Identifier. */ 74*fba98755SAndre Muezerie struct __rte_packed_begin { 7577cb7b18SGavin Li uint8_t rsvd0_gpe; /* Reserved. */ 7677cb7b18SGavin Li uint8_t proto; /**< GPE Next protocol. */ 7777cb7b18SGavin Li /* 0x01 : IPv4 7877cb7b18SGavin Li * 0x02 : IPv6 7977cb7b18SGavin Li * 0x03 : Ethernet 8077cb7b18SGavin Li * 0x04 : Network Service Header 8177cb7b18SGavin Li */ 82*fba98755SAndre Muezerie } __rte_packed_end; 83f1567c73SThomas Monjalon }; 84*fba98755SAndre Muezerie } __rte_packed_end; 8577cb7b18SGavin Li }; 86*fba98755SAndre Muezerie } __rte_packed_end; 8777cb7b18SGavin Li }; /* end of 1st 32-bit word */ 8877cb7b18SGavin Li union { 8977cb7b18SGavin Li rte_be32_t vx_vni; /**< VNI (24 bits) + reserved (8 bits). */ 90*fba98755SAndre Muezerie struct __rte_packed_begin { 9177cb7b18SGavin Li uint8_t vni[3]; /**< VXLAN Identifier. */ 925259e8cfSRongwei Liu union { 93f1567c73SThomas Monjalon uint8_t rsvd1; /**< Reserved. */ 945259e8cfSRongwei Liu uint8_t last_rsvd; /**< Reserved. */ 955259e8cfSRongwei Liu }; 96*fba98755SAndre Muezerie } __rte_packed_end; 9777cb7b18SGavin Li }; /* end of 2nd 32-bit word */ 98*fba98755SAndre Muezerie } __rte_packed_end; 9999a2dd95SBruce Richardson 10099a2dd95SBruce Richardson /** VXLAN tunnel header length. */ 10199a2dd95SBruce Richardson #define RTE_ETHER_VXLAN_HLEN \ 10299a2dd95SBruce Richardson (sizeof(struct rte_udp_hdr) + sizeof(struct rte_vxlan_hdr)) 10399a2dd95SBruce Richardson 10499a2dd95SBruce Richardson 10599a2dd95SBruce Richardson /** 10677cb7b18SGavin Li * @deprecated 10777cb7b18SGavin Li * @see rte_vxlan_hdr 10877cb7b18SGavin Li * 10999a2dd95SBruce Richardson * VXLAN-GPE protocol header (draft-ietf-nvo3-vxlan-gpe-05). 11099a2dd95SBruce Richardson * Contains the 8-bit flag, 8-bit next-protocol, 24-bit VXLAN Network 11199a2dd95SBruce Richardson * Identifier and Reserved fields (16 bits and 8 bits). 11299a2dd95SBruce Richardson */ 113f1567c73SThomas Monjalon __extension__ /* no named member in struct */ 114*fba98755SAndre Muezerie struct __rte_packed_begin rte_vxlan_gpe_hdr { 115f1567c73SThomas Monjalon union { 116f1567c73SThomas Monjalon struct { 11799a2dd95SBruce Richardson uint8_t vx_flags; /**< flag (8). */ 11899a2dd95SBruce Richardson uint8_t reserved[2]; /**< Reserved (16). */ 119f1567c73SThomas Monjalon uint8_t protocol; /**< next-protocol (8). */ 12099a2dd95SBruce Richardson rte_be32_t vx_vni; /**< VNI (24) + Reserved (8). */ 121f1567c73SThomas Monjalon }; 122f1567c73SThomas Monjalon struct { 123f1567c73SThomas Monjalon uint8_t flags; /**< Flags. */ 124f1567c73SThomas Monjalon uint8_t rsvd0[2]; /**< Reserved. */ 125f1567c73SThomas Monjalon uint8_t proto; /**< Next protocol. */ 126f1567c73SThomas Monjalon uint8_t vni[3]; /**< VXLAN identifier. */ 127f1567c73SThomas Monjalon uint8_t rsvd1; /**< Reserved. */ 128f1567c73SThomas Monjalon }; 129f1567c73SThomas Monjalon }; 130*fba98755SAndre Muezerie } __rte_packed_end; 13199a2dd95SBruce Richardson 13277cb7b18SGavin Li /** 13377cb7b18SGavin Li * @deprecated 13477cb7b18SGavin Li * @see RTE_ETHER_VXLAN_HLEN 13577cb7b18SGavin Li * 13677cb7b18SGavin Li * VXLAN-GPE tunnel header length. 13777cb7b18SGavin Li */ 13899a2dd95SBruce Richardson #define RTE_ETHER_VXLAN_GPE_HLEN (sizeof(struct rte_udp_hdr) + \ 13999a2dd95SBruce Richardson sizeof(struct rte_vxlan_gpe_hdr)) 14099a2dd95SBruce Richardson 14199a2dd95SBruce Richardson /* VXLAN-GPE next protocol types */ 14299a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_IPV4 1 /**< IPv4 Protocol. */ 14399a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_IPV6 2 /**< IPv6 Protocol. */ 14499a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_ETH 3 /**< Ethernet Protocol. */ 14599a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_NSH 4 /**< NSH Protocol. */ 14699a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_MPLS 5 /**< MPLS Protocol. */ 14799a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_GBP 6 /**< GBP Protocol. */ 14899a2dd95SBruce Richardson #define RTE_VXLAN_GPE_TYPE_VBNG 7 /**< vBNG Protocol. */ 14999a2dd95SBruce Richardson 15099a2dd95SBruce Richardson #endif /* RTE_VXLAN_H_ */ 151