Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * 3 : : * Copyright 2022 NXP 4 : : * 5 : : */ 6 : : 7 : : #ifndef _DPAA2_PARSE_DUMP_H 8 : : #define _DPAA2_PARSE_DUMP_H 9 : : 10 : : #include <rte_event_eth_rx_adapter.h> 11 : : #include <rte_pmd_dpaa2.h> 12 : : 13 : : #include <dpaa2_hw_pvt.h> 14 : : #include "dpaa2_tm.h" 15 : : 16 : : #include <mc/fsl_dpni.h> 17 : : #include <mc/fsl_mc_sys.h> 18 : : 19 : : #include "base/dpaa2_hw_dpni_annot.h" 20 : : 21 : : #define DPAA2_PR_PRINT printf 22 : : 23 : : struct dpaa2_faf_bit_info { 24 : : const char *name; 25 : : int position; 26 : : }; 27 : : 28 : : struct dpaa2_fapr_field_info { 29 : : const char *name; 30 : : uint16_t value; 31 : : }; 32 : : 33 : : struct dpaa2_fapr_array { 34 : : union { 35 : : uint64_t pr_64[DPAA2_FAPR_SIZE / 8]; 36 : : uint8_t pr[DPAA2_FAPR_SIZE]; 37 : : }; 38 : : }; 39 : : 40 : : #define NEXT_HEADER_NAME "Next Header" 41 : : #define ETH_OFF_NAME "ETH OFFSET" 42 : : #define VLAN_TCI_OFF_NAME "VLAN TCI OFFSET" 43 : : #define LAST_ENTRY_OFF_NAME "LAST ETYPE Offset" 44 : : #define L3_OFF_NAME "L3 Offset" 45 : : #define L4_OFF_NAME "L4 Offset" 46 : : #define L5_OFF_NAME "L5 Offset" 47 : : #define NEXT_HEADER_OFF_NAME "Next Header Offset" 48 : : 49 : : static const 50 : : struct dpaa2_fapr_field_info support_dump_fields[] = { 51 : : { 52 : : .name = NEXT_HEADER_NAME, 53 : : }, 54 : : { 55 : : .name = ETH_OFF_NAME, 56 : : }, 57 : : { 58 : : .name = VLAN_TCI_OFF_NAME, 59 : : }, 60 : : { 61 : : .name = LAST_ENTRY_OFF_NAME, 62 : : }, 63 : : { 64 : : .name = L3_OFF_NAME, 65 : : }, 66 : : { 67 : : .name = L4_OFF_NAME, 68 : : }, 69 : : { 70 : : .name = L5_OFF_NAME, 71 : : }, 72 : : { 73 : : .name = NEXT_HEADER_OFF_NAME, 74 : : } 75 : : }; 76 : : 77 : : static inline void 78 : 0 : dpaa2_print_faf(struct dpaa2_fapr_array *fapr) 79 : 0 : { 80 : : const int faf_bit_len = DPAA2_FAF_TOTAL_SIZE * 8; 81 : 0 : struct dpaa2_faf_bit_info faf_bits[faf_bit_len]; 82 : : int i, byte_pos, bit_pos, vxlan = 0, vxlan_vlan = 0; 83 : : struct rte_ether_hdr vxlan_in_eth; 84 : : uint16_t vxlan_vlan_tci; 85 : : 86 [ # # ]: 0 : for (i = 0; i < faf_bit_len; i++) { 87 : 0 : faf_bits[i].position = i; 88 [ # # ]: 0 : if (i == FAFE_VXLAN_IN_VLAN_FRAM) 89 : 0 : faf_bits[i].name = "VXLAN VLAN Present"; 90 : : else if (i == FAFE_VXLAN_IN_IPV4_FRAM) 91 : 0 : faf_bits[i].name = "VXLAN IPV4 Present"; 92 : : else if (i == FAFE_VXLAN_IN_IPV6_FRAM) 93 : 0 : faf_bits[i].name = "VXLAN IPV6 Present"; 94 : : else if (i == FAFE_VXLAN_IN_UDP_FRAM) 95 : 0 : faf_bits[i].name = "VXLAN UDP Present"; 96 : : else if (i == FAFE_VXLAN_IN_TCP_FRAM) 97 : 0 : faf_bits[i].name = "VXLAN TCP Present"; 98 : : else if (i == FAF_VXLAN_FRAM) 99 : 0 : faf_bits[i].name = "VXLAN Present"; 100 : : else if (i == FAF_ETH_FRAM) 101 : 0 : faf_bits[i].name = "Ethernet MAC Present"; 102 : : else if (i == FAF_VLAN_FRAM) 103 : 0 : faf_bits[i].name = "VLAN 1 Present"; 104 : : else if (i == FAF_IPV4_FRAM) 105 : 0 : faf_bits[i].name = "IPv4 1 Present"; 106 : : else if (i == FAF_IPV6_FRAM) 107 : 0 : faf_bits[i].name = "IPv6 1 Present"; 108 : : else if (i == FAF_IP_FRAG_FRAM) 109 : 0 : faf_bits[i].name = "IP fragment Present"; 110 : : else if (i == FAF_UDP_FRAM) 111 : 0 : faf_bits[i].name = "UDP Present"; 112 : : else if (i == FAF_TCP_FRAM) 113 : 0 : faf_bits[i].name = "TCP Present"; 114 : : else 115 : 0 : faf_bits[i].name = "Check RM for this unusual frame"; 116 : : } 117 : : 118 : : DPAA2_PR_PRINT("Frame Annotation Flags:\r\n"); 119 [ # # ]: 0 : for (i = 0; i < faf_bit_len; i++) { 120 : 0 : byte_pos = i / 8 + DPAA2_FAFE_PSR_OFFSET; 121 : 0 : bit_pos = i % 8; 122 [ # # ]: 0 : if (fapr->pr[byte_pos] & (1 << (7 - bit_pos))) { 123 : 0 : DPAA2_PR_PRINT("FAF bit %d : %s\r\n", 124 : : faf_bits[i].position, faf_bits[i].name); 125 [ # # ]: 0 : if (i == FAF_VXLAN_FRAM) 126 : : vxlan = 1; 127 : : } 128 : : } 129 : : 130 [ # # ]: 0 : if (vxlan) { 131 : 0 : vxlan_in_eth.dst_addr.addr_bytes[0] = 132 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR0_OFFSET]; 133 : 0 : vxlan_in_eth.dst_addr.addr_bytes[1] = 134 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR1_OFFSET]; 135 : 0 : vxlan_in_eth.dst_addr.addr_bytes[2] = 136 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR2_OFFSET]; 137 : 0 : vxlan_in_eth.dst_addr.addr_bytes[3] = 138 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR3_OFFSET]; 139 : 0 : vxlan_in_eth.dst_addr.addr_bytes[4] = 140 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR4_OFFSET]; 141 : 0 : vxlan_in_eth.dst_addr.addr_bytes[5] = 142 : 0 : fapr->pr[DPAA2_VXLAN_IN_DADDR5_OFFSET]; 143 : : 144 : 0 : vxlan_in_eth.src_addr.addr_bytes[0] = 145 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR0_OFFSET]; 146 : 0 : vxlan_in_eth.src_addr.addr_bytes[1] = 147 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR1_OFFSET]; 148 : 0 : vxlan_in_eth.src_addr.addr_bytes[2] = 149 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR2_OFFSET]; 150 : 0 : vxlan_in_eth.src_addr.addr_bytes[3] = 151 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR3_OFFSET]; 152 : 0 : vxlan_in_eth.src_addr.addr_bytes[4] = 153 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR4_OFFSET]; 154 : 0 : vxlan_in_eth.src_addr.addr_bytes[5] = 155 : 0 : fapr->pr[DPAA2_VXLAN_IN_SADDR5_OFFSET]; 156 : : 157 : : vxlan_in_eth.ether_type = 158 : 0 : fapr->pr[DPAA2_VXLAN_IN_TYPE_OFFSET]; 159 : : vxlan_in_eth.ether_type = 160 : 0 : vxlan_in_eth.ether_type << 8; 161 : 0 : vxlan_in_eth.ether_type |= 162 : 0 : fapr->pr[DPAA2_VXLAN_IN_TYPE_OFFSET + 1]; 163 : : 164 [ # # ]: 0 : if (vxlan_in_eth.ether_type == RTE_ETHER_TYPE_VLAN) 165 : : vxlan_vlan = 1; 166 : : DPAA2_PR_PRINT("VXLAN inner eth:\r\n"); 167 : : DPAA2_PR_PRINT("dst addr: "); 168 [ # # ]: 0 : for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) { 169 [ # # ]: 0 : if (i != 0) 170 : : DPAA2_PR_PRINT(":"); 171 : 0 : DPAA2_PR_PRINT("%02x", 172 : 0 : vxlan_in_eth.dst_addr.addr_bytes[i]); 173 : : } 174 : : DPAA2_PR_PRINT("\r\n"); 175 : : DPAA2_PR_PRINT("src addr: "); 176 [ # # ]: 0 : for (i = 0; i < RTE_ETHER_ADDR_LEN; i++) { 177 [ # # ]: 0 : if (i != 0) 178 : : DPAA2_PR_PRINT(":"); 179 : 0 : DPAA2_PR_PRINT("%02x", 180 : 0 : vxlan_in_eth.src_addr.addr_bytes[i]); 181 : : } 182 : : DPAA2_PR_PRINT("\r\n"); 183 : 0 : DPAA2_PR_PRINT("type: 0x%04x\r\n", 184 : : vxlan_in_eth.ether_type); 185 [ # # ]: 0 : if (vxlan_vlan) { 186 : 0 : vxlan_vlan_tci = fapr->pr[DPAA2_VXLAN_IN_TCI_OFFSET]; 187 : 0 : vxlan_vlan_tci = vxlan_vlan_tci << 8; 188 : 0 : vxlan_vlan_tci |= 189 : 0 : fapr->pr[DPAA2_VXLAN_IN_TCI_OFFSET + 1]; 190 : : 191 : 0 : DPAA2_PR_PRINT("vlan tci: 0x%04x\r\n", 192 : : vxlan_vlan_tci); 193 : : } 194 : : } 195 : 0 : } 196 : : 197 : : static inline void 198 : 0 : dpaa2_print_parse_result(struct dpaa2_annot_hdr *annotation) 199 : : { 200 : : struct dpaa2_fapr_array fapr; 201 : : struct dpaa2_fapr_field_info 202 : : fapr_fields[sizeof(support_dump_fields) / 203 : : sizeof(struct dpaa2_fapr_field_info)]; 204 : : uint64_t len, i; 205 : : 206 : 0 : memcpy(&fapr, &annotation->word3, DPAA2_FAPR_SIZE); 207 [ # # ]: 0 : for (i = 0; i < (DPAA2_FAPR_SIZE / 8); i++) 208 [ # # ]: 0 : fapr.pr_64[i] = rte_cpu_to_be_64(fapr.pr_64[i]); 209 : : 210 : : memcpy(fapr_fields, support_dump_fields, 211 : : sizeof(support_dump_fields)); 212 : : 213 : 0 : for (i = 0; 214 [ # # ]: 0 : i < sizeof(fapr_fields) / 215 : : sizeof(struct dpaa2_fapr_field_info); 216 : 0 : i++) { 217 [ # # ]: 0 : if (!strcmp(fapr_fields[i].name, NEXT_HEADER_NAME)) { 218 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_NXTHDR_OFFSET]; 219 : 0 : fapr_fields[i].value = fapr_fields[i].value << 8; 220 : 0 : fapr_fields[i].value |= 221 : 0 : fapr.pr[DPAA2_PR_NXTHDR_OFFSET + 1]; 222 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, ETH_OFF_NAME)) { 223 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_ETH_OFF_OFFSET]; 224 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, VLAN_TCI_OFF_NAME)) { 225 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_TCI_OFF_OFFSET]; 226 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, LAST_ENTRY_OFF_NAME)) { 227 : 0 : fapr_fields[i].value = 228 : 0 : fapr.pr[DPAA2_PR_LAST_ETYPE_OFFSET]; 229 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, L3_OFF_NAME)) { 230 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_L3_OFF_OFFSET]; 231 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, L4_OFF_NAME)) { 232 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_L4_OFF_OFFSET]; 233 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, L5_OFF_NAME)) { 234 : 0 : fapr_fields[i].value = fapr.pr[DPAA2_PR_L5_OFF_OFFSET]; 235 [ # # ]: 0 : } else if (!strcmp(fapr_fields[i].name, NEXT_HEADER_OFF_NAME)) { 236 : 0 : fapr_fields[i].value = 237 : 0 : fapr.pr[DPAA2_PR_NXTHDR_OFF_OFFSET]; 238 : : } 239 : : } 240 : : 241 : : len = sizeof(fapr_fields) / sizeof(struct dpaa2_fapr_field_info); 242 : : DPAA2_PR_PRINT("Parse Result:\r\n"); 243 [ # # ]: 0 : for (i = 0; i < len; i++) { 244 : 0 : DPAA2_PR_PRINT("%21s : 0x%02x\r\n", 245 : 0 : fapr_fields[i].name, fapr_fields[i].value); 246 : : } 247 : 0 : dpaa2_print_faf(&fapr); 248 : 0 : } 249 : : 250 : : #endif