LCOV - code coverage report
Current view: top level - drivers/net/dpaa2/base - dpaa2_tlu_hash.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 46 0.0 %
Date: 2024-04-01 19:00:53 Functions: 0 4 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 24 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright 2021 NXP
       3                 :            :  */
       4                 :            : #include <stdio.h>
       5                 :            : #include <inttypes.h>
       6                 :            : #include <unistd.h>
       7                 :            : #include <rte_pmd_dpaa2.h>
       8                 :            : 
       9                 :          0 : static unsigned int sbox(unsigned int x)
      10                 :            : {
      11                 :            :         unsigned int a, b, c, d;
      12                 :            :         unsigned int oa, ob, oc, od;
      13                 :            : 
      14                 :          0 :         a = x & 0x1;
      15                 :          0 :         b = (x >> 1) & 0x1;
      16                 :          0 :         c = (x >> 2) & 0x1;
      17                 :          0 :         d = (x >> 3) & 0x1;
      18                 :            : 
      19                 :          0 :         oa = ((a & ~b & ~c & d) | (~a & b) | (~a & ~c & ~d) | (b & c)) & 0x1;
      20                 :          0 :         ob = ((a & ~b & d) | (~a & c & ~d) | (b & ~c)) & 0x1;
      21                 :          0 :         oc = ((a & ~b & c) | (a & ~b & ~d) | (~a & b & ~d) | (~a & c & ~d) |
      22                 :          0 :              (b & c & d)) & 0x1;
      23                 :          0 :         od = ((a & ~b & c) | (~a & b & ~c) | (a & b & ~d) | (~a & c & d)) & 0x1;
      24                 :            : 
      25                 :          0 :         return ((od << 3) | (oc << 2) | (ob << 1) | oa);
      26                 :            : }
      27                 :            : 
      28                 :            : static unsigned int sbox_tbl[16];
      29                 :            : 
      30                 :            : static int pbox_tbl[16] = {5, 9, 0, 13,
      31                 :            :                         7, 2, 11, 14,
      32                 :            :                         1, 4, 12, 8,
      33                 :            :                         3, 15, 6, 10 };
      34                 :            : 
      35                 :            : static unsigned int mix_tbl[8][16];
      36                 :            : 
      37                 :          0 : static unsigned int stage(unsigned int input)
      38                 :            : {
      39                 :            :         int sbox_out = 0;
      40                 :            :         int pbox_out = 0;
      41                 :            :         int i;
      42                 :            : 
      43                 :            :         /* mix */
      44                 :          0 :         input ^= input >> 16; /* xor lower */
      45                 :          0 :         input ^= input << 16; /* move original lower to upper */
      46                 :            : 
      47         [ #  # ]:          0 :         for (i = 0; i < 32; i += 4) /* sbox stage */
      48                 :          0 :                 sbox_out |= (sbox_tbl[(input >> i) & 0xf]) << i;
      49                 :            : 
      50                 :            :         /* permutation */
      51         [ #  # ]:          0 :         for (i = 0; i < 16; i++)
      52                 :          0 :                 pbox_out |= ((sbox_out >> i) & 0x10001) << pbox_tbl[i];
      53                 :            : 
      54                 :          0 :         return pbox_out;
      55                 :            : }
      56                 :            : 
      57                 :            : static unsigned int fast_stage(unsigned int input)
      58                 :            : {
      59                 :            :         int pbox_out = 0;
      60                 :            :         int i;
      61                 :            : 
      62                 :            :         /* mix */
      63                 :          0 :         input ^= input >> 16; /* xor lower */
      64                 :          0 :         input ^= input << 16; /* move original lower to upper */
      65                 :            : 
      66         [ #  # ]:          0 :         for (i = 0; i < 32; i += 4) /* sbox stage */
      67                 :          0 :                 pbox_out |= mix_tbl[i >> 2][(input >> i) & 0xf];
      68                 :            : 
      69                 :          0 :         return pbox_out;
      70                 :            : }
      71                 :            : 
      72                 :            : static unsigned int fast_hash32(unsigned int x)
      73                 :            : {
      74                 :            :         int i;
      75                 :            : 
      76         [ #  # ]:          0 :         for (i = 0; i < 4; i++)
      77                 :            :                 x = fast_stage(x);
      78                 :            :         return x;
      79                 :            : }
      80                 :            : 
      81                 :            : static unsigned int
      82                 :            : byte_crc32(unsigned char data /* new byte for the crc calculation */,
      83                 :            :            unsigned old_crc /* crc result of the last iteration */)
      84                 :            : {
      85                 :            :         int i;
      86                 :            :         unsigned int crc, polynom = 0xedb88320;
      87                 :            :         /* the polynomial is built on the reversed version of
      88                 :            :          * the CRC polynomial with out the x64 element.
      89                 :            :          */
      90                 :            : 
      91                 :            :         crc = old_crc;
      92         [ #  # ]:          0 :         for (i = 0; i < 8; i++, data >>= 1)
      93         [ #  # ]:          0 :                 crc = (crc >> 1) ^ (((crc ^ data) & 0x1) ? polynom : 0);
      94                 :            :                 /* xor with polynomial is lsb of crc^data is 1 */
      95                 :            : 
      96                 :            :         return crc;
      97                 :            : }
      98                 :            : 
      99                 :            : static unsigned int crc32_table[256];
     100                 :            : 
     101                 :            : static void init_crc32_table(void)
     102                 :            : {
     103                 :            :         int i;
     104                 :            : 
     105         [ #  # ]:          0 :         for (i = 0; i < 256; i++)
     106                 :          0 :                 crc32_table[i] = byte_crc32((unsigned char)i, 0LL);
     107                 :            : }
     108                 :            : 
     109                 :            : static unsigned int
     110                 :            : crc32_string(unsigned char *data,
     111                 :            :              int size, unsigned int old_crc)
     112                 :            : {
     113                 :            :         unsigned int crc;
     114                 :            :         int i;
     115                 :            : 
     116                 :            :         crc = old_crc;
     117         [ #  # ]:          0 :         for (i = 0; i < size; i++)
     118                 :          0 :                 crc = (crc >> 8) ^ crc32_table[(crc ^ data[i]) & 0xff];
     119                 :            : 
     120                 :            :         return crc;
     121                 :            : }
     122                 :            : 
     123                 :          0 : static void hash_init(void)
     124                 :            : {
     125                 :            :         init_crc32_table();
     126                 :            :         int i, j;
     127                 :            : 
     128         [ #  # ]:          0 :         for (i = 0; i < 16; i++)
     129                 :          0 :                 sbox_tbl[i] = sbox(i);
     130                 :            : 
     131         [ #  # ]:          0 :         for (i = 0; i < 32; i += 4)
     132         [ #  # ]:          0 :                 for (j = 0; j < 16; j++) {
     133                 :            :                         /* (a,b)
     134                 :            :                          * (b,a^b)=(X,Y)
     135                 :            :                          * (X^Y,X)
     136                 :            :                          */
     137                 :          0 :                         unsigned int input = (0x88888888 ^ (8 << i)) | (j << i);
     138                 :            : 
     139                 :          0 :                         input ^= input << 16; /* (X^Y,Y) */
     140                 :          0 :                         input ^= input >> 16; /* (X^Y,X) */
     141                 :          0 :                         mix_tbl[i >> 2][j] = stage(input);
     142                 :            :                 }
     143                 :          0 : }
     144                 :            : 
     145                 :          0 : uint32_t rte_pmd_dpaa2_get_tlu_hash(uint8_t *data, int size)
     146                 :            : {
     147                 :            :         static int init;
     148                 :            : 
     149         [ #  # ]:          0 :         if (~init)
     150                 :          0 :                 hash_init();
     151                 :          0 :         init = 1;
     152                 :          0 :         return fast_hash32(crc32_string(data, size, 0x0));
     153                 :            : }

Generated by: LCOV version 1.14