LCOV - code coverage report
Current view: top level - drivers/net/dpaa2 - dpaa2_parse_dump.h (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 105 0.0 %
Date: 2025-01-02 22:41:34 Functions: 0 2 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 48 0.0 %

           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

Generated by: LCOV version 1.14