2
puts "FLOW: duplicate some port guid"
4
# duplicate the node guid from the source to the dest
5
proc dupNodeGuid {fromNode toNode} {
7
set newGuid [IBNode_guid_get $fromNode]
8
set toNodeName [IBNode_name_get $toNode]
9
set fromNodeName [IBNode_name_get $fromNode]
10
puts "-I- Overriding node:$toNodeName guid to $newGuid (dup of $fromNodeName)"
13
IBNode_guid_set $toNode $newGuid
15
# But we need to deal with the SIMNODE too:
16
set simNode "sim$toNode"
17
set ni [IBMSNode_getNodeInfo $simNode]
18
ib_node_info_t_node_guid_set $ni $newGuid
21
# duplicate the port guid from the source to the dest
22
proc dupPortGuid {fromNodeNPort toNodeNPort} {
24
# IBDM has a limitation of not holding "end ports"
25
# instead only physical ports are available.
26
# So in case of a switch port (port num 0) we need to handle all physical ports
29
# do we have a switch as the guid to duplicate?
30
set node [lindex $fromNodeNPort 0]
31
if {[lindex $fromNodeNPort 1] == 0} {
32
# just use the port 1 instead
33
set port [IBNode_getPort $node 1]
34
set fromPortName "[IBNode_name_get $node]/P0"
36
set port [IBNode_getPort $node [lindex $fromNodeNPort 1]]
37
set fromPortName [IBPort_getName $port]
39
set newGuid [IBPort_guid_get $port]
41
# do we have a switch port 0 as a target?
42
set node [lindex $toNodeNPort 0]
43
if {[lindex $toNodeNPort 1] == 0} {
44
set numPorts [IBNode_numPorts_get $node]
45
for {set pn 1} {$pn <= $numPorts} {incr pn} {
46
set port [IBNode_getPort $node $pn]
48
lappend targetPorts $port
51
set simNodeInfo [IBMSNode_getNodeInfo sim$node]
52
puts "-I- Overriding node:[IBNode_name_get $node] port guid to $newGuid (dup of $fromPortName)"
53
ib_node_info_t_port_guid_set $simNodeInfo $newGuid
55
set port [IBNode_getPort $node [lindex $toNodeNPort 1]]
60
foreach port $targetPorts {
61
puts "-I- Overriding port:[IBPort_getName $port] guid to $newGuid (dup of $fromPortName)"
62
IBPort_guid_set $port $newGuid
66
# get a random order of all the fabric endports:
67
# a list of {node port-num random}
68
proc getEndPortsByRandomOreder {fabric} {
69
# get number of nodes:
70
set nodesByName [IBFabric_NodeByName_get $fabric]
72
set nodePortNOrderList {}
73
foreach nodeNameNId [IBFabric_NodeByName_get $fabric] {
74
set node [lindex $nodeNameNId 1]
76
# each node might be a switch (then take port 0)
77
if {[IBNode_type_get $node] == 1} {
78
lappend nodePortNOrderList [list $node 0 [rmRand]]
80
# only connected ports please:
81
set numPorts [IBNode_numPorts_get $node]
82
for {set pn 1} {$pn <= $numPorts} {incr pn} {
83
set port [IBNode_getPort $node $pn]
84
if {($port != "") && ([IBPort_p_remotePort_get $port] != "")} {
85
lappend nodePortNOrderList [list $node $pn [rmRand]]
92
foreach nodePortNRnd [lsort -index 2 -real $nodePortNOrderList] {
93
lappend randNodes [lrange $nodePortNRnd 0 1]
98
# setup post SM run changes:
99
proc postSmSettings {fabric} {
100
return "-I- Nothing to be done post SM"
103
# make sure ibdiagnet reported the bad links
104
proc verifyDiagRes {fabric logFile} {
105
return "-I- Could not figure out if OK yet"
108
set fabric [IBMgtSimulator getFabric]
110
# get a random order of the end ports:
111
set randEndPorts [getEndPortsByRandomOreder $fabric]
112
set numEndPorts [llength $randEndPorts]
114
set swaps [expr int([rmRand]*$numEndPorts)/5]
116
for {set i 1} {$i <= $swaps } {incr i} {
117
set idx [expr ($i + int([rmRand]*$numEndPorts))%$numEndPorts]
118
set fromNodeNPort [lindex $randEndPorts $idx]
119
set clones [expr int([rmRand]*2)]
120
for {set j 1} {$j <= $clones} {incr j} {
121
set toNodeNPort [lindex $randEndPorts [expr ($idx+$j)%$numEndPorts]]
122
if {[catch {dupPortGuid $fromNodeNPort $toNodeNPort} e]} {
125
dupNodeGuid [lindex $fromNodeNPort 0] [lindex $toNodeNPort 0]