Commit 8823a213 authored by Grzegorz Daniluk's avatar Grzegorz Daniluk

Merge branch 'greg-smbits'

parents 4df5984d 758dd0a1
CC = gcc
NAME = wrs_smb
CFLAGS = -I ../../smartlib/include
LDFLAGS = -L ../../smartlib/lib
LIB = ../../smartlib/lib/libetsmb.so
OBJ = wrs_smb.o smartbits.o tests_body.o switch_config.o
all: $(OBJ)
$(CC) $(LDFLAGS) -o $(NAME) $^ $(LIB)
%.o : %.c
$(CC) -c $(CFLAGS) $^
clean:
rm -rf *.o wrs_smb
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include "et1000.h"
#include "smartbits.h"
#include "tests_body.h"
extern int force_stop;
/**********************************************************************/
/**********************************************************************/
/* linkToSmartBits
Checks state of link to SmartBits chassis. If it exists we skip over
the rest of the procedure. If it does not exist (the return value of
ETGetLinkStatus is less than 1) the user is prompted for the IP address of
the chassis.
The status of the ETSocketLink command is tested and if there is an error
(status is negative), an error message is displayed.
*/
void linkToSmartBits()
{
char ipaddr[16] = IPADR;
// ETGetLinkStatus will be positive if we're linked
int iRetVal = ETGetLinkStatus();
// If return was negative we're not linked. Prompt for IP and link
if (iRetVal < 1)
{
printf("\nConnecting to SmartBits chassis...\n");
iRetVal = NSSocketLink(ipaddr,16385,RESERVE_NONE);
// Return Value is negative if link did not succeed. Display message and exit
if ( iRetVal < 0)
{
printf("ERROR: %d\n", iRetVal);
printf(" Could not link to chassis at IP address %s\n", ipaddr);
exit(-1);
}
}
}
/**********************************************************************/
/* setTrigger
Sets a trigger to match the base source MAC address. Since we have a
cycle count of five on the VFD1 we are triggering on, our trigger will fire
every fifth packet
*/
void setTrigger(int h1, int s1, int p1)
{
HTTriggerStructure MyTrigger;
// start 48 bits after preamble (SOURCE MAC)
MyTrigger.Offset = 48;
// trigger pattern is 6 bytes long
MyTrigger.Range = 6;
// data to match is 66 55 44 33 22 11
MyTrigger.Pattern[0] = 0x11;
MyTrigger.Pattern[1] = 0x22;
MyTrigger.Pattern[2] = 0x33;
MyTrigger.Pattern[3] = 0x44;
MyTrigger.Pattern[4] = 0x55;
MyTrigger.Pattern[5] = 0x66;
// send config to card
CHECKERROR(HTTrigger(HTTRIGGER_1,HTTRIGGER_ON,&MyTrigger,h1,s1,p1));
}
/**********************************************************************/
/* clearCounters
zero out the counters on the target Hub Slot Port
*/
void clearCounters(int h1, int s1, int p1)
{
CHECKERROR(HTClearPort(h1, s1, p1));
}
/**********************************************************************/
void show_cntrs(HTCountStructure *cs, int p1)
{
HTCountStructure cs_local;
if (cs == NULL) {
cs = &cs_local;
CHECKERROR(HTGetCounters(cs, HUB, SLOT, p1));
}
printf("=========================================\n");
printf("Counter Data Card %d PORT %d\n", (SLOT + 1), p1);
printf("=========================================\n");
printf("\t Transmitted Pkts %lu\n", cs->TmtPkt);
printf("\t Received Pkts %lu\n", cs->RcvPkt);
printf("\t Collisions %lu\n", cs->Collision);
printf("\t Received Triggers %lu\n", cs->RcvTrig);
printf("\t CRC Errors %lu\n", cs->CRC);
printf("\t Alignment Errors %lu\n", cs->Align);
printf("\t Oversize Pkts %lu\n", cs->Oversize);
printf("\t Undersize Pkts %lu\n", cs->Undersize);
printf("\t Mbit/s %lu\n", cs->RcvByteRate *8 /1000000L);
printf("=========================================\n");
}
/**********************************************************************/
int get_allcntrs(int mask, HTCountStructure *cntrs)
{
int i, ret = 0;
for(i=0; i<SMB_PORTS; ++i) {
if (mask & PORT_TO_PMASK(i))
ret |= HTGetCounters(cntrs+i, HUB, SLOT, i);
}
if(ret) {
fprintf(stderr, "Could not read SMB counters\n");
return -1;
}
return 0;
}
int show_allcntrs(FILE *f, int mask, HTCountStructure *cntrs)
{
HTCountStructure cs[SMB_PORTS];
int i, ret = 0;
if (cntrs == NULL) {
cntrs = cs;
ret = get_allcntrs(mask, cntrs);
}
if (!f) f = stdout;
if(ret) {
fprintf(stderr, "Could not read SMB counters\n");
return -1;
}
fprintf(f, "=====================================================================\
====================================================================\n");
fprintf(f, "| Port \t| Tframe \t| Rframe \t| Collis \t| Rtrig \t| CRCerr \t| Oversz \t| Undersz \t| Mbit/s \t|\n");
fprintf(f, "=====================================================================\
====================================================================\n");
for(i = 0; i<SMB_PORTS; ++i) {
if (mask & (1<<i) )
fprintf(f, "| %u \t| %10lu \t| %10lu \t| %10lu \t| %10lu \t| %10lu \t| %10lu \t| %10lu \t| %10lu \t|\n",
i, cntrs[i].TmtPkt, cntrs[i].RcvPkt, cntrs[i].Collision, cntrs[i].RcvTrig, cntrs[i].CRC,
cntrs[i].Oversize, cntrs[i].Undersize, cntrs[i].RcvByteRate*8/1000000L);
}
return 0;
}
int clear_allcntrs(int mask)
{
int i, ret = 0;
for(i=0; i<SMB_PORTS; ++i) {
if (mask & (1<<i))
ret |= HTClearPort(HUB, SLOT, i);
}
return ret;
}
/**********************************************************************/
int show_floss(FILE *f, HTCountStructure *cntrs, unsigned long *total)
{
int i;
float loss[SMB_PORTS];
fprintf(f, "===========================\n");
fprintf(f, "| Port \t| Loss rate \t|\n");
fprintf(f, "===========================\n");
for(i=0; i<SMB_PORTS; ++i) {
if(total[i]!=0)
loss[i] = (total[i]-cntrs[i].RcvTrig)*100.0/total[i];
else
loss[i] = 0;
fprintf(f, "| %d \t| %f \t|\n", i, loss[i]);
}
}
/**********************************************************************/
int set_port_config(int p)
{
NSPhyConfig phycfg;
GIGAutoFiberNegotiate autoneg;
bzero(&phycfg, sizeof(NSPhyConfig));
#if FIBER
phycfg.ucActiveMedia = FIBER_MODE;
#else
phycfg.ucActiveMedia = COPPER_MODE;
#endif
if (HTSetStructure(NS_PHY_CONFIG, 0, 0, 0, &phycfg, sizeof(NSPhyConfig),
HUB, SLOT, p) < 0)
return -1;
//else
// printf("Port %d configuration set\n", p);
#if FIBER
bzero(&autoneg, sizeof(GIGAutoFiberNegotiate));
autoneg.ucMode = 1;
//autoneg.ucRestart = 1;
CHECKERROR( HTSetStructure(GIG_STRUC_AUTO_FIBER_NEGOTIATE, 0, 0, 0, &autoneg,
sizeof(GIGAutoFiberNegotiate), HUB, SLOT, p));
//printf("Autoneg set for port %d\n", p);
HTResetPort(RESET_PARTIAL, HUB, SLOT, p);
//bzero(&phycfg, sizeof(NSPhyConfig));
//phycfg.ucActiveMedia = COPPER_MODE;
//HTSetStructure(NS_PHY_CONFIG, 0, 0, 0, &phycfg, sizeof(NSPhyConfig), HUB, SLOT, p);
//NSDelay(2);
//bzero(&phycfg, sizeof(NSPhyConfig));
//phycfg.ucActiveMedia = FIBER_MODE;
//HTSetStructure(NS_PHY_CONFIG, 0, 0, 0, &phycfg, sizeof(NSPhyConfig), HUB, SLOT, p);
//NSDelay(2);
//bzero(&autoneg, sizeof(GIGAutoFiberNegotiate));
//autoneg.ucMode = 1;
//autoneg.ucRestart = 1;
//CHECKERROR( HTSetStructure(GIG_STRUC_AUTO_FIBER_NEGOTIATE, 0, 0, 0, &autoneg,
// sizeof(GIGAutoFiberNegotiate), HUB, SLOT, p));
//NSDelay(5);
//HTSetStructure(NS_PHY_CONFIG, 0, 0, 0, &phycfg, sizeof(NSPhyConfig), HUB, SLOT, p);
//NSDelay(2);
//printf("test1\n"); fflush(stdout);
//HTResetPort(RESET_FULL, HUB, SLOT, p);
//printf("test2\n"); fflush(stdout);
//NSDelay(2);
//bzero(&phycfg, sizeof(NSPhyConfig));
//phycfg.ucActiveMedia = FIBER_MODE;
//HTSetStructure(NS_PHY_CONFIG, 0, 0, 0, &phycfg, sizeof(NSPhyConfig), HUB, SLOT, p);
//printf("test3\n"); fflush(stdout);
//NSDelay(2);
#endif
return 0;
}
/**********************************************************************/
void show_card_info(int p)
{
GIGCardInfo ci;
NSPhyConfig phycfg;
CHECKERROR(HTGetStructure(GIG_STRUC_CARD_INFO, 0, 0, 0, &ci, sizeof(GIGCardInfo), HUB, SLOT, p));
CHECKERROR(HTGetStructure(NS_PHY_CONFIG_INFO, 0, 0, 0, &phycfg, sizeof(NSPhyConfig), HUB, SLOT, p));
//printf("Configuration: %x\n", ci.uiLinkConfiguration);
printf("ActiveMedia: %d\n", phycfg.ucActiveMedia);
//phycfg.ucActiveMedia = FIBER_MODE;
}
int detect_stop(void)
{
fd_set fds;
struct timeval tv;
int ret;
FD_ZERO(&fds);
FD_SET(0, &fds);
tv.tv_sec = 0;
tv.tv_usec = 500000;
ret = select(1, &fds, NULL, NULL, &tv);
if(ret > 0 && getchar() == 'q') force_stop = 1;
return ret;
}
long ratio_to_fps(int frame_size, float ratio)
{
long max_fps = 1000000000L / (frame_size+24) / 8;
//printf("max fps: %lu\n", max_fps);
return max_fps*ratio;
}
long ratio_to_gap(int frame_size, float ratio)
{
long fps = ratio_to_fps(frame_size, ratio);
return (1000000000L - (frame_size+12)*8*fps)/fps;
}
int reset_ports(int mask)
{
int i, ret = 0;
for (i=0; i<SMB_PORTS; ++i) {
if(mask & (1<<i)) {
//requested port reset
ret = HTResetPort(RESET_FULL, HUB, SLOT, i);
ret |= HTClearPort(HUB, SLOT, i);
ret |= set_port_config(i);
if (ret) {
fprintf(stderr, "Could not reset & configure port %d\n", i);
return ret;
}
}
}
return 0;
}
int run_traffic(int mask, int start)
{
int i, ret;
//for (i=0; i<SMB_PORTS; ++i) {
// if (mask & (1<<i)) {
// if (start)
// ret = HTRun(HTRUN, HUB, SLOT, i);
// else
// ret = HTRun(HTSTOP, HUB, SLOT, i);
// if (ret) {
// fprintf(stderr, "Could not %s transmission on port %d\n", start?"start":"stop", i);
// return ret;
// }
// }
//}
HGSetGroup(NULL);
for (i=0; i<SMB_PORTS; ++i) {
if (mask & (1<<i))
HGAddtoGroup(HUB, SLOT, i);
}
if(start) ret = HGStart();
else ret = HGStop();
if (ret) {
fprintf(stderr, "Could not %s transmission on ports %x\n", start?"start":"stop", mask);
return ret;
}
return 0;
}
int wait_linkup(int mask)
{
int i, led, tout;
for(i=0; i<SMB_PORTS; ++i) {
if (mask & (1<<i)) {
tout = LINKUP_TIMEOUT;
do {
NSDelay(1);
led = HTGetLEDs(HUB, SLOT, i);
--tout;
} while( !(led & HTLED_LINKED) && tout );
//printf("Port %d LED: 0x%X\n", i, led);
if (!tout) {
printf("Port %d is still down...\n", i);
return -1;
}
}
}
return 0;
}
/* sends fnum frames from each masked port
* dmac ff:ff:ff:ff:ff:ff
* smac mac[n] */
int smb_learning(int mask, char mac[][6], int fnum)
{
int i;
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);
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, 0);
setup_stream(i, broadcast, mac[i], FRAME_SZ, fnum, 0.001, 0, -1, -1);
}
}
run_traffic(mask, 1);
return 0;
}
int smb_set_trigger(char *pat, int port, int offset, int range, int trigno)
{
HTTriggerStructure trig;
int i;
bzero(&trig, sizeof(HTTriggerStructure));
trig.Offset = offset*8;
trig.Range = range;
for(i=0; i<range; ++i) {
if (trigno == HTTRIGGER_1)
trig.Pattern[i] = pat[5-i];
else
trig.Pattern[i] = pat[i];
}
//printf("port: %d, offset: %d, range: %d, %02X:%02X:%02X:%02X:%02X:%02X, %02X:%02X:%02X:%02X:%02X:%02X\n", port, trig.Offset, trig.Range,
// pat[0]&0xff, pat[1]&0xff, pat[2]&0xff, pat[3]&0xff, pat[4]&0xff, pat[5]&0xff,
// trig.Pattern[0]&0xff, trig.Pattern[1]&0xff, trig.Pattern[2]&0xff,
// trig.Pattern[3]&0xff, trig.Pattern[4]&0xff, trig.Pattern[5]&0xff);
if (trigno == HTTRIGGER_1)
return( HTTrigger(trigno, HTTRIGGER_ON, &trig, HUB, SLOT, port) );
else
/* TRIGGER 2 (ethtype) when TRIG1 (SMAC) met */
return( HTTrigger(trigno, HTTRIGGER_DEPENDENT, &trig, HUB, SLOT, port) );
}
/***************************************************/
int wait_test_done(int mask, int sec)
{
int i, run = 1;
HTCountStructure cntrs[SMB_PORTS];
if (sec>0) {
/* continous stream, wait for a given time */
sleep(sec);
return 0;
}
/* wait untill all frames on all required ports sent */
while(run) {
get_allcntrs(mask, cntrs);
run = 0;
for(i=0; i<SMB_PORTS; ++i) {
if ((mask & PORT_TO_PMASK(i)) && cntrs[i].TmtPktRate != 0)
run = 1;
}
}
return 0;
}
/***************************************************/
int exp_rx_frames(struct smb_test *wrst, HTCountStructure *cntrs, unsigned long *exp)
{
int i_port, idp, j;
struct smb_port_tx *p_tx;
/* clear exp[] */
for(i_port=0; i_port<SMB_PORTS; ++i_port)
exp[i_port] = 0;
for(i_port=0; i_port<SMB_PORTS; ++i_port) {
/* take TX port */
p_tx = &(wrst->ptx[i_port]);
/* iterate through DST portx of TX port */
for(idp=0; idp < p_tx->d_ports_n; ++idp) {
if(p_tx->d_ports[idp] < SMB_PORTS && wrst->ftime == 0) {
/* first check if DST port is not broadcast */
/* increment appropriate port */
exp[ p_tx->d_ports[idp] ] += p_tx->fnum;
}
else if(p_tx->d_ports[idp] < SMB_PORTS && wrst->ftime > 0) {
/* still unicast, but now TX time was given instead of fnum */
/* all streams from one port have the same load */
exp[ p_tx->d_ports[idp] ] += cntrs[i_port].TmtPkt/p_tx->d_ports_n;
/* now check if at the end of the stream run, one more frame wasn't sent
* to analyzed port */
if( cntrs[i_port].TmtPkt % p_tx->d_ports_n > idp )
exp[ p_tx->d_ports[idp] ]++;
}
else if(p_tx->d_ports[idp] == TX_PALL){
/* broadcast - increment all but TX port port */
for(j=0; j<SMB_PORTS; ++j)
if(j != i_port)
exp[j] + cntrs[i_port].TmtPkt;
}
}
}
return 0;
}
#ifndef __SMARTBITS_H__
#define __SMARTBITS_H__
#define HUB 0
#define SLOT 7
#define IPADR "10.11.34.101"
//#define IPADR "127.0.0.1"
#define FIBER 1
#define BANK 0
//FIBER 0 BANK 0 -> regular ETH switch
//FIBER 1 BANK 0 -> WR switch
//FIBER 0 BANK 1 -> PCBE13137
//FIBER 1 BANK 1 -> loopback
/****** SmartBits device ******/
#define SMB_PORTS 4
#define SMB_P0 0x01
#define SMB_P1 0x02
#define SMB_P2 0x04
#define SMB_P3 0x08
#define SMB_PALL (SMB_P0 | SMB_P1 | SMB_P2 | SMB_P3)
#define PORT_TO_PMASK(i) (1<<(i))
#define MAX_STREAMS 4
#define FRAME_SZ 60
#define LINKUP_TIMEOUT 10
#define TRAFFIC_START 1
#define TRAFFIC_STOP 0
// macro CHECKERROR:
// in case of error displays the function name and the status
#define CHECKERROR(givenfunction) \
{\
int _____ireturncode = (givenfunction); \
if( _____ireturncode < 0 ) \
fprintf(stderr, "\n%s = %d\n", #givenfunction, _____ireturncode); \
}
struct smb_test;
void linkToSmartBits();
void setTrigger(int h1, int s1, int p1);
void clearCounters(int h1, int s1, int p1);
int set_port_config(int p);
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 idx);
int temp_run_test(int p_tx, int p_rx);
int detect_stop(void);
long ratio_to_fps(int frame_size, float ratio);
long ratio_to_gap(int frame_size, float ratio);
int get_allcntrs(int mask, HTCountStructure *cntrs);
int show_allcntrs(FILE *f, int mask, HTCountStructure *cntrs);
int clear_allcntrs(int mask);
int show_floss(FILE *f, HTCountStructure *cntrs, unsigned long *total);
int reset_ports(int mask);
int run_traffic(int mask, int start);
int smb_learning(int mask, char [][6], int fnum);
int wait_linkup(int mask);
int smb_set_trigger(char *pat, int port, int offset, int range, int trigno);
int wait_test_done(int mask, int sec);
int exp_rx_frames(struct smb_test *wrst, HTCountStructure *cntrs, unsigned long *exp);
#endif
#include <stdio.h>
#include <stdlib.h>
#include "switch_config.h"
int wrs_config(char *ip, int testno)
{
char cmd[100];
int list[16] = {211, 212, 221, 222, 225, 226, 227, 311, 312, 313, 314, 315, 321, 322, 331, 332};
sprintf(cmd, "ssh -p %d root@%s %s %d >/dev/null 2>&1", WRS_PORT, ip, WRS_CONF_SCRIPT, list[testno]);
return system(cmd);
}
#ifndef __SWITCH_CONFIG_H__
#define __SWITCH_CONFIG_H__
#define WRS_PORT 2223
#define WRS_CONF_SCRIPT "/root/wrs_vlan_config.sh"
int wrs_config(char *ip, int testno);
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "tests_body.h"
/**********************************************************************/
/************************ TEST SCENARIOS ******************************/
struct smb_test wrst;
const char* TLIST[16] = {"2.1.1", "2.1.2", "2.2.1", "2.2.2", "2.2.5", "2.2.6",
"2.2.7", "3.1.1", "3.1.2", "3.1.3", "3.1.4", "3.1.5",
"3.2.1", "3.2.2", "3.3.1", "3.3.2"};
void init_wr_test(int test_no, int variant)
{
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_start= 64;
wrst.ptx[i].fsize_step = 64;
wrst.ptx[i].fsize_stop = 64;
wrst.ptx[i].fsize_n = 0;
wrst.ptx[i].fload_tab[0] = 10;
wrst.ptx[i].fload_n = 1;
wrst.ptx[i].fnum = T_2XX_FNUM;
}
wrst.test_type = TEST_FUNCTIONAL;
wrst.permute = 0;
wrst.force_prst = 0;
/*loads and sizes for performance tests*/
if (test_no >= TEST_3_1_1 && test_no != TEST_3_2_2 && variant == VAR1) {
wrst.ftime = 0;
wrst.test_type = TEST_PERFORMANCE;
for (i=0; i<SMB_PORTS; ++i) {
/* 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 = 60;
wrst.ptx[i].fsize_start= 60;
wrst.ptx[i].fsize_step = 32; //1;
wrst.ptx[i].fsize_stop = 128; //1522;
wrst.ptx[i].fsize_n = 0;
wrst.ptx[i].fload_tab[0] = 10;
wrst.ptx[i].fload_tab[1] = 30;
wrst.ptx[i].fload_tab[2] = 50;
wrst.ptx[i].fload_tab[3] = 70;
wrst.ptx[i].fload_tab[4] = 80;
wrst.ptx[i].fload_tab[5] = 85;
wrst.ptx[i].fload_tab[6] = 90;
wrst.ptx[i].fload_tab[7] = 92;
wrst.ptx[i].fload_tab[8] = 95;
wrst.ptx[i].fload_tab[9] = 97;
wrst.ptx[i].fload_tab[10] = 99;
wrst.ptx[i].fload_tab[11] = 100;
wrst.ptx[i].fload_n = 12;
wrst.ptx[i].fnum = 1000000; //1000000000; //10^9
}
}
if ( (test_no >= TEST_3_1_1 && variant == VAR2) ||
(test_no == TEST_3_2_2 && variant == VAR1) ||
(test_no == TEST_3_3_1 && variant == VAR1) ||
(test_no == TEST_3_3_2 && variant == VAR1) ) {
wrst.ftime = 20; //5*60; //5 min
wrst.test_type = TEST_PERFORMANCE;
for (i=0; i<SMB_PORTS; ++i) {
/* 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_start= 0;
wrst.ptx[i].fsize_step = 0;
wrst.ptx[i].fsize_stop = 0;
wrst.ptx[i].fsize_tab[0] = 60;
wrst.ptx[i].fsize_tab[1] = 61;
wrst.ptx[i].fsize_tab[2] = 696;
wrst.ptx[i].fsize_tab[3] = 697;
wrst.ptx[i].fsize_tab[4] = 1513;
wrst.ptx[i].fsize_tab[5] = 1514;
wrst.ptx[i].fsize_n = 6;
wrst.ptx[i].fload_tab[0] = 50;
wrst.ptx[i].fload_tab[1] = 80;
wrst.ptx[i].fload_tab[2] = 95;
wrst.ptx[i].fload_tab[3] = 100;
wrst.ptx[i].fload_n = 4;
wrst.ptx[i].fnum = 0;
}
}
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.learning = 0;
wrst.variants = 1;
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[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;
wrst.prx[1].s_port = RX_PALL;
wrst.prx[3].s_port = RX_PALL;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
case TEST_2_1_2:
/* 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.learning = 0;
wrst.variants = 1;
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 = RX_ALLUNI;
wrst.prx[1].s_port = RX_ALLUNI;
wrst.prx[2].s_port = RX_ALLUNI;
wrst.prx[3].s_port = RX_ALLUNI;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
case TEST_2_2_1:
/* 2.2.1 VLAN-limited forwarding */
/* TX: p0->p2; p2->p0; 802.1q
* RX_TRIG: p0; p2 -> smac; vid; prio
* RX: p1; p3 */
wrst.learning = 0;
wrst.variants = 1;
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].q_vid = 1;
wrst.ptx[2].q_pri = 1;
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;
wrst.prx[1].s_port = RX_PALL;
wrst.prx[3].s_port = RX_PALL;
wrst.prx[0].trig2_len = 4;
wrst.prx[2].trig2_len = 4;
wrst.prx[1].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
vtag = VLAN_TAG(1, 1);
memcpy( wrst.prx[0].trig2_pat, &vtag, 4 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 4 );
break;
case TEST_2_2_2:
/* 2.2.2 VLAN separation of traffic */
/* TX: p0; p2; 802.1q; broadcast
* RX_TRIG: p0; p2 -> smac; vid; prio
* RX: p1; p3 */
wrst.learning = 0;
wrst.variants = 1;
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].q_vid = 1;
wrst.ptx[2].q_pri = 0;
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;
wrst.prx[1].s_port = RX_PALL;
wrst.prx[3].s_port = RX_PALL;
wrst.prx[0].trig2_len = 4;
wrst.prx[2].trig2_len = 4;
wrst.prx[1].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
vtag = VLAN_TAG(1, 0);
memcpy( wrst.prx[0].trig2_pat, &vtag, 4 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 4 );
break;
case TEST_2_2_5:
/* 2.2.5 Tagging */
/* TX: p0->p2; p2->p0; 802.1d
* RX_TRIG: p0; p2 -> smac; vid; prio
* RX: p1; p3 */
wrst.learning = 0;
wrst.variants = 1;
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[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;
wrst.prx[1].s_port = RX_PALL;
wrst.prx[3].s_port = RX_PALL;
wrst.prx[0].trig2_len = 4;
wrst.prx[2].trig2_len = 4;
wrst.prx[1].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
vtag = VLAN_TAG(1, 3);
memcpy( wrst.prx[0].trig2_pat, &vtag, 4 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 4 );
break;
case TEST_2_2_6:
/* 2.2.6 Untagging */
/* TX: p0->p2; p2->p0; 802.1q
* RX_TRIG: p0; p2 -> smac; ethtype
* RX: p1; p3 */
wrst.learning = 0;
wrst.variants = 1;
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[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;
wrst.prx[1].s_port = RX_PALL;
wrst.prx[3].s_port = RX_PALL;
wrst.prx[0].trig2_len = 2;
wrst.prx[2].trig2_len = 2;
wrst.prx[1].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
vtag = NOVLAN_TAG;
memcpy( wrst.prx[0].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 2 );
break;
case TEST_2_2_7:
/* 2.2.7 Snake test */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2
* RX_TRIG: p0; p1; p2; p3 -> smac; ethtype */
wrst.learning = 0;
wrst.variants = 1;
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;
wrst.prx[2].s_port = 3;
wrst.prx[3].s_port = 2;
wrst.prx[0].trig2_len = 2;
wrst.prx[1].trig2_len = 2;
wrst.prx[2].trig2_len = 2;
wrst.prx[3].trig2_len = 2;
vtag = NOVLAN_TAG;
memcpy( wrst.prx[0].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[1].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[3].trig2_pat, &vtag, 2 );
break;
/***********************************************/
/* PERFORMANCE TESTS */
/***********************************************/
case TEST_3_1_1:
wrst.learning = 1;
wrst.variants = 2;
wrst.ptx[0].d_ports[0] = 2;
wrst.ptx[2].d_ports[0] = 0;
wrst.ptx[1].d_ports[0] = 3;
wrst.ptx[3].d_ports[0] = 1;
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 = 2;
wrst.prx[2].s_port = 0;
wrst.prx[1].s_port = 3;
wrst.prx[3].s_port = 1;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
case TEST_3_1_2:
/* 3.1.2 Unicast one-to-one streams */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2
* RX_TRIG: p0; p1; p2; p3 -> smac */
wrst.learning = 1;
wrst.variants = 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;
wrst.prx[2].s_port = 3;
wrst.prx[3].s_port = 2;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
case TEST_3_1_3:
/* 3.1.3 Unicast many-to-many streams */
/* TX: p0->p1,p2,p3; p1->p0,p2,p3; p2->p0,p1,p3; p3->p0,p1,p2
* RX_TRIG: p0; p1; p2; p3 */
wrst.learning = 1;
wrst.variants = 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 = RX_ALLUNI;
wrst.prx[1].s_port = RX_ALLUNI;
wrst.prx[2].s_port = RX_ALLUNI;
wrst.prx[3].s_port = RX_ALLUNI;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
case TEST_3_1_4:
/* 3.1.4 VLAN, broadcast */
/* TX: p0; p1; p2; p3 -> broadcast, 802.1q
* RX_TRIG: p0; p1; p2; p3 -> smac, vid, prio */
wrst.learning = 1;
wrst.variants = 2;
wrst.ptx[0].d_ports[0] = TX_PALL;
wrst.ptx[1].d_ports[0] = TX_PALL;
wrst.ptx[2].d_ports[0] = TX_PALL;
wrst.ptx[3].d_ports[0] = TX_PALL;
wrst.ptx[0].q_vid = 1;
wrst.ptx[1].q_vid = 2;
wrst.ptx[2].q_vid = 1;
wrst.ptx[3].q_vid = 2;
wrst.ptx[0].q_pri = 0;
wrst.ptx[1].q_pri = 0;
wrst.ptx[2].q_pri = 0;
wrst.ptx[3].q_pri = 0;
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 = 2;
wrst.prx[2].s_port = 0;
wrst.prx[1].s_port = 3;
wrst.prx[3].s_port = 1;
wrst.prx[0].trig2_len = 4;
wrst.prx[1].trig2_len = 4;
wrst.prx[2].trig2_len = 4;
wrst.prx[3].trig2_len = 4;
vtag = VLAN_TAG(1, 0);
memcpy( wrst.prx[0].trig2_pat, &vtag, 4 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 4 );
vtag = VLAN_TAG(2, 0);
memcpy( wrst.prx[1].trig2_pat, &vtag, 4 );
memcpy( wrst.prx[3].trig2_pat, &vtag, 4 );
break;
case TEST_3_1_5:
/* 3.1.5 VLAG, broadcast, tagging/untagging */
/* TX: p0->p2; p2->p0; p1->p3; p3->p1
* RX_TRIG: p0; p1; p2; p3 -> smac */
wrst.learning = 1;
wrst.variants = 2;
wrst.ptx[0].d_ports[0] = TX_PALL;
wrst.ptx[1].d_ports[0] = TX_PALL;
wrst.ptx[2].d_ports[0] = TX_PALL;
wrst.ptx[3].d_ports[0] = TX_PALL;
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 = 2;
wrst.prx[2].s_port = 0;
wrst.prx[1].s_port = 3;
wrst.prx[3].s_port = 1;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
case TEST_3_2_1:
/* 3.2.1 Snake - Uniformly distributed load on all ports */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2
* RX_TRIG: p0; p1; p2; p3 -> smac, ethtype */
wrst.learning = 1;
wrst.variants = 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;
wrst.prx[2].s_port = 3;
wrst.prx[3].s_port = 2;
wrst.prx[0].trig2_len = 2;
wrst.prx[1].trig2_len = 2;
wrst.prx[2].trig2_len = 2;
wrst.prx[3].trig2_len = 2;
vtag = NOVLAN_TAG;
memcpy( wrst.prx[0].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[1].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[3].trig2_pat, &vtag, 2 );
break;
case TEST_3_2_2:
/* Non uniformly distributed load on ports */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2
* RX_TRIG: p0; p1; p2; p3 -> smac, ethertype */
wrst.learning = 1;
wrst.variants = 1;
wrst.permute = 1;
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;
wrst.prx[2].s_port = 3;
wrst.prx[3].s_port = 2;
wrst.prx[0].trig2_len = 2;
wrst.prx[1].trig2_len = 2;
wrst.prx[2].trig2_len = 2;
wrst.prx[3].trig2_len = 2;
vtag = NOVLAN_TAG;
memcpy( wrst.prx[0].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[1].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[2].trig2_pat, &vtag, 2 );
memcpy( wrst.prx[3].trig2_pat, &vtag, 2 );
break;
case TEST_3_3_1:
/* 3.3.1 Unicast frame storm */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2
* RX_TRIG: p0; p1; p2; p3 -> smac */
wrst.learning = 0;
wrst.variants = 1;
wrst.permute = 0;
wrst.force_prst = 1;
wrst.ftime = 60; //override default setting
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;
wrst.prx[2].s_port = 3;
wrst.prx[3].s_port = 2;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
case TEST_3_3_2:
/* 3.3.2 VLAN, broadcast, tagging/untagging */
/* TX: p0->p1; p1->p0; p2->p3; p3->p2
* RX_TRIG: p0; p1; p2; p3 -> smac */
wrst.learning = 0;
wrst.variants = 1;
wrst.permute = 0;
wrst.force_prst = 1;
wrst.ftime = 60; //override default setting
wrst.ptx[0].d_ports[0] = TX_PALL;
wrst.ptx[1].d_ports[0] = TX_PALL;
wrst.ptx[2].d_ports[0] = TX_PALL;
wrst.ptx[3].d_ports[0] = TX_PALL;
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;
wrst.prx[2].s_port = 3;
wrst.prx[3].s_port = 2;
wrst.prx[0].trig2_len = 0;
wrst.prx[1].trig2_len = 0;
wrst.prx[2].trig2_len = 0;
wrst.prx[3].trig2_len = 0;
break;
}
}
int run_test( HTCountStructure *cntrs, char mac[][6] )
{
int i, j, rx_pmask = 0, tx_pmask = 0;
struct smb_port_tx *p_tx = NULL;
struct smb_port_rx *p_rx = NULL;
//reset_ports(SMB_P0 | SMB_P1 | SMB_P2 | SMB_P3);
///* optional learning */
//if (wrst.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_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/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_ports[j]], mac[i], p_tx->fsize, p_tx->fnum,
p_tx->fload/100.0/p_tx->d_ports_n, p_tx->q_pri, p_tx->q_vid, -1);
}
}
/* setup required triggers */
for (i=0; i<SMB_PORTS; ++i) {
p_rx = &(wrst.prx[i]);
/* 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)
smb_set_trigger( p_rx->trig2_pat, i, 12, p_rx->trig2_len, HTTRIGGER_2);
}
clear_allcntrs(SMB_PALL);
////wait for link up
rx_pmask = 0;
for (i=0; i<SMB_PORTS; ++i) {
p_rx = &(wrst.prx[i]);
if ((p_rx->s_port >= 0 && p_rx->s_port <=3) || p_rx->s_port == RX_PALL)
rx_pmask |= PORT_TO_PMASK(i);
}
wait_linkup(rx_pmask);
//generate traffic
run_traffic(tx_pmask, TRAFFIC_START);
//NSDelay(1);
wait_test_done(tx_pmask, wrst.ftime);
if(wrst.ftime > 0) {
run_traffic(tx_pmask, TRAFFIC_STOP);
wait_test_done(tx_pmask, 0);
}
get_allcntrs(SMB_PALL, cntrs);
return 0;
}
int anl_result( HTCountStructure *cntrs, int testno)
{
int req_num;
unsigned long exp_rx[SMB_PORTS];
switch (testno) {
case TEST_2_1_1:
/* All frames sent from p0 received on p2
* All frames sent from p2 received on p0
* Limited number of frames may be received on p1; p3 due to learning */
if ( (cntrs[0].TmtPkt == T_2XX_FNUM && cntrs[2].RcvPkt == T_2XX_FNUM && cntrs[2].RcvTrig == T_2XX_FNUM) &&
(cntrs[2].TmtPkt == T_2XX_FNUM && cntrs[0].RcvPkt == T_2XX_FNUM && cntrs[0].RcvTrig == T_2XX_FNUM) &&
(cntrs[1].RcvPkt < T_2XX_UNRECOG_THR) && (cntrs[3].RcvPkt < T_2XX_UNRECOG_THR))
return TEST_PASSED;
if ( (cntrs[0].TmtPkt == T_2XX_FNUM && cntrs[2].RcvPkt == T_2XX_FNUM && cntrs[2].RcvTrig == T_2XX_FNUM) &&
(cntrs[2].TmtPkt == T_2XX_FNUM && cntrs[0].RcvPkt == T_2XX_FNUM && cntrs[0].RcvTrig == T_2XX_FNUM) )
return TEST_WARNING;
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
* All frames sent from p2 received on p3
* All frames sent from p3 received on p2 */
if ( (cntrs[0].TmtPkt == T_2XX_FNUM && cntrs[1].RcvPkt == T_2XX_FNUM && cntrs[1].RcvTrig == T_2XX_FNUM) &&
(cntrs[1].TmtPkt == T_2XX_FNUM && cntrs[0].RcvPkt == T_2XX_FNUM && cntrs[0].RcvTrig == T_2XX_FNUM) &&
(cntrs[2].TmtPkt == T_2XX_FNUM && cntrs[3].RcvPkt == T_2XX_FNUM && cntrs[3].RcvTrig == T_2XX_FNUM) &&
(cntrs[3].TmtPkt == T_2XX_FNUM && cntrs[2].RcvPkt == T_2XX_FNUM && cntrs[2].RcvTrig == T_2XX_FNUM) )
return TEST_PASSED;
if ( (cntrs[0].TmtPkt == T_2XX_FNUM && cntrs[1].RcvPkt >= T_2XX_FNUM && cntrs[1].RcvTrig == T_2XX_FNUM) &&
(cntrs[1].TmtPkt == T_2XX_FNUM && cntrs[0].RcvPkt >= T_2XX_FNUM && cntrs[0].RcvTrig == T_2XX_FNUM) &&
(cntrs[2].TmtPkt == T_2XX_FNUM && cntrs[3].RcvPkt >= T_2XX_FNUM && cntrs[3].RcvTrig == T_2XX_FNUM) &&
(cntrs[3].TmtPkt == T_2XX_FNUM && cntrs[2].RcvPkt >= T_2XX_FNUM && cntrs[2].RcvTrig == T_2XX_FNUM) )
return TEST_WARNING;
break;
case TEST_2_2_1:
case TEST_2_2_5:
case TEST_2_2_6:
/* All frames sent from p0 received on p2
* All frames sent from p2 received on p0
* No frames received on ports other than p0; p2 */
if ( (cntrs[0].TmtPkt == T_2XX_FNUM && cntrs[2].RcvPkt == T_2XX_FNUM && cntrs[2].RcvTrig == T_2XX_FNUM) &&
(cntrs[2].TmtPkt == T_2XX_FNUM && cntrs[0].RcvPkt == T_2XX_FNUM && cntrs[0].RcvTrig == T_2XX_FNUM) &&
(cntrs[1].RcvPkt == 0 && cntrs[3].RcvPkt == 0) )
return TEST_PASSED;
break;
case TEST_2_2_2:
/* All frames sent from p0 dropped
* All frames sent from p2 received only on p0
* No frames received on ports other than p0 */
if ( (cntrs[0].TmtPkt == T_2XX_FNUM && cntrs[2].RcvPkt == 0 && cntrs[2].RcvTrig == 0) &&
(cntrs[2].TmtPkt == T_2XX_FNUM && cntrs[0].RcvPkt == T_2XX_FNUM && cntrs[0].RcvTrig == T_2XX_FNUM) &&
(cntrs[1].RcvPkt == 0 && cntrs[2].RcvPkt == 0 && cntrs[3].RcvPkt == 0) )
return TEST_PASSED;
break;
case TEST_3_1_1:
case TEST_3_1_4:
case TEST_3_1_5:
/* All frames sent from p0 received on p2
* All frames sent from p2 received on p0
* All frames sent from p1 received on p3
* All frames sent from p3 received on p1 */
if ( (cntrs[0].TmtPkt == cntrs[2].RcvPkt && cntrs[0].TmtPkt == cntrs[2].RcvTrig) &&
(cntrs[2].TmtPkt == cntrs[0].RcvPkt && cntrs[2].TmtPkt == cntrs[0].RcvTrig) &&
(cntrs[1].TmtPkt == cntrs[3].RcvPkt && cntrs[1].TmtPkt == cntrs[3].RcvTrig) &&
(cntrs[3].TmtPkt == cntrs[1].RcvPkt && cntrs[3].TmtPkt == cntrs[1].RcvTrig) )
return TEST_PASSED;
break;
case TEST_3_1_2:
case TEST_3_2_1:
case TEST_3_2_2:
/* All frames sent from p0 received on p1
* All frames sent from p1 received on p0
* All frames sent from p2 received on p3
* All frames sent from p3 received on p2 */
if ( (cntrs[0].TmtPkt == cntrs[1].RcvPkt && cntrs[0].TmtPkt == cntrs[1].RcvTrig) &&
(cntrs[1].TmtPkt == cntrs[0].RcvPkt && cntrs[1].TmtPkt == cntrs[0].RcvTrig) &&
(cntrs[2].TmtPkt == cntrs[3].RcvPkt && cntrs[2].TmtPkt == cntrs[3].RcvTrig) &&
(cntrs[3].TmtPkt == cntrs[2].RcvPkt && cntrs[3].TmtPkt == cntrs[2].RcvTrig) )
return TEST_PASSED;
break;
case TEST_3_1_3:
/* Each of the ports got frames addressed to it from all other ports */
exp_rx_frames(&wrst, cntrs, exp_rx);
if ( (cntrs[0].RcvTrig == cntrs[0].RcvPkt && cntrs[0].RcvTrig == exp_rx[0]) &&
(cntrs[1].RcvTrig == cntrs[1].RcvPkt && cntrs[1].RcvTrig == exp_rx[1]) &&
(cntrs[2].RcvTrig == cntrs[2].RcvPkt && cntrs[2].RcvTrig == exp_rx[2]) &&
(cntrs[3].RcvTrig == cntrs[3].RcvPkt && cntrs[3].RcvTrig == exp_rx[3]) )
return TEST_PASSED;
break;
case TEST_3_3_1:
case TEST_3_3_2:
/* All frames sent from p0 received on p1
* All frames sent from p1 received on p0
* All frames sent from p2 received on p3
* All frames sent from p3 received on p2
* Limited number of additional frames may be received on p0; p1; p2; p3 due to learning */
if ( (cntrs[0].RcvTrig == cntrs[1].TmtPkt && cntrs[0].RcvPkt >= cntrs[1].TmtPkt &&
cntrs[0].RcvPkt <= cntrs[1].TmtPkt + T_2XX_UNRECOG_THR) &&
(cntrs[1].RcvTrig == cntrs[0].TmtPkt && cntrs[1].RcvPkt >= cntrs[0].TmtPkt &&
cntrs[1].RcvPkt <= cntrs[0].TmtPkt + T_2XX_UNRECOG_THR) &&
(cntrs[2].RcvTrig == cntrs[3].TmtPkt && cntrs[2].RcvPkt >= cntrs[3].TmtPkt &&
cntrs[2].RcvPkt <= cntrs[3].TmtPkt + T_2XX_UNRECOG_THR) &&
(cntrs[3].RcvTrig == cntrs[2].TmtPkt && cntrs[3].RcvPkt >= cntrs[2].TmtPkt &&
cntrs[3].RcvPkt <= cntrs[2].TmtPkt + T_2XX_UNRECOG_THR) )
return TEST_PASSED;
if ( (cntrs[0].RcvTrig == cntrs[1].TmtPkt && cntrs[0].RcvPkt >= cntrs[1].TmtPkt) &&
(cntrs[1].RcvTrig == cntrs[0].TmtPkt && cntrs[1].RcvPkt >= cntrs[0].TmtPkt) &&
(cntrs[2].RcvTrig == cntrs[3].TmtPkt && cntrs[2].RcvPkt >= cntrs[3].TmtPkt) &&
(cntrs[3].RcvTrig == cntrs[2].TmtPkt && cntrs[3].RcvPkt >= cntrs[2].TmtPkt) )
return TEST_WARNING;
break;
}
return TEST_FAILED;
}
/*************************************************************/
int next_testcase(int reset)
{
static int cur_load[2], cur_size[2];
int i, j, quit = 1;
int p_no;
if(reset) {
cur_load[0] = 0;
cur_load[1] = 0;
cur_size[0] = 0;
cur_size[1] = 0;
/* init load, needed for first run */
for(j=0; j<SMB_PORTS; ++j) {
if (wrst.ptx[j].fsize_n > 0)
wrst.ptx[j].fsize = wrst.ptx[j].fsize_tab[0];
else
wrst.ptx[j].fsize = wrst.ptx[j].fsize_start;
wrst.ptx[j].fload = wrst.ptx[j].fload_tab[0];
}
cur_load[0]++;
cur_load[1]++;
cur_size[0]++;
cur_size[1]++;
return NEXT_STEP;
}
if(wrst.permute) {
/* that's the only fucking different case than all other... */
for(i=0; i<2; ++i) {
quit = 1;
/* size */
for(j=0; j<SMB_PORTS/2; ++j) {
p_no = i*2+j;
/* no more sizes */
if( (wrst.ptx[p_no].fsize_n > 0 && cur_size[i] >= wrst.ptx[p_no].fsize_n) ||
(wrst.ptx[p_no].fsize_n == 0 && wrst.ptx[p_no].fsize_start + cur_size[i]*wrst.ptx[p_no].fsize_step > wrst.ptx[p_no].fsize_stop) ) {
//printf("greg port %d no more sizes\n", p_no);
quit = 0;
cur_size[i] = 0;
//printf("%s: no more size for port %d\n", __FUNCTION__, p_no);
}
/*next*/
//printf("greg incr size port %d\n", p_no);
if (wrst.ptx[p_no].fsize_n > 0 && cur_size[i] < wrst.ptx[p_no].fsize_n)
wrst.ptx[p_no].fsize = wrst.ptx[p_no].fsize_tab[cur_size[i]];
else if (wrst.ptx[p_no].fsize_n == 0)
wrst.ptx[p_no].fsize = wrst.ptx[p_no].fsize_start + cur_size[i]*wrst.ptx[p_no].fsize_step;
//printf("%s: port %d fsize %d\n", __FUNCTION__, p_no, wrst.ptx[p_no].fsize);
/*set also size and load for i=0*/
if(i==1) {
if(wrst.ptx[0].fsize_n > 0)
wrst.ptx[0].fsize = wrst.ptx[0].fsize_tab[0];
else
wrst.ptx[0].fsize = wrst.ptx[0].fsize_start;
if(wrst.ptx[1].fsize_n > 0)
wrst.ptx[1].fsize = wrst.ptx[1].fsize_tab[0];
else
wrst.ptx[1].fsize = wrst.ptx[1].fsize_start;
wrst.ptx[0].fload = wrst.ptx[0].fload_tab[0];
wrst.ptx[1].fload = wrst.ptx[1].fload_tab[0];
}
}
cur_size[i]++;
if(quit) return NEXT_STEP;
quit = 1;
/* load */
for(j=0; j<SMB_PORTS/2; ++j) {
p_no = i*2+j;
/* no more loads */
if(cur_load[i] >= wrst.ptx[p_no].fload_n) {
//printf("greg port %d no more loads\n", p_no);
quit = 0;
cur_load[i] = -1;
break;
}
/*next*/
//printf("greg incr load port %d\n", p_no);
wrst.ptx[p_no].fload = wrst.ptx[p_no].fload_tab[cur_load[i]];
if(wrst.ptx[p_no].fsize_n > 0)
wrst.ptx[p_no].fsize = wrst.ptx[p_no].fsize_tab[0];
else
wrst.ptx[p_no].fsize = wrst.ptx[p_no].fsize_start;
//printf("%s: port %d new fload %d fsize %d\n", __FUNCTION__, p_no, wrst.ptx[p_no].fload, wrst.ptx[p_no].fsize);
}
cur_load[i]++;
if(quit) return NEXT_STEP;
}
}
else {
//printf("greg %s: no permute\n", __FUNCTION__);
/* size */
for(j=0; j<SMB_PORTS; ++j) {
/* no more sizes */
if( (wrst.ptx[j].fsize_n > 0 && cur_size[0] >= wrst.ptx[j].fsize_n) ||
(wrst.ptx[j].fsize_n == 0 && wrst.ptx[j].fsize_start + cur_size[0]*wrst.ptx[j].fsize_step > wrst.ptx[j].fsize_stop) ) {
quit = 0;
cur_size[0] = 0;
//printf("greg %s: no more size for port %d\n", __FUNCTION__, j);
}
/*next*/
if (wrst.ptx[j].fsize_n > 0 && cur_size[0] < wrst.ptx[j].fsize_n)
wrst.ptx[j].fsize = wrst.ptx[j].fsize_tab[cur_size[0]];
else if (wrst.ptx[j].fsize_n == 0)
wrst.ptx[j].fsize = wrst.ptx[j].fsize_start + cur_size[0]*wrst.ptx[j].fsize_step;
//printf("greg %s: port %d fsize %d\n", __FUNCTION__, j, wrst.ptx[j].fsize);
}
cur_size[0]++;
if(quit) return NEXT_STEP;
quit = 1;
/* load */
for(j=0; j<SMB_PORTS; ++j) {
/* no more loads */
if(cur_load[i] >= wrst.ptx[j].fload_n) {
quit = 0;
cur_load[i] = 0;
break;
}
/*next*/
wrst.ptx[j].fload = wrst.ptx[j].fload_tab[cur_load[i]];
if(wrst.ptx[j].fsize_n > 0)
wrst.ptx[j].fsize = wrst.ptx[j].fsize_tab[0];
else
wrst.ptx[j].fsize = wrst.ptx[j].fsize_start;
//printf("greg %s: port %d new fload %d fsize %d\n", __FUNCTION__, j, wrst.ptx[j].fload, wrst.ptx[j].fsize);
}
cur_load[i]++;
}
if (!quit) return NONEXT_STEP;
else return NEXT_STEP;
}
/*************************************************************/
int run_and_analyze(int test_no, FILE *logfile)
{
char mac[SMB_PORTS+1][6] = {{0x3c, 0x47, 0x0e, 0x04, 0x05, 0x06},
{0x3c, 0x47, 0x0e, 0x14, 0x15, 0x16},
{0x3c, 0x47, 0x0e, 0x24, 0x25, 0x26},
{0x3c, 0x47, 0x0e, 0x34, 0x35, 0x36},
{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}};
HTCountStructure cntrs[SMB_PORTS];
unsigned long exp_rxf[SMB_PORTS];
int result, result_final, i, j, i_var;
time_t t_start, t_stop;
printf("------ TEST %s ------\n", TLIST[test_no]);
fprintf(logfile, "\n\n------ TEST %s ------\n", TLIST[test_no]);
printf("Configuring WR Switch...\n");
wrs_config("127.0.0.1", test_no);
reset_ports(SMB_PALL);
init_wr_test(test_no, 0);
for(i_var=0; i_var<wrst.variants; ++i_var) {
if(i_var > 0) {
printf("------ TEST %s.%d ------\n", TLIST[test_no], i_var);
fprintf(logfile, "\n\n------ TEST %s.%d ------\n", TLIST[test_no], i_var);
}
init_wr_test(test_no, i_var);
//printf("Running test...");
//fflush(stdout);
/* optional learning */
if (wrst.learning)
smb_learning(SMB_PALL, mac, 3);
result_final = TEST_PASSED;
next_testcase(1);
do {
t_start = time(NULL);
if( wrst.permute ) {
printf("load %3d %3d frame size %4d %4d B...", wrst.ptx[0].fload,
wrst.ptx[2].fload, wrst.ptx[0].fsize, wrst.ptx[2].fsize);
fflush(stdout);
fprintf(logfile, "\nload %3d %3d frame size %4d %4d B...\n", wrst.ptx[0].fload,
wrst.ptx[2].fload, wrst.ptx[0].fsize, wrst.ptx[2].fsize);
} else {
printf("load %3d frame size %4d B...", wrst.ptx[0].fload, wrst.ptx[0].fsize);
fflush(stdout);
fprintf(logfile, "\nload %3d frame size %4d B...\n", wrst.ptx[0].fload, wrst.ptx[0].fsize);
}
if(wrst.force_prst)
reset_ports(SMB_PALL);
run_test(cntrs, mac);
exp_rx_frames(&wrst, cntrs, exp_rxf);
fprintf(logfile, "expected RX frames: p0 = %lu, p1 = %lu, p2 = %lu, p3 = %lu\n",
exp_rxf[0], exp_rxf[1], exp_rxf[2], exp_rxf[3]);
result = anl_result(cntrs, test_no);
if(wrst.test_type == TEST_PERFORMANCE)
show_floss(logfile, cntrs, exp_rxf);
t_stop = time(NULL);
/* update final result of the test */
if ( (result_final == TEST_PASSED) ||
(result_final == TEST_WARNING && result != TEST_PASSED) ) {
result_final = result;
//printf("updating final result to %d\n", result_final);
}
switch (result) {
case TEST_PASSED:
printf("OK (time %u)\n", (unsigned)(t_stop - t_start));
fprintf(logfile, "OK (time %u)\n", (unsigned)(t_stop - t_start));
break;
case TEST_WARNING:
printf("WARNING (time %u)\n", (unsigned)(t_stop - t_start));
fprintf(logfile, "WARNING (time %u)\n", (unsigned)(t_stop - t_start));
break;
case TEST_FAILED:
printf("Failed (time %u)\n", (unsigned)(t_stop - t_start));
fprintf(logfile, "Failed (time %u)\n", (unsigned)(t_stop - t_start));
break;
}
show_allcntrs(logfile, SMB_PALL, cntrs);
fflush(logfile);
//show_allcntrs(stdout, SMB_PALL, cntrs);
//fflush(stdout);
if(detect_stop() > 0) break;
} while( next_testcase(0) );
}
return result_final;
}
#ifndef __TESTS_BODY_H__
#define __TESTS_BODY_H__
#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
#define TEST_2_2_2 3
#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
#define TEST_3_1_2 8
#define TEST_3_1_3 9
#define TEST_3_1_4 10
#define TEST_3_1_5 11
#define TEST_3_2_1 12
#define TEST_3_2_2 13
#define TEST_3_3_1 14
#define TEST_3_3_2 15
extern const char* TLIST[16];
//#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
#define TEST_PASSED 2
#define TEST_WARNING 1
#define TEST_FAILED 0
#define NEXT_STEP 1
#define NONEXT_STEP 0
#define TEST_FUNCTIONAL 0
#define TEST_PERFORMANCE 1
/* Tests parameters */
#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_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 fsize_start;
int fsize_step;
int fsize_stop;
int fsize_tab[FSIZE_MAXTAB];
int fsize_n;
int fload; /* currently used frame load */
int fload_tab[FLOAD_MAXTAB]; //traffic load tab to test[1..100]%
int fload_n;
int fnum; //amount of frames sent in a single burst
};
struct smb_port_rx {
int s_port; //Source SMB port for setting TRIG1
char trig2_len; //TRIG2 pattern length, if 0 TRIG2 not set
char trig2_pat[6]; //TRIG2 pattern - Ethtype + VLAN tag
};
struct smb_test {
struct smb_port_tx ptx[SMB_PORTS];
struct smb_port_rx prx[SMB_PORTS];
int learning;
int variants;
int ftime; //length of burst in seconds
int test_type;
int permute;
int force_prst; // force ports reset for each tested load/size
};
void init_wr_tests(int num, int variant);
int run_test( HTCountStructure *cntrs, char mac[][6] );
int anl_result( HTCountStructure *cntrs, int testno);
int run_and_analyze(int test_no, FILE *logfile);
int next_testcase(int reset);
#endif
#include <memory.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include "et1000.h"
#include "wrs_smb.h"
#include "smartbits.h"
#include "tests_body.h"
#include "switch_config.h"
int force_stop;
int main()
{
FILE *logfile;
int test_no, result;
int t_pass = 0, t_warn = 0, t_fail = 0;
// Set Hub Slot Port location of the two cards in test
//int iHub = 0;
//int iSlot = 7;
#if BANK
int iPort1 = 2;
int iPort2 = 3;
#else
int iPort1 = 0;
int iPort2 = 1;
#endif
int iDataLength = 100;
int iStreams = 1;
linkToSmartBits();
if (HTSlotReserve(HUB, SLOT) < 0) {
fprintf(stderr, "Could not reserve the card\n");
CHECKERROR(NSUnLink());
return -1;
}
CHECKERROR( HTResetPort(RESET_FULL, HUB, SLOT, iPort1) );
CHECKERROR( HTResetPort(RESET_FULL, HUB, SLOT, iPort2) );
//reset_ports(SMB_PALL);
//latency_meas(iPort1, iPort2);
//basic_traffic(FRAME_SZ, iPort1, iPort2);
//setup_stream(iPort1, iPort2, FRAME_SZ, 1000, 0.1, 5, -1, 1);
//temp_run_test(iPort1, iPort2);
logfile = open_logfile();
if (!logfile) {
fprintf(stderr, "Could not open the logfile\n");
CHECKERROR(NSUnLink());
return -1;
}
force_stop = 0;
for(test_no=TEST_3_1_4; test_no<=TEST_3_3_2; ++test_no) {
//for(test_no=TEST_3_1_1; test_no<TEST_3_3_2+1; ++test_no) {
//for(test_no=TEST_3_1_4; test_no<TEST_3_1_4+1; ++test_no) {
//test_no = TEST_2_2_2;
result = run_and_analyze(test_no, logfile);
switch (result) {
case TEST_PASSED:
++t_pass;
break;
case TEST_WARNING:
++t_warn;
break;
case TEST_FAILED:
++t_fail;
break;
}
if (force_stop) break;
NSDelay(5);
}
//Greg
//while(!detect_stop()) {
// show_allcntrs(SMB_PALL, NULL);
//}
run_traffic(SMB_PALL, TRAFFIC_STOP);
printf("----------------------\n");
printf("PASSED: %d\n", t_pass);
printf("WARNINGS: %d\n", t_warn);
printf("FAILED: %d\n", t_fail);
fclose(logfile);
NSDelay(1);
CHECKERROR(NSUnLink());
return 0;
}
/**********************************************************************/
void latency_meas(int p_tx, int p_rx)
{
HTLatencyStructure lat_tx, lat_rx;
GIGAutoFiberNegotiate aneg_tx, aneg_rx;
HTCountStructure cnt_tx, cnt_rx;
int i;
//clear counters
CHECKERROR( HTResetPort(RESET_FULL, HUB, SLOT, p_tx) );
CHECKERROR( HTResetPort(RESET_FULL, HUB, SLOT, p_rx) );
set_port_config(p_tx);
set_port_config(p_rx);
printf("Showing card info\n");
show_card_info(p_tx);
show_card_info(p_rx);
#if FIBER
//
// HTGetStructure(GIG_STRUC_AUTO_FIBER_NEGOTIATE, 0, 0, 0, &aneg_tx, sizeof(GIGAutoFiberNegotiate), HUB, SLOT, p_tx);
// HTSetStructure(GIG_STRUC_AUTO_FIBER_NEGOTIATE, 0, 0, 0, &aneg_rx, sizeof(GIGAutoFiberNegotiate), HUB, SLOT, p_rx);
#endif
//get MAC
//{
// int mac_tx[6], mac_rx[6];
// CHECKERROR( HTGetBuiltInAddress(mac_tx, HUB, SLOT, p_tx) );
// CHECKERROR( HTGetBuiltInAddress(mac_rx, HUB, SLOT, p_rx) );
// printf("MAC tx: ");
// for(int i=0; i<6; ++i)
// printf("%02x ", mac_tx[i]);
// printf("\n");
// printf("MAC rx: ");
// for(int i=0; i<6; ++i)
// printf("%02x ", mac_rx[i]);
// printf("\n");
//}
//clear the group
//CHECKERROR( HGClearGroup() );
//add ports to a group
CHECKERROR( HGAddtoGroup(HUB, SLOT, p_tx) );
CHECKERROR( HGAddtoGroup(HUB, SLOT, p_rx) );
//set transmit mode on TX port
CHECKERROR( HTTransmitMode(SINGLE_BURST_MODE, HUB, SLOT, p_tx) );
CHECKERROR( HTBurstCount(1000, HUB, SLOT, p_tx) );
CHECKERROR( HTGap(90, HUB, SLOT, p_tx) );
#if FIBER
#else
//CHECKERROR( HTDuplexMode(FULLDUPLEX_MODE, HUB, SLOT, p_tx) );
#endif
CHECKERROR( HTGapAndScale(90, NANO_SCALE, HUB, SLOT, p_tx) );
//set lattency transmitter and receiver
lat_tx.Range = 12;
lat_tx.iData[6] = 0xff;
lat_tx.iData[7] = 0xff;
lat_tx.iData[8] = 0xff;
lat_tx.iData[9] = 0xff;
lat_tx.iData[10] = 0xff;
lat_tx.iData[11] = 0xff;
for (i=0; i<6; ++i)
lat_tx.iData[i] = 0xa5;
lat_tx.Offset = 0;
lat_tx.ulLatency = 0;
lat_rx.Range = 12;
lat_rx.iData[6] = 0xff;
lat_rx.iData[7] = 0xff;
lat_rx.iData[8] = 0xff;
lat_rx.iData[9] = 0xff;
lat_rx.iData[10] = 0xff;
lat_rx.iData[11] = 0xff;
for (i=0; i<6; ++i)
lat_rx.iData[i] = 0xa5;
lat_rx.Offset = 0;
lat_rx.ulLatency = 0;
CHECKERROR( HTLatency(HT_LATENCY_RXTX, &lat_tx, HUB, SLOT, p_tx) );
CHECKERROR( HTLatency(HT_LATENCY_RX, &lat_rx, HUB, SLOT, p_rx) );
//Timestamp-Initialization Sequence
CHECKERROR( HGSetGroupBehavior(ALLOW_LATENCY_COUNTER_RESET) );
CHECKERROR( HGStop() );
CHECKERROR( HGSetGroupBehavior(INHIBIT_LATENCY_COUNTER_RESET) );
//start transmission
//CHECKERROR( HGStart() );
//CHECKERROR( HGRun(HTRUN) );
CHECKERROR( HTRun(HTRUN, HUB, SLOT, p_tx) );
NSDelay(2);
// Now wait until transmission stops
CHECKERROR( HTGetCounters(&cnt_tx, HUB, SLOT, p_tx) );
while (cnt_tx.TmtPktRate != 0)
{
CHECKERROR( HTGetCounters(&cnt_tx, HUB, SLOT, p_tx) );
CHECKERROR( HTGetCounters(&cnt_rx, HUB, SLOT, p_rx) );
show_cntrs(&cnt_tx, p_tx);
show_cntrs(&cnt_rx, p_rx);
NSDelay(1);
}
NSDelay(1);
CHECKERROR( HTGetCounters(&cnt_tx, HUB, SLOT, p_tx) );
CHECKERROR( HTGetCounters(&cnt_rx, HUB, SLOT, p_rx) );
show_cntrs(&cnt_tx, p_tx);
show_cntrs(&cnt_rx, p_rx);
//get latency info
CHECKERROR( HTLatency(HT_LATENCY_REPORT, &lat_tx, HUB, SLOT, p_tx) );
CHECKERROR( HTLatency(HT_LATENCY_REPORT, &lat_rx, HUB, SLOT, p_rx) );
printf("Latency tx: %lu\n", lat_tx.ulLatency);
printf("Latency rx: %lu\n", lat_rx.ulLatency);
printf("Latency : %lu\n", lat_rx.ulLatency - lat_tx.ulLatency);
CHECKERROR( HTLatency(HT_LATENCY_OFF, &lat_tx, HUB, SLOT, p_tx) );
CHECKERROR( HTLatency(HT_LATENCY_OFF, &lat_rx, HUB, SLOT, p_rx) );
CHECKERROR( HGStop() );
}
/**********************************************************************/
int basic_traffic(int fsize, int p_tx, int p_rx)
{
int pattern[1514]; //max frame size
HTCountStructure cs1, cs2;
HTVFDStructure vfd1, vfd2, vfd3;
static int vfd1Data[6], vfd2Data[6], vfd3Data[2];
int i;
CHECKERROR( HTResetPort(RESET_FULL, HUB, SLOT, p_tx) );
CHECKERROR( HTResetPort(RESET_FULL, HUB, SLOT, p_rx) );
set_port_config(p_tx);
set_port_config(p_rx);
printf("Showing card info\n");
show_card_info(p_tx);
show_card_info(p_rx);
CHECKERROR( HTDataLength(fsize, HUB, SLOT, p_tx) );
for(i=0; i<fsize; ++i)
pattern[i] = 0xaa;
CHECKERROR( HTFillPattern(fsize, pattern, HUB, SLOT, p_tx) );
//VFD1
vfd1.Configuration = HVFD_STATIC;
vfd1.Range = 6;
vfd1.Offset = 0;
vfd1Data[0] = 0x07;
vfd1Data[1] = 0x06;
vfd1Data[2] = 0x05;
vfd1Data[3] = 0x04;
vfd1Data[4] = 0x03;
vfd1Data[5] = 0x02;
printf("9\n"); fflush(stdout);
vfd1.Data = vfd1Data;
printf("10\n"); fflush(stdout);
CHECKERROR( HTVFD(HVFD_1, &vfd1, HUB, SLOT, p_tx) );
printf("11\n"); fflush(stdout);
//VFD2
vfd2.Configuration = HVFD_STATIC;
vfd2.Range = 6;
vfd2.Offset = 48;
vfd2Data[0] = 0x06;
vfd2Data[1] = 0x05;
vfd2Data[2] = 0x04;
vfd2Data[3] = 0x03;
vfd2Data[4] = 0x02;
vfd2Data[5] = 0x01;
printf("9\n"); fflush(stdout);
vfd2.Data = vfd2Data;
printf("10\n"); fflush(stdout);
CHECKERROR( HTVFD(HVFD_2, &vfd2, HUB, SLOT, p_tx) );
printf("11\n"); fflush(stdout);
//VFD3
NSDelay(1);
vfd3.Configuration = HVFD_ENABLED;
vfd3.Range = 2;
vfd3.Offset = 12*8;
vfd3Data[0] = 0x88;
vfd3Data[1] = 0xf7;
vfd3.Data = vfd3Data;
vfd3.DataCount = 2;
CHECKERROR( HTVFD(HVFD_3, &vfd3, HUB, SLOT, p_tx) );
NSDelay(1);
CHECKERROR( HTTransmitMode(SINGLE_BURST_MODE, HUB, SLOT, p_tx) );
//CHECKERROR( HTTransmitMode(CONTINUOUS_PACKET_MODE, HUB, SLOT, p_tx) );
CHECKERROR( HTBurstCount(1000, HUB, SLOT, p_tx) );
CHECKERROR( HTGapAndScale(96, NANO_SCALE, HUB, SLOT, p_tx) );
clearCounters(HUB, SLOT, p_tx);
clearCounters(HUB, SLOT, p_rx);
CHECKERROR( HTRun(HTRUN, HUB, SLOT, p_tx) );
NSDelay(1);
CHECKERROR( HTRun(HTRUN, HUB, SLOT, p_tx) );
CHECKERROR(HTGetCounters(&cs1, HUB, SLOT, p_tx));
while (cs1.TmtPktRate != 0)
{
CHECKERROR(HTGetCounters(&cs1, HUB, SLOT, p_tx));
CHECKERROR(HTGetCounters(&cs2, HUB, SLOT, p_rx));
show_cntrs(&cs1, p_tx);
show_cntrs(&cs2, p_rx);
NSDelay(1);
}
NSDelay(5);
}
int setup_stream(int port, char *dmac, char *smac, int fsize, int fnum, float ratio, int v_pri, int vid, int idx)
{
static StreamIP str[MAX_STREAMS];
static int n_streams = 0;
static StreamIPVLAN strv[MAX_STREAMS];
NSPortTransmit tx_mode;
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 && idx >=0 ) {
//////// no VLAN ///////////
//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;
n_streams++;
}
else if (vid >= 0 && idx >= 0) {
//////// VLANs ///////////
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
// Stream EXT
//printf("Calculated %lu frames/sec for %f ratio\n", ratio_to_fps(fsize, ratio), ratio);
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);
//printf("L3 EXT rate %lu count %lu\n", l3_ext[0].ulFrameRate, l3_ext[0].ulBurstCount);
//CHECKERROR( HTSetStructure(L3_DEFINE_STREAM_EXTENSION, 0, 0, 0,
// l3_ext, n_streams*sizeof(L3StreamExtension), HUB, SLOT, port) );
///*verify frame rate*/
//NSDelay(1);
//bzero(l3_ext, MAX_STREAMS*sizeof(L3StreamExtension));
//CHECKERROR( HTGetStructure(L3_READ_STREAM_EXTENSION, 1, 0, 0, l3_ext,
// sizeof(L3StreamExtension), HUB, SLOT, port) );
//printf("L3 EXT read rate %lu %s %lu\n", l3_ext[0].ulFrameRate,
// l3_ext[0].ulTxMode==L3_CONTINUOUS_MODE?"cont":"sburst", l3_ext[0].ulBurstCount);
bzero(&tx_mode, sizeof(NSPortTransmit));
tx_mode.ulBurstCount = n_streams*fnum;
tx_mode.ucScheduleMode = SCHEDULE_MODE_GAP; //SCHEDULE_MODE_FRAME_RATE;
//printf("calculated gap %ld\n", ratio_to_gap(fsize, ratio));
tx_mode.ulInterFrameGap = ratio_to_gap(fsize, ratio);
tx_mode.uiGapScale = NANO_SCALE;
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;
}
return 0;
}
int temp_run_test(int p_tx, int p_rx)
{
int bidir = 1;
HTCountStructure cs_tx, cs_rx;
int tx_led, rx_led;
char mac[SMB_PORTS][6] = {{0x3c, 0x47, 0x0e, 0x04, 0x05, 0x06},
{0x3c, 0x47, 0x0e, 0x14, 0x15, 0x16},
{0x3c, 0x47, 0x0e, 0x24, 0x25, 0x26},
{0x3c, 0x47, 0x0e, 0x34, 0x35, 0x36}};
reset_ports(SMB_P0 | SMB_P1 | SMB_P2 | SMB_P3);
//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, 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);
smb_set_trigger(mac[1], p_tx, 6, 6, HTTRIGGER_1);
clear_allcntrs(SMB_PALL);
////wait for link up
wait_linkup(SMB_P0 | SMB_P1);
//generate traffic
if(bidir)
run_traffic(1<<p_tx | 1<<p_rx, 1);
else
run_traffic(1<<p_tx, 1);
NSDelay(1);
//Greg
while(!detect_stop()) {
show_allcntrs(NULL, SMB_PALL, NULL);
}
run_traffic(1<<p_tx | 1<<p_rx, 0);
return 0;
}
FILE* open_logfile()
{
time_t curtime;
struct tm *t;
char filename[30];
FILE *f;
curtime = time(NULL);
t = localtime(&curtime);
sprintf(filename, "%s-%d-%02d-%02d-%02d-%02d.log", LOG_FILE, t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min);
printf("%s\n", filename);
f = fopen(filename, "w");
return f;
}
#ifndef __WRS_SMB_H__
#define __WRS_SMB_H__
#define LOG_FILE "wrs-test"
FILE* open_logfile();
#endif
#!/bin/sh
# remove all possible VLANs
/wr/bin/rtu_stat vlan 1 1 0x0 1
/wr/bin/rtu_stat vlan 2 2 0x0 1
/wr/bin/rtu_stat vlan 3 3 0x0 1
/wr/bin/rtu_stat vlan 4 4 0x0 1
/wr/bin/rtu_stat vlan 5 5 0x0 1
/wr/bin/rtu_stat vlan 6 6 0x0 1
/wr/bin/rtu_stat vlan 7 7 0x0 1
/wr/bin/rtu_stat vlan 8 8 0x0 1
/wr/bin/rtu_stat vlan 9 9 0x0 1
/wr/bin/rtu_gd -g $1
if [ "$1" == "211" ] || [ "$1" == "212" ] || [ "$1" == "311" ] || [ "$1" == "312" ] || [ "$1" == "313" ] || [ "$1" == "331" ]; then
#remove VLAN 1
/wr/bin/rtu_stat vlan 1 1 0x0 1
fi
if [ "$1" == "221" ] || [ "$1" == "225" ] || [ "$1" == "226" ]; then
#configure VLAN 1
/wr/bin/rtu_stat vlan 1 1 0x3
fi
if [ "$1" == "222" ]; then
/wr/bin/rtu_stat vlan 1 1 0x1
fi
if [ "$1" == "227" ] || [ "$1" == "321" ] || [ "$1" == "322" ]; then
/wr/bin/rtu_stat vlan 1 1 0x20001
/wr/bin/rtu_stat vlan 2 2 0x00006
/wr/bin/rtu_stat vlan 3 3 0x00018
/wr/bin/rtu_stat vlan 4 4 0x00060
/wr/bin/rtu_stat vlan 5 5 0x00180
/wr/bin/rtu_stat vlan 6 6 0x00600
/wr/bin/rtu_stat vlan 7 7 0x01800
/wr/bin/rtu_stat vlan 8 8 0x06000
/wr/bin/rtu_stat vlan 9 9 0x18000
fi
if [ "$1" == "314" ] || [ "$1" == "315" ] || [ "$1" == "332" ]; then
/wr/bin/rtu_stat vlan 1 1 0x3
/wr/bin/rtu_stat vlan 2 2 0x30000
fi
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