From cce37bcd1c131470f034bb31cc2e2cee8c59c13c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kosta=20Pribi=C4=87?= Date: Wed, 9 Sep 2009 22:32:08 +0200 Subject: [PATCH] Implementiran hub kao L2 bridge interface. Dobro radi za hostove, konceptualni problemi se jave kad treba spojiti dva huba direktno. --- linux/exec.tcl | 65 +++++++++++++++++++++++++++++++++++++------------- linux/host.tcl | 5 ---- linux/hub.tcl | 7 ++++-- test1.imn | 24 ++++++++++++++++--- 4 files changed, 74 insertions(+), 27 deletions(-) diff --git a/linux/exec.tcl b/linux/exec.tcl index 7a7c3b7..cdf1abf 100755 --- a/linux/exec.tcl +++ b/linux/exec.tcl @@ -302,7 +302,7 @@ proc l3node.instantiate { eid node } { set peer [peerByIfc $node $ifc] - puts " Node $node na lokalnom interfaceu (\$ifc) $ifc vidi (\$peer) $peer" + puts " Interface $ifc at $node links to $peer" if { [nodeType $peer] == "rj45" } { # TODO: RJ-45 nodes zasad ne podrzavamo @@ -641,7 +641,7 @@ proc deployCfg {} { } } -## TODO: kreiranje linkova i podesavanje l2 parametara +## TODO: Podesavanje l2 parametara for { set pending_links $link_list } { $pending_links != "" } {} { set link [lindex $pending_links 0] @@ -691,25 +691,56 @@ proc deployCfg {} { # puts ">>>>>>>>>>kreiranje linkova" + # OpenVZ kreiranje linkova - if { [[typemodel $lnode1].layer] == "LINK" || [[typemodel $lnode2].layer] == "LINK" } { - #slucaj kad se spaja na L2 uredjaj (hub) + #detekcija da li je link prema L3 node-u (host, pc) ili prema L2 nodeu (hub, switch) + if { [[typemodel $lnode1].layer] == "LINK" || [[typemodel $lnode2].layer] == "LINK" } { + #jedan od nodeova je sigurno L2, sad provjerava da li se radi o vezi izmedju + #dva L2 uredjaja + if { [[typemodel $lnode1].layer] == "LINK" && [[typemodel $lnode2].layer] == "LINK" } { + #TODO do something here!!! + #slucaj kad su spojena dva huba!! + puts "\n\n*********************************************************************" + puts "**** Panic! Panic! Spojena su dva huba, nemogu ja to!! ***\n" + puts "*********************************************************************\n\n" + puts "Klikni Eksperiment -> Terminate za uredan cleanup." + } else { + # za slucaj kad se L3 spaja na L2 treba detektirati koji je koji te dodati + # L3 host side interface u odgovarajuci bridge + if { [[typemodel $lnode1].layer] == "LINK" } { + set port_if $ngpeer2 + set bridge $lnode1 + } else { + set port_if $ngpeer1 + set bridge $lnode2 + } + } + + # TODO Ovo bi trebalo elegantnije rjesiti. + # Naredba pokusava utvrditi da li vec postoji bridge pod tim imenom, + # ako ima onda ga netreba ponovo stvarati nego samo doda interface. + # + # Problem je u nacinu kako exec radi. + # Ovdje ustvari ispadne $result="child process exited abnormally" za + # slucaj kada ne nadje rezultat natrag. + # Kad nadje vrijednost, vraca u obliku: + # invalid command name "ime_bridgea" + + set status [catch { [exec brctl show | grep -v interfaces | awk {{ print $1 }} | grep $bridge] } result] - if { [[typemodel $lnode1].layer] == "LINK" } { - set port_if $ngpeer2 - set bridge $lnode1 + if { $result == "invalid command name \"$bridge\""} { + puts "\nBridge $bridge (L2 hub emulation) already exists." } else { - set port_if $ngpeer1 - set bridge $lnode2 - } - - puts "\nCreating bridge $bridge (L2 hub emulation)" - - nexec brctl addbr $bridge + puts "\nCreating bridge $bridge (L2 hub emulation)" + nexec brctl addbr $bridge + } + + #dodaje interface nexec brctl addif $bridge $port_if - nexec ifconfig $bridge up + #dize bridge, interesantno ne baca error ako je bridge vec dignut + nexec ifconfig $bridge up - puts " L2 device $bridge is up, connected interface port_if" + puts " L2 device $bridge is up, added interface $port_if" } else { # Slucaj kad se radi link izmedju dva L3 uredjaja (standardno) @@ -723,7 +754,7 @@ proc deployCfg {} { nexec brctl addif $bridge $host_if_a nexec brctl addif $bridge $host_if_b nexec ifconfig $bridge up - puts " Bridge $bridge is up, connected interfaces $host_if_a and $host_if_b" + puts " Bridge $bridge is up, added interface $host_if_a and $host_if_b" } # FreeBSD-specific diff --git a/linux/host.tcl b/linux/host.tcl index b247469..9401913 100755 --- a/linux/host.tcl +++ b/linux/host.tcl @@ -99,11 +99,9 @@ proc $MODULE.cfggen { node } { foreach statrte [getStatIPv4routes $node] { lappend cfg "route -q add -inet $statrte" - puts " >>>>>>>>>>>>>>>> dodana IPV4 ruta $statrte" } foreach statrte [getStatIPv6routes $node] { lappend cfg "route -q add -inet6 $statrte" - puts " >>>>>>>>>>>>>>>> dodana IPV6 ruta $statrte" } # Temporary fix to enable multiple inetd and rpcbind processes @@ -169,15 +167,12 @@ proc $MODULE.shellcmd { node } { # duljina je uvijek 3 if { [llength $ret] == 3 } { - puts " >>>>>> nasao sam [lindex $ret 1]" return [lindex $ret 1] } else { set ret [nexec whereis -b tcsh] if { [llength $ret] == 2 } { - puts " >>>>>> nasao sam [lindex $ret 1]" return [lindex $ret 1] } else { - puts " >>>>>> nasao sam /bin/sh" return "/bin/sh" } } diff --git a/linux/hub.tcl b/linux/hub.tcl index 04eb596..9bde62b 100755 --- a/linux/hub.tcl +++ b/linux/hub.tcl @@ -74,7 +74,10 @@ proc $MODULE.layer {} { proc $MODULE.instantiate { eid node } { upvar 0 ::cf::[set ::curcfg]::ngnodemap ngnodemap - puts "\nhub.INSTANTIATE" + +# puts "\nhub.INSTANTIATE" +# puts " Ne radi nista. Sve se rjesava prilikom dodavanja pojedinih linkova. + #puts " catch {exec vimage $eid ngctl mkpeer hub anchor anchor | tail -1} resp" #puts " catch {exec vimage $eid ngctl l | fgrep \" Name: \" | cut -c51-58 | xargs echo } nglist" #set id [lindex $nglist 0] @@ -82,7 +85,7 @@ proc $MODULE.instantiate { eid node } { #puts " >>> id = $id" #puts " catch {exec vimage $eid ngctl name \[$id\]: $node}" set ngnodemap($eid\.$node) $node - puts " >>>$eid\.$node $node" + } #****f* hub.tcl/hub.start diff --git a/test1.imn b/test1.imn index a392200..53ac29b 100644 --- a/test1.imn +++ b/test1.imn @@ -12,7 +12,7 @@ node n0 { canvas c0 iconcoords {168.0 192.0} labelcoords {168.0 224.0} - interface-peer {eth0 n1} + interface-peer {eth0 n2} } node n1 { @@ -29,11 +29,29 @@ node n1 { canvas c0 iconcoords {504.0 192.0} labelcoords {504.0 224.0} - interface-peer {eth0 n0} + interface-peer {eth0 n2} +} + +node n2 { + type hub + network-config { + hostname n2 + ! + } + canvas c0 + iconcoords {336.0 288.0} + labelcoords {336.0 312.0} + interface-peer {e0 n0} + interface-peer {e1 n1} } link l0 { - nodes {n0 n1} + nodes {n0 n2} + bandwidth 0 +} + +link l1 { + nodes {n2 n1} bandwidth 0 } -- 2.39.5