proc removeGUILink { link } {
global .c
- removeLink $link
+ set nodes [linkPeers $link]
+ set node1 [lindex $nodes 0]
+ set node2 [lindex $nodes 1]
+ if { [nodeType $node1] == "pseudo" } {
+ removeLink [getLinkMirror $link]
+ removeLink $link
+ removeNode [getNodeMirror $node1]
+ removeNode $node1
+ .c delete $node1
+ } elseif { [nodeType $node2] == "pseudo" } {
+ removeLink [getLinkMirror $link]
+ removeLink $link
+ removeNode [getNodeMirror $node2]
+ removeNode $node2
+ .c delete $node2
+ } else {
+ removeLink $link
+ }
.c delete $link
return
}
proc removeGUINode { node } {
global .c
+ set type [nodeType $node]
foreach ifc [ifcList $node] {
set peer [peerByIfc $node $ifc]
set link [lindex [.c gettags "link && $node && $peer"] 1]
removeGUILink $link
}
- removeNode $node
- .c delete $node
+ if { $type != "pseudo" } {
+ removeNode $node
+ .c delete $node
+ }
return
}
proc drawNode { node } {
global showNodeLabels
- global router pc host lanswitch frswitch rj45 hub
+ global router pc host lanswitch frswitch rj45 hub pseudo
set type [nodeType $node]
set coords [getNodeCoords $node]
set coords [getNodeLabelCoords $node]
set x [lindex $coords 0]
set y [lindex $coords 1]
- set label [.c create text $x $y -fill blue -text "[getNodeName $node]" \
- -tags "nodelabel $node"]
+ if { [nodeType $node] != "pseudo" } {
+ set label [.c create text $x $y -fill blue \
+ -text "[getNodeName $node]" \
+ -tags "nodelabel $node"]
+ } else {
+ set pnode [getNodeName $node]
+ set pcanvas [getNodeCanvas $pnode]
+ set ifc [ifcByPeer $pnode [getNodeMirror $node]]
+ set label [.c create text $x $y -fill blue \
+ -text "$ifc@[getNodeName $pnode]\r([getCanvasName $pcanvas])" \
+ -tags "nodelabel $node" -justify center]
+ }
if { $showNodeLabels == 0} {
.c itemconfigure $label -state hidden
}
set lnode2 [lindex $nodes 1]
set newlink [.c create line 0 0 0 0 \
-fill $defLinkColor -width $defLinkWidth \
- -tags "link $link $lnode1 $lnode2"]
+ -tags "link $link $lnode1 $lnode2" \
+ -arrow both]
.c raise $newlink background
set newlink [.c create line 0 0 0 0 \
- -fill white -width [expr $defLinkWidth * 4 ] \
+ -fill white -width [expr $defLinkWidth * 3 ] \
-tags "link $link $lnode1 $lnode2"]
.c raise $newlink background
.c create text 0 0 -tags "linklabel $link" -justify center
#
# Configure node
#
- .button3menu add command -label "Configure" \
- -command "popupConfigDialog $c"
+ if { [nodeType $node] != "pseudo" } {
+ .button3menu add command -label "Configure" \
+ -command "popupConfigDialog $c"
+ } else {
+ .button3menu add command -label "Configure" \
+ -command "popupConfigDialog $c" -state disabled
+ }
#
# Create a new link - can be between different canvases
#
.button3menu.connect delete 0 end
- if { $oper_mode == "exec" } {
+ if { $oper_mode == "exec" || [nodeType $node] == "pseudo" } {
.button3menu add cascade -label "Create link to" \
-menu .button3menu.connect -state disabled
} else {
-menu .button3menu.connect.$canvas
}
foreach peer_node $node_list {
- if { $node != $peer_node } {
+ if { $node != $peer_node && [nodeType $peer_node] != "pseudo" } {
set canvas [getNodeCanvas $peer_node]
.button3menu.connect.$canvas add command \
-label [getNodeName $peer_node] \
}
if { $curobj == $background } {
if { [lsearch {select link} $activetool] < 0 } {
- set node [newObjectId node]
- global $node
- lappend $node "type $activetool"
- if { $activetool == "router" } {
- lappend $node "model $def_router_model"
- }
- if {$activetool == "router"} {
- set nconfig [list \
- "hostname $activetool[string range $node 1 end]" \
- ! \
- "router rip" \
- " redistribute static" \
- " redistribute connected" \
- " network 0.0.0.0/0" \
- ! \
- "router ripng" \
- " redistribute static" \
- " redistribute connected" \
- " network ::/0" \
- ! ]
- } elseif {$activetool == "rj45"} {
- set nconfig [list \
- "hostname UNASSIGNED" \
- ! ]
- } else {
- set nconfig [list \
- "hostname $activetool[string range $node 1 end]" \
- ! ]
- }
- lappend $node "network-config [list $nconfig]"
- lappend node_list $node
+ set node [newNode $activetool]
setNodeCanvas $node $curcanvas
setNodeCoords $node "$x $y"
set dy 32
set lastY $y
if {$selectbox != ""} {
# We actually shouldn't get here!
-puts XXXX 1
$c delete $selectbox
set selectbox ""
}
}
+proc pseudo.layer { node } {
+}
+
+
proc newLink { c lnode1 lnode2 } {
global link_list
global $lnode1 $lnode2
global defEthBandwidth defSerBandwidth defSerDelay
global defLinkColor defLinkWidth
+ global curcanvas
#
- # We still do not support linking objects in different canvases.
+ # When linking nodes residing in different canvases, we actually
+ # have to create a connector-type pseudo-node in each canvas, and
+ # then recursively call newLink to connect requested nodes to those
+ # automatically created pseudo-nodes
#
if { [getNodeCanvas $lnode1] != [getNodeCanvas $lnode2] } {
- return no
+ set pnode1 [newNode pseudo]
+ setNodeCanvas $pnode1 [getNodeCanvas $lnode1]
+ setNodeName $pnode1 $lnode2
+ setNodeCoords $pnode1 "100 100"
+ setNodeLabelCoords $pnode1 "100 100"
+ if { [getNodeCanvas $lnode1] == $curcanvas } {
+ drawNode $pnode1
+ }
+
+ set pnode2 [newNode pseudo]
+ setNodeCanvas $pnode2 [getNodeCanvas $lnode2]
+ setNodeName $pnode2 $lnode1
+ setNodeCoords $pnode2 "100 100"
+ setNodeLabelCoords $pnode2 "100 100"
+ if { [getNodeCanvas $lnode2] == $curcanvas } {
+ drawNode $pnode2
+ }
+
+ setNodeMirror $pnode1 $pnode2
+ setNodeMirror $pnode2 $pnode1
+
+ newLink $c $lnode1 $pnode1
+ newLink $c $lnode2 $pnode2
+
+ set link1 [linkByPeers $lnode1 $pnode1]
+ set link2 [linkByPeers $lnode2 $pnode2]
+ setLinkMirror $link1 $link2
+ setLinkMirror $link2 $link1
+
+ #
+ # Redraw our node so interface labels gets properly populated
+ #
+ if { [getNodeCanvas $lnode1] == $curcanvas } {
+ $c delete -withtags "node && $pnode1"
+ $c delete -withtags "nodelabel && $pnode1"
+ drawNode $pnode1
+ } else {
+ $c delete -withtags "node && $pnode2"
+ $c delete -withtags "nodelabel && $pnode2"
+ drawNode $pnode2
+ }
+
+ return yes
}
set regular yes
}
foreach link $link_list {
+ #
+ # XXX what is this -> makes no sense / cannot work!
+ #
global $link
if { [$c find withtag "link && $lnode1 && $lnode2"] != "" } {
set regular no
set ifname2 [newIfc [chooseIfName $lnode2 $lnode1] $lnode2]
lappend $lnode2 "interface-peer {$ifname2 $lnode1}"
- if { [[typemodel $lnode2].layer] == "NETWORK" && \
- [lsearch {lanswitch hub} [nodeType $lnode1]] >= 0 } {
- setIfcIPv4addr $lnode2 $ifname2 [newLANIPv4 $lnode2 $lnode1]
- setIfcIPv6addr $lnode2 $ifname2 [newLANIPv6 $lnode2 $lnode1]
- set lannode $lnode1
- } elseif { [[typemodel $lnode2].layer] == "NETWORK" } {
- setIfcIPv4addr $lnode2 $ifname2 $ipv4net.2/24
- setIfcIPv6addr $lnode2 $ifname2 $ipv6net\::2/64
- if { [nodeType $lnode2] == "pc" || \
- [nodeType $lnode2] == "host" } {
- setStatIPv4routes $lnode2 [list "0.0.0.0/0 $ipv4net.1"]
+ if { [nodeType $lnode2] != "pseudo" } {
+ if { [[typemodel $lnode2].layer] == "NETWORK" && \
+ [lsearch {lanswitch hub} [nodeType $lnode1]] >= 0 } {
+ setIfcIPv4addr $lnode2 $ifname2 [newLANIPv4 $lnode2 $lnode1]
+ setIfcIPv6addr $lnode2 $ifname2 [newLANIPv6 $lnode2 $lnode1]
+ set lannode $lnode1
+ } elseif { [[typemodel $lnode2].layer] == "NETWORK" } {
+ setIfcIPv4addr $lnode2 $ifname2 $ipv4net.2/24
+ setIfcIPv6addr $lnode2 $ifname2 $ipv6net\::2/64
+ if { [nodeType $lnode2] == "pc" || \
+ [nodeType $lnode2] == "host" } {
+ setStatIPv4routes $lnode2 [list "0.0.0.0/0 $ipv4net.1"]
+ }
}
}
}
lappend link_list $link
- drawLink $link
- updateLinkLabel $link
if { $lannode != "" } {
updateLANdg $lannode
}
- nodeEnter $c
- redrawLink $link
+
+ if { [getNodeCanvas $lnode1] == $curcanvas } {
+ drawLink $link
+ updateLinkLabel $link
+ nodeEnter $c
+ redrawLink $link
+ }
}
return $regular
switch -exact -- $object_type {
node {
set type [nodeType $target]
+ if { $type == "pseudo" } {
+ destroy $wi
+ return
+ }
set model [getNodeModel $target]
set router_model $model
wm title $wi "$type configuration"
return
}
switch -exact -- $object_type {
+ #
+ # Node
+ #
node {
set type [nodeType $target]
set model [getNodeModel $target]
}
}
+ #
+ # Link
+ #
link {
set bw [$wi.bandwidth.value get]
if { $bw != [getLinkBandwidth $target] } {