Multi-thread development changes
authorTinku Mannan <tmannan@ti.com>
Fri, 26 Oct 2012 18:33:09 +0000 (14:33 -0400)
committerTinku Mannan <tmannan@ti.com>
Fri, 26 Oct 2012 18:33:09 +0000 (14:33 -0400)
13 files changed:
ti/runtime/netapi/netapi_sched.h
ti/runtime/netapi/netapi_tune.h
ti/runtime/netapi/pktio.h
ti/runtime/netapi/src/netapi.c
ti/runtime/netapi/src/netapi_loc.h
ti/runtime/netapi/src/netapi_sched.c
ti/runtime/netapi/src/pktio.c
ti/runtime/netapi/test/build/Makefile
ti/runtime/netapi/test/net_test.c
ti/runtime/netapi/test/net_test.h
ti/runtime/netapi/test/router.c
ti/runtime/netapi/test/synchtest.c [deleted file]
ti/runtime/netapi/test/synchtest2.c [deleted file]

index 4318ee4667fba6bd60c7782f499afc54cb47e8be..8bf1287a45fa6650f1e22f4d7ebd9573ebf00dd6 100755 (executable)
@@ -198,6 +198,9 @@ typedef struct NETAPI_SCHED_HANDLE_Tag
     uint64_t start;                     /**< Start time of NETAPI scheduler context TBD*/ 
     volatile int shutdown_reason;       /**< FUTURE-not implemented TBD */
     volatile uint64_t shutdown_time;    /**< Time till scheduler context will be shutdown/closed */
+unsigned long long num_pkts;
+unsigned long long busy_cycles;
+unsigned long long cache_cycles;
 
 } NETAPI_SCHED_HANDLE_T;
 
@@ -333,12 +336,14 @@ static NETAPI_T netapi_schedGetNetapiHandle(NETAPI_SCHED_HANDLE_T *s)
  *  @brief netapi_sched_get_stats: API to tget NETAP scheduling context statistics
  *
  *  @details   API to tget NETAP scheduling context statistics
+ *  @param[in]  s           The NETAPI scheduling context handle, @ref NETAPI_SCHED_HANDLE_T
  *  @param[in]  p_pkts TBD
  *  @param[in]  p_cycles TBD
  *  @param[in]  p_ccycles TBD
  *  @retval     none
  */
-void netapi_sched_get_stats(unsigned long long * p_pkts, 
-                            unsigned long long * p_cycles,
-                            unsigned long long * p_ccycles);
+void netapi_sched_get_stats(NETAPI_SCHED_HANDLE_T *s,
+                                                        unsigned long long * p_pkts, 
+                                                        unsigned long long * p_cycles,
+                                                        unsigned long long * p_ccycles);
 #endif
index c8f2b5e2a57269820ed339af689469e68405357a..68e2ad1277327e6b7ff6216495d57ed8cc3b7e2d 100755 (executable)
@@ -97,7 +97,7 @@
 * @def TUNE_NETAPI_NUM_CORES
 *       This defines the number of cores (theads) 
  */
-#define TUNE_NETAPI_NUM_CORES 1
+#define TUNE_NETAPI_NUM_CORES 4
 
 /**
  * @ingroup tune_parameters
  * @ingroup tune_parameters
  * @def TUNE_NETAPI_MAX_INTERFACES
  *      This defines the maximum number of MAX interfaces */
-#define TUNE_NETAPI_MAX_INTERFACES 2
+#define TUNE_NETAPI_MAX_INTERFACES 3  //2 interfaces
 
 /**
  * @ingroup tune_parameters
index 0ddf435b40db006967b7649e4eaf8452cf7ffa13..453a489914219dd215a28fdbefbcd24edc8955da 100755 (executable)
@@ -411,6 +411,7 @@ typedef struct PKTIO_HANDLE_Tag
     void * cookie;                  /**<app specific */
     PKTIO_SEND _send;               /**<pktio type specific send function */
     PKTIO_POLL _poll;               /**<pktio type specific POLL function */
+    int poll_flags;
     char name[PKTIO_MAX_NAME+1];    /**< Name of pktio channel */
 }  PKTIO_HANDLE_T;
 
@@ -434,9 +435,10 @@ typedef struct PKTIO_CONTROL_Tag
  *      This defines is used to divert to dest channel TBD
  */
 #define PKTIO_DIVERT 0x2
-
+#define PKTIO_SET_POLL_FLAGS 0x4 //control poll flags (netcp_rx only)
     int op;                 /**< TBD */
     PKTIO_HANDLE_T *dest;   /**< Handle to PKTIO channel */
+  int poll_flags;
 } PKTIO_CONTROL_T;
 
 
index c62e0f430812e3d5ceec2a137925f7da7a07903e..e10a8fce2adbbb49102d7f3d125a684b819e44f7 100755 (executable)
@@ -108,6 +108,7 @@ NETAPI_T netapi_init(int master, NETAPI_CFG_T * p_cfg)
  int i;
  int err;
  NETAPI_HANDLE_T * p = (NETAPI_HANDLE_T *) calloc(1,sizeof(NETAPI_HANDLE_T));
+ NETAPI_HANDLE_T * p_master;
  if (!p) return NULL;
  p->master = master;
 
@@ -138,6 +139,15 @@ NETAPI_T netapi_init(int master, NETAPI_CFG_T * p_cfg)
  //this goes to shared memory eventually
  p->global = (void *) &netapi_global;
 
+ //dalmt: save master's handle back in global; else for slave retrieve p_master
+ if (master==NETAPI_SYS_MASTER)
+ {
+    netapi_global.p_master = p;
+ }
+ else
+ {
+    p_master=(NETAPI_HANDLE_T *)netapi_global.p_master;
+ }
 
    /* system init */
    if(master==NETAPI_SYS_MASTER)
@@ -150,6 +160,13 @@ NETAPI_T netapi_init(int master, NETAPI_CFG_T * p_cfg)
       }
       /* create pktio channels for tx,rx */
    }
+   else if (master==NETAPI_NO_MASTER)
+   {
+   //dalmt ->simple trial.  Just copy master's packetio list for now
+        p->n_pktios = p_master->n_pktios;
+        memcpy(&p->pktios[0],&p_master->pktios[0],NETAPI_MAX_PKTIO*sizeof(PKTIO_HANDLE_T));
+        p->nwal_local=p_master->nwal_local;
+   }
    else
    {
        /*todo init for non-system cores/threads */
index 44ad682d11296031559a4281665a997d171420ea..d5126394a2c400a8fc27391ded700e566372222d 100755 (executable)
@@ -172,6 +172,7 @@ NETAPI_CFG_T  cfg;
 /* nwal context */
 NETAPI_NWAL_GLOBAL_CONTEXT_T nwal_context;
 
+NETAPI_T p_master;  //DALMT save p'masters handle 
 } NETAPI_GLOBAL_T;
 
 
index f3a62054fffbf94cac5c7583d84835351c0b0182..e6ff8d879879feb8e6952100177beb05646459e0 100755 (executable)
 #define NO_TIMER  //turn off timer related scheduling
 #define NO_GARBAGE  //turn off garbage collection
 
-volatile unsigned long long netapi_sched_num_pkts=0L;
-volatile unsigned long long netapi_sched_busy_cycles=0L;
-volatile unsigned long long netapi_sched_cache_cycles=0L;
-void netapi_sched_get_stats(unsigned long long * p_pkts, unsigned long long * p_cycles,
-                            unsigned long long * p_cache_cycles)
+void netapi_sched_get_stats(NETAPI_SCHED_HANDLE_T *s, 
+    unsigned long long * p_pkts, 
+    unsigned long long * p_cycles,
+    unsigned long long * p_cache_cycles)
 {
-   *p_pkts= netapi_sched_num_pkts;
-   *p_cycles= netapi_sched_busy_cycles;
-   *p_cache_cycles= netapi_sched_cache_cycles;
+   *p_pkts= s->num_pkts;
+   *p_cycles= s->busy_cycles;
+   *p_cache_cycles= s->cache_cycles;
    return;
 }
 /****************************************/
@@ -109,8 +108,8 @@ int netapi_schedWaitForEvents(NETAPI_SCHED_HANDLE_T *s, int *p_err)
   volatile int pkts;
   volatile unsigned long t1;
   volatile unsigned long t2;
-  volatile unsigned int cache_op_b2;
-  volatile int n_c_ops;
+  volatile unsigned long long cache_op_b2;
+  volatile unsigned long long n_c_ops;
 
   next_house =  s->config.interval;
   /* loop for duration or until shutdown */
@@ -121,16 +120,17 @@ int netapi_schedWaitForEvents(NETAPI_SCHED_HANDLE_T *s, int *p_err)
 #endif
     next_house -=1;
     //poll all  pktio channels we have open in RX mode 
-     Osal_cache_op_measure_reset();
+     //Osal_cache_op_measure_reset();
+     cache_op_b2= Osal_cache_op_measure(&n_c_ops);
      t1=hplib_mUtil_GetTickCount();
      pkts=pktio_pollAll((NETAPI_T) s->back, NULL, &err);
      t2=hplib_mUtil_GetTickCount();
      if (pkts)
      {
-        netapi_sched_num_pkts+= (unsigned long long) pkts;
-        netapi_sched_busy_cycles += (unsigned long long) (t2-t1);
-        cache_op_b2= Osal_cache_op_measure(&n_c_ops);
-        netapi_sched_cache_cycles += (unsigned long long) cache_op_b2;
+        s->num_pkts+= (unsigned long long) pkts;
+        s->busy_cycles += (unsigned long long) (t2-t1);
+        cache_op_b2=  Osal_cache_op_measure(&n_c_ops)- cache_op_b2;
+        s->cache_cycles += (unsigned long long) cache_op_b2;
      }
 
 #ifndef NO_GARBAGE
index f86f50a6b581e3c86558de70b9ab50cb71aa1a4c..67578d039c6b559c07fbb71367a72a8f5a999d48 100755 (executable)
@@ -193,7 +193,7 @@ PKTIO_HANDLE_T *p=(PKTIO_HANDLE_T*) pp;
         vv13p=netapi_timing_stop();
 #endif
         r=nwal_pollPkt(p->nwalInstanceHandle,
-                   nwal_POLL_DEFAULT_GLOB_PKT_Q|  nwal_POLL_DEFAULT_PER_PROC_PKT_Q,
+                   p->poll_flags,
                    (uint32_t) p,
                    p->max_n,
                    QMSS_PARAM_NOT_SPECIFIED,
@@ -366,7 +366,11 @@ if( (!strcmp(name, NETCP_RX)) || (!strcmp(name,NETCP_TX)) )
     p->use_nwal = PKTIO_DEF_NWAL;
     p->q = 0;  
     p->nwalInstanceHandle = netapi_return_nwal_instance_handle(n); 
-    if (!strcmp(name,NETCP_RX)) p->_poll=pktio_poll_nwal;
+    if (!strcmp(name,NETCP_RX)) 
+    {
+       p->_poll=pktio_poll_nwal; 
+       p->poll_flags= nwal_POLL_DEFAULT_GLOB_PKT_Q|  nwal_POLL_DEFAULT_PER_PROC_PKT_Q;
+    }
     if (!strcmp(name,NETCP_TX)) p->_send=pktio_send_nwal;
 }
 else if( (!strcmp(name, NETCP_SB_RX)) || (!strcmp(name,NETCP_SB_TX)) )
@@ -452,6 +456,9 @@ void pktio_control(PKTIO_HANDLE_T * p,
                switch(p_control->op)
                {
                        //clear the queue
+                        case(PKTIO_SET_POLL_FLAGS):
+                               p->poll_flags=p_control->poll_flags;
+                               break;
                        case(PKTIO_CLEAR):
                                netapi_zapQ(p->q);
                                break;
@@ -478,7 +485,7 @@ void pktio_close(PKTIO_HANDLE_T * p, int * err)
 {
        if(!p) { *err=1; return;}
        *err=0;
-       Qmss_queueClose(p->q); //LLD keeps reference count
+       if (p->q) Qmss_queueClose(p->q); //LLD keeps reference count
         p->q=-1;
        p->inuse=0;
         ((NETAPI_HANDLE_T *)p->back)->n_pktios-=1;
@@ -616,7 +623,7 @@ uint64_t ts=0LL;
             vv13p=netapi_timing_stop();
 #endif
                r=nwal_pollPkt(p->nwalInstanceHandle,
-                     nwal_POLL_DEFAULT_GLOB_PKT_Q|  nwal_POLL_DEFAULT_PER_PROC_PKT_Q,
+                     p->poll_flags,
                      (uint32_t) p,
                      p->max_n,
                      QMSS_PARAM_NOT_SPECIFIED,
index bbb0fb9b0f988217f85cd455bf15bad15b1b1da4..b4550ceba91eecb37dab5357d38cfac1be3fc204 100755 (executable)
@@ -7,6 +7,7 @@ export NETAPI_INSTALL_PATH ?= $(TRANS_SDK_INSTALL_PATH)
 
 TRIE_OBJS=$(ARMV7OBJDIR)/netapi/test/trie.o
 NT_OBJS= $(ARMV7OBJDIR)/netapi/test/net_test.o  $(ARMV7OBJDIR)/netapi/test/stubs.o  
+NTB_OBJS= $(ARMV7OBJDIR)/netapi/test/nt_bridge.o  $(ARMV7OBJDIR)/netapi/test/stubs.o  
 
 # INCLUDE Directories
 QMSS_INC_DIR = $(PDK_INSTALL_PATH)/ti/drv/qmss
@@ -76,10 +77,7 @@ $(ARMV7LIBDIR)/libnetapi.a:
 $(ARMV7BINDIR)/netapi/test/net_test:  $(NT_OBJS) $(TRIE_OBJS) $(ARMV7LIBDIR)/libnetapi.a
        $(CC) $(LDFLAGS)  $(NT_OBJS) $(TRIE_OBJS) $(INTERNALLINKDEFS)  -o $(ARMV7BINDIR)/netapi/test/net_test
 
+$(ARMV7BINDIR)/netapi/test/nt_bridge:  $(NTB_OBJS) $(TRIE_OBJS) $(ARMV7LIBDIR)/libnetapi.a
+       $(CC) $(LDFLAGS)  $(NTB_OBJS) $(TRIE_OBJS) $(INTERNALLINKDEFS)  -o $(ARMV7BINDIR)/netapi/test/nt_bridge
 
-$(ARMV7BINDIR)/netapi/test/synchtest: $(ARMV7OBJDIR)/netapi/test/synchtest.o
-       $(CC) $(LDFLAGS) $(ARMV7OBJDIR)/netapi/test/synchtest.o -o $(ARMV7BINDIR)/netapi/test/synchtest
-
-$(ARMV7BINDIR)/netapi/test/synchtest2: $(ARMV7OBJDIR)/netapi/test/synchtest2.o
-       $(CC) $(LDFLAGS) $(ARMV7OBJDIR)/netapi/test/synchtest2.o -o $(ARMV7BINDIR)/netapi/test/synchtest2 -lpthread
 
index 4e88a2970c8ff1cb94986aa9eac95d28aea756f8..732e109c17b69c7dc2dbb50a4d562dee633f37fe 100755 (executable)
 #define NWAL_ENABLE_SA
 #endif
 
+//define this for multi-thread
+#define MULTI_THREAD
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
-
+#include <signal.h>
+#include <pthread.h>
 
 #include "trie.h"
 #include "string.h"
 #include <sys/resource.h>
 #include "net_test.h"
 #include <ti/drv/sa/salld.h>
-//#define EXPERIMENTAL
+#define EXPERIMENTAL
 #ifdef EXPERIMENTAL
 #include "router.c"
 Trie * our_router;
 
 
 
-
 OUR_ROUTE_T routes[MAX_ROUTES]=
 {
 {0,{0xD4,0xbe,0xd9,0x00,0xd3,0x7e, 0x00,0x01,0x02,0x03,0x14,0x02,0x08,0x00},0},
@@ -77,7 +79,24 @@ OUR_ROUTE_T routes[MAX_ROUTES]=
 unsigned int ip[MAX_ROUTES]={BE(0x0a0100c8),BE(0x0a00000a),BE(0x0a02000a),BE(0xc0a8010a),BE(0x9eda6719)};
 
 #endif
+
+#ifdef MULTI_THREAD
+__thread int our_core;
+#endif
+
 //#define TEST_TIMERS
+static int scnt=0;
+static int QUIT=0;
+void mysig(int x)
+{
+  QUIT=1;
+  scnt+=1;
+  printf(">net_test: recv'd signal %d cnt=%d\n",x,scnt);
+  if (scnt > 10) {printf(">net_test: WARNING EXITING WITH PROPER SHUTDOWN, LUTS LEFT ACTIVE\n");exit(1);}
+
+}
+
+static unsigned char all_mac[]={0,0,0,0,0,0};
 
 /*************debug********************/
 void dump_descr(unsigned long *p, int n)
@@ -347,6 +366,7 @@ HEAD_T *nat;
 #define NP 5000
 int n_pkt = NP;
 STATS_T stats;
+paSysStats_t netcp_stats;
 
 Trie * P_trie;
 Trie *p_trie_sa;
@@ -390,10 +410,14 @@ PKTIO_CFG_T netcp_sb_tx_cfg={PKTIO_W, PKTIO_NA, PKTIO_NA, 8};
 void house(NETAPI_SCHED_HANDLE_T *s);
 NETAPI_T netapi_handle;
 NETAPI_SCHED_HANDLE_T * our_sched;
+#ifdef MULTI_THREAD
+NETAPI_SCHED_HANDLE_T * scheduler[TUNE_NETAPI_NUM_CORES];
+#endif
 NETAPI_SCHED_CONFIG_T our_sched_cfg={
   NETAPI_SCHED_DURATION|NETAPI_SCHED_CBV, 0, house, 5000000  //every 5000000 poll loops
 };
 void our_stats_cb(NETAPI_T h, paSysStats_t* pPaStats);
+void our_stats_cb_mt(NETAPI_T h, paSysStats_t* pPaStats);
 HPLIB_TIMER_GROUP_HANDLE_T ourTimerBlock; 
 HPLIB_TIMER_T t1;
 HPLIB_TIMER_T t2;
@@ -416,7 +440,7 @@ NETCP_CFG_CLASSIFIER_T class_0_cfg=
 {
    NETCP_CFG_CLASS_TYPE_L4,
    {
-        {0,0, NWAL_APP_PLOAD_PROTO_UDP, {2500}}
+       .c_l4={0,0, NWAL_APP_PLOAD_PROTO_UDP, {2500}}
    }
 };
 
@@ -424,8 +448,8 @@ NETCP_CFG_CLASSIFIER_T class_1_cfg=
 {
     NETCP_CFG_CLASS_TYPE_L4,
     {
-        {0,0, NWAL_APP_PLOAD_PROTO_UDP, {2502}}
-    }
+       .c_l4= {0,0, NWAL_APP_PLOAD_PROTO_UDP, {2502}}
+   }
 };
 
 NETCP_CFG_ROUTE_T  class2_route=
@@ -436,7 +460,7 @@ NETCP_CFG_CLASSIFIER_T class_2_cfg=
 {
    NETCP_CFG_CLASS_TYPE_L3_L4,
    {
-        {0,  4 ,0/*fill in below*/ , NULL, NULL,          //L2/L3
+        .c_l3_l4={0,  4 ,0/*fill in below*/ , NULL, NULL,          //L2/L3
            NWAL_APP_PLOAD_PROTO_UDP, {2504}}   //L4
    }
 };
@@ -1009,10 +1033,10 @@ for(i=0;i<ntrials;i++)
            timings[1]/ntrials, timings[2]/ntrials,timings[3]/ntrials, timings[4]/ntrials,timings[5]/ntrials,
            timings[6]/ntrials,timings[7]/ntrials, timings[8]/ntrials );
    {
-       unsigned int ccycles;
-       int n_c_ops;
+       unsigned long long ccycles;
+       unsigned long long  n_c_ops;
        ccycles =Osal_cache_op_measure(&n_c_ops);
-       printf("n_c_ops=%d cache_op_time=%d (total) = %d (pp)\n", n_c_ops, ccycles,  n_c_ops? (ccycles/(n_c_ops)) : 0);
+       printf("n_c_ops=%lld cache_op_time=%lld (total) = %lld (pp)\n", n_c_ops, ccycles,  n_c_ops? (ccycles/(n_c_ops)) : 0);
    }
 #endif
 
@@ -1095,7 +1119,6 @@ void flip_and_send_pkt(Ti_Pkt *tip,  unsigned char * p_pkt, int len, int flag)
     uint8_t p_add[8];
     Cppi_HostDesc*          pPloadDesc;
 
-    printf("flip_and_send_pkt()\n");
               //netapi_dump_buf((long*)p_pkt,len);
     Pktlib_setPacketLen(tip,len);
     //flip the mac address
@@ -1178,7 +1201,7 @@ void flip_and_send_pkt(Ti_Pkt *tip,  unsigned char * p_pkt, int len, int flag)
                 meta_tx.encSize = len - p_sa_info->tx_payload_info.encOffset -p_sa_info->auth_tag_size;
                 meta_tx.authSize = len - meta_tx.authOffset - p_sa_info->auth_tag_size;
 
-#if 1
+#if 0
             printf("flip_and_send_pkt(): encOffset %d\n", meta_tx.encOffset);
             printf("flip_and_send_pkt():authOffset %d\n", meta_tx.authOffset);
             printf("flip_and_send_pkt(): encSize %d\n", meta_tx.encSize);
@@ -1254,7 +1277,7 @@ void flip_and_send_pkt(Ti_Pkt *tip,  unsigned char * p_pkt, int len, int flag)
                                        NWAL_DESC_SIZE);
 
 #else
-            printf("flip_and_send_pkt(): sending for encryption\n");
+            //printf("flip_and_send_pkt(): sending for encryption\n");
            pktio_send(netcp_sb_tx_chan,tip,&meta,&err);
 #endif
        }
@@ -1417,7 +1440,7 @@ unsigned long time, delta_time;
            {
              char *tp = (char *) &hash[0];
              //dump_header((long*)p_pkt, stats.sb_rx, (int)meta[i].u.rx_sb_meta->appId,0);
-#if 1
+#if 0
              printf("decrypt complete: tag in pkt= %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \n",
                       p_pkt[len-16],p_pkt[len-15],p_pkt[len-14],p_pkt[len-13],
                       p_pkt[len-12],p_pkt[len-11],p_pkt[len-10],p_pkt[len-9], p_pkt[len-8],
@@ -1431,7 +1454,7 @@ unsigned long time, delta_time;
 #endif
            }
            //check tag 
-           printf("recv_sb_cb(); auth tag size %d\n", p_sa_info->auth_tag_size);
+           //printf("recv_sb_cb(); auth tag size %d\n", p_sa_info->auth_tag_size);
            tag_cmp = memcmp(&p_pkt[len-p_sa_info->auth_tag_size],(char*) &hash[0],p_sa_info->auth_tag_size); //todo, really use meta->authTagLen
            stats.n_auth_ok += !(tag_cmp);
            
@@ -1449,7 +1472,7 @@ unsigned long time, delta_time;
            {
              char *tp1 = (char *) &hash[0];
              //dump_header((long*)p_pkt, stats.sb_tx, (int)meta[i].u.rx_sb_meta->appId,0);
-#if 1
+#if 0
             printf("encrypt complete: tag in pkt=  %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x %x \n",
                       p_pkt[len-16],p_pkt[len-15],p_pkt[len-14],p_pkt[len-13],
                       p_pkt[len-12],p_pkt[len-11],p_pkt[len-10],p_pkt[len-9], p_pkt[len-8],
@@ -1463,7 +1486,7 @@ unsigned long time, delta_time;
            }
            //put the computed tag in the packet
            memcpy(&p_pkt[len-p_sa_info->auth_tag_size],(char*)&hash[0],p_sa_info->auth_tag_size); //todo, really use meta->authTagLen
-          printf("recv_sb_cb(): dumping pkt after updating computed tag, len %d, auth tag size %d\n", len, p_sa_info->auth_tag_size);
+//          printf("recv_sb_cb(): dumping pkt after updating computed tag, len %d, auth tag size %d\n", len, p_sa_info->auth_tag_size);
            //netapi_dump_buf(p_pkt, len);
            {
           PKTIO_METADATA_T meta2 = {PKTIO_META_TX,{0},0};
@@ -1484,7 +1507,7 @@ unsigned long time, delta_time;
 
            /* post it to netcp tx channel*/
            meta2.u.tx_meta=&meta_tx;
-           printf("recv_sb_cb(): calling pktio send to send it to network\n");
+//           printf("recv_sb_cb(): calling pktio send to send it to network\n");
            pktio_send(netcp_tx_chan,tip,&meta2,&err);
            hplib_CacheWbInv(p_pkt,len);
            stats.tx +=1;
@@ -1522,18 +1545,28 @@ void recv_cb(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
                     nwalLocCxtInfo_t    nwalLocCxt;
 
     Cppi_HostDesc*          pPloadDesc;
-
+    int ifno;
+#ifdef MULTI_THREAD
+int coreid=our_core;  //who we are(thread local)
+#else
+int coreid=0;
+#endif
     p_head=&temp_head;
 
     /* loop over received pkts */
     for(i=0;i<n_pkts;i++)
     {
+        ifno = ((unsigned int)meta[i].u.rx_meta->appId)&0xff;
+        if(coreid<TUNE_NETAPI_NUM_CORES) stats.core_rx[coreid]+=1;
+        if (ifno < TUNE_NETAPI_MAX_INTERFACES) stats.if_rx[ifno]+=1;
+
         tip = p_recv[i];
+        
         Pktlib_getDataBuffer(tip,(uint8_t**)&p_pkt,&templen);/*ignore templen */
         len = Pktlib_getPacketLen(tip)-4;   /*real length, subtract mac trailer */
         Cppi_setData (Cppi_DescType_HOST, (Cppi_Desc *) tip, p_pkt,len);
         Pktlib_setPacketLen(tip,len);
-        printf("recv_cb() packet len %d\n", len);
+        //printf("recv_cb() packet len %d\n", len);
 
         //debug: validate descriptor */
         if(Pktlib_getNextPacket(tip) != 0) 
@@ -1543,7 +1576,7 @@ void recv_cb(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
 
         stats.rx+=1;
 
-#if 1
+#ifdef DEBUG_DESC
         if (stats.rx<16)
         {
             printf(">rx dmp.."); 
@@ -1570,7 +1603,6 @@ void recv_cb(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
         {
             if (!check_header(p_head,&meta[i]))
             {
-                printf("check header failed\n");
                 stats.n_bad+=1;Pktlib_freePacket(tip); 
                 continue;
             }
@@ -1578,48 +1610,6 @@ void recv_cb(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
             //process IP SEC PACKET
             if (config.ipsec_mode_rx == IPSEC_MODE_RX_SIDEBAND)
             {
-#if 0
-                {
-                    
-                    uint8_t             count;
-                    NETAPI_HANDLE_T * n = (NETAPI_HANDLE_T *) netapi_handle;
-
-
-
-
-                    printf("\n ------------- NWAL MODULE UNIT TEST BEGIN ------------- \n");
-                    retVal =
-                    nwal_getGlobCxtInfo(((NETAPI_GLOBAL_T*) (n->global))->nwal_context.nwalInstHandle, 
-                                        &nwalGlobCxt);
-                    if(retVal == nwal_OK)
-                    {
-                        printf("*******NWAL Global Context Info Dump Begin *******\n");
-                        printf("rxPaSaFlowId:%d,rxSaPaFlowId:%d rxDefPktQ:0x%x \n",
-                                       nwalGlobCxt.rxPaSaFlowId,nwalGlobCxt.rxSaPaFlowId,
-                                        nwalGlobCxt.rxDefPktQ);
-                        printf("defFlowQ:0x%x,passCppiHandle:0x%x extErr:%d \n",
-                                       nwalGlobCxt.defFlowQ,nwalGlobCxt.passCppiHandle,
-                                       nwalGlobCxt.extErr);
-                        for(count=0;count < nwalGlobCxt.numPaPDSPs;count++)
-                        {
-                            printf("NetCP PASS PDSP - %d Version:0x%x \n",
-                                           count,nwalGlobCxt.pdspVer[count]);
-                        }
-                        printf("*******NWAL Global Context Info Dump End *******\n\n");
-                    }
-                    printf(" calling nwal_getLocCxtInfo for tx channel\n");
-                    nwal_getLocCxtInfo(PKTIO_GET_NWAL_INSTANCE(netcp_sb_tx_chan),
-                                                      &nwalLocCxt);
-                    printf(" calling nwal_getLocCxtInfo for rx channel\n");
-                    nwal_getLocCxtInfo(PKTIO_GET_NWAL_INSTANCE(netcp_sb_rx_chan),
-                                                      &nwalLocCxt);
-
-                    
-              }
-#endif
-
-
-
                 
                 p_spi = &(p_pkt[netTest_MAC_HEADER_LEN+netTest_IP_HEADER_LEN]);
                  p_sa_info = (netTestSA_t *) trie_lookup(p_trie_sa, (char *)p_spi ,4);
@@ -1646,7 +1636,7 @@ void recv_cb(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],
 
 
 
-#if 1
+#if 0
                 printf("recv_cb(): packet length %d\n", len);
                 printf("recv_cb(): encOffset %d\n", meta_tx.encOffset);
                 printf("recv_cb():authOffset %d\n", meta_tx.authOffset);
@@ -1867,6 +1857,11 @@ static int np2process = NP;
 /******************************************************
  * stats callback
  *******************************************************/
+void our_stats_cb_mt(NETAPI_T h, paSysStats_t* pPaStats)
+{
+  stats.n_stats_cb +=1;
+  if(pPaStats) memcpy(&netcp_stats,pPaStats, sizeof(paSysStats_t));
+}
 void our_stats_cb(NETAPI_T h, paSysStats_t* pPaStats)
 {
 uint32_t numFreeDataPackets;
@@ -1881,20 +1876,34 @@ unsigned long long bcpp_tx;
 unsigned long long npL;
 unsigned long long cyclesL;
 unsigned long long ccyclesL; //cache cycles
+unsigned long long tmp_npL[TUNE_NETAPI_NUM_CORES];
+unsigned long long tmp_cyclesL[TUNE_NETAPI_NUM_CORES];
+unsigned long long tmp_ccyclesL[TUNE_NETAPI_NUM_CORES]; //cache cycles
 NETAPI_SA_STATS_T netapi_sa_stats;
 
-printf(">*****stats @ %lld\n", hplib_mUtil_GetTimestamp());
+printf(">*****stats @ %lld (#cbs%d) \n", hplib_mUtil_GetTimestamp(),stats.n_stats_cb);
 //printf("netcp_tx_handle check %x\n", netcp_tx_chan->back);
-printf(">itx=%d rx=%d tx=%d bad=%d slow=%d \n>rx_class0=%d rx_class1=%d rx_class2=%d  secRx=%d  secPRX=%d sb_rx=%d sb_tx=%d auth_ok=%d sec_tx=%d\n",
+printf(">itx=%d rx=%d tx=%d bad=%d slow=%d \n>rx_class0=%d rx_class1=%d rx_class2=%d  secRx=%d  secPRX=%d sb_rx=%d sb_tx=%d auth_ok=%d sec_tx=%d  min_rx=%d min_tx=%d\n",
          stats.itx, stats.rx, stats.tx, stats.n_bad, stats.n_new, 
          stats.n_class0_rx, stats.n_class1_rx, 
          stats.n_class2_rx, stats.sec_rx, stats.secp_rx, stats.sb_rx, stats.sb_tx, stats.n_auth_ok,
-         stats.sec_tx);
+         stats.sec_tx, stats.rx_min, stats.tx_min);
+printf(">if rx stats:  %d %d %d\n",stats.if_rx[0],stats.if_rx[1],stats.if_rx[2]);
+printf(">core rx stats:  %d %d %d\n",stats.core_rx[0],stats.core_rx[1],stats.core_rx[2]);
+
 
 if (stats.rx && stats.tx)
     printf("decrypt time per packet(avg): %lu, encrypt  time per packet(avg): %lu\n", 
     (unsigned long) stats.total_decrypt_time/stats.rx, (unsigned long) stats.total_encrypt_time/stats.tx);
-netapi_sched_get_stats(&npL,&cyclesL,&ccyclesL);
+#ifdef MULTI_THREAD
+netapi_sched_get_stats(scheduler[0],&tmp_npL[0],&tmp_cyclesL[0],&tmp_ccyclesL[0]);
+netapi_sched_get_stats(scheduler[1],&tmp_npL[1],&tmp_cyclesL[1],&tmp_ccyclesL[1]);
+npL = tmp_npL[0]+tmp_npL[1];
+cyclesL = tmp_cyclesL[0]+tmp_cyclesL[1];
+ccyclesL = tmp_ccyclesL[0]+tmp_ccyclesL[1];
+#else
+netapi_sched_get_stats(our_sched, &npL,&cyclesL,&ccyclesL);
+#endif
 if (npL && stats.rx) {
    bcpp = cyclesL/npL; 
    bcpp_noc = (cyclesL-ccyclesL)/npL; 
@@ -2054,12 +2063,24 @@ unsigned int nwal_sum_vv6=0;
 
 unsigned int nwal_sum_flow_vv1=0;
 unsigned int nwal_sum_flow_vv2=0;
-unsigned int cache_op_b1;
-unsigned int cache_op_b2;
-int n_c_ops;
+unsigned long long cache_op_b1;
+unsigned long long  cache_op_b2;
+unsigned long long  n_c_ops;
 static int first =0;
 Cppi_HostDesc*      pPktDesc;
 
+#ifdef MULTI_THREAD
+int coreid;  //who we are
+NETAPI_T nh= netapi_schedGetNetapiHandle(s);
+coreid=(int) netapi_getCookie(nh);
+
+if (QUIT) {netapi_schedShutdown(s,NULL,&err); return;}
+
+if (coreid==0) //slave
+{
+   netcp_cfgReqStats(nh, our_stats_cb_mt, 0,&err); 
+}
+#else
 if(done_burst)
 {
   house_pkts_gened+=TX_BURST;
@@ -2188,7 +2209,7 @@ if ((house_pkts_gened>0) && (! (house_pkts_gened%1000)) )
        sum_vv1 = sum_vv1 - nwal_sum_flow_vv2;
    }
 
-   sum_vv3 += (vv3-vv2)-(cache_op_b2-cache_op_b1); //sub out cache op cost
+   sum_vv3 += (vv3-vv2)-(long) (cache_op_b2-cache_op_b1); //sub out cache op cost
 
    // printf("pktio send. full=%d metadata=%d pktio_send=%d\n", vv3-vv1,  vv2-vv1,  vv3-vv2);
    
@@ -2197,13 +2218,13 @@ if ((house_pkts_gened>0) && (! (house_pkts_gened%1000)) )
    house_pkts_gened +=1;
  }
 {
-   unsigned int ccycles;
+   unsigned long long  ccycles;
    ccycles =Osal_cache_op_measure(&n_c_ops);
    if (sum_vv1) 
    {
-      printf("BURST NWAL Fast send %d pkts.  metadata=%d Cmd Label Creation Cost=%d  nwal Fast Send Cost (less cacheop)= %d n_c_ops=%d cache_op_time=%d (pp-> %d)\n", 
+      printf("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", 
               stats.itx, sum_vv1/stats.itx,  nwal_sum_flow_vv2, sum_vv3/stats.itx, 
-              n_c_ops, ccycles, n_c_ops? (ccycles/(n_c_ops/2)) : 0);
+              n_c_ops, ccycles, n_c_ops? (ccycles/(n_c_ops/2L)) : 0);
 #if 0
       printf("NWAL Profile Cycles: Prof1= %d,Prof2=%d,Prof3=%d,Prof4=%d,Prof5=%d ,Prof6=%d \n",
               nwal_sum_vv1/stats.itx,nwal_sum_vv2/stats.itx,nwal_sum_vv3/stats.itx,
@@ -2219,6 +2240,7 @@ if ((house_pkts_gened>0) && (! (house_pkts_gened%1000)) )
 
    }
 }
+#endif
 }
 
 void  build_sa_db(int i)
@@ -2808,6 +2830,43 @@ static void parse_config_file(FILE * fpr, netTestConfigFile_t *pConfig)
 #endif
 }
 
+
+#ifdef MULTI_THREAD
+NETAPI_T worker_nh[TUNE_NETAPI_NUM_CORES];
+void slow_path_thread(int coreid)
+{
+int err;
+worker_nh[coreid]=netapi_init(NETAPI_NO_MASTER,NULL);
+netapi_setCookie(worker_nh[coreid],coreid);
+our_core=coreid;
+scheduler[coreid] =netapi_schedOpen(worker_nh[coreid],&our_sched_cfg, &err);
+if (!scheduler[coreid]) {printf("sched create failed for core%d\n",coreid); exit(1);}
+
+/*********************************************/
+/**************Entry point into scheduler ****/
+/*********************************************/
+netapi_schedWaitForEvents(scheduler[coreid], &err);
+printf(">net_test: core %d worker thread done\n",coreid);
+netapi_shutdown(worker_nh[coreid]);
+
+}
+void fast_path_thread(int coreid)
+{
+int err;
+worker_nh[coreid]=netapi_init(NETAPI_NO_MASTER,NULL);
+netapi_setCookie(worker_nh[coreid],coreid);
+our_core=coreid;
+scheduler[coreid] =netapi_schedOpen(worker_nh[coreid],&our_sched_cfg, &err);
+if (!scheduler[coreid]) {printf("sched create failed for core%d\n",coreid); exit(1);}
+
+/*********************************************/
+/**************Entry point into scheduler ****/
+/*********************************************/
+netapi_schedWaitForEvents(scheduler[coreid], &err);
+printf(">net_test: core %d worker thread done\n",coreid);
+netapi_shutdown(worker_nh[coreid]);
+}
+#endif
 static  netTestConfigFile_t config_file;
 /***************************************
  ********** test driver*****************
@@ -2841,6 +2900,8 @@ i   f (!err) printf("set stack to %d\n",rl.rlim_cur); else printf("setrlimit fai
     if (argc==3)  perslow = atoi(argv[2]);
     if ((perslow<0)||(perslow>100)) perslow=PERSLOW;//default
     if (argc>3) {printf("net_test  <no of pkts to process> <percent slow path>\n"); exit(1);}
+     //install signal handler for ^c
+    signal(SIGINT,mysig);
 #if 1
 
 #if 0
@@ -2972,7 +3033,25 @@ our_pktio_bench(1000);
 our_pktio_bench(1000);
 /*********************************************/
 #endif
+//#define PROMISCUOUS
+#ifdef PROMISCUOUS
+#define ETH0 1
+#define ETH1 2
+printf(">net_test: WARNING, ADDING RULE FOR PROMISCUOUS THAT WILL BREAK LINUX STACK\n");
+netcp_cfgCreateMacInterface(
+                  netapi_handle,
+                  &all_mac[0],
+                  0,0,
+                  (NETCP_CFG_ROUTE_HANDLE_T)  NULL,
+                  (NETCP_CFG_VLAN_T ) NULL ,  //future
+                  1,
+                  &err);
+if (err) {printf("addmac0 failed %d\n",err); exit(1); }
 
+#else
+#define ETH0 0
+#define ETH1 1
+#endif
 
 
 
@@ -2980,7 +3059,7 @@ our_pktio_bench(1000);
 netcp_cfgCreateMacInterface(
                   netapi_handle,
                   &config.mac0[0],
-                  0,0,
+                  ETH0,0,
                   (NETCP_CFG_ROUTE_HANDLE_T)  NULL,
                   (NETCP_CFG_VLAN_T ) NULL ,  //future
                   1, 
@@ -2990,7 +3069,7 @@ if (err) {printf("addmac0 failed %d\n",err); exit(1); }
 //attach an IP to this interface
 ip_rule0=netcp_cfgAddIp(
                   netapi_handle,
-                  0,
+                  ETH0,
                   nwal_IPV4,
                   &config.ip0,
                   NULL,  //all IP
@@ -3003,7 +3082,7 @@ if (err) {printf("addip0 failed %d\n",err); exit(1); }
 netcp_cfgCreateMacInterface(
                   netapi_handle,
                   &config.mac1[0],
-                  1,1,
+                  ETH1,1,
                   (NETCP_CFG_ROUTE_HANDLE_T)  NULL,
                   (NETCP_CFG_VLAN_T ) NULL ,  //future
                   1,
@@ -3013,7 +3092,7 @@ if (err) {printf("addmac1 failed %d\n",err); exit(1); }
 //attach an IP to this interface
 ip_rule1=netcp_cfgAddIp(
                   netapi_handle,
-                  1,
+                  ETH1,
                   nwal_IPV4,
                   &config.ip1,
                   NULL,  //all IP
@@ -3204,9 +3283,10 @@ t3 = hplib_Timer_Start(
         &err);
 if (err) {printf("timerstart failed %d\n");}
 #endif
+#if 0
 netcp_cfgReqStats(netapi_handle, our_stats_cb, 1,&err);
 if (err!=0) {printf("stats req failed\n");}
-
+#endif
 /*********************************************/
 /*****************end NETAPI STARTUP**********/
 /*********************************************/
@@ -3241,11 +3321,59 @@ build_table(P_trie);
 srand((unsigned) np2process);
 #endif
 
+#ifdef MULTI_THREAD
+{
+       pthread_t *thrs;
+        int procs =2;  //get this from config eventually
+        char c;
+        thrs = malloc( sizeof( pthread_t ) * procs );
+        if (thrs == NULL)
+        {
+                perror( "malloc" );
+                return -1;
+        }
+        printf( "Starting %d threads...\n", procs );
+
+        if (pthread_create( &thrs[0], NULL, slow_path_thread,
+                        (void *)0 ))
+        {
+                        perror( "pthread_create" );
+                        exit(1);
+        }
+        if (pthread_create( &thrs[1], NULL, fast_path_thread,
+                        (void *)1 ))
+        {
+                        perror( "pthread_create" );
+                        exit(1);
+        }
+
+        //this thread of execution (main) now just waits on user input
+        for(;;)
+        {
+           printf(">");
+           c=getchar();
+           if (c=='q') {QUIT=1;break;}
+           else if (c=='s') our_stats_cb(netapi_handle, &netcp_stats);
+           else if (c=='h') printf("'q' to quit,  's' for stats, 'h' for help\n");
+        }
+
+        //wait for completion 
+        printf("main task now pending on slow/fast path completion\n");
+        for (i = 0; i < procs; i++)
+                pthread_join( thrs[i], NULL );
+
+        free( thrs );
+}
+#else
+
+
 /*********************************************/
 /**************Entry point into scheduler ****/
 /*********************************************/
 netapi_schedWaitForEvents(our_sched, &err);
 
+#endif
+
 /* done */
 our_stats_cb(netapi_handle, NULL);
 
@@ -3288,7 +3416,9 @@ netcp_cfgDelIp(netapi_handle, 0, 0, NULL, NULL, ip_rule0, &err);
 netcp_cfgDelIp(netapi_handle, 1, 0, NULL, NULL, ip_rule1, &err);
 netcp_cfgDelMac(netapi_handle,0,&err);
 netcp_cfgDelMac(netapi_handle,1,&err);
-
+#ifdef PROMISCUOUS
+netcp_cfgDelMac(netapi_handle,2,&err);
+#endif
 
 //close pktio channels we opened
 pktio_close(netcp_tx_chan ,&err);
@@ -3534,7 +3664,7 @@ for(;max_pkts>0;)
 
 #ifdef EXPERIMENTAL
 
-static inline void send_it(Ti_Pkt *tip, int len, ROUTE_SEC_T * p_sec)
+static inline void send_it(Ti_Pkt *tip, int len, ROUTE_SEC_T * p_sec, int out_port)
 {
   unsigned long st1;
   unsigned long st2;
@@ -3556,11 +3686,11 @@ static inline void send_it(Ti_Pkt *tip, int len, ROUTE_SEC_T * p_sec)
   meta_tx2.startOffset = 0;
   meta_tx2.ipOffBytes = 14;
   meta_tx2.ploadLen = len ;
+  meta_tx2.enetPort=out_port;
   if(p_sec)
   {   
        meta_tx2.txFlag1 |= NWAL_TX_FLAG1_DO_IPSEC_ESP_CRYPTO ;
        meta2.sa_handle=p_sec->tx_inflow_mode_handle; //this tells netapi that inflow crypto needs to be applied
-       meta_tx2.enetPort=0;
        meta_tx2.saOffBytes=14+20;
        meta_tx2.saPayloadLen=len-14-20;   //don't include tag, mac and outer header
        stats.sec_tx+=1;
@@ -3587,14 +3717,24 @@ IP_HEAD_T th;
 ROUTE_SEC_T *sec_data=NULL;
 unsigned long t1;
 unsigned long t2;
-unsigned long ct1;
-unsigned long ct2;
+unsigned long long ct1;
+unsigned long long ct2;
 unsigned short ip_pl;
-int n_c_ops;
+unsigned long long n_c_ops;
+int ifno;
+int out_port;
+#ifdef MULTI_THREAD
+int coreid=our_core;  //who we are(thread local)
+#else
+int coreid=0;
+#endif
 t1=hplib_mUtil_GetTickCount();
 ct1 =Osal_cache_op_measure(&n_c_ops);
 for(i=0;i<n_pkts;i++)
 {
+        ifno = ((unsigned int)meta[i].u.rx_meta->appId)&0xff;
+        if(coreid<TUNE_NETAPI_NUM_CORES) stats.core_rx[coreid]+=1;
+        if (ifno < TUNE_NETAPI_MAX_INTERFACES) stats.if_rx[ifno]+=1;
         tip = p_recv[i];
         Pktlib_getDataBuffer(tip,(uint8_t**)&p_pkt,&templen);//ignore templen
         len = Pktlib_getPacketLen(tip)-4;//real length, subtract mac trailer
@@ -3626,14 +3766,14 @@ for(i=0;i<n_pkts;i++)
              Cppi_setData (Cppi_DescType_HOST, (Cppi_Desc *) tip, p_pkt,len);
              Pktlib_setPacketLen(tip,len);
              
-             if (route_pkt(our_router, tip, &th, p_pkt, &len,&sec_data)<0)
+             if (route_pkt(our_router, tip, &th, p_pkt, &len,&sec_data,&out_port)<0)
               {
                 stats.n_bad+=1;
                 Pktlib_freePacket(tip);
              }
              else
              {
-               send_it(tip,len,sec_data);
+               send_it(tip,len,sec_data,out_port);
              }
              break;
            }
@@ -3658,14 +3798,14 @@ for(i=0;i<n_pkts;i++)
                 stats.rx_min+=1;
               }
               Pktlib_setPacketLen(tip,len);
-              if (route_pkt(our_router, tip, &th, p_pkt, &len,&sec_data)<0)
+              if (route_pkt(our_router, tip, &th, p_pkt, &len,&sec_data,&out_port)<0)
               {
                 stats.n_bad+=1;
                 Pktlib_freePacket(tip);
               }
               else
               {
-                 send_it(tip,len,sec_data);
+                 send_it(tip,len,sec_data,out_port);
               }
               break;
            case(NETAPI_NETCP_MATCH_GENERIC_IP):
index 74702ed116d5a4e43aff8fb23100ae18196213e6..731af229e7975966cdf63304b8d57dc9d01fba57 100755 (executable)
@@ -178,6 +178,10 @@ typedef struct stats_t
         unsigned long long total_encrypt_time;
                long rx_min;
                long tx_min;
+       long if_rx[TUNE_NETAPI_MAX_INTERFACES];
+       long  core_rx[TUNE_NETAPI_NUM_CORES];
+       long  n_stats_cb;
+       long  ip;
 } STATS_T; 
 
 typedef struct head_t
index a088127db16602f12ce694a7661314d7000aa4a9..e0f289ef96ed305f71cb3dc8b3e48b6d8446b498 100755 (executable)
@@ -42,7 +42,7 @@ void route_add(Trie * Pt, unsigned int * Pdest_ipBE, void * Pour_route)
 
 //route the packet 
 //  lookup next hop in route trie
-int route_pkt(Trie *Pt, void * Ppkt, IP_HEAD_T *Phead, unsigned char * Pbuf, int * Plen, ROUTE_SEC_T **Prs)
+int route_pkt(Trie *Pt, void * Ppkt, IP_HEAD_T *Phead, unsigned char * Pbuf, int * Plen, ROUTE_SEC_T **Prs, int *PoutPort)
 {
    OUR_ROUTE_T *Pr;
    int ret;
@@ -52,7 +52,7 @@ int route_pkt(Trie *Pt, void * Ppkt, IP_HEAD_T *Phead, unsigned char * Pbuf, int
    {
       if(!Prs) return -3;
      //tunnel i/f
-      ret=process_tunnel(Pt, Ppkt, Phead, Pbuf, Plen, Pr);             
+      ret=process_tunnel(Pt, Ppkt, Phead, Pbuf, Plen, Pr,*PoutPort);             
       *Prs = Pr->sec_ptr;
       return ret;
    }
@@ -63,11 +63,13 @@ int route_pkt(Trie *Pt, void * Ppkt, IP_HEAD_T *Phead, unsigned char * Pbuf, int
     Pbuf[14+8]-=1;  //ttl--
     //todo do check ttl!
     Pbuf[14+10]=0; Pbuf[14+11]=0;  //zap [outer] header checksum
+   if(PoutPort) *PoutPort=Pr->out_port;
    return 1;
 }
 
 int process_tunnel(Trie *Pt, void *Ppkt, IP_HEAD_T * Phead, 
-                   unsigned char * Pbuf, int* Plen, OUR_ROUTE_T * Proute)
+                   unsigned char * Pbuf, int* Plen, OUR_ROUTE_T * Proute,
+                   int * PoutPort)
 {
 unsigned char *sb = Pbuf;
 unsigned char *eb= &Pbuf[*Plen]; 
@@ -133,7 +135,7 @@ Cppi_setData (Cppi_DescType_HOST, (Cppi_Desc *) Ppkt, sb,newlen);
 Pktlib_setPacketLen(Ppkt,newlen);
 
 //now route based on outer ip
-ret=route_pkt(Pt, Ppkt, Phead, sb, &newlen,NULL);
+ret=route_pkt(Pt, Ppkt, Phead, sb, &newlen,NULL,PoutPort);
 if (ret<0) return ret;
 *Plen=newlen;
 return 1;
@@ -156,6 +158,7 @@ main()
 {
 int i;
 int l;
+int out_port;
 rt = route_init();
 for (i=0;i<NR;i++)
 {  
@@ -164,6 +167,6 @@ for (i=0;i<NR;i++)
 
 memcpy(&tp[14],&th,20);
 l=1500;
-route_pkt(rt, 0, &th, &tp[0],&l,NULL);
+route_pkt(rt, 0, &th, &tp[0],&l,NULL,&out_port);
 }
 #endif
diff --git a/ti/runtime/netapi/test/synchtest.c b/ti/runtime/netapi/test/synchtest.c
deleted file mode 100755 (executable)
index d5de741..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-/********************************
- * file: synchtest.c
- * sync primitives unit test
- ************************************************
-* FILE:  synchtest.c 
- * 
- * DESCRIPTION:  netapi user space transport
- *               library  test application -> synchronization primitives
- * 
- * REVISION HISTORY:  rev 0.0.1 
- *
- *  Copyright (c) Texas Instruments Incorporated 2010-2011
- * 
- *  Redistribution and use in source and binary forms, with or without 
- *  modification, are permitted provided that the following conditions 
- *  are met:
- *
- *    Redistributions of source code must retain the above copyright 
- *    notice, this list of conditions and the following disclaimer.
- *
- *    Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the 
- *    documentation and/or other materials provided with the   
- *    distribution.
- *
- *    Neither the name of Texas Instruments Incorporated nor the names of
- *    its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
- *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ******************************/
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include "netsync.h"
-#include "netapi_util.h"
-
-#if 0
-/* timing */
-static inline unsigned long timing_start(void)
-{
-       volatile int vval;
-        //read clock
-        asm volatile("mrc p15, 0, %0, c9, c13, 0" :  "=r"(vval));
-        return vval;
-}
-static inline unsigned long timing_stop(void)
-{
-        volatile int vval2;
-        //read clock
-        asm volatile("mrc p15, 0, %0, c9, c13, 0" :  "=r"(vval2));
-        return vval2;
-}
-#endif
-#define timing_start netapi_timing_start
-#define timing_stop netapi_timing_stop
-
-int spot=0;
-
-NETAPI_RWLOCK_T  temp;
-
-void test1()
-{
-int v1, v2;
-netapi_rwlock_init(&temp);
-v1 = timing_start();
-netapi_rwlock_write_lock(&temp);
-v2 = timing_stop();
-printf("rwlock write locked, cycles= %d \n", v2-v1);
-}
-
-void test2()
-{
-int v1, v2;
-
-v1 = timing_start();
-netapi_rwlock_write_unlock(&temp);
-v2 = timing_stop();
-printf("rwlock write unlocked, cycles= %d \n",v2-v1);
-}
-void test3()
-{
-int v1,v2;
-v1 = timing_start();
-netapi_rwlock_read_lock(&temp);
-v2 = timing_stop();
-printf("rwlock read locked, cycles= %d \n", v2-v1);
-}
-void test4()
-{
-int v1,v2;
-v1 = timing_start();
-netapi_rwlock_read_unlock(&temp);
-v2 = timing_stop();
-printf("rwlock read_unlocked, cycles= %d\n", v2-v1);
-}
-
-main()
-{
-NETAPI_SPINLOCK_T val;
-int i;
-unsigned long v1,v2;
-int val2;
-for(i=0;i<10;i++) {
-val=__sync_fetch_and_add(&spot, 1);
-printf(" val = %d %d\n",val,spot);
-
-//now we try the synch_lock_and_test
-netapi_spinlock_init(&val);
-v1 = timing_start();
-netapi_spinlock_lock(&val);
-v2 = timing_stop();
-printf("locked, val= %d cycles=%d\n",val,v2-v1);
-
-//try the lock
-v1 = timing_start();
-val2=netapi_spinlock_try_lock(&val);
-v2 = timing_stop();
-printf("try lock has returns %d, cycles=%d\n", val2, v2-v1);
-
-//poll the lock 
-v1 = timing_start();
-val2=netapi_spinlock_is_locked(&val);
-v2 = timing_stop();
-printf("is_locked has returns %d, cycles=%d\n", val2, v2-v1);
-
-
-//unlock
-v1 = timing_start();
-netapi_spinlock_unlock(&val);
-v2 = timing_stop();
-printf("unlocked, val= %d cycles=%d\n", val,v2-v1);
-
-/*-------now try rwlock--------*/
-test1();
-test2();
-test3();
-test3();
-test4();
-test4();
-
-}
-}
-
-
-
diff --git a/ti/runtime/netapi/test/synchtest2.c b/ti/runtime/netapi/test/synchtest2.c
deleted file mode 100755 (executable)
index 5a3717e..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/**************************************
- * file : synchtest2.c
- **************************************
- * * FILE:  synchtest2.c
- * 
- * DESCRIPTION:  netapi user space transport
- *               library  test application - more synchtest
- * 
- * REVISION HISTORY:  rev 0.0.1 
- *
- *  Copyright (c) Texas Instruments Incorporated 2010-2011
- * 
- *  Redistribution and use in source and binary forms, with or without 
- *  modification, are permitted provided that the following conditions 
- *  are met:
- *
- *    Redistributions of source code must retain the above copyright 
- *    notice, this list of conditions and the following disclaimer.
- *
- *    Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the 
- *    documentation and/or other materials provided with the   
- *    distribution.
- *
- *    Neither the name of Texas Instruments Incorporated nor the names of
- *    its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
- *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
- *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
- *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
- *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
- *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- ******************************************************************************/
-
-#include <stdio.h>
-#include <pthread.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <sched.h>
-#include <linux/unistd.h>
-#include <sys/syscall.h>
-#include <errno.h>
-
-#include "netsync.h"
-#include "netapi_util.h"
-//#define INC_TO 1000000 // one million.
-#define INC_TO 10000 // one million...
-
-NETAPI_ATOMIC64_T global_int=NETAPI_ATOMIC_INIT64(0LL)  ;
-__thread blah=0;
-int blah2=0;
-NETAPI_SPINLOCK_T spin_test;
-
-pid_t gettid( void )
-{
-       return syscall( __NR_gettid );
-}
-
-void *thread_routine( void *arg )
-{
-       int i;
-       int proc_num = (int)(long)arg;
-       cpu_set_t set;
-       int v1, v2,v3;
-
-#if 0
-       CPU_ZERO( &set );
-       CPU_SET( proc_num, &set );
-
-       if (sched_setaffinity( gettid(), sizeof( cpu_set_t ), &set ))
-       {
-               perror( "sched_setaffinity" );
-               return NULL;
-       }
-#endif
-
-       for (i = 0; i < INC_TO; i++)
-       {
-               
-               v1 = netapi_timing_start(); 
-              netapi_atomic_add64(&global_int,1LL);
-              v1= netapi_timing_stop() - v1;
-               sched_yield();
-               v2 = netapi_timing_start(); 
-               blah+=1;        
-              v2= netapi_timing_stop() - v2;
-              
-               v3 = netapi_timing_start(); 
-               blah2+=1;       
-              v3= netapi_timing_stop() - v3;
-               if(i<10) { printf("thread %d -> a64 costs %d,  tls costs %d simple++ costs %d\n", proc_num,v1,v2,v3);}
-               sched_yield();
-       }
-        printf("thead %d -> blah=%d\n",proc_num, blah);
-
-        printf("now try spin lock test. i'm thread %d, about to grab lock \n", proc_num);
-
-        //now we try the synch_lock_and_test
-        v1 = netapi_timing_start();
-        netapi_spinlock_lock(&spin_test);
-        v2 = netapi_timing_stop();
-        printf("i'm thread %d. I've locked it, val= %d, it took cycles=%d to get it\ngoing to sleep..",proc_num,spin_test,v2-v1);
-        sleep(1);
-        printf(" i'm back.  i'm thread %d. i'm unlocking now\n",proc_num); 
-        netapi_spinlock_unlock(&spin_test);
-       return NULL;
-}
-
-int main()
-{
-       int procs = 0;
-       int i;
-       pthread_t *thrs;
-        printf("at start up\n");
-
-       // Getting number of CPUs
-       procs = (int)sysconf( _SC_NPROCESSORS_ONLN );
-       if (procs < 0)
-       {
-               perror( "sysconf" );
-               return -1;
-       }
-        printf(" num cpus = %d\n",procs);
-        if (procs==1) {procs+=1; printf("adding 2nd 'core' \n");}
-       thrs = malloc( sizeof( pthread_t ) * procs );
-       if (thrs == NULL)
-       {
-               perror( "malloc" );
-               return -1;
-       }
-
-        //initialize spinlock
-        netapi_spinlock_init(&spin_test);
-       printf( "Starting %d threads...\n", procs );
-
-       for (i = 0; i < procs; i++)
-       {
-               if (pthread_create( &thrs[i], NULL, thread_routine,
-                       (void *)(long)i ))
-               {
-                       perror( "pthread_create" );
-                       procs = i;
-                       break;
-               }
-       }
-
-       for (i = 0; i < procs; i++)
-               pthread_join( thrs[i], NULL );
-
-       free( thrs );
-
-       printf( "global_int value is: %lld bare global_int is %d\n",
-               global_int.val, blah2 );
-       printf( "Expected value is: %d\n", INC_TO * procs );
-
-       return 0;
-}