# Python version of OneBottleneck.java import sys from jarray import zeros from jarray import array from java.lang import * from drcl.comp import * from drcl.inet import * from drcl.inet.data import RTKey from drcl.inet.data import RTEntry from drcl.inet.transport import TCP from drcl.inet.transport import TCPSink from drcl.inet.core import PktDispatcher from drcl.inet.core import RT from drcl.ruv.Commands import * from drcl.data import BitSet from drcl.sim import SimulatorAssistant from drcl.sim.event import * from drcl.ruv import CommandTask argc = len(sys.argv) if argc < 2: print "Usage: onebottleneck.py <\#connections> ?interval? ?event? ?radix?" System.exit(0) nc_ = int(sys.argv[0]) simulationTime = int(sys.argv[1]) linkemu_ = 1 event_ = 0 radix_ = 0 interval_ = 100 for i in range(2,argc): arg_ = sys.argv[i] if arg_=='event': event_ = 1 elif arg_ == 'radix': radix_ = 1 elif String(arg_).indexOf('interval')==0: interval_ = Integer.parseInt(arg_[8:]) print "Constructing a network of", (2*nc_+2), "nodes with", nc_, "TCP connections" print "Simulation time =", simulationTime if event_: print "-- event simulation engine --" if radix_: print "-- radix tree routing table --" RT.IMPLEMENTATION = RT.RADIX_TREE print "interval = ", interval_ starttime = System.currentTimeMillis() senders_ = zeros(nc_, Node) receivers_ = zeros(nc_, Node) root_ = mkdir("drcl.comp.Component", "/test") # senders and router0 take address space (0, addrDivider-1) # receivers and router1 take address space (addrDivider, 2*addrDivider-1) addrDivider = 1L; while addrDivider < (nc_+1): addrDivider<<=1 print "address divider =", addrDivider print "Create topology..." # adjacency matrix adjMatrix_ = [zeros(nc_+1, "i"), zeros(nc_+1, "i")] adjMatrix_[0][0] = 1 adjMatrix_[1][0] = 0 for i in range(0,nc_): adjMatrix_[0][i+1] = i+2; adjMatrix_[1][i+1] = i+nc_+2; for i in range(0,nc_): adjMatrix_.append(zeros(1, "i")); for i in range(0,nc_): adjMatrix_.append(array([1], "i")); if linkemu_ == 0: link_ = Link(); link_.setPropDelay(0.01); else: link_ = None; InetUtil.createTopology(root_, "n", "h", None, adjMatrix_, None, link_, 0); routers_ = toRef(root_, "n?"); senders_ = zeros(nc_, Node) receivers_ = zeros(nc_, Node) for i in range(0,nc_): senders_[i] = root_.getComponent("h" + `i+2`) senders_[i].addAddress(i) receivers_[i] = root_.getComponent("h" + `i+nc_+2`) receivers_[i].addAddress(i + addrDivider) routers_[0].addAddress(nc_) routers_[1].addAddress(addrDivider + nc_) print "\nBuilding..." nb_ = NodeBuilder(".nb") nb_.setBandwidth(10000000); # 10Mbps if linkemu_ != 0: nb_.setLinkEmulationEnabled(1); nb_.setLinkPropDelay(0.01); nb_.build(routers_) nb_.build(senders_, "tcp drcl.inet.transport.TCP\nsource -/tcp drcl.inet.application.BulkSource") nb_.build(receivers_, "tcpsink drcl.inet.transport.TCPSink\nsink -/tcpsink drcl.inet.application.BulkSink") routers_[0].setBufferSize(0, 4096 * nc_) # // 4KB per connection routers_[0].setBandwidth(0, 1500000); # 1.5Mbps routers_[1].setBandwidth(0, 1500000); # 1.5Mbps if linkemu_ != 0: routers_[0].getComponent("csl").setLinkPropDelay(0, 0.1) else: routers_[0].getPort("0").getPeers()[0].getHost().setPropDelay(0.1) print "\nSetup TCP..." for i in range(0,nc_): j = i+addrDivider tcp_ = senders_[i].getComponent("tcp") tcp_.setPeer(j) tcp_.setMSS(950) receivers_[i].getComponent("tcpsink").setMSS(950) print "\nSetup routes..." # router0 csl_ = routers_[0].getComponent("csl") csl_.addRTEntry(RTKey(0L, 0L, addrDivider, -addrDivider, 0, 0), RTEntry(BitSet([0])), Double.NaN) for i in range(0,nc_): csl_.addRTEntry(RTKey(0L, 0L, i, -1L, 0, 0), RTEntry(BitSet([i+1])), Double.NaN) # router1 csl_ = routers_[1].getComponent("csl"); csl_.addRTEntry(RTKey(0L, 0L, 0L, -addrDivider, 0, 0), RTEntry(BitSet([0])), Double.NaN) for i in range(0,nc_): csl_.addRTEntry(RTKey(0L, 0L, i+addrDivider, -1L, 0, 0), RTEntry(BitSet([i+1])), Double.NaN) print "Time for building scenario =", ((System.currentTimeMillis() - starttime) / 1000.0) if event_ == 0: sim_ = SimulatorAssistant.defaultInstance() sim_.setMaxWorkforce(1) else: sim_ = SESimulator() sim_.takeover(root_) sim_.stop() tmp = CommandTask.addAt("""print "simulation ends.\\n", sim_.diag();print "Time for the whole thing =", ((System.currentTimeMillis() - starttime) / 1000.0);System.exit(0)""", simulationTime, -1.0, sim_, __current_shell__) times_ = [10] + range(interval_, simulationTime, interval_) + [simulationTime+1] index_ = 0 cmd_ = """print sim_.getTime(), "\t", sim_.getWallTimeElapsed()/1000.0;tmp = CommandTask.addAt(cmd_, times_[index_], -1.0, sim_, __current_shell__);index_ = index_+1""" tmp = CommandTask.addAt(cmd_, 0.001, -1.0, sim_, __current_shell__) Util.operate(senders_, "start") print "Start simulation" sim_.resume()