This commit adds the following:
[keystone-rtos/netapi.git] / ti / runtime / netapi / test / net_test_max_params.c
1 /******************************************
2  * File: net_test.c
3  * Purpose: Application for testing out max configuration parameters
4  *          such as SA's, MACs/IP interfaces
5  **************************************************************
6  * FILE:  net_test.c
7  * 
8  * DESCRIPTION:  netapi user space transport
9  *               library  test application
10  * 
11  * REVISION HISTORY:
12  *
13  *  Copyright (c) Texas Instruments Incorporated 2013
14  * 
15  *  Redistribution and use in source and binary forms, with or without 
16  *  modification, are permitted provided that the following conditions 
17  *  are met:
18  *
19  *    Redistributions of source code must retain the above copyright 
20  *    notice, this list of conditions and the following disclaimer.
21  *
22  *    Redistributions in binary form must reproduce the above copyright
23  *    notice, this list of conditions and the following disclaimer in the 
24  *    documentation and/or other materials provided with the   
25  *    distribution.
26  *
27  *    Neither the name of Texas Instruments Incorporated nor the names of
28  *    its contributors may be used to endorse or promote products derived
29  *    from this software without specific prior written permission.
30  *
31  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
32  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
33  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
35  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
36  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
37  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
40  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
41  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
43  *****************************************/
45 #include <stdio.h>
46 #include <stdlib.h>
47 #include <unistd.h>
48 #include <string.h>
49 #include <signal.h>
50 #include <pthread.h>
52 #include "net_test.h"
53 #include "trie.h"
54 #include "string.h"
56 #include <sys/resource.h>
58 #include <ti/drv/sa/salld.h>
59 #include <ti/drv/pa/pa.h>
61 #include "net_test_utils.h"
62 #include "router.h"
64 extern int QUIT;
65 extern STATS_T stats[TUNE_NETAPI_NUM_CORES];
66 extern paSysStats_t netcp_stats;
67 /* Global definitions */
68 #ifdef MULTI_THREAD
69     cpu_set_t cpu_set;
70 #endif
73 #define TEST_SA
74 //#define TEST_MAC_IP
75 #define SA_CREATE_LOOP_COUNT 64
76 #define IP_CREATE_LOOP_COUNT 64
77 #define MAC_CREATE_LOOP_COUNT 59
80 netTestConfig_t netTestCfg;
81 static  netTestConfigFile_t config_file;
83 char    input_file_name[] = "net_test_config.txt";
85 nwal_RetValue       nwalRetVal;
86 Pktlib_HeapHandle ourHeap;
88 PKTIO_HANDLE_T *netcp_rx_chan;
89 PKTIO_HANDLE_T *netcp_tx_chan_no_crypto;
90 PKTIO_HANDLE_T *netcp_tx_chan_esp;
91 PKTIO_HANDLE_T *netcp_tx_chan_ah;
92 PKTIO_HANDLE_T *netcp_sb_tx_chan;
93 PKTIO_HANDLE_T *netcp_sb_rx_chan;
95 PKTIO_CFG_T our_chan_cfg={PKTIO_RX_TX, PKTIO_LOCAL, PKTIO_Q_ANY, 8};
96 PKTIO_CFG_T netcp_rx_cfg={PKTIO_RX, PKTIO_NA, PKTIO_NA, 8};
97 PKTIO_CFG_T netcp_rx_cfg2={PKTIO_RX, (PKTIO_GLOBAL|PKTIO_PKT), PKTIO_Q_ANY, 8};
98 PKTIO_CFG_T netcp_tx_cfg={PKTIO_TX, PKTIO_NA, PKTIO_NA, 8};
99 PKTIO_CFG_T netcp_sb_rx_cfg={PKTIO_RX, PKTIO_NA, PKTIO_NA, 8};
100 PKTIO_CFG_T netcp_sb_tx_cfg={PKTIO_TX, PKTIO_NA, PKTIO_NA, 8};
103 NETCP_CFG_EXCEPTION_PKT_T expPkt_appid;
105 Trie *p_trie_sa_rx;
106 Trie *p_trie_sa_tx;
109 /*******************************************
110  *************NETAPI OBJECTS***************
111  *****************************************/
112 static NETAPI_CFG_T our_netapi_default_cfg=
114 TUNE_NETAPI_PERM_MEM_SZ,
115 128,  //start of packet offset for hw to place data on rx for default flow
116 TUNE_NETAPI_QM_CONFIG_MAX_DESC_NUM, //max number of descriptors in system
117 TUNE_NETAPI_NUM_GLOBAL_DESC,        //total we will use
118 TUNE_NETAPI_DEFAULT_NUM_BUFFERS,   //#descriptors+buffers in default heap
119 64, //#descriptors w/o buffers in default heap
120 TUNE_NETAPI_DEFAULT_BUFFER_SIZE+128+128,  //size of buffers in default heap
121 128   ,  //tail room
122 256      //extra room 
123 };
125 NETAPI_T netapi_handle;
126 NETAPI_SCHED_HANDLE_T * our_sched;
127 #ifdef MULTI_THREAD
128 NETAPI_SCHED_HANDLE_T * scheduler[TUNE_NETAPI_NUM_CORES];
129 #endif
130 NETAPI_SCHED_CONFIG_T our_sched_cfg={
131   NETAPI_SCHED_DURATION|NETAPI_SCHED_CBV, 0, house, 5000000  //every 5000000 poll loops
132 };
134 NETCP_CFG_IP_T ip_rule[NET_TEST_MAX_IP];
135 NETCP_CFG_MACIF_T mac[NET_TEST_MAX_MAC];
139 /* security objects. (for loopback mode) */
140 netTestSA_t sa_info[MAX_SEC_INDEX];
142 NETCP_CFG_IPSEC_POLICY_T rx_policy[MAX_SEC_INDEX];
144 /* stub functions */
145 void recv_cb(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
146                          PKTIO_METADATA_T meta[], int n_pkts,
147                          uint64_t ts )
149     return;
152 void flip_and_send_pkt(Ti_Pkt *tip,  unsigned char * p_pkt, int len, int flag, uint16_t enet_port)
154     return;
159 void recv_sb_cb(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
160                          PKTIO_METADATA_T meta[], int n_pkts,
161                          uint64_t ts )
163     return;
166 Trie * route_init(void)
169 void route_add(Trie * Pt, unsigned long * Pdest_ipBE, void * Pour_route)
173 #ifdef MULTI_THREAD
174 NETAPI_T worker_nh[TUNE_NETAPI_NUM_CORES];
176 void slow_path_thread(uint32_t thread_num)
178     return;
181 void fast_path_thread(uint32_t thread_num)
183     return;
186 #endif
188 /* Templates to build command labels at startup up time, required by open_pktio_tx_channels() */
189 nwalTxPktInfo_t txPktInfoESP = 
191     NULL,                                                                                               /* p_pkt */
192     NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID,      /* txFlags */
193     0,                                                                                                  /* lpbackPass */
194     0,                                                                                                  /* enetport */
195     0,                                                                                                  /* msuSize */
196     0,                                                                                                   /* startOffset */
197     netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN,                                                    /* saOffBytes */
198     0,                                                                                                  /* saPayLoadLen */
199     0               ,                                                                                    /* saAhIcvOffBytes */
200     0,                                                                                                 /* saAhMacSize */
201     0,                                                                                                  /* etherLenOffBytes */
202     0,                                                                                                  /* ipOffBytes */
203     0,                                                                                                  /* l4OffBytes */
204     netTest_UDP_HEADER_LEN,                                                                             /* l4HdrLen */
205     0,                                                                                                  /* pseudoHdrChecksum */
206     0                                                                                                   /* pLoadLen */
207 };
210 nwalTxPktInfo_t txPktInfoAH = 
212     NULL,                                                                                               /* p_pkt */
213     NWAL_TX_FLAG1_DO_IPSEC_AH_CRYPTO| NWAL_TX_FLAG1_DO_UDP_CHKSUM | NWAL_TX_FLAG1_META_DATA_VALID,      /* txFlags */
214     0,                                                                                                  /* lpbackPass */
215     0,                                                                                                  /* enetport */
216     0,                                                                                                  /* msuSize */
217     0,                                                                                                   /* startOffset */
218     netTest_MAC_HEADER_LEN  + netTest_IP_HEADER_LEN,                                                    /* saOffBytes */
219     0,                                                                                                  /* saPayLoadLen */
220     netTest_MAC_HEADER_LEN + netTest_IP_HEADER_LEN + netTest_IPSEC_AH_FIXED_HDR_SIZE,                    /* saAhIcvOffBytes */
221     12,                                                                                                 /* saAhMacSize */
222     0,                                                                                                  /* etherLenOffBytes */
223     0,                                             /* ipOffBytes */
224     0,                                                                                                  /* l4OffBytes */
225     netTest_UDP_HEADER_LEN,                                                                            /* l4HdrLen */
226     0,                                                                                                  /* pseudoHdrChecksum */
227     0                                                                                                   /* pLoadLen */
228 };
230 nwalTxPktInfo_t txPktInfoNoCrypto = 
232     NULL,                                                                                               /* p_pkt */
233     NWAL_TX_FLAG1_DO_UDP_CHKSUM| NWAL_TX_FLAG1_META_DATA_VALID,      /* txFlags */
234     0,                                                                                                  /* lpbackPass */
235     0,                                                                                                  /* enetport */
236     0,                                                                                                  /* msuSize */
237     0,                                                                                                   /* startOffset */
238     0,                                                    /* saOffBytes */
239     0,                                                                                                  /* saPayLoadLen */
240     0               ,                                                                                    /* saAhIcvOffBytes */
241     0,                                                                                                 /* saAhMacSize */
242     0,                                                                                                  /* etherLenOffBytes */
243     0,                                                                                                  /* ipOffBytes */
244     netTest_MAC_HEADER_LEN +netTest_IP_HEADER_LEN,                                        /* l4OffBytes */
245     netTest_UDP_HEADER_LEN,                                                             /* l4HdrLen */
246     0,                                                                         /* pseudoHdrChecksum */
247     0                                                                                                   /* pLoadLen */
248 };
251 void close_pktio_channels(void)
253     int err;
254     netapi_pktioClose(netcp_tx_chan_esp ,&err);
255     netapi_pktioClose(netcp_tx_chan_ah ,&err);
256     netapi_pktioClose(netcp_sb_tx_chan ,&err);
257     netapi_pktioClose(netcp_tx_chan_no_crypto,&err);
260 void open_pktio_tx_channels(void)
262     int err;
263     /* open netcp default  TX for ESP packets */
264     netcp_tx_chan_esp= netapi_pktioOpen(netapi_handle, NETCP_TX, NULL, &netcp_tx_cfg,  &err);
265     if (!netcp_tx_chan_esp)
266     {
267         printf("pktio open TX failed err=%d\n",err);
268         exit(1);
269     }
270     else
271     {
272         if(netTestCfg.ipsec_mode_tx == IPSEC_MODE_TX_INFLOW)
273         {
274             PKTIO_CONTROL_T control;
275             control.op = PKTIO_UPDATE_FAST_PATH;
276             PKTIO_CFG_T cfg;
277             cfg.fast_path_cfg.fp_send_option = PKTIO_FP_ESP_L4CKSUM_PORT;
278             cfg.fast_path_cfg.txPktInfo= &txPktInfoESP;
279             netapi_pktioControl(netcp_tx_chan_esp, NULL, &cfg, &control, &err);
280         }
281     }
283     /*/* open netcp default  TX for AH packets */
284     netcp_tx_chan_ah= netapi_pktioOpen(netapi_handle, NETCP_TX, NULL, &netcp_tx_cfg,  &err);
285     if (!netcp_tx_chan_ah)
286     {
287         printf("pktio open TX failed err=%d\n",err);
288         exit(1);
289     }
290     else
291     {
292         if(netTestCfg.ipsec_mode_tx == IPSEC_MODE_TX_INFLOW)
293         {
294             PKTIO_CONTROL_T control;
295             control.op = PKTIO_UPDATE_FAST_PATH;
296             PKTIO_CFG_T cfg;
297             cfg.fast_path_cfg.fp_send_option = PKTIO_FP_AH_L4CKSUM_PORT;
298             cfg.fast_path_cfg.txPktInfo= &txPktInfoAH;
299             netapi_pktioControl(netcp_tx_chan_ah, NULL, &cfg, &control, &err);
300         }
301     }
303     /* open netcp default  TX channels for non-Crypto packets */
304     netcp_tx_chan_no_crypto= netapi_pktioOpen(netapi_handle, NETCP_TX, NULL, &netcp_tx_cfg,  &err);
305     if (!netcp_tx_chan_no_crypto)
306     {
307         printf("pktio open TX failed err=%d\n",err);
308         exit(1);
309     }
310     else
311     {
312         if(netTestCfg.ipsec_mode_tx == IPSEC_MODE_TX_INFLOW)
313         {
314             PKTIO_CONTROL_T control;
315             control.op = PKTIO_UPDATE_FAST_PATH;
316             PKTIO_CFG_T cfg;
317             cfg.fast_path_cfg.fp_send_option = PKTIO_FP_L4CKSUM_PORT;
318             cfg.fast_path_cfg.txPktInfo= &txPktInfoNoCrypto;
319             netapi_pktioControl(netcp_tx_chan_no_crypto, NULL, &cfg, &control, &err);
320         }
321     }
323     /* open netcp default  TX channels for SB crypto */
324     netcp_sb_tx_chan= netapi_pktioOpen(netapi_handle, NETCP_SB_TX, NULL, &netcp_sb_tx_cfg,  &err);
325     if (!netcp_sb_tx_chan)
326     {
327         printf("pktio open SB TX failed err=%d\n",err);
328         exit(1);
329     }
331 /***************************************
332  ********** test driver*****************
333  ***************************************/
334 int main(int argc, char **argv)
336     int err,i;
337     Pktlib_HeapCfg      heapCfg;
338     rlim_t oss,ss = 1024*1024;
339     struct rlimit rl;
340     int32_t             errCode;
341     Pktlib_HeapIfTable*  pPktifTable;
342     /* Local Per Process default resourcese maintained at NWAL */
343     nwalLocCxtInfo_t    nwalLocCxt;
344     //nwalSaIpSecId_t  nwalSaIpSecId;
345     FILE * fpr = NULL;
347     err= getrlimit(RLIMIT_STACK,&rl);
348     if (!err) printf(" stack limit = %d\n",rl.rlim_cur); else printf("getrlimit failed\n");
351      /* install signal handler for ^c */
352     signal(SIGINT,mysig);
354     if (argc == 2)
355     {
356         printf("main: filename1 %s\n", argv[1]);
357         fpr = fopen(argv[1], "r");
358     }
359     else
360     {
361         fpr = fopen(input_file_name, "r");
362     }
363     if (fpr == NULL)
364     {
365         exit(1);
366     }
367     else
368     {
369         memset(&config_file, 0, sizeof(netTestConfigFile_t));
370         memset(&netTestCfg, 0, sizeof(netTestConfig_t));
371         parse_config_file(fpr,&config_file);
372     }
374     memset(&sa_info, 0, sizeof(sa_info));
377 #ifdef MULTI_THREAD
378     /* assign main net_test thread to run on core 0 */
379     CPU_ZERO( &cpu_set);
380     CPU_SET( 0, &cpu_set);
381     hplib_utilSetupCore(0, &cpu_set);
382 #endif
384     /* create netapi */
385     netapi_handle = netapi_init(NETAPI_SYS_MASTER, &our_netapi_default_cfg);
387     /* open the main heap */
388     ourHeap = Pktlib_findHeapByName("netapi");
389     if (!ourHeap)
390     {
391         printf("Pktlib_findHeapByName()  fail\n");
392         exit(1);
393     }
395     open_pktio_tx_channels();
397     /* create scheduler instance */
398     our_sched =netapi_schedOpen(netapi_handle,&our_sched_cfg, &err);
399     if (!our_sched) {printf("sched create failed\n"); exit(1);}
402     /*create net_test MAC interfaces, attach IP to created MAC interfaces */
403 //#ifdef TEST_MAC_IP
404     create_interfaces();
405 //#endif
406     /* lookup Database for SA context, this is used by packet processing routines to get RX and TX SA information*/
407     p_trie_sa_rx = trie_new();
408     p_trie_sa_tx = trie_new();
409     if (!p_trie_sa_rx || !p_trie_sa_tx)
410         {printf("trie alloc for SA  failed\n"); exit(1);}
413 #ifdef TEST_SA
414     /* Create RX SA's, RX Policy and TX SA's, all SA configuration parameters are read from net_test_config.txt file */
415     create_sec_associations();
416 #endif
417 #ifdef MULTI_THREAD
419     char c;
420     /* create and set affinity of slow path and fast path threads to
421     * specific CPU cores as specified in the net_test_config.txt file */
422     //create_sp_fp_threads();
424         //this thread of execution (main) now just waits on user input
425         for(;;)
426         {
427             printf(">");
428             c=getchar();
429             if (c=='q')
430             {
431                 QUIT=1;
432                 break;
433             }
434             else if (c=='h')
435                 printf("'q' to quit,  's' for stats, 'h' for help\n");
436         }
438         //sp_fp_thread_cleanup();
441 #else
442     /*********************************************/
443     /**************Entry point into scheduler ****/
444     /*********************************************/
445     netapi_schedRun(our_sched, &err);
446 #endif
448     /* cleanup*/
449      delete_sec_associations();
451     delete_interfaces();
453     /* close pktio channels we opened via open_pktio_tx_channels() */
454     close_pktio_channels();
455     
456     netapi_shutdown(netapi_handle);