From 3168c1af08d342ae71dc06f958ef51287437beae Mon Sep 17 00:00:00 2001 From: marko Date: Fri, 8 Jul 2005 13:13:45 +0000 Subject: [PATCH] Improved IP address assignment in LANs / broadcast domains comprised of multiple interconnected switches / hubs. The new code recursively traverses all directly connected link-layer nodes in a search for an appropriate subnet and host address. Bug found by: nikola Submitted by: Requested by: Reviewed by: Approved by: Obtained from: --- editor.tcl | 58 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/editor.tcl b/editor.tcl index 663fe57..d3e0243 100755 --- a/editor.tcl +++ b/editor.tcl @@ -469,7 +469,34 @@ proc findFreeIPnet { mask } { } +proc listLANnodes { l2node l2peers } { + lappend l2peers $l2node + foreach ifc [ifcList $l2node] { + set peer [peerByIfc $l2node $ifc] + set type [nodeType $peer] + if { [ lsearch {lanswitch hub} $type] != -1 } { + if { [lsearch $l2peers $peer] == -1 } { + set l2peers [listLANnodes $peer $l2peers] + } + } + } + return $l2peers +} + + proc newLANIP { 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 [getIfcIPaddr $peer $peer_if] + if { $peer_ipaddr != "" } { + lappend peer_ipaddrs [lindex [split $peer_ipaddr /] 0] + } + } + } switch -exact -- [nodeType $l3node] { router { set targetbyte 1 @@ -481,30 +508,17 @@ proc newLANIP { l3node bridge } { set targetbyte 20 } } - set ipaddr "" - foreach pass {1 2} { - foreach ifc [ifcList $bridge] { - set peer [peerByIfc $bridge $ifc] - set peer_if [ifcByPeer $peer $bridge] - set peer_ipaddr [getIfcIPaddr $peer $peer_if] - if { $peer_ipaddr == "" } { - continue - } - set ipnums [split $peer_ipaddr .] - set net "[lindex $ipnums 0].[lindex $ipnums 1].[lindex $ipnums 2]" - set host "[lindex [split [lindex $ipnums 3] /] 0]" - if { $pass == 1} { - set ipaddr "$net.$targetbyte" - break - } elseif { $ipaddr == "$net.$host" } { - set ipaddr "$net.[expr $host + 1]" - } + if { $peer_ipaddrs != "" } { + set ipnums [split [lindex $peer_ipaddrs 0] .] + set net "[lindex $ipnums 0].[lindex $ipnums 1].[lindex $ipnums 2]" + set ipaddr $net.$targetbyte + while { [lsearch $peer_ipaddrs $ipaddr] >= 0 } { + incr targetbyte + set ipaddr $net.$targetbyte } - } - if { $ipaddr == "" } { - return "[findFreeIPnet 24].$targetbyte/24" - } else { return "$ipaddr/24" + } else { + return "[findFreeIPnet 24].$targetbyte/24" } } -- 2.39.5