1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2018-2019 Intel Corporation 3 */ 4 5 #ifndef _RTE_VXLAN_H_ 6 #define _RTE_VXLAN_H_ 7 8 /** 9 * @file 10 * 11 * VXLAN-related definitions 12 */ 13 14 #include <stdint.h> 15 16 #include <rte_byteorder.h> 17 #include <rte_udp.h> 18 19 /** VXLAN default port. */ 20 #define RTE_VXLAN_DEFAULT_PORT 4789 21 /** VXLAN GPE port. */ 22 #define RTE_VXLAN_GPE_DEFAULT_PORT 4790 23 24 /** 25 * VXLAN protocol header. 26 * Contains the 8-bit flag, 24-bit VXLAN Network Identifier and 27 * Reserved fields (24 bits and 8 bits) 28 */ 29 __extension__ /* no named member in struct */ 30 struct __rte_packed_begin rte_vxlan_hdr { 31 union { 32 rte_be32_t vx_flags; /**< flags (8 bits) + extensions (24 bits). */ 33 struct __rte_packed_begin { 34 union { 35 uint8_t flags; /**< Default is I bit, others are extensions. */ 36 struct __rte_packed_begin { 37 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 38 uint8_t flag_g:1, /**< GBP bit. */ 39 flag_rsvd:1, /* Reserved. */ 40 flag_ver:2, /**< GPE Protocol Version. */ 41 flag_i:1, /**< VNI bit. */ 42 flag_p:1, /**< GPE Next Protocol bit. */ 43 flag_b:1, /**< GPE Ingress-Replicated BUM. */ 44 flag_o:1; /**< GPE OAM Packet bit. */ 45 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 46 uint8_t flag_o:1, 47 flag_b:1, 48 flag_p:1, 49 flag_i:1, 50 flag_ver:2, 51 flag_rsvd:1, 52 flag_g:1; 53 #endif 54 } __rte_packed_end; 55 }; /* end of 1st byte */ 56 union { 57 uint8_t rsvd0[3]; /* Reserved for extensions. */ 58 struct __rte_packed_begin { 59 #if RTE_BYTE_ORDER == RTE_BIG_ENDIAN 60 uint8_t rsvd0_gbp1:1, /* Reserved. */ 61 flag_d:1, /**< GBP Don't Learn bit. */ 62 rsvd0_gbp2:2, /* Reserved. */ 63 flag_a:1, /**< GBP Applied bit. */ 64 rsvd0_gbp3:3; /* Reserved. */ 65 #elif RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN 66 uint8_t rsvd0_gbp3:3, 67 flag_a:1, 68 rsvd0_gbp2:2, 69 flag_d:1, 70 rsvd0_gbp1:1; 71 #endif 72 union { 73 uint16_t policy_id; /**< GBP Identifier. */ 74 struct __rte_packed_begin { 75 uint8_t rsvd0_gpe; /* Reserved. */ 76 uint8_t proto; /**< GPE Next protocol. */ 77 /* 0x01 : IPv4 78 * 0x02 : IPv6 79 * 0x03 : Ethernet 80 * 0x04 : Network Service Header 81 */ 82 } __rte_packed_end; 83 }; 84 } __rte_packed_end; 85 }; 86 } __rte_packed_end; 87 }; /* end of 1st 32-bit word */ 88 union { 89 rte_be32_t vx_vni; /**< VNI (24 bits) + reserved (8 bits). */ 90 struct __rte_packed_begin { 91 uint8_t vni[3]; /**< VXLAN Identifier. */ 92 union { 93 uint8_t rsvd1; /**< Reserved. */ 94 uint8_t last_rsvd; /**< Reserved. */ 95 }; 96 } __rte_packed_end; 97 }; /* end of 2nd 32-bit word */ 98 } __rte_packed_end; 99 100 /** VXLAN tunnel header length. */ 101 #define RTE_ETHER_VXLAN_HLEN \ 102 (sizeof(struct rte_udp_hdr) + sizeof(struct rte_vxlan_hdr)) 103 104 105 /** 106 * @deprecated 107 * @see rte_vxlan_hdr 108 * 109 * VXLAN-GPE protocol header (draft-ietf-nvo3-vxlan-gpe-05). 110 * Contains the 8-bit flag, 8-bit next-protocol, 24-bit VXLAN Network 111 * Identifier and Reserved fields (16 bits and 8 bits). 112 */ 113 __extension__ /* no named member in struct */ 114 struct __rte_packed_begin rte_vxlan_gpe_hdr { 115 union { 116 struct { 117 uint8_t vx_flags; /**< flag (8). */ 118 uint8_t reserved[2]; /**< Reserved (16). */ 119 uint8_t protocol; /**< next-protocol (8). */ 120 rte_be32_t vx_vni; /**< VNI (24) + Reserved (8). */ 121 }; 122 struct { 123 uint8_t flags; /**< Flags. */ 124 uint8_t rsvd0[2]; /**< Reserved. */ 125 uint8_t proto; /**< Next protocol. */ 126 uint8_t vni[3]; /**< VXLAN identifier. */ 127 uint8_t rsvd1; /**< Reserved. */ 128 }; 129 }; 130 } __rte_packed_end; 131 132 /** 133 * @deprecated 134 * @see RTE_ETHER_VXLAN_HLEN 135 * 136 * VXLAN-GPE tunnel header length. 137 */ 138 #define RTE_ETHER_VXLAN_GPE_HLEN (sizeof(struct rte_udp_hdr) + \ 139 sizeof(struct rte_vxlan_gpe_hdr)) 140 141 /* VXLAN-GPE next protocol types */ 142 #define RTE_VXLAN_GPE_TYPE_IPV4 1 /**< IPv4 Protocol. */ 143 #define RTE_VXLAN_GPE_TYPE_IPV6 2 /**< IPv6 Protocol. */ 144 #define RTE_VXLAN_GPE_TYPE_ETH 3 /**< Ethernet Protocol. */ 145 #define RTE_VXLAN_GPE_TYPE_NSH 4 /**< NSH Protocol. */ 146 #define RTE_VXLAN_GPE_TYPE_MPLS 5 /**< MPLS Protocol. */ 147 #define RTE_VXLAN_GPE_TYPE_GBP 6 /**< GBP Protocol. */ 148 #define RTE_VXLAN_GPE_TYPE_VBNG 7 /**< vBNG Protocol. */ 149 150 #endif /* RTE_VXLAN_H_ */ 151