works properly on cross-canvas links.
Add the "blank.gif" to the install.sh script.
Bug found by:
Submitted by:
Requested by:
Reviewed by:
Approved by:
Obtained from:
proc listLANnodes { l2node l2peers } {
lappend l2peers $l2node
foreach ifc [ifcList $l2node] {
- set peer [peerByIfc $l2node $ifc]
+ set peer [logicalPeerByIfc $l2node $ifc]
set type [nodeType $peer]
if { [ lsearch {lanswitch hub} $type] != -1 } {
if { [lsearch $l2peers $peer] == -1 } {
-menu .button3menu.connect.$canvas
}
foreach peer_node $node_list {
- if { $node != $peer_node && [nodeType $peer_node] != "pseudo" } {
+ if { $node != $peer_node &&
+ [lsearch {pseudo rj45} [nodeType $peer_node]] < 0 } {
set canvas [getNodeCanvas $peer_node]
.button3menu.connect.$canvas add command \
-label [getNodeName $peer_node] \
}
-proc pseudo.layer { node } {
+proc pseudo.layer {} {
}
setLinkMirror $link1 $link2
setLinkMirror $link2 $link1
+ if {[[typemodel $lnode1].layer] == "NETWORK" } {
+ autoIPv4addr $lnode1 [ifcByPeer $lnode1 $pnode1]
+ autoIPv6addr $lnode1 [ifcByPeer $lnode1 $pnode1]
+ }
+ if {[[typemodel $lnode2].layer] == "NETWORK" } {
+ autoIPv4addr $lnode2 [ifcByPeer $lnode2 $pnode2]
+ autoIPv6addr $lnode2 [ifcByPeer $lnode2 $pnode2]
+ }
+
#
# Redraw our node so interface labels gets properly populated
#
$c delete -withtags "node && $pnode1"
$c delete -withtags "nodelabel && $pnode1"
drawNode $pnode1
+ updateIfcLabel $lnode1 $pnode1
} else {
$c delete -withtags "node && $pnode2"
$c delete -withtags "nodelabel && $pnode2"
drawNode $pnode2
+ updateIfcLabel $lnode2 $pnode2
}
return yes
set link [newObjectId link]
global $link
- set ipv4net [findFreeIPv4net 24]
- set ipv6net [findFreeIPv6net 64]
- set lannode ""
-
set ifname1 [newIfc [chooseIfName $lnode1 $lnode2] $lnode1]
lappend $lnode1 "interface-peer {$ifname1 $lnode2}"
- if { [[typemodel $lnode1].layer] == "NETWORK" && \
- [lsearch {lanswitch hub} [nodeType $lnode2]] >= 0 } {
- setIfcIPv4addr $lnode1 $ifname1 [newLANIPv4 $lnode1 $lnode2]
- setIfcIPv6addr $lnode1 $ifname1 [newLANIPv6 $lnode1 $lnode2]
- set lannode $lnode2
- } elseif { [[typemodel $lnode1].layer] == "NETWORK" } {
- setIfcIPv4addr $lnode1 $ifname1 $ipv4net.1/24
- setIfcIPv6addr $lnode1 $ifname1 $ipv6net\::1/64
- if { [nodeType $lnode1] == "pc" || \
- [nodeType $lnode1] == "host" } {
- setStatIPv4routes $lnode1 [list "0.0.0.0/0 $ipv4net.2"]
- }
- }
-
set ifname2 [newIfc [chooseIfName $lnode2 $lnode1] $lnode2]
lappend $lnode2 "interface-peer {$ifname2 $lnode1}"
- 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 "nodes {$lnode1 $lnode2}"
if { ([nodeType $lnode1] == "lanswitch" || \
}
lappend link_list $link
- if { $lannode != "" } {
- updateLANdg $lannode
+
+ if { [nodeType $lnode2] != "pseudo" &&
+ [[typemodel $lnode1].layer] == "NETWORK" } {
+ autoIPv4addr $lnode1 $ifname1
+ autoIPv6addr $lnode1 $ifname1
+ }
+ if { [nodeType $lnode1] != "pseudo" &&
+ [[typemodel $lnode2].layer] == "NETWORK" } {
+ autoIPv4addr $lnode2 $ifname2
+ autoIPv6addr $lnode2 $ifname2
}
if { [getNodeCanvas $lnode1] == $curcanvas } {
nodeEnter $c
redrawLink $link
}
+
}
return $regular
set clock_seconds 0
set oper_mode edit
set grid 24
-set sizex 1024
-set sizey 768
+set sizex 900
+set sizey 620
set curcanvas [lindex $canvas_list 0]
set autorearrange_enabled 0
lanswitch.gif link.gif pc.gif rj45.gif router.gif select.gif"
normal_icons="hub.gif frswitch.gif host.gif lanswitch.gif pc.gif \
- rj45.gif router.gif"
+ rj45.gif router.gif blank.gif"
for file in ${lib_files}; do
#
-proc findFreeIPv4net { mask } {
+proc findFreeIPv4Net { mask } {
global node_list
set ipnets {}
}
-proc newLANIPv4 { l3node bridge } {
- set peer_ipaddrs {}
- set l2nodes [listLANnodes $bridge {}]
- foreach l2node $l2nodes {
- foreach ifc [ifcList $l2node] {
- set peer [peerByIfc $l2node $ifc]
- set peer_if [ifcByPeer $peer $l2node]
- set peer_ipaddr [getIfcIPv4addr $peer $peer_if]
- if { $peer_ipaddr != "" } {
- lappend peer_ipaddrs [lindex [split $peer_ipaddr /] 0]
+proc autoIPv4addr { node iface } {
+ set peer_ip4addrs {}
+
+ if { [[typemodel $node].layer] != "NETWORK" } {
+ #
+ # Shouldn't get called at all in this case
+ #
+puts "autoIPv4 shouldn't get called for non-network layer nodes"
+ return ""
+ }
+ setIfcIPv4addr $node $iface ""
+
+ set peer_node [logicalPeerByIfc $node $iface]
+
+ if { [[typemodel $peer_node].layer] == "LINK" } {
+ foreach l2node [listLANnodes $peer_node {}] {
+ foreach ifc [ifcList $l2node] {
+ set peer [logicalPeerByIfc $l2node $ifc]
+ set peer_if [ifcByLogicalPeer $peer $l2node]
+ set peer_ip4addr [getIfcIPv4addr $peer $peer_if]
+ if { $peer_ip4addr != "" } {
+ lappend peer_ip4addrs [lindex [split $peer_ip4addr /] 0]
+ }
}
- }
+ }
+ } else {
+ set peer_if [ifcByLogicalPeer $peer_node $node]
+ set peer_ip4addr [getIfcIPv4addr $peer_node $peer_if]
+ set peer_ip4addrs [lindex [split $peer_ip4addr /] 0]
}
- switch -exact -- [nodeType $l3node] {
+ switch -exact -- [nodeType $node] {
router {
set targetbyte 1
}
set targetbyte 20
}
}
- if { $peer_ipaddrs != "" } {
- set ipnums [split [lindex $peer_ipaddrs 0] .]
+ if { $peer_ip4addrs != "" } {
+ set ipnums [split [lindex $peer_ip4addrs 0] .]
set net "[lindex $ipnums 0].[lindex $ipnums 1].[lindex $ipnums 2]"
set ipaddr $net.$targetbyte
- while { [lsearch $peer_ipaddrs $ipaddr] >= 0 } {
+ while { [lsearch $peer_ip4addrs $ipaddr] >= 0 } {
incr targetbyte
set ipaddr $net.$targetbyte
}
- return "$ipaddr/24"
+ setIfcIPv4addr $node $iface "$ipaddr/24"
} else {
- return "[findFreeIPv4net 24].$targetbyte/24"
+ setIfcIPv4addr $node $iface "[findFreeIPv4Net 24].$targetbyte/24"
}
+ return
}
-proc findLANdgIP { bridge } {
+proc findLANdgIPv4 { bridge } {
foreach ifc [ifcList $bridge] {
set peer [peerByIfc $bridge $ifc]
set peer_if [ifcByPeer $peer $bridge]
proc updateLANdg { bridge } {
- set gw [findLANdgIP $bridge]
+ set gw [findLANdgIPv4 $bridge]
if { $gw == "" } {
return
}
#
-proc findFreeIPv6net { mask } {
+proc findFreeIPv6Net { mask } {
global node_list
set ipnets {}
foreach node $node_list {
foreach ifc [ifcList $node] {
- set ipnet [lrange [split [getIfcIPv6addr $node $ifc] :] 0 3]
+ set ipnet [lrange [split [getIfcIPv6addr $node $ifc] :] 0 1]
if {[lsearch $ipnets $ipnet] == -1} {
lappend ipnets $ipnet
}
}
}
for { set i 0 } { $i <= 9999 } { incr i } {
- if {[lsearch $ipnets "fec0 0 0 $i"] == -1} {
- set ipnet "fec0:0:0:$i"
+ if {[lsearch $ipnets "a $i"] == -1} {
+ set ipnet "a:$i"
return $ipnet
}
}
}
-proc newLANIPv6 { l3node bridge } {
- set peer_ipaddrs {}
- set l2nodes [listLANnodes $bridge {}]
- foreach l2node $l2nodes {
- foreach ifc [ifcList $l2node] {
- set peer [peerByIfc $l2node $ifc]
- set peer_if [ifcByPeer $peer $l2node]
- set peer_ipaddr [getIfcIPv6addr $peer $peer_if]
- if { $peer_ipaddr != "" } {
- lappend peer_ipaddrs [lindex [split $peer_ipaddr /] 0]
+proc autoIPv6addr { node iface } {
+ set peer_ip6addrs {}
+ setIfcIPv6addr $node $iface ""
+ set peer_node [logicalPeerByIfc $node $iface]
+
+ if { [[typemodel $peer_node].layer] == "LINK" } {
+ foreach l2node [listLANnodes $peer_node {}] {
+ foreach ifc [ifcList $l2node] {
+ set peer [logicalPeerByIfc $l2node $ifc]
+ set peer_if [ifcByLogicalPeer $peer $l2node]
+ set peer_ip6addr [getIfcIPv6addr $peer $peer_if]
+ if { $peer_ip6addr != "" } {
+ lappend peer_ip6addrs [lindex [split $peer_ip6addr /] 0]
+ }
}
- }
+ }
+ } else {
+ set peer_if [ifcByLogicalPeer $peer_node $node]
+ set peer_ip6addr [getIfcIPv6addr $peer_node $peer_if]
+ set peer_ip6addrs [lindex [split $peer_ip6addr /] 0]
}
- switch -exact -- [nodeType $l3node] {
+ switch -exact -- [nodeType $node] {
router {
set targetbyte 1
}
set targetbyte 20
}
}
- if { $peer_ipaddrs != "" } {
- set ipnums [split [lindex $peer_ipaddrs 0] :]
+ if { $peer_ip6addrs != "" } {
+ set ipnums [split [lindex $peer_ip6addrs 0] :]
set net "[lindex $ipnums 0]:[lindex $ipnums 1]"
set ipaddr $net\::$targetbyte
- while { [lsearch $peer_ipaddrs $ipaddr] >= 0 } {
+ while { [lsearch $peer_ip6addrs $ipaddr] >= 0 } {
incr targetbyte
set ipaddr $net\::$targetbyte
}
- return "$ipaddr/64"
+ setIfcIPv6addr $node $iface "$ipaddr/64"
} else {
- return "[findFreeIPv6net 64]::$targetbyte/64"
+ setIfcIPv6addr $node $iface "[findFreeIPv6Net 64]::$targetbyte/64"
}
+ return
+}
+
+proc newLANIPv6 { l3node bridge } {
}
}
+proc logicalPeerByIfc { node ifc } {
+ global $node
+
+ set peer [peerByIfc $node $ifc]
+ if { [nodeType $peer] != "pseudo" } {
+ return $peer
+ } else {
+ set mirror_node [getNodeMirror $peer]
+ set mirror_ifc [ifcList $mirror_node]
+ return [peerByIfc $mirror_node $mirror_ifc]
+ }
+}
+
+
proc ifcByPeer { node peer } {
global $node
}
+proc ifcByLogicalPeer { node peer } {
+ global $node
+
+ set ifc [ifcByPeer $node $peer]
+ if { $ifc == "" } {
+ #
+ # Must search through pseudo peers
+ #
+ foreach ifc [ifcList $node] {
+ set t_peer [peerByIfc $node $ifc]
+ if { [nodeType $t_peer] == "pseudo" } {
+ set mirror [getNodeMirror $t_peer]
+ if { [peerByIfc $mirror [ifcList $mirror]] == $peer } {
+ return $ifc
+ }
+ }
+ }
+ return ""
+ } else {
+ return $ifc
+ }
+}
+
+
proc hasIPv4Addr { node } {
foreach ifc [ifcList $node] {
if { [getIfcIPv4addr $node $ifc] != "" } {