Fixed issue with running and gracefully terminating net_test_router application.
[keystone-rtos/netapi.git] / ti / runtime / netapi / test / net_test_utils.c
1 /******************************************
2  * File: net_test_utils.c
3  * Purpose: net_test application general utilities
4  **************************************************************
5  * FILE:  net_test_utils.c
6  * 
7  * DESCRIPTION:  net_test application general utilities
8  * 
9  * REVISION HISTORY:
10  *
11  *  Copyright (c) Texas Instruments Incorporated 2010-2011
12  * 
13  *  Redistribution and use in source and binary forms, with or without 
14  *  modification, are permitted provided that the following conditions 
15  *  are met:
16  *
17  *    Redistributions of source code must retain the above copyright 
18  *    notice, this list of conditions and the following disclaimer.
19  *
20  *    Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the 
22  *    documentation and/or other materials provided with the   
23  *    distribution.
24  *
25  *    Neither the name of Texas Instruments Incorporated nor the names of
26  *    its contributors may be used to endorse or promote products derived
27  *    from this software without specific prior written permission.
28  *
29  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
30  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
31  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
32  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
33  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
34  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
35  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
38  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
39  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41  *****************************************/
43 #include "net_test_utils.h"
44 #include <signal.h>
45 #include <pthread.h>
46 #include "router.h"
48 #include "ti/drv/nwal/test/fw_rm.h"
49 #include <ti/drv/sa/salld.h>
50 #include <ti/drv/pa/pa.h>
52 extern NETAPI_T netapi_handle;
53 extern netTestConfig_t netTestCfg;
54 extern netTestConfig_t config;
55 extern netTestSA_t sa_info[];
56 extern NETAPI_SCHED_HANDLE_T * scheduler[];
57 extern Pktlib_HeapHandle ourHeap;
58 extern NETCP_CFG_IP_T ip_rule[];
59 extern NETCP_CFG_MACIF_T mac[];
63 netTestStats_T stats[NET_TEST_MAX_SP_THREAD + NET_TEST_MAX_FP_THREAD +1];
64 paSysStats_t netcp_stats;
68 static LastPktInfo_t lpInfo;
69 int netTest_utilCheckHeader(netTestHead_T * p_head, PKTIO_METADATA_T * p_meta)
70 {
71 #ifdef netTest_MULTI_THREAD
72     int coreid=Osal_nwalGetProcId();  //who we are(thread local)
73 #else
74     int coreid=0;
75 #endif
76     if (NWAL_RX_FLAG1_META_DATA_VALID & p_meta->u.rx_meta->rxFlag1)
77     {
78         lpInfo.iface = ((unsigned int)p_meta->u.rx_meta->appId) &0xff; //last byte is interface num
79         lpInfo.ipcsum =(p_meta->u.rx_meta->rxFlag1 & NWAL_RX_FLAG1_IPV4_CHKSUM_VERIFY_MASK )== NWAL_RX_FLAG1_IPV4_CHKSUM_VERIFY_ACK ? 1 : 0;
80         lpInfo.l4csum = (p_meta->u.rx_meta->rxFlag1 & NWAL_RX_FLAG1_L4_CHKSUM_VERIFY_MASK )== ((NWAL_RX_FLAG1_L4_CHKSUM_VERIFY_ACK) << NWAL_RX_FLAG1_L4_CHKSUM_VERIFY_SHIFT) ? 1 : 0; 
81         if ((unsigned int)p_meta->u.rx_meta->appId & NETAPI_NETCP_MATCH_IPSEC)
82         {
83         stats[coreid].sec_rx++;
84         }
85         if ((unsigned int)p_meta->u.rx_meta->appId & NETAPI_NETCP_MATCH_IPSEC_POLICY)
86         {
87         stats[coreid].secp_rx++;
88         }
90         if ((unsigned int)p_meta->u.rx_meta->appId & NETAPI_NETCP_MATCH_CLASS)
91         {
92             int c= ((unsigned int)p_meta->u.rx_meta->appId >>8)&0xffff;
93         if (c==0)  stats[coreid].n_class0_rx +=1;
94         else if (c==1) stats[coreid].n_class1_rx +=1;
95         else if (c==2) stats[coreid].n_class2_rx +=1;
96         else netapi_Log("**NET_TEST RX -unknown class: %x\n",  p_meta->u.rx_meta->appId);
97     }
98 }
100  return 1;
104 static int scnt=0;
105 int QUIT;
106 void netTest_utilMySig(int x)
108     QUIT=1;
109     scnt+=1;
110     netapi_Log(">net_test: recv'd signal %d cnt=%d\n",x,scnt);
111     if (scnt > 10)
112     {
113         netapi_Log(">net_test: WARNING EXITING WITH PROPER SHUTDOWN, LUTS LEFT ACTIVE\n");
114         exit(1);
115     }
117 unsigned long netTest_utilPeek(unsigned long * p)
119     return *p;
121 void netTest_utilDumpDescr(unsigned long *p, int n)
123     netapi_Log("--------dump of descriptor %d %x\n", n, (int) p);
124     netapi_Log("> %x %x %x %x %x %x %x %x\n",p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7]);
125     netapi_Log("> %x %x %x %x %x %x %x %x\n",p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);
126     netapi_Log("-----------------------------\n");
128 void netTest_utilDumpHeader(unsigned long *p, int n, int a, int r)
130     netapi_Log("--------dump of header %d %x appID=%x flag1=%x\n", n, (int) p,a,r);
131     netapi_Log("> %x %x %x %x %x %x %x %x\n",p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7]);
132     netapi_Log("> %x %x %x %x %x %x %x %x\n",p[8],p[9],p[10],p[11],p[12],p[13],p[14],p[15]);
133     netapi_Log("> %x %x %x %x %x %x %x %x\n",p[16],p[17],p[18],p[19],p[20],p[21],p[22],p[23]);
134     netapi_Log("> %x %x %x %x %x %x %x %x\n",p[24],p[25],p[26],p[27],p[28],p[29],p[30],p[31]);
135     netapi_Log("-----------------------------\n");
138 void   netTest_utilDumpBuffer
140     unsigned long *                      buf,
141     uint32_t                      buf_length
144     uint8_t                       count = 0;
145     uint16_t                      dump_size;
146     uint8_t*                     tmp_buf;
147     uint8_t                       row_count;
148     static uint8_t                first = 0;
150     //if(first > 2) return;
152     //first++;
154     dump_size = buf_length ;
156     tmp_buf = (uint8_t *)(buf);
158     netapi_Log("netapi *:  - 8 bit word hex Length: %d Start \n",buf_length);
159     do
160     {
161     row_count = (dump_size - count);
163         if(row_count == 0)
164         {
165             break;
166         }
168         if(row_count > 4)
169         {
170             row_count = 4;
171         }
173         switch (row_count)
174         {
175             case 4:
176             {
177                 netapi_Log("netapi *:%02d : %02x    %02x    %02x    %02x \n",
178                       count,tmp_buf[0],tmp_buf[1],tmp_buf[2],tmp_buf[3]);
179                 break;
180             }
181             case 3:
182             {
183                 netapi_Log("netapi *: %02d : %02x    %02x    %02x \n",
184                       count,tmp_buf[0],tmp_buf[1],tmp_buf[2]);
185                 break;
186             }
188             case 2:
189             {
190                 netapi_Log("netapi *: %02d : %02x    %02x \n",
191                       count,tmp_buf[0],tmp_buf[1]);
192                 break;
193             }
195             case 1:
196             {
197                 netapi_Log("netapi *: %02d : %02x \n",
198                       count,tmp_buf[0]);
199                 break;
200             }
202             default:
203             {
204                 /* Should never reach here */
205                 netapi_Log("netapi *: Internal Error in  netTest_utilDumpBuffer().Row Count: %d \n", row_count);
206                 return;
207             }
208         }
210         tmp_buf = tmp_buf + row_count;
211         count = count +  row_count;
213     }while(count < dump_size);
215     netapi_Log("netapi *:  - Byte hex Dump End \n");
218 long netTest_utilHtonl(long x)
220     long temp = (x&0xff000000)>>24 | (x&0xff0000)>>8 | (x&0xff00)<<8 |  (x&0xff)<<24 ;
221     return temp;
224 unsigned char netTest_utilHex2Dec(char *p_s)
226     int val;
227     sscanf(p_s,"%x",&val); 
228     return val&0xff;
231 /********************************************************************
232  *  FUNCTION PURPOSE: Ones complement addition utility
233  ********************************************************************
234  ********************************************************************/
235 uint16_t netTest_utilOnesComplementAdd (uint16_t v1, uint16_t v2)
237   uint32_t result;
239   result = (uint32_t)v1 + (uint32_t)v2;
240   result = (result >> 16) + (result & 0xffff);
241   result = (result >> 16) + (result & 0xffff);
243   return ((uint16_t)result);
246 /********************************************************************
247  *  FUNCTION PURPOSE: Ones complement checksum utility
248  ********************************************************************
249  ********************************************************************/
250  uint16_t netTest_utilOnesCompChkSum  (uint8_t *p, uint32_t nwords)
252   uint16_t chksum = 0;
253   uint16_t v;
254   uint32_t i;
255   uint32_t j;
257   for (i = j = 0; i < nwords; i++, j+=2)  {
258     v = (p[j] << 8) | p[j+1];
259     chksum = netTest_utilOnesComplementAdd (chksum, v);
260   }
261   return (chksum);
262 } /* utilOnesCompChkSum */
264 /**************************************************************************************
265  * FUNCTION PURPOSE: Compute ipv4 psudo checksum
266  **************************************************************************************
267  * DESCRIPTION: Compute ipv4 psudo checksum
268  **************************************************************************************/
269 uint16_t netTest_utilGetIPv4PsudoChkSum (uint8_t *data, uint16_t payloadLen)
271   uint16_t psudo_chksum;
273   psudo_chksum = netTest_utilOnesCompChkSum (&data[12], 4);
274   psudo_chksum = netTest_utilOnesComplementAdd(psudo_chksum, (uint16_t) data[9]);
275   psudo_chksum = netTest_utilOnesComplementAdd(psudo_chksum, payloadLen);
277   return (psudo_chksum);
279 } /* utilGetIpv4PsudoChkSum */
281 #define CHECK_SET_PARAM(ARG1, ARG2)     \
282     do { \
283         if(strcmp(key, ARG1) == 0) { \
284         if(d1)strncpy(ARG2,d1,netTest_CONFIG_STRING_LEN); \
285         continue; \
286         } \
287     } while(0)
289 #define CHECK_SET_PARAM2(ARG1, ARG2,  ARG3)     \
290     do { \
291         if(strcmp(key, ARG1) == 0) { \
292         if(d1) strncpy(ARG2,d1,netTest_CONFIG_STRING_LEN); \
293         if(d2) strncpy(ARG3,d2,netTest_CONFIG_STRING_LEN); \
294         continue; \
295         } \
296     } while(0)
298 #define CHECK_SET_PARAM_SA(ARG1, ARG2, ARG3, ARG4, ARG5, \
299                                                    ARG6, ARG7, ARG8,  ARG9, ARG10, \
300                                                    ARG11, ARG12,ARG13, ARG14, ARG15, ARG16,ARG17, ARG18)     \
301     do { \
302         if(strcmp(key, ARG1) == 0) { \
303         if(d1) strncpy(ARG2,d1,netTest_CONFIG_STRING_LEN); \
304         if(d2) strncpy(ARG3,d2,netTest_CONFIG_STRING_LEN); \
305         if(d3) strncpy(ARG4,d3,netTest_CONFIG_STRING_LEN); \
306         if(d4) strncpy(ARG5,d4,netTest_CONFIG_STRING_LEN); \
307         if(d5) strncpy(ARG6, d5,netTest_CONFIG_STRING_LEN); \
308         if(d6) strncpy(ARG7,d6,netTest_CONFIG_STRING_LEN); \
309         if(d7) strncpy(ARG8,d7,netTest_CONFIG_STRING_LEN); \
310         if(d8) strncpy(ARG9,d8,netTest_CONFIG_STRING_LEN); \
311         if(d9) strncpy(ARG10,d9,netTest_CONFIG_STRING_LEN); \
312         if(d10) strncpy(ARG11,d10,netTest_CONFIG_STRING_LEN); \
313         if(d11) strncpy(ARG12,d11,netTest_CONFIG_STRING_LEN); \
314         if(d12) strncpy(ARG13,d12,netTest_CONFIG_STRING_LEN); \
315         if(d13) strncpy(ARG14,d13,netTest_CONFIG_STRING_LEN); \
316         if(d14) strncpy(ARG15,d14,netTest_CONFIG_STRING_LEN); \
317         if(d15) strncpy(ARG16,d15,netTest_CONFIG_STRING_LEN); \
318         if(d16) strncpy(ARG17,d16,netTest_CONFIG_STRING_LEN); \
319         if(d17) strncpy(ARG18,d17,netTest_CONFIG_STRING_LEN); \
320         continue; \
321         } \
322     } while(0)
324 void netTest_utilPrintIPSecStats(Sa_IpsecStats_t     *p_saIpsecStats, nwal_saAALG auth, nwal_saEALG cipher)
326 #if 0
327     if(retVal != nwal_OK)
328     {
329         System_System_netapi_Log("CORE: %d Error getting IP Sec Stats: Ret Status: %d \n",
330                        retVal);
331         return(nwal_FALSE);
332     }
333     if((p_saIpsecStats->pktEncHi) ||(p_saIpsecStats->pktEncLo))
334     {
335         Debug_netapi_Log("------------- IPSec TX (Encryption Channel) Stats BEGIN --\n");
336     }
337     else
338     {
339         netapi_Log("------------- IPSec RX (Decryption Channel) Stats BEGIN --\n");
340     }
341 #endif
342     netapi_Log("\nAutentication mode: %d, Encryption Mode: %d\n", auth, cipher);
343     netapi_Log("IPSec replayOld:0x%x,replayDup:0x%x,authFail:0x%x \n",
344                    p_saIpsecStats->replayOld,p_saIpsecStats->replayDup,p_saIpsecStats->authFail);
345     netapi_Log("IPSec txESN:0x%x,rxESN:0x%x,pktEncHi:0x%x,pktEncLo:0x%x,pktDecHi:0x%x,pktDecLo:0x%x \n",
346                    p_saIpsecStats->txESN,p_saIpsecStats->rxESN,p_saIpsecStats->pktEncHi,
347                    p_saIpsecStats->pktEncLo,p_saIpsecStats->pktDecHi,p_saIpsecStats->pktDecLo);
350 void netTest_utilPrintDataModeStats(Sa_DataModeStats_t     *p_saDataModeStats, nwal_saAALG auth, nwal_saEALG cipher)
353     netapi_Log("\nAutentication mode: %d, Encryption Mode: %d\n", auth, cipher);
354     netapi_Log(" Packets processedHi: 0x%x, Packets processed Lo:0x%x\n",
355             p_saDataModeStats->pktHi, p_saDataModeStats->pktLo);
358 /******************************************************
359  * stats callback
360  *******************************************************/
361 void netTest_utilStatsCbMt(NETAPI_T h, paSysStats_t* pPaStats)
364 #ifdef netTest_MULTI_THREAD
365     int coreid=Osal_nwalGetProcId();  //who we are(thread local)
366     //int coreid = our_core;
367 #else
368 int coreid=0;
369 #endif
371   stats[coreid].n_stats_cb +=1;
372   if(pPaStats) memcpy(&netcp_stats,pPaStats, sizeof(paSysStats_t));
374 void netTest_utilsStatsCb(NETAPI_T h, paSysStats_t* pPaStats)
376     uint32_t numFreeDataPackets;
377     uint32_t            numZeroBufferPackets;
378     uint32_t            numPacketsinGarbage;
379     Pktlib_HeapStats    pktLibHeapStats;
380     int i,j;
381     unsigned long long bcpp;
382     unsigned long long bcpp_noc;
383     unsigned long long bcpp_app;
384     unsigned long long bcpp_tx;
385     unsigned long long npL;
386     unsigned long long cyclesL;
387     unsigned long long ccyclesL; //cache cycles
388     unsigned long long tmp_npL[TUNE_NETAPI_NUM_CORES];
389     unsigned long long tmp_cyclesL[TUNE_NETAPI_NUM_CORES];
390     unsigned long long tmp_ccyclesL[TUNE_NETAPI_NUM_CORES]; //cache cycles
391     NETAPI_SA_STATS_T netapi_sa_stats;
393     uint8_t num_threads =  netTestCfg.num_fp_threads;
394     for (j= 0;j < num_threads;j++)
395     {
396         if (netTestCfg.fp_thread_num[j] == 0)
397             continue;
398         i = netTestCfg.fp_thread_num[j];
399         printf("Per THREAD Statistics for Thread %d\n", netTestCfg.fp_thread_num[j]);;
400         printf(">*****stats @ %lld (#cbs%d) \n", hplib_mUtilGetTimestamp(),stats[i].n_stats_cb);
401         printf(">itx=%d rx=%d tx=%d bad=%d slow=%d \n>rx_class0=%d rx_class1=%d rx_class2=%dsecRx=%d\t"
402             "secPRX=%d sb_rx=%d sb_tx=%d auth_ok=%d sec_tx=%d  min_rx=%d min_tx=%d  fragPkt=%d, exceptionPktOther=%d\n",
403          stats[i].itx, stats[i].rx, stats[i].tx, stats[i].n_bad, stats[i].n_new, 
404          stats[i].n_class0_rx, stats[i].n_class1_rx,  stats[i].n_class2_rx, stats[i].sec_rx,
405          stats[i].secp_rx, stats[i].sb_rx, stats[i].sb_tx, stats[i].n_auth_ok,
406          stats[i].sec_tx, stats[i].rx_min, stats[i].tx_min, stats[i].exceptionPktsFrag, stats[i].exceptionPktsOther);
407         printf(">if rx stats:  %d %d %d\n",stats[i].if_rx[0],stats[i].if_rx[1],stats[i].if_rx[2]);
408         printf(">thread rx stats:  %d \n",stats[i].core_rx);
410         if (stats[i].rx && stats[i].tx)
411             printf("decrypt time per packet(avg): %lu, encrypt  time per packet(avg): %lu\n", 
412             (unsigned long) stats[i].total_decrypt_time/stats[i].rx, (unsigned long) stats[i].total_encrypt_time/stats[i].tx);
415         if (npL && stats[i].rx)
416         {
417             bcpp = cyclesL/npL; 
418             bcpp_noc = (cyclesL-ccyclesL)/npL; 
419             bcpp_app = (stats[i].app_cycles-stats[i].tx_cache_cycles)/stats[i].rx;
420         }
421         else
422         {
423             bcpp = bcpp_noc=bcpp_app=0L;
424         }
425         if (stats[i].tx)
426         {
427             bcpp_tx = (stats[i].send_cycles-stats[i].tx_cache_cycles)/stats[i].tx;
428         }
429         else
430         {
431             bcpp_tx = 0L;
432         }
433         printf(">         ++ busy cycles pp=%lld (%lld wo cache ops) (app+tx= %lld) (tx= %lld) ++\n",
434          bcpp,bcpp_noc,bcpp_app, bcpp_tx);
435         printf("\n");
436     }
438 #ifdef netTest_MULTI_THREAD
439     for (i=0;i < TUNE_NETAPI_NUM_CORES;i++)
440     {
441         if(scheduler[i])
442         {
443             netapi_schedGetStats(scheduler[i],&tmp_npL[0],&tmp_cyclesL[0],&tmp_ccyclesL[0]);
444             npL = tmp_npL[0]+tmp_npL[1];
445             cyclesL = tmp_cyclesL[0]+tmp_cyclesL[1];
446             ccyclesL = tmp_ccyclesL[0]+tmp_ccyclesL[1];
447         }
448     }
449 #else
450 netapi_schedGetStats(our_sched, &npL,&cyclesL,&ccyclesL);
451 #endif
453 if(pPaStats)
455        printf("C1 number of packets:           %d\n", pPaStats->classify1.nPackets);
456        printf("C1 number IPv4 packets:         %d\n", pPaStats->classify1.nIpv4Packets);
457        printf("C1 number IPv6 packets:        %d\n", pPaStats->classify1.nIpv6Packets);
458        printf("C1 number Custom packets:        %d\n", pPaStats->classify1.nCustomPackets);
459        printf("C1 number SRIO packets:        %d\n", pPaStats->classify1.nSrioPackets);
460        printf("C1 number LLC/SNAP Fail packets:        %d\n", pPaStats->classify1.nLlcSnapFail);
461        printf("C1 number table matched:        %d\n", pPaStats->classify1.nTableMatch);
462        printf("C1 number failed table matched: %d\n", pPaStats->classify1.nNoTableMatch);
463        printf("C1 number IP Fragmented packets: %d\n", pPaStats->classify1.nIpFrag);
464        printf("C1 number IP Depth Overflow: %d\n", pPaStats->classify1.nIpDepthOverflow);
465        printf("C1 number VLAN Depth Overflow: %d\n", pPaStats->classify1.nVlanDepthOverflow);
466        printf("C1 number GRE Depth Overflow: %d\n", pPaStats->classify1.nGreDepthOverflow);
467        printf("C1 number MPLS Packets: %d\n", pPaStats->classify1.nMplsPackets);
468        printf ("C1 number of parse fail:        %d\n",pPaStats->classify1.nParseFail);
469        printf("C1 number of Invalid IPv6 Opt:  %d\n", pPaStats->classify1.nInvalidIPv6Opt);
470        printf("C1 number of TX IP Fragments:  %d\n", pPaStats->classify1.nTxIpFrag);
471        printf ("C1 number of silent discard:    %d\n",pPaStats->classify1.nSilentDiscard);
472        printf("C1 number of invalid control:   %d\n", pPaStats->classify1.nInvalidControl);
473        printf ("C1 number of invalid states:    %d\n",pPaStats->classify1.nInvalidState);
474        printf ("C1 number of system fails:      %d\n",pPaStats->classify1.nSystemFail);
475        printf ("C2 number Packets  :           %d\n",pPaStats->classify2.nPackets);
476        printf ("C2 number udp           :      %d\n",pPaStats->classify2.nUdp);
477        printf ("C2 number tcp           :      %d\n",pPaStats->classify2.nTcp);
478        printf ("C2 number Custom       :      %d\n",pPaStats->classify2.nCustom);
479        printf ("C2 number silent drop   :      %d\n",pPaStats->classify2.nSilentDiscard);
480        printf ("C2 number invalid cntrl :      %d\n\n",pPaStats->classify2.nInvalidControl);
481        printf ("C2 number Modify Stats Cmd Fail :      %d\n\n",pPaStats->modify.nCommandFail);
483 Pktlib_getHeapStats(ourHeap, &pktLibHeapStats);
484 printf("main heap stats>  #free=%d #zb=%d #garbage=%d\n", pktLibHeapStats.numFreeDataPackets,
485                                 pktLibHeapStats.numZeroBufferPackets, pktLibHeapStats.numPacketsinGarbage);
486 printf("               >  #dataBufThreshStatus=%d #dataBufStarvCounter=%d #zBufThreshStatus=%d #zBufStarvCounter=%d \n", 
487                         pktLibHeapStats.dataBufferThresholdStatus,pktLibHeapStats.dataBufferStarvationCounter,
488                         pktLibHeapStats.zeroDataBufferThresholdStatus, pktLibHeapStats.zeroDataBufferStarvationCounter);
490 #if 0
491 netapi_Log("pa2sa descriptor area dump\n");
492 for(i=0;i<TUNE_NETAPI_CONFIG_MAX_PA_TO_SA_DESC;i++)
494    extern long * pa2sa_descr_base;
495    long * tip= &pa2sa_descr_base[32*i]; 
496    netTest_utilDumpDescr(tip, i);
498 netapi_Log("sa2pa descriptor area dump\n");
499 for(i=0;i<TUNE_NETAPI_CONFIG_MAX_SA_TO_PA_DESC;i++)
501    extern long * sa2pa_descr_base;
502    long * tip= &sa2pa_descr_base[32*i]; 
503    netTest_utilDumpDescr(tip, i);
505 #endif
506     for (i = 0; i < netTestCfg.num_sa; i++)
507     {
508         /* Statistics for RX Tunnel */
509         memset(&netapi_sa_stats, 0, sizeof(netapi_sa_stats));
510         if (netTestCfg.sa[i].dir ==NWAL_SA_DIR_INBOUND )
511         {
512             netapi_getSaStats(netapi_handle, sa_info[i].rx_tunnel, &netapi_sa_stats);
513             if (netapi_sa_stats.validParams & NETAPI_IPSEC_STAT_VALID)
514             {
515                 netTest_utilPrintIPSecStats(&(netapi_sa_stats.saIpsecStats), 
516                                  netTestCfg.sa[i].authMode,
517                                  netTestCfg.sa[i].cipherMode);
518             }
519             if (netapi_sa_stats.validParams & NETAPI_SIDEBAND_DATA_MODE_STAT_VALID)
520             {
521                 netTest_utilPrintDataModeStats(&(netapi_sa_stats.dataModeStats),
522                                    netTestCfg.sa[i].authMode,
523                                    netTestCfg.sa[i].cipherMode);
524             }
525         }
526         else if (netTestCfg.sa[i].dir ==NWAL_SA_DIR_OUTBOUND)
527         {
528             netapi_getSaStats(netapi_handle, sa_info[i].tx_tunnel, &netapi_sa_stats);
529             if (netapi_sa_stats.validParams & NETAPI_IPSEC_STAT_VALID)
530             {
531                  netTest_utilPrintIPSecStats(&(netapi_sa_stats.saIpsecStats), 
532                                    netTestCfg.sa[i].authMode,
533                                    netTestCfg.sa[i].cipherMode);
534             }
535             if (netapi_sa_stats.validParams & NETAPI_SIDEBAND_DATA_MODE_STAT_VALID)
536             {
537                 netTest_utilPrintDataModeStats(&(netapi_sa_stats.dataModeStats),
538                                     netTestCfg.sa[i].authMode,
539                                     netTestCfg.sa[i].cipherMode);
540             }
541         }
542         else
543             netapi_Log("netTest_utilsStatsCb: invalid SA direction\n");
544     }
545     netapi_dump_internal_heap_stats();
551 void parse_dsp_mac(char * p_mac_str)
553     if (strlen(&p_mac_str[0]))
554     {
555         printf("parse_dsp_mac(string): %s\n", p_mac_str);
556         sscanf(p_mac_str,"mac%d",&netTestCfg.dsp_mac);
557         printf("parse_dsp_mac(integer): mac: %d\n", netTestCfg.dsp_mac);
558     }
561 void parse_dsp_ip(char * p_ip_str)
563     if (strlen(&p_ip_str[0]))
564     {
565         printf("parse_dsp_ip: %s\n", p_ip_str);
566         sscanf(p_ip_str,"ip%d",&netTestCfg.dsp_ip);
567         printf("parse_dsp_ip: ip:  %d\n", netTestCfg.dsp_ip);
568     }
571 void netTest_utilParseOneKey(char *p_key_str, unsigned char *p_key)
573     int index = 0;
574     int i;
575     if (strlen(&p_key_str[0]))
576     {
577         char * pch = strtok (&p_key_str[0],",");
579         while (pch != NULL)
580         {
581             p_key[index] = netTest_utilHex2Dec(pch);
582             index++;
583             pch = strtok (NULL,",");
584         }
585     }
588 void netTest_utilParseOneIP(char * p_ip_addr_str, unsigned char * p_ip)
590     int index = 0;
591     int i;
592     if (strlen(&p_ip_addr_str[0]))
593     {
594         char * pch = strtok (&p_ip_addr_str[0],".");
596         while (pch != NULL)
597         {
598             p_ip[index] = atoi(pch);
599             index++;
600             pch = strtok (NULL,".");
601         }
602     }
605 void netTest_utilParseOneMac(char * p_mac_str, unsigned char *p_mac)
607     int index = 0;
608     int i;
609     if (strlen(&p_mac_str[0]))
610     {
611         char *pch = strtok (&(p_mac_str[0]),"-");
613         while (pch != NULL)
614         {
615             p_mac[index] = netTest_utilHex2Dec(pch);
616             index++;
617             pch = strtok (NULL,"-");
618         }
619     }
622 void netTest_utilParseMac(netTestConfigFile_t *pConfig)
624     int i;
625     int port = 0;
626     for(i=0;i<NET_TEST_MAX_MAC;i++)
627     {
628         if (strlen(&pConfig->mac[i][0]))
629         {
630             netTestCfg.num_macs++;
631             netTest_utilParseOneMac(&pConfig->mac[i][0],&netTestCfg.mac[i][0]);
632             sscanf(&pConfig->switch_port[i][0],"sp%d",&netTestCfg.switch_port[i]);
633         }
634     }
635     netapi_Log("netTest_utilParseMac: number of mac address %d\n", netTestCfg.num_macs);
638 void netTest_utilParseIP(netTestConfigFile_t *pConfig)
640     int i;
642     for(i=0;i<NET_TEST_MAX_IP;i++)
643     {
644         if (strlen(&pConfig->ip[i][0]))
645         {
646             netTestCfg.num_ips++;
647             netTest_utilParseOneIP(&pConfig->ip[i][0],&netTestCfg.ip[i].ipv4[0]);
648             sscanf(&pConfig->attach_iface[i][0],"mac%d",&netTestCfg.attach_iface[i]);
649         }
650     }
651     netapi_Log("netTest_utilParseIP: number of ip address %d\n", netTestCfg.num_ips);
653 void netTest_utilParseIpsecMode(netTestConfigFile_t *pConfig)
656     if (strlen(&pConfig->ipsec_mode_rx[0]))
657     {
658         if (strcmp(pConfig->ipsec_mode_rx, "SIDEBAND") == 0)
659         {
660             netTestCfg.ipsec_mode_rx = IPSEC_MODE_RX_SIDEBAND;
661         }
662         else if (strcmp(pConfig->ipsec_mode_rx, "INFLOW") == 0)
663         {
664             netTestCfg.ipsec_mode_rx = IPSEC_MODE_RX_INFLOW;
665         }
666         else
667         {
668             netapi_Log("netTest_utilParseIpsecMode(), invalid RX ipsec mode in config file \n");
669         }
670     }
672     if (strlen(&pConfig->ipsec_mode_tx[0]))
673     {
674         if (strcmp(pConfig->ipsec_mode_tx, "SIDEBAND") == 0)
675         {
676             netTestCfg.ipsec_mode_tx = IPSEC_MODE_TX_SIDEBAND;
677         }
678         else if (strcmp(pConfig->ipsec_mode_tx, "INFLOW") == 0)
679         {
680             netTestCfg.ipsec_mode_tx = IPSEC_MODE_TX_INFLOW;
681         }
682         else
683         {
684             netapi_Log("netTest_utilParseIpsecMode(), invalid TX ipsec mode in config file \n");
685         }
686     }
690 void netTest_utilParseAuthMode(char *auth_mode_str, nwal_saAALG *auth_mode)
692     if (strlen(auth_mode_str))
693     {
694         netapi_Log("strlen of auth_mode_str is %d\n", strlen(auth_mode_str));
696         if (strcmp(auth_mode_str, "NULL") == 0)
697         {
698             *auth_mode= NWAL_SA_AALG_NULL;
699         }
700         else if (strcmp(auth_mode_str, "HMAC_MD5") == 0)
701         {
702             *auth_mode= NWAL_SA_AALG_HMAC_MD5;
703         }
704         else if (strcmp(auth_mode_str, "HMAC_SHA1") == 0)
705         {
706             *auth_mode= NWAL_SA_AALG_HMAC_SHA1;
707         }
708         else if (strcmp(auth_mode_str, "HMAC_SHA2_224") == 0)
709         {
710             *auth_mode= NWAL_SA_AALG_HMAC_SHA2_224;
711         }
712         else if (strcmp(auth_mode_str, "HMAC_SHA2_256") == 0)
713         {
714             *auth_mode= NWAL_SA_AALG_HMAC_SHA2_256;
715         }
716         else if (strcmp(auth_mode_str, "GMAC") == 0)
717         {
718             *auth_mode= NWAL_SA_AALG_GMAC;
719         }
720         else if (strcmp(auth_mode_str, "AES_XCBC") == 0)
721         {
722             *auth_mode= NWAL_SA_AALG_AES_XCBC;
723         }
724         else
725         {
726             netapi_Log("netTest_utilParseAuthMode: invalid auth mode specified\n");
727         }
728     }
731 void netTest_utilParseEncryptMode(char *ency_mode_str, nwal_saEALG*encr_mode)
733     if (strlen(ency_mode_str))
734     {
735         if (strcmp(ency_mode_str, "NULL") == 0)
736         {
737             *encr_mode= NWAL_SA_EALG_NULL;
738         }
739         else if (strcmp(ency_mode_str, "AES_CTR") == 0)
740         {
741             *encr_mode= NWAL_SA_EALG_AES_CTR;
742         }
743         else if (strcmp(ency_mode_str, "AES_CBC") == 0)
744         {
745             *encr_mode= NWAL_SA_EALG_AES_CBC;
746         }
747         else if (strcmp(ency_mode_str, "3DES_CBC") == 0)
748         {
749             *encr_mode= NWAL_SA_EALG_3DES_CBC;
750         }
751         else if (strcmp(ency_mode_str, "AES_CCM") == 0)
752         {
753             *encr_mode= NWAL_SA_EALG_AES_CCM;
754         }
755         else if (strcmp(ency_mode_str, "AES_GCM") == 0)
756         {
757             *encr_mode= NWAL_SA_EALG_AES_GCM;
758         }
759         else if (strcmp(ency_mode_str, "AES_XCBC") == 0)
760         {
761             *encr_mode= NWAL_SA_AALG_AES_XCBC;
762         }
763         else
764         {
765             netapi_Log("netTest_utilParseEncryptMode: invalid auth mode specified\n");
766         }
767     }
770 void netTest_utilParseProto(char *proto_str, nwal_IpSecProto *proto)
772     if (strlen(proto_str))
773     {
774         if (strcmp(proto_str, "ESP") == 0)
775         {
776             *proto= nwal_IpSecProtoESP;
777             netapi_Log("netTest_utilParseProto(): setting proto  to ESP\n");
778         }
779         else if (strcmp(proto_str, "AH") == 0)
780         {
781             *proto = nwal_IpSecProtoAH;
782             netapi_Log("netTest_utilParseProto(): setting proto to AH\n");
783         }
784         else
785         {
786             netapi_Log("netTest_utilParseProto(), invalid RX ipsec mode in config file \n");
787         }
788     }
793 void netTest_utilParseSaMode(char *mode_str, nwal_saMode *mode)
795     if (strlen(mode_str))
796     {
797         if (strcmp(mode_str, "TUNNEL") == 0)
798         {
799             *mode= nwal_SA_MODE_TUNNEL;
800         }
801         else if (strcmp(mode_str, "TRANSPORT") == 0)
802         {
803             *mode = nwal_SA_MODE_TRANSPORT;
804         }
805         else
806         {
807             netapi_Log("netTest_utilParseSaMode(), invalid RX ipsec mode in config file \n");
808         }
809     }
812 void netTest_utilParseIPType(char *ip_type_str, nwal_IpType *ipType)
814     if (strlen(ip_type_str))
815     {
816         if (strcmp(ip_type_str, "IPV4") == 0)
817         {
818             *ipType= nwal_IPV4;
819         }
820         else if (strcmp(ip_type_str, "IPV6") == 0)
821         {
822             *ipType = nwal_IPV6;
823         }
824         else
825         {
826             netapi_Log("netTest_utilParseIPType(), invalid RX ipsec mode in config file \n");
827         }
828     }
831 void parse_simple_param_u16(char* input_str, uint16_t *val)
833     if (strlen(input_str))
834     {
835         *val = (uint16_t)strtol(input_str, NULL, 0);
836     }
839 void parse_simple_param_u32(char* input_str, uint32_t *val)
841     if (strlen(input_str))
842     {
843         *val = (uint32_t)strtol(input_str, NULL, 0);
844     }
847 void netTest_utilParseSADir(char* dir_str, nwal_SaDir *dir)
849     if (strlen(dir_str))
850     {
851         if (strcmp(dir_str, "INBOUND") == 0)
852         {
853             *dir= NWAL_SA_DIR_INBOUND;
854         }
855         else if (strcmp(dir_str, "OUTBOUND") == 0)
856         {
857             *dir = NWAL_SA_DIR_OUTBOUND;
858         }
859         else
860             netapi_Log("netTest_utilParseSADir: invalid direction\n");
861     }
863 void netTest_utilParseThreadConfig(char * p_thread_str, uint8_t* start, uint8_t* end)
865     int index = 0;
866     int i;
868     if (strlen(p_thread_str))
869     {
870         char *pch = strtok (&(p_thread_str[0]),"-");
871         *start = atoi(pch);
872         pch = strtok (NULL,"-");
873         *end = atoi(pch);
874         netapi_Log("netTest_utilParseThreadConfig: start %d, end %d\n", *start, *end);
875     }
878 void netTest_utilParseThreadParams(netTestConfigFile_t *pConfig)
880     int i;
881     for(i=0;i<NET_TEST_MAX_FP_THREAD;i++)
882     {
883         if (strlen(&pConfig->fp[i][0]))
884         {
885             netTestCfg.num_fp_threads++;
886             netTest_utilParseThreadConfig(&pConfig->fp[i][0],
887                                          (uint8_t*)&netTestCfg.fp_proc_start[i],
888                                          (uint8_t*)&netTestCfg.fp_proc_end[i]);
889             printf("netTest_utilParseThreadParams: fp start[%d]: %d, fp end[%d]: %d\n",
890                     i,
891                     netTestCfg.fp_proc_start[i],
892                     i,
893                     netTestCfg.fp_proc_end[i]);
894         }
895         if (strlen(&pConfig->fp_thread_num[i][0]))
896         {
897             netTestCfg.fp_thread_num[i] = atoi((char*)(&pConfig->fp_thread_num[i]));
898             netapi_Log("parse_fp: thread_num[%d]: %d\n", i, netTestCfg.fp_thread_num[i]);
899         }
900     }
901     netapi_Log("parse_fp: number of fp threads  %d\n", netTestCfg.num_fp_threads);
903     for(i=0;i<NET_TEST_MAX_SP_THREAD;i++)
904     {
905         if (strlen(&pConfig->sp[i][0]))
906         {
907             netTestCfg.num_sp_threads++;
908             netTest_utilParseThreadConfig(&pConfig->sp[i][0],
909                                          (uint8_t*)&netTestCfg.sp_proc_start[i],
910                                          (uint8_t*)&netTestCfg.sp_proc_end[i]);
911         }
912         if (strlen(&pConfig->sp_thread_num[i][0]))
913         {
914             netTestCfg.sp_thread_num[i] = atoi((char*)(&pConfig->sp_thread_num[i]));
915             netapi_Log("parse_sp: thread_num[%d]: %d\n", i, netTestCfg.sp_thread_num[i]);
916         }
917     }
918     netapi_Log("parse_sp: number of sp threads  %d\n", netTestCfg.num_sp_threads);
920 void netTest_utilParseSA(netTestConfigFile_t *pConfig)
922     int i;
923     for(i=0;i<MAX_SEC_INDEX;i++)
924     {
925         if (strlen((char*)&pConfig->sa_config[i][0].dir))
926         {
927             netTest_utilParseSADir((char*) &pConfig->sa_config[i][0].dir, &netTestCfg.sa[i].dir);
928             parse_simple_param_u32((char*)&pConfig->sa_config[i][0].spi, &netTestCfg.sa[i].spi);
929             netTest_utilParseProto((char*)&pConfig->sa_config[i][0].proto, &netTestCfg.sa[i].proto);
930             netTest_utilParseSaMode((char*)&pConfig->sa_config[i][0].saMode, &netTestCfg.sa[i].saMode);
931             netTest_utilParseIPType((char*)&pConfig->sa_config[i][0].ipType, &netTestCfg.sa[i].ipType);
932             netTest_utilParseOneIP((char*)&pConfig->sa_config[i][0].src, (unsigned char *)&netTestCfg.sa[i].src);
933             netTest_utilParseOneIP((char*)&pConfig->sa_config[i][0].dst, (unsigned char *)&netTestCfg.sa[i].dst);
934             parse_simple_param_u32((char*)&pConfig->sa_config[i][0].replayWindow, &netTestCfg.sa[i].replayWindow);
935             netTest_utilParseAuthMode((char*)&pConfig->sa_config[i][0].authMode, &netTestCfg.sa[i].authMode);
936             netTest_utilParseEncryptMode((char*)&pConfig->sa_config[i][0].cipherMode, &netTestCfg.sa[i].cipherMode);
937             parse_simple_param_u32((char*)&pConfig->sa_config[i][0].esnLo, &netTestCfg.sa[i].esnLo);
938             parse_simple_param_u32((char*)&pConfig->sa_config[i][0].esnHi, &netTestCfg.sa[i].esnHi);
939             parse_simple_param_u16((char*)&pConfig->sa_config[i][0].encKeySize, &netTestCfg.key_params[i].encKeySize);
940             parse_simple_param_u16((char*)&pConfig->sa_config[i][0].macKeySize, &netTestCfg.key_params[i].macKeySize);
943             netTest_utilParseOneKey((char*) &pConfig->sa_config[i][0].encr_key, &netTestCfg.encr_key[i][0]);
944             netTestCfg.key_params[i].pEncKey = (uint8_t*)&netTestCfg.encr_key[i][0];
946             netTest_utilParseOneKey((char*)&pConfig->sa_config[i][0].auth_key, &netTestCfg.auth_key[i][0]);
947             netTestCfg.key_params[i].pAuthKey= (uint8_t*)&netTestCfg.auth_key[i][0];
950             parse_simple_param_u32((char*)&pConfig->sa_config[i][0].tunnel_id, &netTestCfg.tunnel_id[i]);
952             netTestCfg.num_sa++;
953         }
954     }
956 void netTest_utilParseRoutes(netTestConfigFile_t *pConfig, OUR_ROUTE_T *routes, Trie ** our_router)
958     int i;
959     int said=0;
960     for(i=0;i<MAX_ROUTES;i++)
961     {
962         int port;
963         if (pConfig->routes[i][0])
964         {
965             port=atoi(&pConfig->ports[i][0]);
966             if((port<1)||(port>2)) continue; //bad port #: only 1 or 2 valid
967             netapi_Log("netTest_utilParseRoutes [%d]: %s\n", i, &pConfig->routes[i][0]);
968             if(strncmp(&pConfig->routes[i][0],"MAC",3)==0)
969             {
970                routes[i].out_port = port;
971                netTest_utilParseOneMac(&pConfig->routes[i][3],&routes[i].out_mac[0]);
972                //memcpy(&routes[i].out_mac[6], ((port==1) ?&config.mac0[0]: &config.mac1[0] ),6); 
973                memcpy(&routes[i].out_mac[6], ((port==1) ?&netTestCfg.mac[0][0]: &netTestCfg.mac[1][0] ),6);
974                routes[i].out_mac[12]=0x08;
975                routes[i].out_mac[13]=0x00;
976                routes[i].sec_ptr=NULL;
977             }
978             else if (strncmp(&pConfig->routes[i][0],"SA",2)==0)
979             {      
980                said=atoi(&pConfig->routes[i][2]) ;
981                routes[i].sec_ptr=&sa_info[said];
982             }
983         }
984     }
985     *our_router = route_init();
986     for (i=0;i<MAX_ROUTES;i++)
987     {
988       unsigned long ip_be;
989       int route_index;
990       if (pConfig->dst_ips[i][0])
991       {
992          netTest_utilParseOneIP(&pConfig->dst_ips[i][0],(unsigned char *)&ip_be);
993          sscanf(&pConfig->paths[i][0],"route%d",&route_index);
994          route_add(*our_router,&ip_be,(void*)&routes[route_index]);
995       }
996     }
999 void netTest_utilProcessConfigFile(FILE * fpr, netTestConfigFile_t *pConfig)
1001     char line[MAX_LINE_LENGTH + 1];
1002     int i;
1003     static int sa_count = 0;
1004  
1005     char *key, *ep;
1006     char * d1, *d2, *d3, *d4;
1007     char * d5, *d6, *d7, *d8;
1008     char * d9, *d10, *d11, *d12;
1009     char * d13, *d14, *d15, *d16, *d17;
1010     char tokens[] = " :=;\n";
1011     char temp_str[50];
1012     memset(line, 0, MAX_LINE_LENGTH + 1);
1013     memset(pConfig, 0, sizeof(netTestConfigFile_t));
1014     while (fgets(line, MAX_LINE_LENGTH + 1, fpr))
1015     {
1016         if(line[0]=='#')
1017             continue; //skip comment
1018         key  = (char *)strtok(line, tokens);
1020         d1 = (char *)strtok(NULL, tokens);
1021         if (!key)
1022             continue;
1023         if (!d1) 
1024             continue;
1026         if(strlen(d1) == 0) 
1027         {
1028             continue;
1029         }
1032         d2 = (char *)strtok(NULL, tokens);
1033         d3 = (char *)strtok(NULL, tokens);
1034         d4 = (char *)strtok(NULL, tokens);
1035         d5 = (char *)strtok(NULL, tokens);
1036         d6 = (char *)strtok(NULL, tokens);
1037         d7 = (char *)strtok(NULL, tokens);
1038         d8 = (char *)strtok(NULL, tokens);
1039         d9 = (char *)strtok(NULL, tokens);
1040         d10 = (char *)strtok(NULL, tokens);
1041         d11 = (char *)strtok(NULL, tokens);
1042         d12 = (char *)strtok(NULL, tokens);
1043         d13 = (char *)strtok(NULL, tokens);
1044         d14 = (char *)strtok(NULL, tokens);
1045         d15 = (char *)strtok(NULL, tokens);
1046         d16 = (char *)strtok(NULL, tokens);
1047         d17 = (char *)strtok(NULL, tokens);
1049         CHECK_SET_PARAM(netTest_INIT_CONFIG_IPSEC_MODE_RX,&(pConfig->ipsec_mode_rx[0]));
1050         CHECK_SET_PARAM(netTest_INIT_CONFIG_IPSEC_MODE_TX,&(pConfig->ipsec_mode_tx[0]));
1051         CHECK_SET_PARAM(netTest_INIT_CONFIG_IPSEC_IF_NO,&(pConfig->ipsec_if_no[0]));
1052         CHECK_SET_PARAM(netTest_INIT_CONFIG_DSP_MAC,&(pConfig->dsp_mac[0]));
1053         CHECK_SET_PARAM(netTest_INIT_CONFIG_DSP_IP,&(pConfig->dsp_ip[0]));
1054         CHECK_SET_PARAM(netTest_INIT_CONFIG_STATIC_LOOPBACK_PORT,&(pConfig->dest_udp_port_config[0]));
1057         for(i=0;i<MAX_SEC_INDEX;i++)
1058         {
1059             sprintf(temp_str,"sa%d",i);
1060             CHECK_SET_PARAM_SA(temp_str, 
1061                               (char*)&pConfig->sa_config[i][0].dir,
1062                               (char*)&pConfig->sa_config[i][0].spi,
1063                               (char*)&pConfig->sa_config[i][0].proto,
1064                               (char*)&pConfig->sa_config[i][0].saMode,
1065                               (char*)&pConfig->sa_config[i][0].ipType,
1066                               (char*)&pConfig->sa_config[i][0].src,
1067                               (char*)&pConfig->sa_config[i][0].dst,
1068                               (char*)&pConfig->sa_config[i][0].replayWindow,
1069                               (char*)&pConfig->sa_config[i][0].authMode,
1070                               (char*)&pConfig->sa_config[i][0].cipherMode,
1071                               (char*)&pConfig->sa_config[i][0].esnLo,
1072                               (char*)&pConfig->sa_config[i][0].esnHi,
1073                               (char*)&pConfig->sa_config[i][0].encKeySize,
1074                               (char*)&pConfig->sa_config[i][0].macKeySize,
1075                               (char*)&pConfig->sa_config[i][0].encr_key,
1076                               (char*)&pConfig->sa_config[i][0].auth_key,
1077                               (char*)&pConfig->sa_config[i][0].tunnel_id);
1078         }
1080         for(i=0;i<MAX_ROUTES;i++)
1081         {
1082             sprintf(temp_str,"route%d",i);
1083             CHECK_SET_PARAM2(temp_str,&pConfig->routes[i][0],&pConfig->ports[i][0] );
1084         }
1086         for(i=0;i<MAX_ROUTES;i++)
1087         {
1088             sprintf(temp_str,"dstip%d",i);
1089             CHECK_SET_PARAM2(temp_str,&pConfig->dst_ips[i][0],&pConfig->paths[i][0] );
1090         }
1091         for(i=0;i<NET_TEST_MAX_MAC;i++)
1092         {
1093             sprintf(temp_str,"mac%d",i);
1094             CHECK_SET_PARAM2(temp_str,&pConfig->mac[i][0],&pConfig->switch_port[i][0] );
1095         }
1096         for(i=0;i<NET_TEST_MAX_IP;i++)
1097         {
1098             sprintf(temp_str,"ip%d",i);
1099             CHECK_SET_PARAM2(temp_str,&pConfig->ip[i][0], &pConfig->attach_iface[i][0]);
1100         }
1101         for(i=0;i<NET_TEST_MAX_FP_THREAD;i++)
1102         {
1103             sprintf(temp_str,"fp%d",i);
1104             CHECK_SET_PARAM2(temp_str, &pConfig->fp_thread_num[i][0],&pConfig->fp[i][0]);
1105         }
1106         for(i=0;i<NET_TEST_MAX_SP_THREAD;i++)
1107         {
1108             sprintf(temp_str,"sp%d",i);
1109             CHECK_SET_PARAM2(temp_str, &pConfig->sp_thread_num[i][0],&pConfig->sp[i][0]);
1110         }
1111     }
1114 //******************************************************
1115 //use scheduling housekeeping callback to generate pkts
1116 //******************************************************
1117 static int done_burst=0;
1118 void house(NETAPI_SCHED_HANDLE_T * s)
1120     Ti_Pkt * tip;
1121     unsigned int len;
1122     nwalTxPktInfo_t meta_tx = {0};
1123     PKTIO_METADATA_T meta = {PKTIO_META_TX,{0},0};
1124     int err;
1125     static int house_pkts_gened=0;
1126     int p;
1127     unsigned char * pIpHdr,* pData;
1128     unsigned int vv1,vv2,vv3;
1129     unsigned int sum_vv1=0;
1130     unsigned int sum_vv2=0;
1131     unsigned int sum_vv3=0;
1132     unsigned int sum_vv4=0;
1133     unsigned int sum_vv5=0;
1135     unsigned int nwal_flow_vv1,nwal_flow_vv2;
1136     unsigned int nwal_sum_vv1=0;
1137     unsigned int nwal_sum_vv2=0;
1138     unsigned int nwal_sum_vv3=0;
1139     unsigned int nwal_sum_vv4=0;
1140     unsigned int nwal_sum_vv5=0;
1141     unsigned int nwal_sum_vv6=0;
1143     unsigned int nwal_sum_flow_vv1=0;
1144     unsigned int nwal_sum_flow_vv2=0;
1145     unsigned long long cache_op_b1;
1146     unsigned long long  cache_op_b2;
1147     unsigned long long  n_c_ops;
1148     static int first =0;
1149     Cppi_HostDesc*      pPktDesc;
1150     NETAPI_SCHED_SHUTDOWN_T sched_shutdown;
1152     uint32_t coreid = 0;  //who we are
1153 #ifdef netTest_MULTI_THREAD
1154     NETAPI_T nh= netapi_schedGetHandle(s);
1155     coreid=(uint32_t) netapi_getCookie(nh);
1157     if (QUIT) 
1158     {
1159         sched_shutdown.shutdown_type = NETAPI_SCHED_SHUTDOWN_NOW;
1160         netapi_schedClose(s,&sched_shutdown,&err); 
1161         return;
1162     }
1164     
1165     /* only slow path threads get netcp stats */
1166     if (coreid & NET_TEST_SP_THREAD_MASK)
1167     {
1168         netapi_netcpCfgReqStats(nh, netTest_utilStatsCbMt, 0,&err); 
1169     }
1171     coreid = NET_TEST_THREAD_NUM_MASK & coreid;
1172 #else
1173     coreid = NET_TEST_THREAD_NUM_MASK & coreid;
1174     if(done_burst)
1175     {
1176         house_pkts_gened+=TX_BURST;
1177         netapi_Log("net_test> request stats at n=%d \n",house_pkts_gened);
1178         netapi_netcpCfgReqStats(netapi_handle, netTest_utilsStatsCb, 0,&err);
1179         if (err!=0) {netapi_Log("stats req failed\n");}
1180         if (house_pkts_gened >= np2process+ 100)
1181         {
1182             sched_shutdown.shutdown_type = NETAPI_SCHED_SHUTDOWN_NOW;
1183             netapi_schedClose(s,&sched_shutdown,&err);
1184         }
1185         return;
1186     }
1187     done_burst=1;
1188     Osal_cache_op_measure_reset();
1189     memset(&meta_tx,0,sizeof(meta_tx));
1190     for(p=0;p<TX_BURST;p++) {  
1191     //reguest stats 
1192     if ((house_pkts_gened>0) && (! (house_pkts_gened%1000)) )
1193     {
1194        netapi_Log("net_test> request stats at n=%d \n",house_pkts_gened);
1195        netapi_netcpCfgReqStats(netapi_handle, netTest_utilsStatsCb, 0,&err); 
1196        if (err!=0) {netapi_Log("stats req failed\n");}
1197     }
1200     if (house_pkts_gened >= np2process+ 100)
1201     {
1202         //shutdown
1203         sched_shutdown.shutdown_type = NETAPI_SCHED_SHUTDOWN_NOW;
1204         netapi_schedClose(s,&sched_shutdown,&err);
1205         continue;
1206     }
1208     else if (house_pkts_gened >= np2process) { house_pkts_gened+=1;  continue;}
1210     /* manufacture a pkt to transmit */
1211     tip = get_pkt(house_pkts_gened, &len, ourHeap, netTest_PKT_LEN,&testPkt[0]  , TEST_netTest_PKT_LEN);
1212     if(!tip) { house_pkts_gened +=1; continue; }
1215     /* set the pkt length */
1216     vv1 = hplib_mUtilGetPmuCCNT();
1217     Pktlib_setPacketLen(tip, len);
1219     /* set up meta data */
1220     meta.sa_handle=nwal_HANDLE_INVALID;
1221     /* #define BENCH_UDP_SEND */
1222 #ifdef BEND_UDP_SEND
1223     meta_tx.txFlag1 = (NWAL_TX_FLAG1_DO_IPV4_CHKSUM | NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID);
1224     meta_tx.startOffset = 0;
1225     /* GONE in V2 meta_tx.pktLen = len; */
1226     meta_tx.ipOffBytes = TEST_PKT_IP_OFFSET_BYTES;
1227     meta_tx.l4OffBytes = TEST_PKT_UDP_OFFSET_BYTES;
1228     meta_tx.l4HdrLen = TEST_PKT_UDP_HDR_LEN;
1229     //GONE in V2 meta_tx.ploadOffBytes = TEST_PKT_PLOAD_OFFSET_BYTES;
1230     meta_tx.ploadLen = TEST_PAYLOAD_LEN;
1232     Pktlib_getDataBuffer(tip,&pData,&len);
1233     if(house_pkts_gened &0x1)
1234     {
1235         memcpy(&pData[6],&netTestCfg.mac[1][0] ,6);
1236     }
1237     pIpHdr = pData + meta_tx.ipOffBytes;
1238     meta_tx.pseudoHdrChecksum =
1239         netTest_utilGetIPv4PsudoChkSum(pIpHdr,(TEST_PAYLOAD_LEN+TEST_PKT_UDP_HDR_LEN));
1240 #else
1241     Pktlib_getDataBuffer(tip,&pData,&len);
1242     if(house_pkts_gened &0x1)
1243     {
1244         memcpy(&pData[6],&netTestCfg.mac[1][0] ,6);
1245     }
1246     meta_tx.txFlag1 = NWAL_TX_FLAG1_META_DATA_VALID;
1247     meta_tx.startOffset = 0;
1248     meta_tx.ploadLen = TEST_PAYLOAD_LEN;
1249 #endif
1250    /* post it to netcp tx channel*/
1251    meta.u.tx_meta=&meta_tx;
1252 #ifdef DEBUG_DESC
1253     if (house_pkts_gened<16) netTest_utilDumpDescr((long *) tip, house_pkts_gened);
1254     else if (house_pkts_gened>99) netTest_utilDumpDescr((long *) tip,house_pkts_gened);
1255 #endif
1257     if(!first)
1258     {
1259         first++;
1260         nwal_flow_vv1= hplib_mUtilGetPmuCCNT();
1261         if(nwal_initPSCmdInfo(pktio_mGetNwalInstance(netcp_tx_chan),
1262                              &meta_tx,
1263                              &flowPSCmdInfo) != nwal_OK)
1264         {
1265             netapi_Log("nwal_initPSCmdInfo() ERROR \n");
1266         }
1267         nwal_flow_vv2= hplib_mUtilGetPmuCCNT();
1268         nwal_sum_flow_vv1 += (nwal_flow_vv1-vv1); 
1269         nwal_sum_flow_vv2 += (nwal_flow_vv2-nwal_flow_vv1); 
1270     }
1271     cache_op_b1= Osal_cache_op_measure(&n_c_ops);
1272     vv2= hplib_mUtilGetPmuCCNT();
1273 #ifdef BEND_UDP_SEND
1274     nwal_mCmdSetL4CkSumPort(  tip,
1275                              &flowPSCmdInfo,
1276                              TEST_PKT_UDP_OFFSET_BYTES,
1277                              (TEST_PKT_UDP_HDR_LEN + TEST_PAYLOAD_LEN),
1278                              meta_tx.pseudoHdrChecksum,
1279                              meta_tx.enetPort);
1280 #else
1281     nwal_mCmdSetPort  (tip,
1282                       &flowPSCmdInfo,  //could be NULL
1283                       0);  //port 0 -> switch decides
1285 #endif
1287     pPktDesc = Pktlib_getDescFromPacket(tip);
1288     /* Send the packet out to transmit Q*/
1289     Qmss_queuePushDescSize (flowPSCmdInfo.txQueue, 
1290                         pPktDesc, 
1291                         NWAL_DESC_SIZE);
1292     vv3= hplib_mUtilGetPmuCCNT();
1293     cache_op_b2= Osal_cache_op_measure(&n_c_ops);
1295     sum_vv1 += (vv2-vv1);
1296     if(!house_pkts_gened)
1297     {
1298         /* first packet. Take out the PS command label creation cost */
1299         sum_vv1 = sum_vv1 - nwal_sum_flow_vv2;
1300     }
1302     sum_vv3 += (vv3-vv2)-(long) (cache_op_b2-cache_op_b1); //sub out cache op cost
1304     // netapi_Log("pktio send. full=%d metadata=%d netapi_pktioSend=%d\n", vv3-vv1,  vv2-vv1,  vv3-vv2);
1305     stats[coreid].itx +=1;
1306     house_pkts_gened +=1;
1307     }
1308     {
1309         unsigned long long  ccycles;
1310         ccycles =Osal_cache_op_measure(&n_c_ops);
1311         if (sum_vv1) 
1312         {
1313             netapi_Log("BURST NWAL Fast send %d pkts.  metadata=%d Cmd Label Creation Cost=%d  nwal Fast Send Cost (less cacheop)= %d n_c_ops=%lld cache_op_time=%lld (pp-> %d)\n", 
1314               stats[coreid].itx, sum_vv1/stats[coreid].itx,  nwal_sum_flow_vv2, sum_vv3/stats[coreid].itx, 
1315               n_c_ops, ccycles, n_c_ops? (ccycles/(n_c_ops/2L)) : 0);
1316 #if 0
1317             netapi_Log("NWAL Profile Cycles: Prof1= %d,Prof2=%d,Prof3=%d,Prof4=%d,Prof5=%d ,Prof6=%d \n",
1318               nwal_sum_vv1/stats[coreid].itx,nwal_sum_vv2/stats[coreid].itx,nwal_sum_vv3/stats[coreid].itx,
1319               nwal_sum_vv4/stats[coreid].itx,nwal_sum_vv5/stats[coreid].itx,nwal_sum_vv6/stats[coreid].itx);
1320   
1321 #endif  
1323             if(stats[core_id].itx2)
1324             {
1325                 netapi_Log("nwal_flowSend Profile Cycles: Prof1= %d,Prof2=%d \n",
1326                 nwal_sum_flow_vv1/stats[coreid].itx2,nwal_sum_flow_vv2/stats[coreid].itx2);
1327             }
1328         }
1329     }
1330 #endif
1333 void netTest_utilCreateInterfaces(uint8_t num_macs, uint8_t num_ips)
1335     int err, i;
1337     for (i = 0; i < num_macs; i++)
1338     {
1339         /* add mac intefaces */
1340         mac[i] = netapi_netcpCfgCreateMacInterface(
1341                           netapi_handle,
1342                           &netTestCfg.mac[i][0],
1343                           i,
1344                           netTestCfg.switch_port[i],
1345                           (NETCP_CFG_ROUTE_HANDLE_T)  NULL,
1346                           (NETCP_CFG_VLAN_T ) NULL ,  //future
1347                           1, 
1348                           &err);
1349        if (err)
1350        {
1351             netapi_Log("addmac %d  failed %d\n",i, err);
1352         //exit(1); 
1353        }
1354        else
1355         netapi_Log("netTest_utilCreateInterfaces, added mac sucess\n");
1356     }
1357     for (i = 0; i < num_ips; i++)
1358     {
1359         //attach an IP to this interface
1360         ip_rule[i]=netapi_netcpCfgAddIp(
1361                           netapi_handle,
1362                           netTestCfg.attach_iface[i],
1363                           nwal_IPV4,
1364                           (nwalIpAddr_t*)&netTestCfg.ip[i].ipv4[0],
1365                           NULL,  //all IP
1366                           (NETCP_CFG_ROUTE_HANDLE_T) NULL,
1367                           (void*)NULL,
1368                           &err
1369                           );
1370         if (err) {
1371             netapi_Log("netTest_utilCreateInterfaces: add ip %d failed %d\n", i, err);
1372         //exit(1); 
1373         }
1374         else
1375             netapi_Log("netTest_utilCreateInterfaces, added ip sucess\n");
1376     }
1379 void netTest_utilDeleteInterfaces(uint8_t num_macs, uint8_t num_ips)
1381     int err,i;
1382     //delete IPs and MAC Interfacess
1383     for (i = 0; i < num_ips; i++)
1384     {
1385         err = 0;
1386         netapi_netcpCfgDelIp(netapi_handle, netTestCfg.attach_iface[i], nwal_IPV4, 
1387                       NULL, NULL, ip_rule[i], &err);
1388     }
1389     for (i = 0; i < num_macs; i++)
1390     {
1391         err = 0;
1392         netapi_netcpCfgDelMac(netapi_handle,i,&err);
1393     }
1394     
1395     //netapi_netcpCfgDelMac(netapi_handle,0,&err);
1396     //netapi_netcpCfgDelMac(netapi_handle,1,&err);