index 0acd1dfb84ac6581b4b9daa5964ab67c61ffc6e6..15177e8bee00b764f22b7739898a661346f714f3 100755 (executable)
\r
Pktlib_HeapHandle OurHeap; //default heap, used by producer\r
PKTIO_CFG_T netcp_rx_cfg={PKTIO_RX, PKTIO_NA, PKTIO_NA, 8};\r
+PKTIO_CFG_T netcp_tx_cfg={PKTIO_TX, PKTIO_NA, PKTIO_NA, 8};\r
PKTIO_HANDLE_T * netcp_rx_chan;\r
+PKTIO_HANDLE_T * netcp_tx_chan;\r
NETAPI_T netapi_handle;\r
\r
PKTIO_CONTROL_T zap_channel_control={PKTIO_CLEAR, NULL};\r
pkt_rx_cycles += (t2-t1);\r
}\r
}\r
- printf("nt-bench: recevier DONE %d pkts rx, pkt poll cycles=% u; pkt rx cycle=%u pkt tx cycles=%u \n", pkt_rx,\r
+ printf("nt-bench: receiver DONE %d pkts rx, pkt poll cycles=% u; pkt rx cycle=%u pkt tx cycles=%u \n", pkt_rx,\r
(unsigned) (pkt_rx ? (pkt_rx_cycles - pkt_cb_cycles)/pkt_rx : 0),\r
(unsigned) (pkt_rx ? (pkt_rx_cycles) /pkt_rx : 0),\r
(unsigned) (pkt_tx ? (pkt_tx_cycles) /pkt_tx : 0)\r
);\r
+ printf("Leaving producer_thread\n");\r
}\r
\r
\r
\r
//install signal handler for ^c\r
signal(SIGINT,netTest_utilMySig);\r
+\r
+\r
+\r
+\r
+\r
+\r
CPU_ZERO( &cpu_set);\r
CPU_SET( 0, &cpu_set);\r
hplib_utilSetupThread(2, &cpu_set);\r
netcp_rx_chan= netapi_pktioOpen(netapi_handle, NETCP_RX, (PKTIO_CB) recv_cb_net, &netcp_rx_cfg, &err);\r
if (!netcp_rx_chan) {printf("pktio open RX failed err=%d\n",err); exit(1);}\r
\r
+ netcp_tx_chan= netapi_pktioOpen(netapi_handle, NETCP_TX, (PKTIO_CB) NULL, &netcp_tx_cfg, &err);\r
+ if (!netcp_tx_chan) {printf("pktio open TX failed err=%d\n",err); exit(1);}\r
+\r
/*********************************************/\r
/*****************end NETAPI STARTUP**********/\r
/*********************************************/\r
//Create a worked thread\r
//***************************************\r
{\r
- pthread_t *thrs;\r
- int procs =1; \r
- char c;\r
- thrs = malloc( sizeof( pthread_t ) * procs );\r
- if (thrs == NULL)\r
- {\r
- perror( "malloc" );\r
- return -1;\r
- }\r
- printf( "benchmark-test: Starting %d threads...\n", procs );\r
+ pthread_t *thrs;\r
+ int procs =1; \r
+ char c;\r
+ thrs = malloc( sizeof( pthread_t ) * procs );\r
+ if (thrs == NULL)\r
+ {\r
+ perror( "malloc" );\r
+ return -1;\r
+ }\r
+ printf( "benchmark-test: Starting %d threads...\n", procs );\r
\r
- if (pthread_create( &thrs[0], NULL, (void*)producer_thread,\r
- (void *)0 ))\r
- {\r
- perror( "pthread_create" );\r
- exit(1);\r
- }\r
- //this thread of execution (main) now just waits on user input\r
- for(;;)\r
- {\r
- printf(">");\r
- c=getchar();\r
- if (c=='q') {QUIT=1;break;}\r
- if (c=='t') {XMIT=!XMIT; printf("XMIT= %d\n", XMIT); }\r
- else if (c=='s') printf(">IFDMA-TEST STATS: %d received %d xmitted \n", pkt_rx,pkt_tx);\r
- else if (c=='h') printf("> 'q' to quit, 's' for stats, 't' to toggle transmit 'h' for help\n");\r
- }\r
+ if (pthread_create( &thrs[0], NULL, (void*)producer_thread,\r
+ (void *)0 ))\r
+ {\r
+ perror( "pthread_create" );\r
+ exit(1);\r
+ }\r
+ //this thread of execution (main) now just waits on user input\r
+ for(;;)\r
+ {\r
+ printf(">");\r
+ c=getchar();\r
+ if (c=='q') {QUIT=1;break;}\r
+ if (c=='t') {XMIT=!XMIT; printf("XMIT= %d\n", XMIT); }\r
+ else if (c=='s') printf(">IFDMA-TEST STATS: %d received %d xmitted \n", pkt_rx,pkt_tx);\r
+ else if (c=='h') printf("> 'q' to quit, 's' for stats, 't' to toggle transmit 'h' for help\n");\r
+ }\r
\r
- //wait for completion \r
- printf("main task now pending on thread completion\n");\r
- for (i = 0; i < procs; i++)\r
- pthread_join( thrs[i], NULL );\r
+ //wait for completion \r
+ printf("main task now pending on thread completion\n");\r
+ for (i = 0; i < procs; i++)\r
+ pthread_join( thrs[i], NULL );\r
\r
- free( thrs );\r
+ free( thrs );\r
+ \r
}\r
\r
/*************************************************\r
//also close our netcp rx channel\r
netapi_netcpCfgDelMac(netapi_handle,0,&err);\r
netapi_pktioClose(netcp_rx_chan,&err);\r
+netapi_pktioClose(netcp_tx_chan,&err);\r
\r
\r
//done\r
\r
//!finished!\r
}\r
-\r
+static inline void sendit(Ti_Pkt *tip, int len, int out_port)\r
+{\r
+ int err=0;\r
+ PKTIO_METADATA_T meta2 = {PKTIO_META_TX,{0},0};\r
+ nwalTxPktInfo_t meta_tx2={0};\r
+ if (len<60)\r
+ {\r
+ unsigned int templen;\r
+ char * p_pkt;\r
+ len=60;\r
+ Pktlib_getDataBuffer(tip,(uint8_t**)&p_pkt,&templen);//ignore templen\r
+ Cppi_setData (Cppi_DescType_HOST, (Cppi_Desc *) tip, p_pkt,len);\r
+ }\r
+ Pktlib_setPacketLen(tip,len);\r
+ meta_tx2.txFlag1 = NWAL_TX_FLAG1_META_DATA_VALID ; \r
+ meta_tx2.ploadLen = len ;\r
+ meta_tx2.enetPort=out_port;\r
+ meta2.u.tx_meta=&meta_tx2;\r
+ netapi_pktioSend(netcp_tx_chan,tip,&meta2,&err);\r
+}\r
\r
//receive callback for packets from net (for consumer)\r
void recv_cb_net(struct PKTIO_HANDLE_Tag * channel, Ti_Pkt* p_recv[],\r
unsigned long t2;\r
unsigned long t3;\r
unsigned long t4;\r
+pasahoLongInfo_t* protoInfo; \r
+int ifno;\r
+int out_port;\r
\r
t1= netapi_timing_start();\r
for(i=0;i<n_pkts;i++)\r
len = Pktlib_getPacketLen(tip);\r
if (XMIT)\r
{\r
+ protoInfo=nwal_mGetProtoInfo(tip);\r
+ ifno = nwal_mGetRxEmacPort( protoInfo);\r
+ //----------------------------------------------------\r
+ //very trivial bridging -> just output to other port!\r
+ //----------------------------------------------------\r
+ if (ifno ==1) out_port=2; else out_port=1;\r
+\r
t3= netapi_timing_start();\r
- //sendit(tip);\r
+ sendit(tip,len,out_port);\r
pkt_tx+=1;\r
t4= netapi_timing_start();\r
pkt_tx_cycles += (t4-t3);\r