xref: /f-stack/dpdk/app/test/test_thash.c (revision 4418919f)
1*4418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
2*4418919fSjohnjiang  * Copyright(c) 2015-2019 Vladimir Medvedkin <[email protected]>
3*4418919fSjohnjiang  */
4*4418919fSjohnjiang 
5*4418919fSjohnjiang #include <rte_common.h>
6*4418919fSjohnjiang #include <rte_eal.h>
7*4418919fSjohnjiang #include <rte_ip.h>
8*4418919fSjohnjiang 
9*4418919fSjohnjiang #include "test.h"
10*4418919fSjohnjiang 
11*4418919fSjohnjiang #include <rte_thash.h>
12*4418919fSjohnjiang 
13*4418919fSjohnjiang struct test_thash_v4 {
14*4418919fSjohnjiang 	uint32_t	dst_ip;
15*4418919fSjohnjiang 	uint32_t	src_ip;
16*4418919fSjohnjiang 	uint16_t	dst_port;
17*4418919fSjohnjiang 	uint16_t	src_port;
18*4418919fSjohnjiang 	uint32_t	hash_l3;
19*4418919fSjohnjiang 	uint32_t	hash_l3l4;
20*4418919fSjohnjiang };
21*4418919fSjohnjiang 
22*4418919fSjohnjiang struct test_thash_v6 {
23*4418919fSjohnjiang 	uint8_t		dst_ip[16];
24*4418919fSjohnjiang 	uint8_t		src_ip[16];
25*4418919fSjohnjiang 	uint16_t	dst_port;
26*4418919fSjohnjiang 	uint16_t	src_port;
27*4418919fSjohnjiang 	uint32_t	hash_l3;
28*4418919fSjohnjiang 	uint32_t	hash_l3l4;
29*4418919fSjohnjiang };
30*4418919fSjohnjiang 
31*4418919fSjohnjiang /*From 82599 Datasheet 7.1.2.8.3 RSS Verification Suite*/
32*4418919fSjohnjiang struct test_thash_v4 v4_tbl[] = {
33*4418919fSjohnjiang {RTE_IPV4(161, 142, 100, 80), RTE_IPV4(66, 9, 149, 187),
34*4418919fSjohnjiang 	1766, 2794, 0x323e8fc2, 0x51ccc178},
35*4418919fSjohnjiang {RTE_IPV4(65, 69, 140, 83), RTE_IPV4(199, 92, 111, 2),
36*4418919fSjohnjiang 	4739, 14230, 0xd718262a, 0xc626b0ea},
37*4418919fSjohnjiang {RTE_IPV4(12, 22, 207, 184), RTE_IPV4(24, 19, 198, 95),
38*4418919fSjohnjiang 	38024, 12898, 0xd2d0a5de, 0x5c2b394a},
39*4418919fSjohnjiang {RTE_IPV4(209, 142, 163, 6), RTE_IPV4(38, 27, 205, 30),
40*4418919fSjohnjiang 	2217, 48228, 0x82989176, 0xafc7327f},
41*4418919fSjohnjiang {RTE_IPV4(202, 188, 127, 2), RTE_IPV4(153, 39, 163, 191),
42*4418919fSjohnjiang 	1303, 44251, 0x5d1809c5, 0x10e828a2},
43*4418919fSjohnjiang };
44*4418919fSjohnjiang 
45*4418919fSjohnjiang struct test_thash_v6 v6_tbl[] = {
46*4418919fSjohnjiang /*3ffe:2501:200:3::1*/
47*4418919fSjohnjiang {{0x3f, 0xfe, 0x25, 0x01, 0x02, 0x00, 0x00, 0x03,
48*4418919fSjohnjiang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,},
49*4418919fSjohnjiang /*3ffe:2501:200:1fff::7*/
50*4418919fSjohnjiang {0x3f, 0xfe, 0x25, 0x01, 0x02, 0x00, 0x1f, 0xff,
51*4418919fSjohnjiang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,},
52*4418919fSjohnjiang 1766, 2794, 0x2cc18cd5, 0x40207d3d},
53*4418919fSjohnjiang /*ff02::1*/
54*4418919fSjohnjiang {{0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55*4418919fSjohnjiang 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,},
56*4418919fSjohnjiang /*3ffe:501:8::260:97ff:fe40:efab*/
57*4418919fSjohnjiang {0x3f, 0xfe, 0x05, 0x01, 0x00, 0x08, 0x00, 0x00,
58*4418919fSjohnjiang 0x02, 0x60, 0x97, 0xff, 0xfe, 0x40, 0xef, 0xab,},
59*4418919fSjohnjiang 4739, 14230, 0x0f0c461c, 0xdde51bbf},
60*4418919fSjohnjiang /*fe80::200:f8ff:fe21:67cf*/
61*4418919fSjohnjiang {{0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62*4418919fSjohnjiang 0x02, 0x00, 0xf8, 0xff, 0xfe, 0x21, 0x67, 0xcf,},
63*4418919fSjohnjiang /*3ffe:1900:4545:3:200:f8ff:fe21:67cf*/
64*4418919fSjohnjiang {0x3f, 0xfe, 0x19, 0x00, 0x45, 0x45, 0x00, 0x03,
65*4418919fSjohnjiang 0x02, 0x00, 0xf8, 0xff, 0xfe, 0x21, 0x67, 0xcf,},
66*4418919fSjohnjiang 38024, 44251, 0x4b61e985, 0x02d1feef},
67*4418919fSjohnjiang };
68*4418919fSjohnjiang 
69*4418919fSjohnjiang uint8_t default_rss_key[] = {
70*4418919fSjohnjiang 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
71*4418919fSjohnjiang 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
72*4418919fSjohnjiang 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
73*4418919fSjohnjiang 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
74*4418919fSjohnjiang 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa,
75*4418919fSjohnjiang };
76*4418919fSjohnjiang 
77*4418919fSjohnjiang static int
test_thash(void)78*4418919fSjohnjiang test_thash(void)
79*4418919fSjohnjiang {
80*4418919fSjohnjiang 	uint32_t i, j;
81*4418919fSjohnjiang 	union rte_thash_tuple tuple;
82*4418919fSjohnjiang 	uint32_t rss_l3, rss_l3l4;
83*4418919fSjohnjiang 	uint8_t rss_key_be[RTE_DIM(default_rss_key)];
84*4418919fSjohnjiang 	struct rte_ipv6_hdr ipv6_hdr;
85*4418919fSjohnjiang 
86*4418919fSjohnjiang 	/* Convert RSS key*/
87*4418919fSjohnjiang 	rte_convert_rss_key((uint32_t *)&default_rss_key,
88*4418919fSjohnjiang 		(uint32_t *)rss_key_be, RTE_DIM(default_rss_key));
89*4418919fSjohnjiang 
90*4418919fSjohnjiang 
91*4418919fSjohnjiang 	for (i = 0; i < RTE_DIM(v4_tbl); i++) {
92*4418919fSjohnjiang 		tuple.v4.src_addr = v4_tbl[i].src_ip;
93*4418919fSjohnjiang 		tuple.v4.dst_addr = v4_tbl[i].dst_ip;
94*4418919fSjohnjiang 		tuple.v4.sport = v4_tbl[i].src_port;
95*4418919fSjohnjiang 		tuple.v4.dport = v4_tbl[i].dst_port;
96*4418919fSjohnjiang 		/*Calculate hash with original key*/
97*4418919fSjohnjiang 		rss_l3 = rte_softrss((uint32_t *)&tuple,
98*4418919fSjohnjiang 				RTE_THASH_V4_L3_LEN, default_rss_key);
99*4418919fSjohnjiang 		rss_l3l4 = rte_softrss((uint32_t *)&tuple,
100*4418919fSjohnjiang 				RTE_THASH_V4_L4_LEN, default_rss_key);
101*4418919fSjohnjiang 		if ((rss_l3 != v4_tbl[i].hash_l3) ||
102*4418919fSjohnjiang 				(rss_l3l4 != v4_tbl[i].hash_l3l4))
103*4418919fSjohnjiang 			return -1;
104*4418919fSjohnjiang 		/*Calculate hash with converted key*/
105*4418919fSjohnjiang 		rss_l3 = rte_softrss_be((uint32_t *)&tuple,
106*4418919fSjohnjiang 				RTE_THASH_V4_L3_LEN, rss_key_be);
107*4418919fSjohnjiang 		rss_l3l4 = rte_softrss_be((uint32_t *)&tuple,
108*4418919fSjohnjiang 				RTE_THASH_V4_L4_LEN, rss_key_be);
109*4418919fSjohnjiang 		if ((rss_l3 != v4_tbl[i].hash_l3) ||
110*4418919fSjohnjiang 				(rss_l3l4 != v4_tbl[i].hash_l3l4))
111*4418919fSjohnjiang 			return -1;
112*4418919fSjohnjiang 	}
113*4418919fSjohnjiang 	for (i = 0; i < RTE_DIM(v6_tbl); i++) {
114*4418919fSjohnjiang 		/*Fill ipv6 hdr*/
115*4418919fSjohnjiang 		for (j = 0; j < RTE_DIM(ipv6_hdr.src_addr); j++)
116*4418919fSjohnjiang 			ipv6_hdr.src_addr[j] = v6_tbl[i].src_ip[j];
117*4418919fSjohnjiang 		for (j = 0; j < RTE_DIM(ipv6_hdr.dst_addr); j++)
118*4418919fSjohnjiang 			ipv6_hdr.dst_addr[j] = v6_tbl[i].dst_ip[j];
119*4418919fSjohnjiang 		/*Load and convert ipv6 address into tuple*/
120*4418919fSjohnjiang 		rte_thash_load_v6_addrs(&ipv6_hdr, &tuple);
121*4418919fSjohnjiang 		tuple.v6.sport = v6_tbl[i].src_port;
122*4418919fSjohnjiang 		tuple.v6.dport = v6_tbl[i].dst_port;
123*4418919fSjohnjiang 		/*Calculate hash with original key*/
124*4418919fSjohnjiang 		rss_l3 = rte_softrss((uint32_t *)&tuple,
125*4418919fSjohnjiang 				RTE_THASH_V6_L3_LEN, default_rss_key);
126*4418919fSjohnjiang 		rss_l3l4 = rte_softrss((uint32_t *)&tuple,
127*4418919fSjohnjiang 				RTE_THASH_V6_L4_LEN, default_rss_key);
128*4418919fSjohnjiang 		if ((rss_l3 != v6_tbl[i].hash_l3) ||
129*4418919fSjohnjiang 				(rss_l3l4 != v6_tbl[i].hash_l3l4))
130*4418919fSjohnjiang 			return -1;
131*4418919fSjohnjiang 		/*Calculate hash with converted key*/
132*4418919fSjohnjiang 		rss_l3 = rte_softrss_be((uint32_t *)&tuple,
133*4418919fSjohnjiang 				RTE_THASH_V6_L3_LEN, rss_key_be);
134*4418919fSjohnjiang 		rss_l3l4 = rte_softrss_be((uint32_t *)&tuple,
135*4418919fSjohnjiang 				RTE_THASH_V6_L4_LEN, rss_key_be);
136*4418919fSjohnjiang 		if ((rss_l3 != v6_tbl[i].hash_l3) ||
137*4418919fSjohnjiang 				(rss_l3l4 != v6_tbl[i].hash_l3l4))
138*4418919fSjohnjiang 			return -1;
139*4418919fSjohnjiang 	}
140*4418919fSjohnjiang 	return 0;
141*4418919fSjohnjiang }
142*4418919fSjohnjiang 
143*4418919fSjohnjiang REGISTER_TEST_COMMAND(thash_autotest, test_thash);
144