# net-4.py """Network of 4 "subnets", each with 4 nodes including one "gateway". ____________________________________________________________________ Nodes Nodes have "virtual" ids (vids) of the form 'j.i', for j, i in 0..3. 0,0 0,1 0,2 0,3 // subnet 0 1,0 1,1 1,2 1,3 // subnet 1 2,0 2,1 2,2 2,3 // subnet 2 3,0 3,1 3,2 3,3 // subnet 3 Vid j.i has to be mapped to an integer tssnet node id (nid) k. One natural way would be for k = j*4 + i; then k would be in 0..15. Instead we will map vid j.i to k = 100 + j*10 + i, so that k displayed as a decimal number would be the 3-digit string '1ji'. This makes it easy to see the vids of printed nids, e.g., in the output of print_default_route. _____________________________________________________________________ Links Each subnet j has 5 "internal" (within subnet) links: j.0 ---> j.1 ---> j.2 ---> j.3 <---- <----------------------- There are 8 "external" (between subnets) links: 0.0 ---> 1.0 ---> 2.0 ---> 3.0 <---- <---- <---- <---------------------- ----------------------> _____________________________________________________________________ Tcp flows Each subnet j has 4 "internal" tcp flows, each from j.i1 to j.i2, where i1 and i2 are different random numbers in 0..3. Each subnet j has 4 "external" tcp flows, each from j.i1 to k.i2, where k is random and different from j and i1 and i2 are random numbers in 0..3. _____________________________________________________________________ """ from random import randint import tssnet_0 as tssnet # helpers def _nid(j, i): """return nid for vid j.i.""" return 100 + j*10 + i def _vid(j, i): """return string 'j.i'.""" return str(j) + "." + str(i) def _succ4(i): return (i+1) % 4 def _rand4(j): """return random int in 0..3 other than j.""" return (j + randint(1,3)) % 4 def _vlid(j1, i1, j2, i2): """return virtual link id j1.i1-j2.i2.""" return _vid(j1, i1) + "-" + _vid(j2, i2) def addnodes(nw): print(" ", end="") for j in range(0,4): for i in range(0,4): nw.add_node(100 + j*10 + i) print(" ", 100 + j*10 + i, end="") def addlinks(nw, nlp): """Add internal and external links to network.""" # internal links print("internal links:") for j in range(0, 4): for i in range(0, 4): dstnode = _succ4(i) lid = nw.add_link(_nid(j, i), _nid(j, dstnode), l_rate, cvsq, l_buffersize, l_propdelay, l_cost) vlid = _vlid(j, i, j, dstnode) if i == 0: print(" ", vlid, "(logged)", end="") nlp.log_link(lid, vlid) else: print(" ", vlid, end="") nw.add_link(_nid(j, 1), _nid(j, 0), l_rate, cvsq, l_buffersize, l_propdelay, l_cost) print(" ", _vlid(j, 1, j, 0)) # external links print("external links:") for j in range(0, 4): succnet = _succ4(j) vlid = _vlid(j, 0, succnet, 0) lid = nw.add_link(_nid(j, 0), _nid(succnet, 0), r_rate, cvsq, r_buffersize, r_propdelay, r_cost) if j == 0: print(" ", vlid, "(logged)", end="") nlp.log_link(lid, vlid) else: print(" ", vlid, end="") nw.add_link(_nid(succnet, 0), _nid(j, 0), r_rate, cvsq, r_buffersize, r_propdelay, r_cost) print(" ", _vlid(succnet, 0, j, 0), end="") print(" ") def addtcps(nw, nlp): for j in range(0, 4): # internal tcps print("internal tcp flows:") for i in range(0, 4): srcnode = randint(0,3) dstnode = _rand4(srcnode) vlid = _vlid(j, srcnode, j, dstnode) tid = nw.add_tcp(_nid(j, srcnode), _nid(j, dstnode), randint(0,4), datasize) if i == 0: print(" ", vlid, "(logged)", end="") nlp.log_tcp(tid, vlid) elif i == 3: print(" ", vlid) else: print(" ", vlid, end="") # external tcps print("external tcp flows:") for i in range(0, 4): srcnode = randint(0, 3) dstnet = _rand4(j) dstnode = randint(0, 3) vlid = _vlid(j, srcnode, dstnet, dstnode) tid = nw.add_tcp(_nid(j,srcnode), _nid(dstnet, dstnode), randint(0,4), datasize) if i == 0: print(" ", vlid, "(logged)", end="") nlp.log_tcp(tid, vlid) elif i == 3: print(" ", vlid) else: print(" ", vlid, end="") print("-----------") currtime = 0 endtime = 20 # 20.0 # 0.45 randomseed = 872356321 # 872356321 # 314217, 23415 tcpsrctype = 'newreno' # 'newreno', 'reno', 'tahoe' # create empty network, set random seed nw = tssnet.Network() nw.set_randomseed(randomseed) # create empty logger for nw nlp = tssnet.NetworkLogPlot(nw) print(" ") print("********* adding nodes ********") # add nodes addnodes(nw) # add links cvsq = 0.05 l_rate = 50000 # 5000000 # 50000 l_buffersize = 10000 l_propdelay = 0.05 l_cost = 2 r_rate = 200000 # 5000000 # 50000 r_buffersize = 100000 r_propdelay = 0.08 r_cost = 1 print(" ") print(" ") print("********* adding links ********") addlinks(nw, nlp) # set default routes (used by flow udp_4_2, not used by flow tcp_1_3) print(" ") print("********* setting default routes ********") nw.set_default_routes() # print default routes for selected node pairs nw.print_default_route(101, 132) # vid 0.1 to vid 3.2 nw.print_default_route(132, 101) # vid 3.2 to vid 0.1 nw.print_default_route(111, 123) # vid 1.1 to vid 2.3 print(" ") print("********* adding tcps ********") datasize = 10000000 addtcps(nw, nlp) # simulate while currtime < endtime: # update network state by one timestep currtime = nw.update_network() # add metrics to nlp's logs nlp.update_logs(currtime) # plot all logs of nlp, 4 plots per figure nlp.plot_logs(4) # plot selected logs of nlp # nlp.plot_linklog("1-2") # nlp.plot_tcplog("1-3") # nlp.plot_udplog("4-2")