1
puts "Running Simulation flow for Partitions test case"
3
# Assign partitions randomly
6
# Group 3 : 0x8001 0x8002 0x8003
8
# NOTE: default partition set by the SM ...
10
# find all active HCA ports
11
proc getAllActiveHCAPorts {fabric} {
15
foreach nodeNameId [IBFabric_NodeByName_get $fabric] {
16
set node [lindex $nodeNameId 1]
18
# we do care about non switches only
19
if {[IBNode_type_get $node] != 1} {
21
for {set pn 1} {$pn <= [IBNode_numPorts_get $node]} {incr pn} {
22
set port [IBNode_getPort $node $pn]
23
if {($port != "") && ([IBPort_p_remotePort_get $port] != "")} {
24
lappend hcaPorts $port
32
# prepare the three PKey groups G1 G2 abd G3
33
# then set the active HCA ports PKey tables (based on node name % 3)
34
# Note that the H-1/P1 has to have a slightly different PKey table
35
# with 0xffff such that all nodes can query the SA:
36
# we track the assignments in the arrays:
37
# PORT_PKEY_GROUP(port) -> group
38
# PORT_GROUP_PKEY_IDX(port) -> index of pkey (if set or -1)
39
proc setAllHcaPortsPKeyTable {fabric} {
40
global PORT_PKEY_GROUP
45
set G3 [list 0x8001 0x8002 0x8003]
47
set GROUP_PKEY(1) 0x8001
48
set GROUP_PKEY(2) 0x8002
49
set GROUP_PKEY(3) "0x8002 0x8001"
51
puts "-I- Group1 Pkeys:$G1"
52
puts "-I- Group2 Pkeys:$G2"
53
puts "-I- Group3 Pkeys:$G3"
55
set hcaPorts [getAllActiveHCAPorts $fabric]
57
foreach port $hcaPorts {
58
set portNum [IBPort_num_get $port]
59
# the H-1/P1 has a special treatment:
60
set node [IBPort_p_node_get $port]
61
set nodeName [IBNode_name_get $node]
62
set group [expr int(rand()*3) + 1]
63
set PORT_PKEY_GROUP($port) $group
69
puts "-E- How come we got group $group ?"
73
# all HCA active ports
74
return "Set PKeys on [array size PORT_PKEY_GROUP] ports"
77
# Remove given group PKey from Switch port accross the given host port
78
proc removeGroupPKeyAccrosForHcaPort {fabric hostNodeName portNum groupNum} {
80
set hostNode [IBFabric_getNode $fabric $hostNodeName]
81
if {$hostNode == ""} {
82
puts "-E- fail to find node $hostNodeName"
83
return "ERR: fail to find node $hostNodeName"
85
set port [IBNode_getPort $hostNode $portNum]
87
puts "-E- fail to find node $hostNodeName port $portNum"
88
return "ERR: fail to find node $hostNodeName port $portNum"
90
set remPort [IBPort_p_remotePort_get $port]
92
puts "-E- no remote port accross $hostNodeName port $portNum"
93
return "ERR:no remote port accross $hostNodeName port $portNum"
96
set swPortNum [IBPort_num_get $remPort]
97
set remNode [IBPort_p_node_get $remPort]
98
set swName [IBNode_name_get $remNode]
100
set pkey [lindex $GROUP_PKEY($groupNum) 0]
102
set ni [IBMSNode_getNodeInfo sim$remNode]
103
set partcap [ib_node_info_t_partition_cap_get $ni]
105
for {set blockNum 0 } {$blockNum < ($partcap+31)/32} {incr blockNum} {
106
set block [IBMSNode_getPKeyTblBlock sim$remNode $swPortNum $blockNum]
107
puts "-I- PKey get $remNode port:$swPortNum block:$blockNum is:$block"
109
for {set i 0 } {$i < 32} {incr i} {
110
if {[lindex $block $i] == $pkey} {
111
set block [lreplace $block $i $i 0]
112
puts "-I- Removing $pkey from block:$blockNum idx:$i"
116
IBMSNode_setPKeyTblBlock sim$remNode $swPortNum $blockNum $block
117
set block [IBMSNode_getPKeyTblBlock sim$remNode $swPortNum $blockNum]
118
puts "-I- PKey set $remNode port:$swPortNum block:$blockNum to:$block"
121
return "Removed Group:$groupNum PKey:$pkey from Switch:$swName port:$swPortNum accross:$hostNodeName"
123
return "ERR: fail to find pkey:$pkey on Switch:$swName port:$swPortNum accros:$hostNodeName"
127
# Dump out the HCA ports and their groups:
128
proc dumpHcaPKeyGroupFile {simDir} {
129
global PORT_PKEY_GROUP
132
set fn [file join $simDir "port_pkey_groups.txt"]
134
puts $f [format "\#%-6s %-4s %-5s %-18s %s" HOST PORT GROUP GUID PKEYS]
135
foreach port [array names PORT_PKEY_GROUP] {
136
set node [IBPort_p_node_get $port]
137
set sys [IBNode_p_system_get $node]
138
set num [IBPort_num_get $port]
139
set name [IBSystem_name_get $sys]
140
set guid [IBPort_guid_get $port]
141
set grp $PORT_PKEY_GROUP($port)
142
set pkeys $GROUP_PKEY($grp)
144
puts $f [format " %-6s %4d %5d %s %s" $name $num $grp $guid $pkeys]
147
return "Dumpped Group info into:$fn"
150
# dump out the current set of pkey tables:
151
proc dumpPKeyTables {fabric} {
152
set f [open "pkeys.txt" w]
153
set hcaPorts [getAllActiveHCAPorts $fabric]
154
foreach port $hcaPorts {
155
set portNum [IBPort_num_get $port]
156
set node [IBPort_p_node_get $port]
157
set name [IBPort_getName $port]
158
set ni [IBMSNode_getNodeInfo sim$node]
159
set partcap [ib_node_info_t_partition_cap_get $ni]
160
puts $f "PORT: $name PartCap:$partcap"
161
for {set blockNum 0 } {$blockNum < $partcap/32} {incr blockNum} {
162
set block [IBMSNode_getPKeyTblBlock sim$node $portNum $blockNum]
163
puts $f "BLOCK:$blockNum pkeys:$block"
168
return "Dumped pkeys into:pkeys.txt"
171
set fabric [IBMgtSimulator getFabric]