Commit 04dd60d2 authored by Grzegorz Daniluk's avatar Grzegorz Daniluk

smartbits-tester: configure multiple streams per port

parent 8e84ce99
......@@ -345,11 +345,12 @@ int smb_learning(int mask, char mac[][6], int fnum)
char broadcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
//char broadcast[6] = {0x90, 0xe2, 0xba, 0x17, 0xa7, 0xaf};
printf("Learning on ports: 0x%X\n", mask);
//printf("Learning on ports: 0x%X\n", mask);
wait_linkup(mask);
for (i=0; i<SMB_PORTS; ++i) {
if (mask & (1<<i)) {
setup_stream(i, broadcast, mac[i], FRAME_SZ, fnum, 0.001, 0, -1);
setup_stream(i, broadcast, mac[i], FRAME_SZ, fnum, 0.001, 0, -1, 0);
setup_stream(i, broadcast, mac[i], FRAME_SZ, fnum, 0.001, 0, -1, -1);
}
}
run_traffic(mask, 1);
......
......@@ -24,6 +24,7 @@
#define PORT_TO_PMASK(i) (1<<(i))
#define MAX_STREAMS 4
#define FRAME_SZ 60
#define LINKUP_TIMEOUT 10
#define TRAFFIC_START 1
......@@ -46,7 +47,7 @@ void show_card_info(int p);
void show_cntrs(HTCountStructure *cs, int p1);
void latency_meas(int p_tx, int p_rx);
int basic_traffic(int fsize, int p_tx, int p_rx);
int setup_stream(int port, char *dmac, char *smac, int fsize, int fnum, float ratio, int v_pri, int vid);
int setup_stream(int port, char *dmac, char *smac, int fsize, int fnum, float ratio, int v_pri, int vid, int idx);
int temp_run_test(int p_tx, int p_rx);
int detect_stop(void);
......
......@@ -8,35 +8,88 @@
struct smb_test wrst;
const char* TLIST[7] = {"2.1.1", "2.1.2", "2.2.1", "2.2.2", "2.2.5", "2.2.6", "2.2.7"};
void init_wr_test(int num)
void init_wr_test(int test_no, int variant)
{
unsigned int vtag;
wrst.ptx[0].fsize = 64;
wrst.ptx[0].fload = 1;
wrst.ptx[0].fnum = T_2XX_FNUM; //1000;
wrst.ptx[1].fsize = 64;
wrst.ptx[1].fload = 1;
wrst.ptx[1].fnum = T_2XX_FNUM; //1000;
wrst.ptx[2].fsize = 64;
wrst.ptx[2].fload = 1;
wrst.ptx[2].fnum = T_2XX_FNUM; //1000;
wrst.ptx[3].fsize = 64;
wrst.ptx[3].fload = 1;
wrst.ptx[3].fnum = T_2XX_FNUM; //1000;
switch(num) {
unsigned int vtag, i;
/*default values for functional tests*/
for(i=0; i<SMB_PORTS; ++i) {
wrst.ptx[i].fsize = 64;
wrst.ptx[i].fsize_step = 0;
wrst.ptx[i].fsize_stop = 64;
wrst.ptx[i].fsize_n = 0;
wrst.ptx[i].fload[0] = 10;
wrst.ptx[i].fload_n = 1;
wrst.ptx[i].fnum = T_2XX_FNUM;
wrst.ptx[i].ftime = 0;
}
/*loads and sizes for performance tests*/
if (test_no >= TEST_3_1_1) {
for (i=0; i<SMB_PORTS; ++i) {
if (variant == VAR1) {
/* size: 64 - 1522 with step of 1
* loads: 10, 30, 50, 70, 80, 85, 90, 92, 95, 97, 99, 100
* number: 10^9 */
wrst.ptx[i].fsize = 64;
wrst.ptx[i].fsize_step = 1;
wrst.ptx[i].fsize_stop = 1522;
wrst.ptx[i].fsize_n = 0;
wrst.ptx[i].fload[0] = 10;
wrst.ptx[i].fload[1] = 30;
wrst.ptx[i].fload[2] = 50;
wrst.ptx[i].fload[3] = 70;
wrst.ptx[i].fload[4] = 80;
wrst.ptx[i].fload[5] = 85;
wrst.ptx[i].fload[6] = 90;
wrst.ptx[i].fload[7] = 92;
wrst.ptx[i].fload[8] = 95;
wrst.ptx[i].fload[9] = 97;
wrst.ptx[i].fload[10] = 99;
wrst.ptx[i].fload[11] = 100;
wrst.ptx[i].fload_n = 12;
wrst.ptx[i].fnum = 1000000000; //10^9
wrst.ptx[i].ftime = 0;
}
else if (variant == VAR2) {
/* size: 64, 65, 700, 701, 1521, 1522
* loads: 50, 80, 95, 100
* time of burst: 5 min */
wrst.ptx[i].fsize = 0;
wrst.ptx[i].fsize_step = 0;
wrst.ptx[i].fsize_stop = 0;
wrst.ptx[i].fsize_tab[0] = 64;
wrst.ptx[i].fsize_tab[1] = 65;
wrst.ptx[i].fsize_tab[2] = 700;
wrst.ptx[i].fsize_tab[3] = 701;
wrst.ptx[i].fsize_tab[4] = 1521;
wrst.ptx[i].fsize_tab[5] = 1522;
wrst.ptx[i].fsize_n = 6;
wrst.ptx[i].fload[0] = 50;
wrst.ptx[i].fload[1] = 80;
wrst.ptx[i].fload[2] = 95;
wrst.ptx[i].fload[3] = 100;
wrst.ptx[i].fload_n = 4;
wrst.ptx[i].fnum = 0;
wrst.ptx[i].ftime = 5*60; //5 min
}
}
}
switch(test_no) {
case TEST_2_1_1:
/* 2.1.1 Unicast - one-to-one stream */
/* TX: p0->p2; p2 -> p0; 802.1d
* RX_TRIG: p0; p2 -> smac
* RX: p1; p3 */
wrst.ptx[0].d_port = 2;
wrst.ptx[2].d_port = 0;
wrst.ptx[0].d_ports[0] = 2;
wrst.ptx[2].d_ports[0] = 0;
wrst.ptx[0].q_vid = VID_NONE;
wrst.ptx[2].q_vid = VID_NONE;
wrst.ptx[1].d_port = DPORT_NONE;
wrst.ptx[3].d_port = DPORT_NONE;
wrst.ptx[0].d_ports_n = 1;
wrst.ptx[1].d_ports_n = 0;
wrst.ptx[2].d_ports_n = 1;
wrst.ptx[3].d_ports_n = 0;
wrst.prx[0].s_port = 2;
wrst.prx[2].s_port = 0;
......@@ -52,19 +105,35 @@ void init_wr_test(int num)
/* 2.1.2 Unicast - many-to-many stream */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2; 802.1d
* RX_TRIG: p0; p1; p2; p3 */
wrst.ptx[0].d_port = 1;
wrst.ptx[1].d_port = 0;
wrst.ptx[2].d_port = 3;
wrst.ptx[3].d_port = 2;
wrst.ptx[0].d_ports[0] = 1;
wrst.ptx[0].d_ports[1] = 2;
wrst.ptx[0].d_ports[2] = 3;
wrst.ptx[1].d_ports[0] = 0;
wrst.ptx[1].d_ports[1] = 2;
wrst.ptx[1].d_ports[2] = 3;
wrst.ptx[2].d_ports[0] = 0;
wrst.ptx[2].d_ports[1] = 1;
wrst.ptx[2].d_ports[2] = 3;
wrst.ptx[3].d_ports[0] = 0;
wrst.ptx[3].d_ports[1] = 1;
wrst.ptx[3].d_ports[2] = 2;
wrst.ptx[0].d_ports_n = 3;
wrst.ptx[1].d_ports_n = 3;
wrst.ptx[2].d_ports_n = 3;
wrst.ptx[3].d_ports_n = 3;
wrst.ptx[0].q_vid = VID_NONE;
wrst.ptx[1].q_vid = VID_NONE;
wrst.ptx[2].q_vid = VID_NONE;
wrst.ptx[3].q_vid = VID_NONE;
wrst.prx[0].s_port = 1;
wrst.prx[1].s_port = 0;
wrst.prx[2].s_port = 3;
wrst.prx[3].s_port = 2;
wrst.prx[0].s_port = RX_ALLUNI;
wrst.prx[1].s_port = RX_ALLUNI;
wrst.prx[2].s_port = RX_ALLUNI;
wrst.prx[3].s_port = RX_ALLUNI;
break;
case TEST_2_2_1:
......@@ -72,14 +141,16 @@ void init_wr_test(int num)
/* TX: p0->p2; p2->p0; 802.1q
* RX_TRIG: p0; p2 -> smac; vid; prio
* RX: p1; p3 */
wrst.ptx[0].d_port = 2;
wrst.ptx[0].d_ports[0] = 2;
wrst.ptx[2].d_ports[0] = 0;
wrst.ptx[0].q_vid = 1;
wrst.ptx[0].q_pri = 1;
wrst.ptx[2].d_port = 0;
wrst.ptx[2].q_vid = 1;
wrst.ptx[2].q_pri = 1;
wrst.ptx[1].d_port = DPORT_NONE;
wrst.ptx[3].d_port = DPORT_NONE;
wrst.ptx[0].d_ports_n = 1;
wrst.ptx[1].d_ports_n = 0;
wrst.ptx[2].d_ports_n = 1;
wrst.ptx[3].d_ports_n = 0;
wrst.prx[0].s_port = 2;
wrst.prx[2].s_port = 0;
......@@ -99,14 +170,16 @@ void init_wr_test(int num)
/* TX: p0; p2; 802.1q; broadcast
* RX_TRIG: p0; p2 -> smac; vid; prio
* RX: p1; p3 */
wrst.ptx[0].d_port = TX_PALL;
wrst.ptx[0].d_ports[0] = TX_PALL;
wrst.ptx[2].d_ports[0] = TX_PALL;
wrst.ptx[0].q_vid = 1;
wrst.ptx[0].q_pri = 0;
wrst.ptx[2].d_port = TX_PALL;
wrst.ptx[2].q_vid = 1;
wrst.ptx[2].q_pri = 0;
wrst.ptx[1].d_port = DPORT_NONE;
wrst.ptx[3].d_port = DPORT_NONE;
wrst.ptx[0].d_ports_n = 1;
wrst.ptx[1].d_ports_n = 0;
wrst.ptx[2].d_ports_n = 1;
wrst.ptx[3].d_ports_n = 0;
wrst.prx[0].s_port = 2;
wrst.prx[2].s_port = 0;
......@@ -126,12 +199,14 @@ void init_wr_test(int num)
/* TX: p0->p2; p2->p0; 802.1d
* RX_TRIG: p0; p2 -> smac; vid; prio
* RX: p1; p3 */
wrst.ptx[0].d_port = 2;
wrst.ptx[2].d_port = 0;
wrst.ptx[0].d_ports[0] = 2;
wrst.ptx[2].d_ports[0] = 0;
wrst.ptx[0].q_vid = VID_NONE;
wrst.ptx[2].q_vid = VID_NONE;
wrst.ptx[1].d_port = DPORT_NONE;
wrst.ptx[3].d_port = DPORT_NONE;
wrst.ptx[0].d_ports_n = 1;
wrst.ptx[1].d_ports_n = 0;
wrst.ptx[2].d_ports_n = 1;
wrst.ptx[3].d_ports_n = 0;
wrst.prx[0].s_port = 2;
wrst.prx[2].s_port = 0;
......@@ -151,14 +226,16 @@ void init_wr_test(int num)
/* TX: p0->p2; p2->p0; 802.1q
* RX_TRIG: p0; p2 -> smac; ethtype
* RX: p1; p3 */
wrst.ptx[0].d_port = 2;
wrst.ptx[2].d_port = 0;
wrst.ptx[0].d_ports[0] = 2;
wrst.ptx[2].d_ports[0] = 0;
wrst.ptx[0].q_vid = 1;
wrst.ptx[0].q_pri = 0;
wrst.ptx[2].q_vid = 1;
wrst.ptx[2].q_pri = 0;
wrst.ptx[1].d_port = DPORT_NONE;
wrst.ptx[3].d_port = DPORT_NONE;
wrst.ptx[0].d_ports_n = 1;
wrst.ptx[1].d_ports_n = 0;
wrst.ptx[2].d_ports_n = 1;
wrst.ptx[3].d_ports_n = 0;
wrst.prx[0].s_port = 2;
wrst.prx[2].s_port = 0;
......@@ -177,14 +254,18 @@ void init_wr_test(int num)
/* 2.2.7 Snake test */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2
* RX_TRIG: p0; p1; p2; p3 -> smac; ethtype */
wrst.ptx[0].d_port = 1;
wrst.ptx[1].d_port = 0;
wrst.ptx[2].d_port = 3;
wrst.ptx[3].d_port = 2;
wrst.ptx[0].d_ports[0] = 1;
wrst.ptx[1].d_ports[0] = 0;
wrst.ptx[2].d_ports[0] = 3;
wrst.ptx[3].d_ports[0] = 2;
wrst.ptx[0].q_vid = VID_NONE;
wrst.ptx[1].q_vid = VID_NONE;
wrst.ptx[2].q_vid = VID_NONE;
wrst.ptx[3].q_vid = VID_NONE;
wrst.ptx[0].d_ports_n = 1;
wrst.ptx[1].d_ports_n = 1;
wrst.ptx[2].d_ports_n = 1;
wrst.ptx[3].d_ports_n = 1;
wrst.prx[0].s_port = 1;
wrst.prx[1].s_port = 0;
......@@ -200,12 +281,18 @@ void init_wr_test(int num)
memcpy( wrst.prx[2].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[3].trig2_pat, &vtag, 2 );
break;
/***********************************************/
/* PERFORMANCE TESTS */
/***********************************************/
case TEST_3_1_1:
break;
}
}
int run_test( HTCountStructure *cntrs )
{
int i, rx_pmask = 0, tx_pmask = 0;
int i, j, rx_pmask = 0, tx_pmask = 0;
struct smb_port_tx *p_tx = NULL;
struct smb_port_rx *p_rx = NULL;
char mac[SMB_PORTS+1][6] = {{0x3c, 0x47, 0x0e, 0x04, 0x05, 0x06},
......@@ -216,14 +303,26 @@ int run_test( HTCountStructure *cntrs )
reset_ports(SMB_P0 | SMB_P1 | SMB_P2 | SMB_P3);
/* optional learning */
//smb_learning(SMB_PALL, mac, 3);
/* setup required streams */
for (i=0; i<SMB_PORTS; ++i) {
p_tx = &(wrst.ptx[i]);
if (p_tx->d_port != DPORT_NONE) {
//if (p_tx->d_ports_n > 0) {
// tx_pmask |= PORT_TO_PMASK(i);
// setup_stream(i, mac[p_tx->d_ports[0]], mac[i], p_tx->fsize, p_tx->fnum,
// p_tx->fload[0]/100.0, p_tx->q_pri, p_tx->q_vid);
//}
for (j=0; j< p_tx->d_ports_n; ++j) {
setup_stream(i, mac[p_tx->d_ports[j]], mac[i], p_tx->fsize, p_tx->fnum,
p_tx->fload[0]/100.0/p_tx->d_ports_n, p_tx->q_pri, p_tx->q_vid, j);
}
if(p_tx->d_ports_n>0) {
tx_pmask |= PORT_TO_PMASK(i);
setup_stream(i, mac[p_tx->d_port], mac[i], p_tx->fsize, p_tx->fnum,
p_tx->fload/100.0, p_tx->q_pri, p_tx->q_vid);
setup_stream(i, mac[p_tx->d_ports[j]], mac[i], p_tx->fsize, p_tx->fnum,
p_tx->fload[0]/100.0/p_tx->d_ports_n, p_tx->q_pri, p_tx->q_vid, -1);
}
}
......@@ -231,8 +330,10 @@ int run_test( HTCountStructure *cntrs )
for (i=0; i<SMB_PORTS; ++i) {
p_rx = &(wrst.prx[i]);
/* TRIG1 - SMAC */
if (p_rx->s_port != RX_PALL)
/* TRIG1 - SMAC or DMAC */
if (p_rx->s_port == RX_ALLUNI)
smb_set_trigger( mac[i], i, 0, 6, HTTRIGGER_1 );
else if (p_rx->s_port != RX_PALL)
smb_set_trigger( mac[p_rx->s_port], i, 6, 6, HTTRIGGER_1 );
/* TRIG2 - Ethtype */
if (p_rx->trig2_len > 0)
......@@ -263,6 +364,8 @@ int run_test( HTCountStructure *cntrs )
int anl_result( HTCountStructure *cntrs, int testno)
{
int req_num;
switch (testno) {
case TEST_2_1_1:
/* All frames sent from p0 received on p2
......@@ -280,6 +383,22 @@ int anl_result( HTCountStructure *cntrs, int testno)
break;
case TEST_2_1_2:
req_num = (SMB_PORTS-1)*T_2XX_FNUM;
/* Each of the ports got frames addressed to it from all other ports
* Limited number of frames addressed to other ports may be received due to learning */
if ( (cntrs[0].TmtPkt == req_num && cntrs[0].RcvTrig == req_num && cntrs[0].RcvPkt <= req_num + T_2XX_UNRECOG_THR) &&
(cntrs[1].TmtPkt == req_num && cntrs[1].RcvTrig == req_num && cntrs[1].RcvPkt <= req_num + T_2XX_UNRECOG_THR) &&
(cntrs[2].TmtPkt == req_num && cntrs[2].RcvTrig == req_num && cntrs[2].RcvPkt <= req_num + T_2XX_UNRECOG_THR) &&
(cntrs[3].TmtPkt == req_num && cntrs[3].RcvTrig == req_num && cntrs[3].RcvPkt <= req_num + T_2XX_UNRECOG_THR) )
return TEST_PASSED;
if ( (cntrs[0].TmtPkt == req_num && cntrs[0].RcvTrig == req_num) &&
(cntrs[1].TmtPkt == req_num && cntrs[1].RcvTrig == req_num) &&
(cntrs[2].TmtPkt == req_num && cntrs[2].RcvTrig == req_num) &&
(cntrs[3].TmtPkt == req_num && cntrs[3].RcvTrig == req_num) )
return TEST_WARNING;
break;
case TEST_2_2_7:
/* All frames sent from p0 received on p1
* All frames sent from p1 received on p0
......
......@@ -4,6 +4,7 @@
#include "et1000.h"
#include "smartbits.h"
/* functional tests */
#define TEST_2_1_1 0
#define TEST_2_1_2 1
#define TEST_2_2_1 2
......@@ -11,13 +12,18 @@
#define TEST_2_2_5 4
#define TEST_2_2_6 5
#define TEST_2_2_7 6
/* performance tests */
#define VAR1 0
#define VAR2 1
#define TEST_3_1_1 7
extern const char* TLIST[7];
#define DPORT_NONE 0xFE
//#define DPORT_NONE 0xFE
#define TX_PALL 0x4
#define VID_NONE -1
#define RX_PALL 0xFF
#define RX_ALLUNI 0xFE
#define VLAN_TAG(vid,prio) ((0x8100 << 16) | (prio<<13) | (vid))
#define NOVLAN_TAG 0x0800
......@@ -30,13 +36,23 @@ extern const char* TLIST[7];
#define T_2XX_FNUM 1000
#define T_2XX_UNRECOG_THR 10
#define FLOAD_MAXTAB 12
#define FSIZE_MAXTAB 6
struct smb_port_tx {
int d_port; //SMB destination port index [0..3]; 0xff for broadcast
int d_ports[SMB_PORTS]; //SMB destination port index [0..3]; 0xff for broadcast
int d_ports_n;
int q_vid; //VLAN ID, if 802.1d, make it -1
int q_pri; //priority, if 802.1d, make it -1
int fsize; //size of transmitted frames
int fload; //traffic load [1..100]%
int fsize_step;
int fsize_stop;
int fsize_tab[FSIZE_MAXTAB];
int fsize_n;
int fload[FLOAD_MAXTAB]; //traffic load [1..100]%
int fload_n;
int fnum; //amount of frames sent in a single burst
int ftime; //length of burst in seconds
};
struct smb_port_rx {
......
......@@ -57,6 +57,7 @@ int main()
}
for(test_no=0; test_no<6; ++test_no) {
//for(test_no=TEST_2_2_1; test_no<TEST_2_2_1+1; ++test_no) {
//test_no = TEST_2_2_2;
printf("\n\n------ TEST %s ------\n", TLIST[test_no]);
fprintf(logfile, "\n\n------ TEST %s ------\n", TLIST[test_no]);
......@@ -84,6 +85,7 @@ int main()
++t_fail;
show_allcntrs(logfile, SMB_PALL, cntrs);
}
show_allcntrs(stdout, SMB_PALL, cntrs);
NSDelay(5);
}
......@@ -318,95 +320,103 @@ int basic_traffic(int fsize, int p_tx, int p_rx)
}
int setup_stream(int port, char *dmac, char *smac, int fsize, int fnum, float ratio, int v_pri, int vid)
int setup_stream(int port, char *dmac, char *smac, int fsize, int fnum, float ratio, int v_pri, int vid, int idx)
{
StreamIP str;
StreamIPVLAN strv;
static StreamIP str[MAX_STREAMS];
static int n_streams = 0;
static StreamIPVLAN strv[MAX_STREAMS];
NSPortTransmit tx_mode;
L3StreamExtension l3_ext;
static L3StreamExtension l3_ext[MAX_STREAMS];
unsigned long eth_speed;
char dip[4] = {192, 168, 1, 1};
char sip[4] = {192, 168, 1, 3};
/* procedure according to page 332 of SmartLibrary Overview */
//printf("stream: port %d, dmac %02x:%02x:%02x:%02x:%02x:%02x, smac %02x:%02x:%02x:%02x:%02x:%02x, size %d, fnum %d, ratio %f, pri %d, vid %d, idx %d\n",
// port, dmac[0]&0xff, dmac[1]&0xff, dmac[2]&0xff, dmac[3]&0xff, dmac[4]&0xff, dmac[5]&0xff,
// smac[0]&0xff, smac[1]&0xff, smac[2]&0xff, smac[3]&0xff, smac[4]&0xff, smac[5]&0xff, fsize, fnum, ratio, v_pri, vid, idx);
//6
if (vid < 0 ) {
if (vid < 0 && idx >=0 ) {
//////// no VLAN ///////////
bzero(&str, sizeof(StreamIP));
str.ucActive = 1;
str.ucProtocolType = STREAM_PROTOCOL_IP;
str.uiFrameLength = fsize;
str.ucTagField = 1;
memcpy(str.DestinationMAC, dmac, 6);
memcpy(str.SourceMAC, smac, 6);
str.TimeToLive = 255;
str.InitialSequenceNumber = 0;
bzero(str.DestinationIP, 4);
bzero(str.SourceIP, 4);
memcpy(str.DestinationIP, dip, 4);
memcpy(str.SourceIP, sip, 4);
str.Protocol = 4;
//IP Stream
bzero(&str[idx], sizeof(StreamIP));
str[idx].ucActive = 1;
str[idx].ucProtocolType = STREAM_PROTOCOL_IP;
str[idx].uiFrameLength = fsize;
str[idx].ucTagField = 1;
memcpy(str[idx].DestinationMAC, dmac, 6);
memcpy(str[idx].SourceMAC, smac, 6);
str[idx].TimeToLive = 255;
str[idx].InitialSequenceNumber = 0;
bzero(str[idx].DestinationIP, 4);
bzero(str[idx].SourceIP, 4);
memcpy(str[idx].DestinationIP, dip, 4);
memcpy(str[idx].SourceIP, sip, 4);
str[idx].Protocol = 4;
//str.uiActualSequenceNumber = 0xcafe;
CHECKERROR( HTSetStructure(L3_DEFINE_IP_STREAM, 0, 0, 0, &str, sizeof(StreamIP), HUB, SLOT, port) );
} else {
n_streams++;
}
else if (vid >= 0 && idx >= 0) {
//////// VLANs ///////////
bzero(&strv, sizeof(StreamIP));
strv.ucActive = 1;
strv.ucProtocolType = STREAM_PROTOCOL_IP_VLAN;
strv.uiFrameLength = fsize;
strv.ucTagField = 0;
memcpy(strv.DestinationMAC, dmac, 6);
memcpy(strv.SourceMAC, smac, 6);
strv.TimeToLive = 255;
strv.InitialSequenceNumber = 0;
bzero(strv.DestinationIP, 4);
bzero(strv.SourceIP, 4);
bzero(strv.Netmask, 4);
memcpy(strv.DestinationIP, dip, 4);
memcpy(strv.SourceIP, sip, 4);
bzero(strv.Gateway, 4);
strv.Protocol = 4;
strv.VLAN_Pri = v_pri;
strv.VLAN_Cfi = VLAN_CFI_RIF_ABSENT;
strv.VLAN_Vid = vid;
CHECKERROR( HTSetStructure(L3_DEFINE_IP_STREAM_VLAN, 0, 0, 0, &strv, sizeof(StreamIPVLAN), HUB, SLOT, port) );
bzero(&strv[idx], sizeof(StreamIP));
strv[idx].ucActive = 1;
strv[idx].ucProtocolType = STREAM_PROTOCOL_IP_VLAN;
strv[idx].uiFrameLength = fsize;
strv[idx].ucTagField = 0;
memcpy(strv[idx].DestinationMAC, dmac, 6);
memcpy(strv[idx].SourceMAC, smac, 6);
strv[idx].TimeToLive = 255;
strv[idx].InitialSequenceNumber = 0;
bzero(strv[idx].DestinationIP, 4);
bzero(strv[idx].SourceIP, 4);
bzero(strv[idx].Netmask, 4);
memcpy(strv[idx].DestinationIP, dip, 4);
memcpy(strv[idx].SourceIP, sip, 4);
bzero(strv[idx].Gateway, 4);
strv[idx].Protocol = 4;
strv[idx].VLAN_Pri = v_pri;
strv[idx].VLAN_Cfi = VLAN_CFI_RIF_ABSENT;
strv[idx].VLAN_Vid = vid;
n_streams++;
}
else if(vid<0 && idx == -1) {
CHECKERROR( HTSetStructure(L3_DEFINE_IP_STREAM, 0, 0, 0, str, n_streams*sizeof(StreamIP), HUB, SLOT, port) );
}
else if(vid>=0 && idx == -1)
CHECKERROR( HTSetStructure(L3_DEFINE_IP_STREAM_VLAN, 0, 0, 0, strv, n_streams*sizeof(StreamIPVLAN), HUB, SLOT, port) );
//7
//CHECKERROR( HTScheduleMode(SCHEDULE_MODE_FRAME_RATE, HUB, SLOT, p_tx) );
//CHECKERROR( HTTransmitMode(SINGLE_BURST_MODE, HUB, SLOT, p_tx) );
//CHECKERROR( HTBurstCount(1000, HUB, SLOT, p_tx) );
bzero(&tx_mode, sizeof(NSPortTransmit));
if (fnum > 0) {
tx_mode.ulBurstCount = fnum;
tx_mode.ucTransmitMode = SINGLE_BURST_MODE;
} else {
tx_mode.ulBurstCount = 0;
tx_mode.ucTransmitMode = CONTINUOUS_PACKET_MODE;
}
tx_mode.ucScheduleMode = SCHEDULE_MODE_FRAME_RATE;
tx_mode.ucRandomGapEnable = 0;
CHECKERROR( HTSetStructure(NS_PORT_TRANSMIT, 0, 0, 0, &tx_mode, sizeof(NSPortTransmit), HUB, SLOT, port) );
// Stream EXT
//printf("Calculated %lu frames/sec for %f ratio\n", ratio_to_fps(fsize, ratio), ratio);
bzero(&l3_ext, sizeof(L3StreamExtension));
l3_ext.ulFrameRate = ratio_to_fps(fsize, ratio);
if (fnum > 0) {
l3_ext.ulBurstCount = 1000;
l3_ext.ulTxMode = L3_SINGLE_BURST_MODE;
} else {
l3_ext.ulBurstCount = 0;
l3_ext.ulTxMode = L3_CONTINUOUS_MODE;
if (idx >= 0) {
bzero(&l3_ext[idx], sizeof(L3StreamExtension));
l3_ext[idx].ulFrameRate = ratio_to_fps(fsize, ratio);
l3_ext[idx].ulBurstCount = fnum;
l3_ext[idx].uiInitialSeqNumber = 0;
l3_ext[idx].ucIPHeaderChecksumError = 0;
if (fnum > 0)
l3_ext[idx].ulTxMode = L3_SINGLE_BURST_MODE;
else
l3_ext[idx].ulTxMode = L3_CONTINUOUS_MODE;
}
else {
//printf("define L3 EXT for %d streams\n", n_streams);
CHECKERROR( HTSetStructure(L3_DEFINE_STREAM_EXTENSION, 0, 0, 0,
l3_ext, n_streams*sizeof(L3StreamExtension), HUB, SLOT, port) );
bzero(&tx_mode, sizeof(NSPortTransmit));
tx_mode.ulBurstCount = n_streams*fnum;
tx_mode.ucScheduleMode = SCHEDULE_MODE_FRAME_RATE;
tx_mode.ucRandomGapEnable = 0;
if (fnum > 0)
tx_mode.ucTransmitMode = SINGLE_BURST_MODE;
else
tx_mode.ucTransmitMode = CONTINUOUS_PACKET_MODE;
CHECKERROR( HTSetStructure(NS_PORT_TRANSMIT, 0, 0, 0, &tx_mode, sizeof(NSPortTransmit), HUB, SLOT, port) );
n_streams = 0;
}
l3_ext.uiInitialSeqNumber = 0;
l3_ext.ucIPHeaderChecksumError = 0;
CHECKERROR( HTSetStructure(L3_DEFINE_STREAM_EXTENSION, 0, 0, 0, &l3_ext, sizeof(L3StreamExtension), HUB, SLOT, port) );
//8
//eth_speed = SPEED_1GHZ;
//CHECKERROR( HTSetStructure(ETH_SET_SPEED, 0, 0, 0, &eth_speed, sizeof(unsigned long), HUB, SLOT, p_tx) );
//CHECKERROR( HTSetStructure(ETH_SET_SPEED, 0, 0, 0, &eth_speed, sizeof(unsigned long), HUB, SLOT, p_rx) ); //do I need that?
return 0;
}
......@@ -425,8 +435,8 @@ int temp_run_test(int p_tx, int p_rx)
//smb_learning(SMB_P0 | SMB_P1 | SMB_P2 | SMB_P3, mac, 3);
setup_stream(p_tx, mac[1], mac[0], FRAME_SZ, 1000, 0.1, 5, -1);
setup_stream(p_rx, mac[0], mac[1], FRAME_SZ, 1234, 0.1, 5, -1);
setup_stream(p_tx, mac[1], mac[0], FRAME_SZ, 1000, 0.1, 5, -1, 0);
setup_stream(p_rx, mac[0], mac[1], FRAME_SZ, 1234, 0.1, 5, -1, 0);
//wait_linkup(SMB_P0 | SMB_P1);
smb_set_trigger(mac[0], p_rx, 6, 6, HTTRIGGER_1);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment