# 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]
}
}
+ 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)."