From b3629f7a8980ba64fa06ce3ab0d096c84edf67bf Mon Sep 17 00:00:00 2001 From: Josip Rodin Date: Sun, 13 Sep 2009 18:38:00 +0200 Subject: [PATCH] bah, da bi radili brctl itd, moramo imati interfaceove dignute, tako da i u deployCfg moramo pomaknuti bridging kod nakon start --- linux/exec.tcl | 312 ++++++++++++++++++++++++------------------------- 1 file changed, 153 insertions(+), 159 deletions(-) diff --git a/linux/exec.tcl b/linux/exec.tcl index 4a9152e..01a8ab5 100755 --- a/linux/exec.tcl +++ b/linux/exec.tcl @@ -407,7 +407,7 @@ proc l3node.start { eid node } { # puts " nexec vimage $eid vimage -i $node $ifid $ifc " # na Linux/OpenVZ ne moramo pokrenuti createIfc/vimage, samo izvaditi # ime interfacea iz ngnodemapa za vzctl --netif_add - set ifid ngnodemap($ifc@$node_id) + set ifid $ngnodemap($ifc@$node_id) set peer [peerByIfc $node $ifc] @@ -702,178 +702,172 @@ proc deployCfg {} { } } + foreach node $node_list { + upvar 0 ::cf::[set ::curcfg]::[set node] $node + set type [nodeType $node] + if { $type == "pseudo" } { + continue + } + statline "Starting node [getNodeName $node]" + [typemodel $node].start $eid $node + } + ## TODO: Podesavanje l2 parametara for { set pending_links $link_list } { $pending_links != "" } {} { - set link [lindex $pending_links 0] - set i [lsearch -exact $pending_links $link] - set pending_links [lreplace $pending_links $i $i] - - set lnode1 [lindex [linkPeers $link] 0] - set lnode2 [lindex [linkPeers $link] 1] - set ifname1 [ifcByPeer $lnode1 $lnode2] - set ifname2 [ifcByPeer $lnode2 $lnode1] + set link [lindex $pending_links 0] + set i [lsearch -exact $pending_links $link] + set pending_links [lreplace $pending_links $i $i] - if { [getLinkMirror $link] != "" } { - set mirror_link [getLinkMirror $link] - set i [lsearch -exact $pending_links $mirror_link] - set pending_links [lreplace $pending_links $i $i] + set lnode1 [lindex [linkPeers $link] 0] + set lnode2 [lindex [linkPeers $link] 1] + set ifname1 [ifcByPeer $lnode1 $lnode2] + set ifname2 [ifcByPeer $lnode2 $lnode1] - statline "Creating link $link/$mirror_link" + if { [getLinkMirror $link] != "" } { + set mirror_link [getLinkMirror $link] + set i [lsearch -exact $pending_links $mirror_link] + set pending_links [lreplace $pending_links $i $i] - set p_lnode2 $lnode2 - set lnode2 [lindex [linkPeers $mirror_link] 0] - set ifname2 [ifcByPeer $lnode2 [getNodeMirror $p_lnode2]] - } else { - statline "Creating link $link" - } + statline "Creating link $link/$mirror_link" - set lname $lnode1-$lnode2 - set bandwidth [expr [getLinkBandwidth $link] + 0] - set delay [expr [getLinkDelay $link] + 0] - set ber [expr [getLinkBER $link] + 0] - set dup [expr [getLinkDup $link] + 0] - - set peer1 \ - [lindex [[typemodel $lnode1].nghook $eid $lnode1 $ifname1] 0] - set peer2 \ - [lindex [[typemodel $lnode2].nghook $eid $lnode2 $ifname2] 0] - set ngpeer1 $ngnodemap($peer1) - set ngpeer2 $ngnodemap($peer2) - set nghook1 \ - [lindex [[typemodel $lnode1].nghook $eid $lnode1 $ifname1] 1] - set nghook2 \ - [lindex [[typemodel $lnode2].nghook $eid $lnode2 $ifname2] 1] - -# puts ">>>>>>>>>>kreiranje linkova" -# puts " nexec vimage $eid ngctl mkpeer $ngpeer1: pipe $nghook1 upper " -# puts " nexec vimage $eid ngctl name $ngpeer1:$nghook1 $lname " -# puts " nexec vimage $eid ngctl connect $lname: $ngpeer2: lower $nghook2 " -# puts ">>>>>>>>>>kreiranje linkova" - - - # OpenVZ kreiranje linkova + set p_lnode2 $lnode2 + set lnode2 [lindex [linkPeers $mirror_link] 0] + set ifname2 [ifcByPeer $lnode2 [getNodeMirror $p_lnode2]] + } else { + statline "Creating link $link" + } - upvar 0 ::cf::[set ::curcfg]::bridges bridges - - #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 "b$eid$lnode1" - set bridge_node $lnode1 - } else { - set port_if $ngpeer1 - set bridge "b$eid$lnode2" - set bridge_node $lnode2 - } - } + set lname $lnode1-$lnode2 + set bandwidth [expr [getLinkBandwidth $link] + 0] + set delay [expr [getLinkDelay $link] + 0] + set ber [expr [getLinkBER $link] + 0] + set dup [expr [getLinkDup $link] + 0] + + set peer1 \ + [lindex [[typemodel $lnode1].nghook $eid $lnode1 $ifname1] 0] + set peer2 \ + [lindex [[typemodel $lnode2].nghook $eid $lnode2 $ifname2] 0] + set ngpeer1 $ngnodemap($peer1) + set ngpeer2 $ngnodemap($peer2) + set nghook1 \ + [lindex [[typemodel $lnode1].nghook $eid $lnode1 $ifname1] 1] + set nghook2 \ + [lindex [[typemodel $lnode2].nghook $eid $lnode2 $ifname2] 1] - - # 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 { $result == "invalid command name \"$bridge\""} { - puts "\nBridge $bridge (L2 hub emulation) already exists." - } else { - puts "\nCreating bridge $bridge (L2 hub emulation)" - nexec brctl addbr $bridge - lappend bridges $bridge - } - - #TODO ovo bas ne radi, ne moze komunicirati sa fizickim interface-om, iako je - #uredno pridruzen bridge interface-u - # - #RJ45 se ponasa kao L2 device, tj. hub, samo u njega treba odmah joinati - #odgovarajuci fizicki interface koji je rucno upisan u gui - - if { [nodeType $bridge_node] == "rj45" } { - set bridge_name [getNodeName $bridge_node] - nexec brctl addif $bridge $bridge_name - puts " RJ45 emulacija, spojen na $bridge_name na hostu." - } - - #dodaje interface - nexec brctl addif $bridge $port_if - #dize bridge, interesantno ne baca error ako je bridge vec dignut - nexec ifconfig $bridge up +# FreeBSD-specific: +# puts " nexec vimage $eid ngctl mkpeer $ngpeer1: pipe $nghook1 upper " +# puts " nexec vimage $eid ngctl name $ngpeer1:$nghook1 $lname " +# puts " nexec vimage $eid ngctl connect $lname: $ngpeer2: lower $nghook2 " +# # Ethernet frame has a 14-byte header - this is a temp. hack!!! +# puts " nexec vimage $eid ngctl msg $lname: setcfg { header_offset=14 } " +# # Link parameters +# puts " nexec vimage $eid ngctl msg $lname: setcfg +# { bandwidth=$bandwidth delay=$delay +# upstream={ BER=$ber duplicate=$dup } +# downstream={ BER=$ber duplicate=$dup } } " +# # Queues +# foreach node [list $lnode1 $lnode2] { +# if { $node == $lnode1 } { +# set ifc $ifname1 +# } else { +# set ifc $ifname2 +# } +# if { [nodeType $lnode1] != "rj45" && \ +# [nodeType $lnode2] != "rj45" } { +# execSetIfcQDisc $eid $node $ifc [getIfcQDisc $node $ifc] +# execSetIfcQDrop $eid $node $ifc [getIfcQDrop $node $ifc] +# execSetIfcQLen $eid $node $ifc [getIfcQLen $node $ifc] +# } +# } - puts " L2 device $bridge is up, added interface $port_if" +# Linux/OpenVZ kreiranje linkova + + upvar 0 ::cf::[set ::curcfg]::bridges bridges + + #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 "b$eid$lnode1" + set bridge_node $lnode1 + } else { + set port_if $ngpeer1 + set bridge "b$eid$lnode2" + set bridge_node $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 { $result == "invalid command name \"$bridge\""} { + puts "\nBridge $bridge (L2 hub emulation) already exists." + } else { + puts "\nCreating bridge $bridge (L2 hub emulation)" + nexec brctl addbr $bridge + lappend bridges $bridge + } + + #TODO ovo bas ne radi, ne moze komunicirati sa fizickim interface-om, iako je + #uredno pridruzen bridge interface-u + # + #RJ45 se ponasa kao L2 device, tj. hub, samo u njega treba odmah joinati + #odgovarajuci fizicki interface koji je rucno upisan u gui + + if { [nodeType $bridge_node] == "rj45" } { + set bridge_name [getNodeName $bridge_node] + nexec brctl addif $bridge $bridge_name + puts " RJ45 emulacija, spojen na $bridge_name na hostu." + } + + #dodaje interface + nexec brctl addif $bridge $port_if + #dize bridge, interesantno ne baca error ako je bridge vec dignut + nexec ifconfig $bridge up + + puts " L2 device $bridge is up, added interface $port_if" - } else { - # Slucaj kad se radi link izmedju dva L3 uredjaja (standardno) - set host_if_a $ngpeer1 - set host_if_b $ngpeer2 - set bridge "b$eid$lname" - set bridge_node $lname - - puts "\nCreating bridge $bridge" - - nexec brctl addbr $bridge - lappend bridges $bridge - nexec brctl addif $bridge $host_if_a - nexec brctl addif $bridge $host_if_b - nexec ifconfig $bridge up - puts " Bridge $bridge is up, added interface $host_if_a and $host_if_b" - } + } else { + # Slucaj kad se radi link izmedju dva L3 uredjaja (standardno) + set host_if_a $ngpeer1 + set host_if_b $ngpeer2 + set bridge "b$eid$lname" + set bridge_node $lname -# FreeBSD-specific -# # Ethernet frame has a 14-byte header - this is a temp. hack!!! -# puts " nexec vimage $eid ngctl msg $lname: setcfg { header_offset=14 } " - -# # Link parameters -# puts " nexec vimage $eid ngctl msg $lname: setcfg -# { bandwidth=$bandwidth delay=$delay -# upstream={ BER=$ber duplicate=$dup } -# downstream={ BER=$ber duplicate=$dup } } " - -# # Queues -# foreach node [list $lnode1 $lnode2] { -# if { $node == $lnode1 } { -# set ifc $ifname1 -# } else { -# set ifc $ifname2 -# } - -# if { [nodeType $lnode1] != "rj45" && \ -# [nodeType $lnode2] != "rj45" } { -# execSetIfcQDisc $eid $node $ifc [getIfcQDisc $node $ifc] -# execSetIfcQDrop $eid $node $ifc [getIfcQDrop $node $ifc] -# execSetIfcQLen $eid $node $ifc [getIfcQLen $node $ifc] -# } -# } -# } + puts "\nCreating bridge $bridge" - foreach node $node_list { - upvar 0 ::cf::[set ::curcfg]::[set node] $node - set type [nodeType $node] - if { $type == "pseudo" } { - continue + nexec brctl addbr $bridge + lappend bridges $bridge + nexec brctl addif $bridge $host_if_a + nexec brctl addif $bridge $host_if_b + nexec ifconfig $bridge up + puts " Bridge $bridge is up, added interface $host_if_a and $host_if_b" } - statline "Configuring node [getNodeName $node]" - [typemodel $node].start $eid $node - } + + } statline "Network topology instantiated in [expr [clock seconds] - $t_start] seconds ([llength $node_list] nodes and [llength $link_list] links)." -- 2.39.5