}
+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
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"
}
}