]> git.entuzijast.net Git - imunes.git/commitdiff
Improved IP address assignment in LANs / broadcast domains comprised of
authormarko <marko>
Fri, 8 Jul 2005 13:13:45 +0000 (13:13 +0000)
committermarko <marko>
Fri, 8 Jul 2005 13:13:45 +0000 (13:13 +0000)
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

index 663fe57dcd06b339584400af0bc51b9d54d51a61..d3e024360b018102bc01edc3a7440a7809be29c0 100755 (executable)
@@ -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"
     }
 }