Files
yttrium-virtio-gpu/NetKVM/DebugTools/RSS-Toeplitz/RSS-Toeplitz.cpp
T

106 lines
2.9 KiB
C++

// RSS-Toeplitz.cpp : Little-endian test for RSS Toeplitz hash
//
#include "stdafx.h"
#include "WinToeplitz.h"
static uint8_t testKey[WTEP_MAX_KEY_SIZE] = {
0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa };
static struct
{
uint32_t resultIP;
uint32_t resultTCP;
uint8_t sourceIP[4];
uint8_t destIP[4];
uint16_t sourcePort;
uint16_t destPort;
} testData[] =
{
{ 0x323e8fc2, 0x51ccc178, { 66, 9, 149, 187 }, { 161, 142, 100, 80 }, 2794, 1766 },
{ 0xd718262a, 0xc626b0ea, { 199, 92, 111, 2 }, { 65, 69, 140, 83 } , 14230, 4739 },
{ 0xd2d0a5de, 0x5c2b394a, { 24, 19, 198, 95 }, { 12, 22, 207, 184 }, 12898, 38024 },
{ 0x82989176, 0xafc7327f, { 38, 27, 205, 30 }, { 209, 142, 163, 6 }, 48228, 2217 },
{ 0x5d1809c5, 0x10e828a2, { 153, 39, 163, 191 }, { 202, 188, 127, 2 }, 44251, 1303 },
};
int _tmain(int argc, _TCHAR* argv[])
{
int i;
uint8_t vector[12];
toeplitzw_initialize(testKey, sizeof(testKey));
for (i = 0; i < sizeof(testData)/sizeof(testData[0]); ++i)
{
uint32_t res;
vector[0] = testData[i].sourceIP[0];
vector[1] = testData[i].sourceIP[1];
vector[2] = testData[i].sourceIP[2];
vector[3] = testData[i].sourceIP[3];
vector[4] = testData[i].destIP[0];
vector[5] = testData[i].destIP[1];
vector[6] = testData[i].destIP[2];
vector[7] = testData[i].destIP[3];
vector[8] = testData[i].sourcePort >> 8;
vector[9] = testData[i].sourcePort & 0xff;
vector[10] = testData[i].destPort >> 8;
vector[11] = testData[i].destPort & 0xff;
res = toeplitzw_hash(vector, 8);
if (res == testData[i].resultIP)
printf("Test %d: IP OK\n", i);
else
printf("Test %d: IP FAILED\n", i);
res = toeplitzw_hash(vector, 12);
if (res == testData[i].resultTCP)
printf("Test %d: TCP OK\n", i);
else
printf("Test %d: TCP FAILED\n", i);
}
}
static void invertbits(const uint8_t *from, int len, uint8_t *to)
{
// 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f
static uint8_t trans[16] = { 0x00, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e, 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f };
while (len--)
{
uint8_t lo = trans[*from >> 4];
uint8_t hi = trans[*from & 0xf];
*to = (hi << 4) | lo;
++from;
++to;
}
}
static void printbitsofbyte(uint8_t val, char last)
{
int i;
char s[9];
s[8] = 0;
for (i = 0; i < 8; ++i) s[i] = (val & (1 << i)) ? '1' : '0';
printf("%s%c", s, last);
}
static void printbits(const char *name, uint8_t *p, int len)
{
int i;
printf("%s", name);
for (i = 0; i < len/4; ++i)
{
printbitsofbyte(p[4*i], ' ');
printbitsofbyte(p[4*i + 1], ' ');
printbitsofbyte(p[4*i + 2], ' ');
printbitsofbyte(p[4*i + 3], '\n');
}
for (i = 0; i < len % 4; ++i)
{
printbitsofbyte(p[(len/4)*4 + i], ' ');
}
printf("\n");
}