Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
W
White Rabbit Switch - Testing
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
image/svg+xml
Discourse
Discourse
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Projects
White Rabbit Switch - Testing
Commits
8823a213
Commit
8823a213
authored
Jul 31, 2017
by
Grzegorz Daniluk
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'greg-smbits'
parents
4df5984d
758dd0a1
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
2305 additions
and
0 deletions
+2305
-0
Makefile
sw/smartbits-tester/Makefile
+16
-0
smartbits.c
sw/smartbits-tester/smartbits.c
+487
-0
smartbits.h
sw/smartbits-tester/smartbits.h
+71
-0
switch_config.c
sw/smartbits-tester/switch_config.c
+12
-0
switch_config.h
sw/smartbits-tester/switch_config.h
+9
-0
tests_body.c
sw/smartbits-tester/tests_body.c
+1076
-0
tests_body.h
sw/smartbits-tester/tests_body.h
+96
-0
wrs_smb.c
sw/smartbits-tester/wrs_smb.c
+484
-0
wrs_smb.h
sw/smartbits-tester/wrs_smb.h
+8
-0
wrs_vlan_config.sh
sw/smartbits-tester/wrs_vlan_config.sh
+46
-0
No files found.
sw/smartbits-tester/Makefile
0 → 100644
View file @
8823a213
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
sw/smartbits-tester/smartbits.c
0 → 100644
View file @
8823a213
#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
(
"
\n
Connecting 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
;
}
sw/smartbits-tester/smartbits.h
0 → 100644
View file @
8823a213
#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
sw/smartbits-tester/switch_config.c
0 → 100644
View file @
8823a213
#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
);
}
sw/smartbits-tester/switch_config.h
0 → 100644
View file @
8823a213
#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
sw/smartbits-tester/tests_body.c
0 → 100644
View file @
8823a213
#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
,
"
\n
load %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
,
"
\n
load %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
;
}
sw/smartbits-tester/tests_body.h
0 → 100644
View file @
8823a213
#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
sw/smartbits-tester/wrs_smb.c
0 → 100644
View file @
8823a213
#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
;
}
sw/smartbits-tester/wrs_smb.h
0 → 100644
View file @
8823a213
#ifndef __WRS_SMB_H__
#define __WRS_SMB_H__
#define LOG_FILE "wrs-test"
FILE
*
open_logfile
();
#endif
sw/smartbits-tester/wrs_vlan_config.sh
0 → 100755
View file @
8823a213
#!/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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment