1*76404edcSAsim Jamshed #include <stdio.h>
2*76404edcSAsim Jamshed #include <string.h>
3*76404edcSAsim Jamshed #include <stdint.h>
4*76404edcSAsim Jamshed //#include <sys/socket.h>
5*76404edcSAsim Jamshed #include <netinet/in.h>
6*76404edcSAsim Jamshed #include <arpa/inet.h>
7*76404edcSAsim Jamshed #include <stdlib.h>
8*76404edcSAsim Jamshed #include <unistd.h>
9*76404edcSAsim Jamshed
10*76404edcSAsim Jamshed //static int num_queue = 4;
11*76404edcSAsim Jamshed
12*76404edcSAsim Jamshed /*-------------------------------------------------------------*/
13*76404edcSAsim Jamshed static void
BuildKeyCache(uint32_t * cache,int cache_len)14*76404edcSAsim Jamshed BuildKeyCache(uint32_t *cache, int cache_len)
15*76404edcSAsim Jamshed {
16*76404edcSAsim Jamshed #define NBBY 8 /* number of bits per byte */
17*76404edcSAsim Jamshed
18*76404edcSAsim Jamshed // 16bit test set
19*76404edcSAsim Jamshed /*
20*76404edcSAsim Jamshed static const uint8_t key[] = {
21*76404edcSAsim Jamshed 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
22*76404edcSAsim Jamshed 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
23*76404edcSAsim Jamshed 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
24*76404edcSAsim Jamshed 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,
25*76404edcSAsim Jamshed 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00
26*76404edcSAsim Jamshed };
27*76404edcSAsim Jamshed */
28*76404edcSAsim Jamshed /*
29*76404edcSAsim Jamshed static const uint8_t key[] = {
30*76404edcSAsim Jamshed 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
31*76404edcSAsim Jamshed 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
32*76404edcSAsim Jamshed 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
33*76404edcSAsim Jamshed 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a,
34*76404edcSAsim Jamshed 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a, 0x6d, 0x5a
35*76404edcSAsim Jamshed };
36*76404edcSAsim Jamshed */
37*76404edcSAsim Jamshed
38*76404edcSAsim Jamshed /*
39*76404edcSAsim Jamshed static const uint8_t key[] = {
40*76404edcSAsim Jamshed 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
41*76404edcSAsim Jamshed 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
42*76404edcSAsim Jamshed 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
43*76404edcSAsim Jamshed 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
44*76404edcSAsim Jamshed 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
45*76404edcSAsim Jamshed };
46*76404edcSAsim Jamshed */
47*76404edcSAsim Jamshed
48*76404edcSAsim Jamshed // 32bit test set
49*76404edcSAsim Jamshed /*
50*76404edcSAsim Jamshed static const uint8_t key[] = {
51*76404edcSAsim Jamshed 0x6d, 0x5a, 0x56, 0x25, 0x6d, 0x5a, 0x56, 0x25,
52*76404edcSAsim Jamshed 0x6d, 0x5a, 0x56, 0x25, 0x6d, 0x5a, 0x56, 0x25,
53*76404edcSAsim Jamshed 0x6d, 0x5a, 0x56, 0x25, 0x6d, 0x5a, 0x56, 0x25,
54*76404edcSAsim Jamshed 0x6d, 0x5a, 0x56, 0x25, 0x6d, 0x5a, 0x56, 0x25,
55*76404edcSAsim Jamshed 0x6d, 0x5a, 0x56, 0x25, 0x6d, 0x5a, 0x56, 0x25
56*76404edcSAsim Jamshed };
57*76404edcSAsim Jamshed */
58*76404edcSAsim Jamshed /* ixgbe driver had a different set of keys than that of Microsoft
59*76404edcSAsim Jamshed RSS keys */
60*76404edcSAsim Jamshed /* static const uint8_t key[] = {
61*76404edcSAsim Jamshed 0x3D, 0xD7, 0x91, 0xE2,
62*76404edcSAsim Jamshed 0x6C, 0xEC, 0x05, 0x18,
63*76404edcSAsim Jamshed 0x0D, 0xB3, 0x94, 0x2A,
64*76404edcSAsim Jamshed 0xEC, 0x2B, 0x4F, 0xA5,
65*76404edcSAsim Jamshed 0x7C, 0xAF, 0x49, 0xEA,
66*76404edcSAsim Jamshed 0x3D, 0xAD, 0x14, 0xE2,
67*76404edcSAsim Jamshed 0xBE, 0xAA, 0x55, 0xB8,
68*76404edcSAsim Jamshed 0xEA, 0x67, 0x3E, 0x6A,
69*76404edcSAsim Jamshed 0x17, 0x4D, 0x36, 0x14,
70*76404edcSAsim Jamshed 0x0D, 0x20, 0xED, 0x3B};
71*76404edcSAsim Jamshed */
72*76404edcSAsim Jamshed
73*76404edcSAsim Jamshed #if 0
74*76404edcSAsim Jamshed /* Microsoft RSS keys */
75*76404edcSAsim Jamshed static const uint8_t key[] = {
76*76404edcSAsim Jamshed 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
77*76404edcSAsim Jamshed 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
78*76404edcSAsim Jamshed 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
79*76404edcSAsim Jamshed 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
80*76404edcSAsim Jamshed 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
81*76404edcSAsim Jamshed };
82*76404edcSAsim Jamshed #endif
83*76404edcSAsim Jamshed /* Keys for system testing */
84*76404edcSAsim Jamshed static const uint8_t key[] = {
85*76404edcSAsim Jamshed 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
86*76404edcSAsim Jamshed 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
87*76404edcSAsim Jamshed 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
88*76404edcSAsim Jamshed 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
89*76404edcSAsim Jamshed 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05
90*76404edcSAsim Jamshed };
91*76404edcSAsim Jamshed
92*76404edcSAsim Jamshed uint32_t result = (((uint32_t)key[0]) << 24) | (((uint32_t)key[1]) << 16) | (((uint32_t)key[2]) << 8) | ((uint32_t)key[3]);
93*76404edcSAsim Jamshed uint32_t idx = 32;
94*76404edcSAsim Jamshed int i;
95*76404edcSAsim Jamshed
96*76404edcSAsim Jamshed for (i = 0; i < cache_len; i++, idx++) {
97*76404edcSAsim Jamshed uint8_t shift = (idx % NBBY);
98*76404edcSAsim Jamshed uint32_t bit;
99*76404edcSAsim Jamshed
100*76404edcSAsim Jamshed cache[i] = result;
101*76404edcSAsim Jamshed bit = ((key[idx/NBBY] << shift) & 0x80) ? 1 : 0;
102*76404edcSAsim Jamshed result = ((result << 1) | bit);
103*76404edcSAsim Jamshed }
104*76404edcSAsim Jamshed
105*76404edcSAsim Jamshed }
106*76404edcSAsim Jamshed /*-------------------------------------------------------------*/
107*76404edcSAsim Jamshed static uint32_t
GetRSSHash(in_addr_t sip,in_addr_t dip,in_port_t sp,in_port_t dp)108*76404edcSAsim Jamshed GetRSSHash(in_addr_t sip, in_addr_t dip, in_port_t sp, in_port_t dp)
109*76404edcSAsim Jamshed {
110*76404edcSAsim Jamshed #define MSB32 0x80000000
111*76404edcSAsim Jamshed #define MSB16 0x8000
112*76404edcSAsim Jamshed #define KEY_CACHE_LEN 96
113*76404edcSAsim Jamshed
114*76404edcSAsim Jamshed uint32_t res = 0;
115*76404edcSAsim Jamshed int i;
116*76404edcSAsim Jamshed static int first = 1;
117*76404edcSAsim Jamshed static uint32_t key_cache[KEY_CACHE_LEN] = {0};
118*76404edcSAsim Jamshed
119*76404edcSAsim Jamshed if (first) {
120*76404edcSAsim Jamshed BuildKeyCache(key_cache, KEY_CACHE_LEN);
121*76404edcSAsim Jamshed first = 0;
122*76404edcSAsim Jamshed }
123*76404edcSAsim Jamshed
124*76404edcSAsim Jamshed for (i = 0; i < 32; i++) {
125*76404edcSAsim Jamshed if (sip & MSB32)
126*76404edcSAsim Jamshed res ^= key_cache[i];
127*76404edcSAsim Jamshed sip <<= 1;
128*76404edcSAsim Jamshed }
129*76404edcSAsim Jamshed for (i = 0; i < 32; i++) {
130*76404edcSAsim Jamshed if (dip & MSB32)
131*76404edcSAsim Jamshed res ^= key_cache[32+i];
132*76404edcSAsim Jamshed dip <<= 1;
133*76404edcSAsim Jamshed }
134*76404edcSAsim Jamshed for (i = 0; i < 16; i++) {
135*76404edcSAsim Jamshed if (sp & MSB16)
136*76404edcSAsim Jamshed res ^= key_cache[64+i];
137*76404edcSAsim Jamshed sp <<= 1;
138*76404edcSAsim Jamshed }
139*76404edcSAsim Jamshed for (i = 0; i < 16; i++) {
140*76404edcSAsim Jamshed if (dp & MSB16)
141*76404edcSAsim Jamshed res ^= key_cache[80+i];
142*76404edcSAsim Jamshed dp <<= 1;
143*76404edcSAsim Jamshed }
144*76404edcSAsim Jamshed return res;
145*76404edcSAsim Jamshed }
146*76404edcSAsim Jamshed /*-------------------------------------------------------------------*/
147*76404edcSAsim Jamshed /* RSS redirection table is in the little endian byte order (intel) */
148*76404edcSAsim Jamshed /* */
149*76404edcSAsim Jamshed /* idx: 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15 | 16 17 18 19 ...*/
150*76404edcSAsim Jamshed /* val: 3 2 1 0 | 7 6 5 4 | 11 10 9 8 | 15 14 13 12 | 19 18 17 16 ...*/
151*76404edcSAsim Jamshed /* qid = val % num_queues */
152*76404edcSAsim Jamshed /*-------------------------------------------------------------------*/
153*76404edcSAsim Jamshed #if 0
154*76404edcSAsim Jamshed int
155*76404edcSAsim Jamshed GetRSSCPUCore(in_addr_t sip, in_addr_t dip,
156*76404edcSAsim Jamshed in_port_t sp, in_port_t dp, int num_queues)
157*76404edcSAsim Jamshed {
158*76404edcSAsim Jamshed #define RSS_BIT_MASK 0x0000007F
159*76404edcSAsim Jamshed
160*76404edcSAsim Jamshed uint32_t masked = GetRSSHash(sip, dip, sp, dp) & RSS_BIT_MASK;
161*76404edcSAsim Jamshed
162*76404edcSAsim Jamshed #ifndef ENABLE_DPDK
163*76404edcSAsim Jamshed static const uint32_t off[4] = {3, 1, -1, -3};
164*76404edcSAsim Jamshed masked += off[masked & 0x3];
165*76404edcSAsim Jamshed #endif
166*76404edcSAsim Jamshed return (masked % num_queues);
167*76404edcSAsim Jamshed
168*76404edcSAsim Jamshed }
169*76404edcSAsim Jamshed #endif
170*76404edcSAsim Jamshed #if _TEST_RSS_
171*76404edcSAsim Jamshed /*-------------------------------------------------------------*/
172*76404edcSAsim Jamshed static void
VerifyRSSHash(void)173*76404edcSAsim Jamshed VerifyRSSHash(void)
174*76404edcSAsim Jamshed {
175*76404edcSAsim Jamshed in_addr_t faddr, laddr;
176*76404edcSAsim Jamshed in_port_t fport, lport;
177*76404edcSAsim Jamshed char *src[] = {"66.9.149.187",
178*76404edcSAsim Jamshed "199.92.111.2",
179*76404edcSAsim Jamshed "24.19.198.95",
180*76404edcSAsim Jamshed "38.27.205.30",
181*76404edcSAsim Jamshed "153.39.163.191"};
182*76404edcSAsim Jamshed char *dest[] = {"161.142.100.80",
183*76404edcSAsim Jamshed "65.69.140.83",
184*76404edcSAsim Jamshed "12.22.207.184",
185*76404edcSAsim Jamshed "209.142.163.6",
186*76404edcSAsim Jamshed "202.188.127.2"};
187*76404edcSAsim Jamshed in_port_t src_port[] = {2794, 14230, 12898, 48228, 44251};
188*76404edcSAsim Jamshed in_port_t dest_port[] = {1766, 4739, 38024, 2217, 1303};
189*76404edcSAsim Jamshed uint32_t correct_hash[] = {0x51ccc178,
190*76404edcSAsim Jamshed 0xc626b0ea,
191*76404edcSAsim Jamshed 0x5c2b394a,
192*76404edcSAsim Jamshed 0xafc7327f,
193*76404edcSAsim Jamshed 0x10e828a2};
194*76404edcSAsim Jamshed int i;
195*76404edcSAsim Jamshed
196*76404edcSAsim Jamshed /*
197*76404edcSAsim Jamshed * RSS hash calculation verification example is from
198*76404edcSAsim Jamshed * http://msdn.microsoft.com/en-us/library/ff571021%28v=vs.85%29.aspx
199*76404edcSAsim Jamshed */
200*76404edcSAsim Jamshed
201*76404edcSAsim Jamshed for (i = 0; i < 5; i++) {
202*76404edcSAsim Jamshed struct in_addr addr;
203*76404edcSAsim Jamshed
204*76404edcSAsim Jamshed if (inet_aton(src[i], &addr) == 0) {
205*76404edcSAsim Jamshed fprintf(stderr, "inet_aton error\n");
206*76404edcSAsim Jamshed exit(-1);
207*76404edcSAsim Jamshed }
208*76404edcSAsim Jamshed faddr = ntohl(addr.s_addr);
209*76404edcSAsim Jamshed
210*76404edcSAsim Jamshed if (inet_aton(dest[i], &addr) == 0) {
211*76404edcSAsim Jamshed fprintf(stderr, "inet_aton error\n");
212*76404edcSAsim Jamshed exit(-1);
213*76404edcSAsim Jamshed }
214*76404edcSAsim Jamshed laddr = ntohl(addr.s_addr);
215*76404edcSAsim Jamshed
216*76404edcSAsim Jamshed fport = src_port[i];
217*76404edcSAsim Jamshed lport = dest_port[i];
218*76404edcSAsim Jamshed
219*76404edcSAsim Jamshed printf("(%15s %15s %5d %5d) 0x%08x, correct_hash: 0x%08x\n",
220*76404edcSAsim Jamshed src[i], dest[i], src_port[i], dest_port[i],
221*76404edcSAsim Jamshed GetRSSHash(faddr, laddr, fport, lport), correct_hash[i]);
222*76404edcSAsim Jamshed }
223*76404edcSAsim Jamshed }
224*76404edcSAsim Jamshed
225*76404edcSAsim Jamshed static unsigned long next = 2192123;
myrand(void)226*76404edcSAsim Jamshed unsigned int myrand(void){
227*76404edcSAsim Jamshed next = next * 1103515245 + 12345;
228*76404edcSAsim Jamshed return next/65536;
229*76404edcSAsim Jamshed }
230*76404edcSAsim Jamshed
231*76404edcSAsim Jamshed static void
CheckRSSHash(int cnt,const char * src_ip,const char * dest_ip,int32_t src_port,int32_t dest_port)232*76404edcSAsim Jamshed CheckRSSHash(int cnt, const char* src_ip, const char* dest_ip, int32_t src_port, int32_t dest_port)
233*76404edcSAsim Jamshed {
234*76404edcSAsim Jamshed
235*76404edcSAsim Jamshed struct in_addr saddr, daddr;
236*76404edcSAsim Jamshed char saddr_str[15], daddr_str[15];
237*76404edcSAsim Jamshed in_port_t sport, dport;
238*76404edcSAsim Jamshed long queue_cnt[num_queue];
239*76404edcSAsim Jamshed int queue_idx;
240*76404edcSAsim Jamshed
241*76404edcSAsim Jamshed
242*76404edcSAsim Jamshed int i;
243*76404edcSAsim Jamshed for( i = 0; i < num_queue; i++)
244*76404edcSAsim Jamshed {
245*76404edcSAsim Jamshed queue_cnt[i] = 0;
246*76404edcSAsim Jamshed }
247*76404edcSAsim Jamshed
248*76404edcSAsim Jamshed printf("src\tdest\tqueue_idx\n");
249*76404edcSAsim Jamshed
250*76404edcSAsim Jamshed for( i =0; i < cnt; i++){
251*76404edcSAsim Jamshed // Only generate src/dest address when no address specified
252*76404edcSAsim Jamshed if (src_ip == NULL) {
253*76404edcSAsim Jamshed saddr.s_addr = (in_addr_t) myrand();
254*76404edcSAsim Jamshed } else {
255*76404edcSAsim Jamshed if (inet_aton(src_ip, &saddr) == 0) saddr.s_addr = (in_addr_t) myrand();
256*76404edcSAsim Jamshed }
257*76404edcSAsim Jamshed if (dest_ip == NULL) {
258*76404edcSAsim Jamshed daddr.s_addr = (in_addr_t) myrand();
259*76404edcSAsim Jamshed } else {
260*76404edcSAsim Jamshed if (inet_aton(dest_ip, &daddr) == 0) daddr.s_addr = (in_addr_t) myrand();
261*76404edcSAsim Jamshed }
262*76404edcSAsim Jamshed
263*76404edcSAsim Jamshed int32_t ports = (int32_t) myrand();
264*76404edcSAsim Jamshed if (src_port > 0) {
265*76404edcSAsim Jamshed sport = htons(src_port);
266*76404edcSAsim Jamshed } else {
267*76404edcSAsim Jamshed sport = ports;
268*76404edcSAsim Jamshed }
269*76404edcSAsim Jamshed if (dest_port > 0) {
270*76404edcSAsim Jamshed dport = htons(dest_port);
271*76404edcSAsim Jamshed } else {
272*76404edcSAsim Jamshed dport = ports >> 16;
273*76404edcSAsim Jamshed }
274*76404edcSAsim Jamshed
275*76404edcSAsim Jamshed //get rss hash
276*76404edcSAsim Jamshed queue_idx = GetRSSCPUCore(saddr.s_addr, daddr.s_addr, sport, dport, num_queue);
277*76404edcSAsim Jamshed //create logs
278*76404edcSAsim Jamshed strncpy(saddr_str, inet_ntoa(saddr), 15);
279*76404edcSAsim Jamshed strncpy(daddr_str, inet_ntoa(daddr), 15);
280*76404edcSAsim Jamshed printf("%15s:%5d\t%15s:%5d\t%d\n", saddr_str, ntohs(sport), daddr_str, ntohs(dport), queue_idx);
281*76404edcSAsim Jamshed
282*76404edcSAsim Jamshed queue_idx = GetRSSCPUCore(daddr.s_addr, saddr.s_addr, dport, sport, num_queue);
283*76404edcSAsim Jamshed printf("%15s:%5d\t%15s:%5d\t%d\n", daddr_str, ntohs(dport), saddr_str, ntohs(sport), queue_idx);
284*76404edcSAsim Jamshed
285*76404edcSAsim Jamshed queue_cnt[queue_idx]++;
286*76404edcSAsim Jamshed }
287*76404edcSAsim Jamshed
288*76404edcSAsim Jamshed printf("\n-----summary-----\n");
289*76404edcSAsim Jamshed for( i = 0; i < num_queue; i++)
290*76404edcSAsim Jamshed {
291*76404edcSAsim Jamshed printf("%ld\n", queue_cnt[i]);
292*76404edcSAsim Jamshed }
293*76404edcSAsim Jamshed printf("\n");
294*76404edcSAsim Jamshed
295*76404edcSAsim Jamshed }
296*76404edcSAsim Jamshed
297*76404edcSAsim Jamshed void
print_usage(int argc,char ** argv)298*76404edcSAsim Jamshed print_usage(int argc, char** argv){
299*76404edcSAsim Jamshed printf("Usage: %s -c number_of_test_ip [options]\n", argv[0]);
300*76404edcSAsim Jamshed printf("Options:\n");
301*76404edcSAsim Jamshed printf(" -r seed(long) : Specifiy random seed\n");
302*76404edcSAsim Jamshed printf(" -s srcIP : Source IP address\n");
303*76404edcSAsim Jamshed printf(" -S srcPort : Source port number\n");
304*76404edcSAsim Jamshed printf(" -d destIP : Destination IP address\n");
305*76404edcSAsim Jamshed printf(" -D destPort : Destination port number\n");
306*76404edcSAsim Jamshed printf("Any of source/destination IP/port could be omitted.\n");
307*76404edcSAsim Jamshed printf("If absent, random generated address is used.\n");
308*76404edcSAsim Jamshed }
309*76404edcSAsim Jamshed
310*76404edcSAsim Jamshed /*-------------------------------------------------------------*/
311*76404edcSAsim Jamshed int
main(int argc,char ** argv)312*76404edcSAsim Jamshed main(int argc, char** argv)
313*76404edcSAsim Jamshed {
314*76404edcSAsim Jamshed int opt;
315*76404edcSAsim Jamshed int cnt = -1;
316*76404edcSAsim Jamshed long seed = -1;
317*76404edcSAsim Jamshed int32_t sport = -1, dport = -1;
318*76404edcSAsim Jamshed char *srcIP = 0, *destIP = 0;
319*76404edcSAsim Jamshed while ((opt=getopt(argc, argv, "c:r:sS:dD:")) != -1) {
320*76404edcSAsim Jamshed switch (opt) {
321*76404edcSAsim Jamshed case 'c':
322*76404edcSAsim Jamshed cnt = atoi(optarg);
323*76404edcSAsim Jamshed break;
324*76404edcSAsim Jamshed case 'r':
325*76404edcSAsim Jamshed seed = atol(optarg);
326*76404edcSAsim Jamshed break;
327*76404edcSAsim Jamshed case 's':
328*76404edcSAsim Jamshed srcIP = strdup(argv[optind]);
329*76404edcSAsim Jamshed break;
330*76404edcSAsim Jamshed case 'S':
331*76404edcSAsim Jamshed sport = atoi(optarg);
332*76404edcSAsim Jamshed break;
333*76404edcSAsim Jamshed case 'd':
334*76404edcSAsim Jamshed destIP = strdup(argv[optind]);
335*76404edcSAsim Jamshed break;
336*76404edcSAsim Jamshed case 'D':
337*76404edcSAsim Jamshed dport = atoi(optarg);
338*76404edcSAsim Jamshed break;
339*76404edcSAsim Jamshed }
340*76404edcSAsim Jamshed }
341*76404edcSAsim Jamshed
342*76404edcSAsim Jamshed if (cnt < 1) {
343*76404edcSAsim Jamshed print_usage(argc, argv);
344*76404edcSAsim Jamshed exit(0);
345*76404edcSAsim Jamshed }
346*76404edcSAsim Jamshed if (seed > 0) next = seed;
347*76404edcSAsim Jamshed
348*76404edcSAsim Jamshed // Test configuration:
349*76404edcSAsim Jamshed // 10.10.4.11:X (rock5) -> 10.10.2.10:80 (rock4)
350*76404edcSAsim Jamshed CheckRSSHash(cnt, srcIP, destIP, sport, dport);
351*76404edcSAsim Jamshed
352*76404edcSAsim Jamshed if (srcIP) free(srcIP);
353*76404edcSAsim Jamshed if (destIP) free(destIP);
354*76404edcSAsim Jamshed return 0;
355*76404edcSAsim Jamshed }
356*76404edcSAsim Jamshed #endif
357