1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright 2016 6WIND S.A. 3 */ 4 5 #include <stdint.h> 6 7 #include <rte_mbuf.h> 8 #include <rte_mbuf_ptype.h> 9 10 /* get the name of the l2 packet type */ 11 const char *rte_get_ptype_l2_name(uint32_t ptype) 12 { 13 switch (ptype & RTE_PTYPE_L2_MASK) { 14 case RTE_PTYPE_L2_ETHER: return "L2_ETHER"; 15 case RTE_PTYPE_L2_ETHER_TIMESYNC: return "L2_ETHER_TIMESYNC"; 16 case RTE_PTYPE_L2_ETHER_ARP: return "L2_ETHER_ARP"; 17 case RTE_PTYPE_L2_ETHER_LLDP: return "L2_ETHER_LLDP"; 18 case RTE_PTYPE_L2_ETHER_NSH: return "L2_ETHER_NSH"; 19 case RTE_PTYPE_L2_ETHER_VLAN: return "L2_ETHER_VLAN"; 20 case RTE_PTYPE_L2_ETHER_QINQ: return "L2_ETHER_QINQ"; 21 case RTE_PTYPE_L2_ETHER_PPPOE: return "L2_ETHER_PPPOE"; 22 case RTE_PTYPE_L2_ETHER_FCOE: return "L2_ETHER_FCOE"; 23 case RTE_PTYPE_L2_ETHER_MPLS: return "L2_ETHER_MPLS"; 24 default: return "L2_UNKNOWN"; 25 } 26 } 27 28 /* get the name of the l3 packet type */ 29 const char *rte_get_ptype_l3_name(uint32_t ptype) 30 { 31 switch (ptype & RTE_PTYPE_L3_MASK) { 32 case RTE_PTYPE_L3_IPV4: return "L3_IPV4"; 33 case RTE_PTYPE_L3_IPV4_EXT: return "L3_IPV4_EXT"; 34 case RTE_PTYPE_L3_IPV6: return "L3_IPV6"; 35 case RTE_PTYPE_L3_IPV4_EXT_UNKNOWN: return "L3_IPV4_EXT_UNKNOWN"; 36 case RTE_PTYPE_L3_IPV6_EXT: return "L3_IPV6_EXT"; 37 case RTE_PTYPE_L3_IPV6_EXT_UNKNOWN: return "L3_IPV6_EXT_UNKNOWN"; 38 default: return "L3_UNKNOWN"; 39 } 40 } 41 42 /* get the name of the l4 packet type */ 43 const char *rte_get_ptype_l4_name(uint32_t ptype) 44 { 45 switch (ptype & RTE_PTYPE_L4_MASK) { 46 case RTE_PTYPE_L4_TCP: return "L4_TCP"; 47 case RTE_PTYPE_L4_UDP: return "L4_UDP"; 48 case RTE_PTYPE_L4_FRAG: return "L4_FRAG"; 49 case RTE_PTYPE_L4_SCTP: return "L4_SCTP"; 50 case RTE_PTYPE_L4_ICMP: return "L4_ICMP"; 51 case RTE_PTYPE_L4_NONFRAG: return "L4_NONFRAG"; 52 case RTE_PTYPE_L4_IGMP: return "L4_IGMP"; 53 case RTE_PTYPE_L4_ESP: return "L4_ESP"; 54 default: return "L4_UNKNOWN"; 55 } 56 } 57 58 /* get the name of the tunnel packet type */ 59 const char *rte_get_ptype_tunnel_name(uint32_t ptype) 60 { 61 switch (ptype & RTE_PTYPE_TUNNEL_MASK) { 62 case RTE_PTYPE_TUNNEL_IP: return "TUNNEL_IP"; 63 case RTE_PTYPE_TUNNEL_GRE: return "TUNNEL_GRE"; 64 case RTE_PTYPE_TUNNEL_VXLAN: return "TUNNEL_VXLAN"; 65 case RTE_PTYPE_TUNNEL_NVGRE: return "TUNNEL_NVGRE"; 66 case RTE_PTYPE_TUNNEL_GENEVE: return "TUNNEL_GENEVE"; 67 case RTE_PTYPE_TUNNEL_GRENAT: return "TUNNEL_GRENAT"; 68 case RTE_PTYPE_TUNNEL_GTPC: return "TUNNEL_GTPC"; 69 case RTE_PTYPE_TUNNEL_GTPU: return "TUNNEL_GTPU"; 70 case RTE_PTYPE_TUNNEL_ESP: return "TUNNEL_ESP"; 71 case RTE_PTYPE_TUNNEL_L2TP: return "TUNNEL_L2TP"; 72 case RTE_PTYPE_TUNNEL_VXLAN_GPE: return "TUNNEL_VXLAN_GPE"; 73 case RTE_PTYPE_TUNNEL_MPLS_IN_UDP: return "TUNNEL_MPLS_IN_UDP"; 74 case RTE_PTYPE_TUNNEL_MPLS_IN_GRE: return "TUNNEL_MPLS_IN_GRE"; 75 default: return "TUNNEL_UNKNOWN"; 76 } 77 } 78 79 /* get the name of the inner_l2 packet type */ 80 const char *rte_get_ptype_inner_l2_name(uint32_t ptype) 81 { 82 switch (ptype & RTE_PTYPE_INNER_L2_MASK) { 83 case RTE_PTYPE_INNER_L2_ETHER: return "INNER_L2_ETHER"; 84 case RTE_PTYPE_INNER_L2_ETHER_VLAN: return "INNER_L2_ETHER_VLAN"; 85 case RTE_PTYPE_INNER_L2_ETHER_QINQ: return "INNER_L2_ETHER_QINQ"; 86 default: return "INNER_L2_UNKNOWN"; 87 } 88 } 89 90 /* get the name of the inner_l3 packet type */ 91 const char *rte_get_ptype_inner_l3_name(uint32_t ptype) 92 { 93 switch (ptype & RTE_PTYPE_INNER_L3_MASK) { 94 case RTE_PTYPE_INNER_L3_IPV4: return "INNER_L3_IPV4"; 95 case RTE_PTYPE_INNER_L3_IPV4_EXT: return "INNER_L3_IPV4_EXT"; 96 case RTE_PTYPE_INNER_L3_IPV6: return "INNER_L3_IPV6"; 97 case RTE_PTYPE_INNER_L3_IPV4_EXT_UNKNOWN: 98 return "INNER_L3_IPV4_EXT_UNKNOWN"; 99 case RTE_PTYPE_INNER_L3_IPV6_EXT: return "INNER_L3_IPV6_EXT"; 100 case RTE_PTYPE_INNER_L3_IPV6_EXT_UNKNOWN: 101 return "INNER_L3_IPV6_EXT_UNKNOWN"; 102 default: return "INNER_L3_UNKNOWN"; 103 } 104 } 105 106 /* get the name of the inner_l4 packet type */ 107 const char *rte_get_ptype_inner_l4_name(uint32_t ptype) 108 { 109 switch (ptype & RTE_PTYPE_INNER_L4_MASK) { 110 case RTE_PTYPE_INNER_L4_TCP: return "INNER_L4_TCP"; 111 case RTE_PTYPE_INNER_L4_UDP: return "INNER_L4_UDP"; 112 case RTE_PTYPE_INNER_L4_FRAG: return "INNER_L4_FRAG"; 113 case RTE_PTYPE_INNER_L4_SCTP: return "INNER_L4_SCTP"; 114 case RTE_PTYPE_INNER_L4_ICMP: return "INNER_L4_ICMP"; 115 case RTE_PTYPE_INNER_L4_NONFRAG: return "INNER_L4_NONFRAG"; 116 case RTE_PTYPE_INNER_L4_ESP: return "INNER_L4_ESP"; 117 default: return "INNER_L4_UNKNOWN"; 118 } 119 } 120 121 /* write the packet type name into the buffer */ 122 int rte_get_ptype_name(uint32_t ptype, char *buf, size_t buflen) 123 { 124 int ret; 125 126 if (buflen == 0) 127 return -1; 128 129 buf[0] = '\0'; 130 if ((ptype & RTE_PTYPE_ALL_MASK) == RTE_PTYPE_UNKNOWN) { 131 ret = snprintf(buf, buflen, "UNKNOWN"); 132 if (ret < 0) 133 return -1; 134 if ((size_t)ret >= buflen) 135 return -1; 136 return 0; 137 } 138 139 if ((ptype & RTE_PTYPE_L2_MASK) != 0) { 140 ret = snprintf(buf, buflen, "%s ", 141 rte_get_ptype_l2_name(ptype)); 142 if (ret < 0) 143 return -1; 144 if ((size_t)ret >= buflen) 145 return -1; 146 buf += ret; 147 buflen -= ret; 148 } 149 if ((ptype & RTE_PTYPE_L3_MASK) != 0) { 150 ret = snprintf(buf, buflen, "%s ", 151 rte_get_ptype_l3_name(ptype)); 152 if (ret < 0) 153 return -1; 154 if ((size_t)ret >= buflen) 155 return -1; 156 buf += ret; 157 buflen -= ret; 158 } 159 if ((ptype & RTE_PTYPE_L4_MASK) != 0) { 160 ret = snprintf(buf, buflen, "%s ", 161 rte_get_ptype_l4_name(ptype)); 162 if (ret < 0) 163 return -1; 164 if ((size_t)ret >= buflen) 165 return -1; 166 buf += ret; 167 buflen -= ret; 168 } 169 if ((ptype & RTE_PTYPE_TUNNEL_MASK) != 0) { 170 ret = snprintf(buf, buflen, "%s ", 171 rte_get_ptype_tunnel_name(ptype)); 172 if (ret < 0) 173 return -1; 174 if ((size_t)ret >= buflen) 175 return -1; 176 buf += ret; 177 buflen -= ret; 178 } 179 if ((ptype & RTE_PTYPE_INNER_L2_MASK) != 0) { 180 ret = snprintf(buf, buflen, "%s ", 181 rte_get_ptype_inner_l2_name(ptype)); 182 if (ret < 0) 183 return -1; 184 if ((size_t)ret >= buflen) 185 return -1; 186 buf += ret; 187 buflen -= ret; 188 } 189 if ((ptype & RTE_PTYPE_INNER_L3_MASK) != 0) { 190 ret = snprintf(buf, buflen, "%s ", 191 rte_get_ptype_inner_l3_name(ptype)); 192 if (ret < 0) 193 return -1; 194 if ((size_t)ret >= buflen) 195 return -1; 196 buf += ret; 197 buflen -= ret; 198 } 199 if ((ptype & RTE_PTYPE_INNER_L4_MASK) != 0) { 200 ret = snprintf(buf, buflen, "%s ", 201 rte_get_ptype_inner_l4_name(ptype)); 202 if (ret < 0) 203 return -1; 204 if ((size_t)ret >= buflen) 205 return -1; 206 buf += ret; 207 buflen -= ret; 208 } 209 210 return 0; 211 } 212