still some file restructuration
This commit is contained in:
parent
d37f6d6405
commit
dffae6d281
119
core/topo.py
119
core/topo.py
@ -1,7 +1,118 @@
|
||||
from .parameter import Parameter
|
||||
|
||||
from mpLinkCharacteristics import MpLinkCharacteristics
|
||||
from mpNetemAt import MpNetemAt
|
||||
import math
|
||||
|
||||
|
||||
class NetemAt(object):
|
||||
def __init__(self, at, cmd):
|
||||
self.at = at
|
||||
self.cmd = cmd
|
||||
self.delta = 0
|
||||
|
||||
def __str__(self):
|
||||
return "Netem... at " + str(self.at) + "(" + str(self.delta) + \
|
||||
") will be " + self.cmd
|
||||
|
||||
|
||||
class LinkCharacteristics(object):
|
||||
tcNetemParent = "1:1"
|
||||
tcHtbClassid = "10"
|
||||
tcNetemHandle = "1:10"
|
||||
|
||||
def bandwidthDelayProductDividedByMTU(self):
|
||||
rtt = 2 * float(self.delay)
|
||||
""" Since bandwidth is in Mbps and rtt in ms """
|
||||
bandwidthDelayProduct = (float(self.bandwidth) * 125000.0) * (rtt / 1000.0)
|
||||
return int(math.ceil(bandwidthDelayProduct * 1.0 / 1500.0))
|
||||
|
||||
def bufferSize(self):
|
||||
return (1500.0 * self.bandwidthDelayProductDividedByMTU()) + (float(self.bandwidth) * 1000.0 * float(self.queuingDelay) / 8)
|
||||
|
||||
def extractQueuingDelay(self, queueSize, bandwidth, delay, mtu=1500):
|
||||
# rtt = 2 * float(delay)
|
||||
# bdp_queue_size = int((float(rtt) * float(bandwidth) * 1024 * 1024) / (int(mtu) * 8 * 1000))
|
||||
# if int(queueSize) <= bdp_queue_size:
|
||||
# Returning 0 seems to bypass everything, then only limited by CPU.
|
||||
# This is not what we want...
|
||||
# return 1
|
||||
|
||||
# queuingQueueSize = int(queueSize) - bdp_queue_size
|
||||
queuingDelay = (int(queueSize) * int(mtu) * 8.0 * 1000.0) / (float(bandwidth) * 1024 * 1024)
|
||||
return max(int(queuingDelay), 1)
|
||||
|
||||
def __init__(self, id, delay, queueSize, bandwidth, loss, back_up=False):
|
||||
self.id = id
|
||||
self.delay = delay
|
||||
self.queueSize = queueSize
|
||||
self.bandwidth = bandwidth
|
||||
self.loss = loss
|
||||
self.queuingDelay = str(self.extractQueuingDelay(queueSize, bandwidth, delay))
|
||||
self.netemAt = []
|
||||
self.back_up = back_up
|
||||
|
||||
def addNetemAt(self, n):
|
||||
if len(self.netemAt) == 0:
|
||||
n.delta = n.at
|
||||
self.netemAt.append(n)
|
||||
else:
|
||||
if n.at > self.netemAt[-1].at:
|
||||
n.delta = n.at - self.netemAt[-1].at
|
||||
self.netemAt.append(n)
|
||||
else:
|
||||
print("Do not take into account " + n.__str__() + \
|
||||
"because ooo !")
|
||||
pass
|
||||
|
||||
def buildBwCmd(self, ifname):
|
||||
cmd = ""
|
||||
for n in self.netemAt:
|
||||
cmd = cmd + "sleep {}".format(n.delta)
|
||||
cmd = cmd + " && tc qdisc del dev {} root ".format(ifname)
|
||||
cmd = cmd + " ; tc qdisc add dev {} root handle 5:0 tbf rate {}mbit burst 15000 limit {} &&".format(ifname, self.bandwidth, int(self.bufferSize()))
|
||||
|
||||
cmd = cmd + " true &"
|
||||
return cmd
|
||||
|
||||
def buildNetemCmd(self, ifname):
|
||||
cmd = ""
|
||||
for n in self.netemAt:
|
||||
cmd = cmd + "sleep " + str(n.delta)
|
||||
cmd = cmd + " && tc qdisc del dev " + ifname + " root "
|
||||
cmd = cmd + " ; tc qdisc add dev {} root handle 10: netem {} delay {}ms limit 50000 &&".format(ifname, n.cmd, self.delay)
|
||||
|
||||
cmd = cmd + " true &"
|
||||
return cmd
|
||||
|
||||
def buildPolicingCmd(self, ifname):
|
||||
cmd = ""
|
||||
for n in self.netemAt:
|
||||
cmd = cmd + "sleep {}".format(n.delta)
|
||||
cmd = cmd + " && tc qdisc del dev {} ingress".format(ifname)
|
||||
cmd = cmd + " ; tc qdisc add dev {} handle ffff: ingress".format(ifname)
|
||||
cmd = cmd + " && tc filter add dev {} parent ffff: u32 match u32 0 0 police rate {}mbit burst {} drop && ".format(ifname, self.bandwidth, int(self.bufferSize() * 1.2))
|
||||
|
||||
cmd = cmd + " true &"
|
||||
return cmd
|
||||
|
||||
def asDict(self):
|
||||
d = {}
|
||||
d['bw'] = float(self.bandwidth)
|
||||
d['delay'] = self.delay + "ms"
|
||||
d['loss'] = float(self.loss)
|
||||
d['max_queue_size'] = int(self.queueSize)
|
||||
return d
|
||||
|
||||
def __str__(self):
|
||||
s = "Link id : " + str(self.id) + "\n"
|
||||
s = s + "\tDelay : " + str(self.delay) + "\n"
|
||||
s = s + "\tQueue Size : " + str(self.queueSize) + "\n"
|
||||
s = s + "\tBandwidth : " + str(self.bandwidth) + "\n"
|
||||
s = s + "\tLoss : " + str(self.loss) + "\n"
|
||||
s = s + "\tBack up : " + str(self.back_up) + "\n"
|
||||
for l in self.netemAt:
|
||||
s = s + "\t" + l.__str__() + "\n"
|
||||
return s
|
||||
|
||||
|
||||
class TopoParameter(Parameter):
|
||||
LSUBNET = "leftSubnet"
|
||||
@ -37,7 +148,7 @@ class TopoParameter(Parameter):
|
||||
for n in nlist:
|
||||
tab = n.split(",")
|
||||
if len(tab)==2:
|
||||
o = MpNetemAt(float(tab[0]), tab[1])
|
||||
o = NetemAt(float(tab[0]), tab[1])
|
||||
if id < len(self.linkCharacteristics):
|
||||
self.linkCharacteristics[id].addNetemAt(o)
|
||||
else:
|
||||
@ -63,7 +174,7 @@ class TopoParameter(Parameter):
|
||||
except ValueError:
|
||||
bup = tab[3] == 'True'
|
||||
if len(tab) == 3 or len(tab) == 4 or len(tab) == 5:
|
||||
path = MpLinkCharacteristics(i,tab[0],
|
||||
path = LinkCharacteristics(i,tab[0],
|
||||
tab[1], tab[2], loss, bup)
|
||||
self.linkCharacteristics.append(path)
|
||||
i = i + 1
|
||||
|
@ -5,7 +5,7 @@ from mininet.node import OVSBridge
|
||||
from mininet.cli import CLI
|
||||
from subprocess import Popen, PIPE
|
||||
|
||||
class MpMininetBuilder(Topo):
|
||||
class MininetBuilder(Topo):
|
||||
def __init__(self):
|
||||
Topo.__init__( self )
|
||||
self.net = None
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceAb(Experience):
|
||||
@ -51,7 +50,7 @@ class ExperienceAb(Experience):
|
||||
|
||||
def getAbServerCmd(self):
|
||||
s = "python " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/http.py &>" + ExperienceAb.SERVER_LOG + "&"
|
||||
"/utils/http.py &>" + ExperienceAb.SERVER_LOG + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceDITG(Experience):
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceEpload(Experience):
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceHTTP(Experience):
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceHTTPS(Experience):
|
||||
@ -49,7 +48,7 @@ class ExperienceHTTPS(Experience):
|
||||
|
||||
def getHTTPSServerCmd(self):
|
||||
s = "python " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/https.py &>" + ExperienceHTTPS.SERVER_LOG + "&"
|
||||
"/utils/https.py &>" + ExperienceHTTPS.SERVER_LOG + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceIperf(Experience):
|
||||
|
@ -46,13 +46,13 @@ class ExperienceMsg(Experience):
|
||||
|
||||
def getMsgServerCmd(self):
|
||||
s = "python " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/msg_server.py --sleep " + self.server_sleep + " --bytes " + self.bytes + " &>" + ExperienceMsg.SERVER_LOG + "&"
|
||||
"/utils/msg_server.py --sleep " + self.server_sleep + " --bytes " + self.bytes + " &>" + ExperienceMsg.SERVER_LOG + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
def getMsgClientCmd(self):
|
||||
s = "python " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/msg_client.py --sleep " + self.client_sleep + " --nb " + self.nb_requests + \
|
||||
"/utils/msg_client.py --sleep " + self.client_sleep + " --nb " + self.nb_requests + \
|
||||
" --bytes " + self.bytes + " >" + ExperienceMsg.CLIENT_LOG + " 2>" + ExperienceMsg.CLIENT_ERR
|
||||
print(s)
|
||||
return s
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
|
||||
"""
|
||||
Should be the mother of ExperienceNCPV, shame on me, should rewrite
|
||||
|
@ -1,5 +1,16 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
|
||||
|
||||
class MpPvAt(object):
|
||||
def __init__(self, at, cmd):
|
||||
self.at = at
|
||||
self.cmd = cmd
|
||||
self.delta = 0
|
||||
|
||||
def __str__(self):
|
||||
return "Pv... at " + str(self.at) + "(" + str(self.delta) + \
|
||||
") will be " + self.cmd
|
||||
|
||||
|
||||
class ExperienceNCPV(Experience):
|
||||
"""
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceNetperf(Experience):
|
||||
|
@ -70,7 +70,7 @@ class ExperienceQUIC(Experience):
|
||||
|
||||
def getCongServerCmd(self, congID):
|
||||
s = "python " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/https.py &> https_server" + str(congID) + ".log &"
|
||||
"/utils/https.py &> https_server" + str(congID) + ".log &"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceSendFile(Experience):
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceSiri(Experience):
|
||||
@ -54,12 +53,12 @@ class ExperienceSiri(Experience):
|
||||
|
||||
def getSiriServerCmd(self):
|
||||
s = "python3 " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/siri_server.py &>" + ExperienceSiri.SERVER_LOG + "&"
|
||||
"/utils/siri_server.py &>" + ExperienceSiri.SERVER_LOG + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
def getSiriClientCmd(self):
|
||||
s = ExperienceSiri.JAVA_BIN + " -jar " + os.path.dirname(os.path.abspath(__file__)) + "/siriClient.jar " + \
|
||||
s = ExperienceSiri.JAVA_BIN + " -jar " + os.path.dirname(os.path.abspath(__file__)) + "/utils/siriClient.jar " + \
|
||||
self.mpConfig.getServerIP() + " 8080 " + self.run_time + " " + self.query_size + " " + self.response_size + \
|
||||
" " + self.delay_query_response + " " + self.min_payload_size + " " + \
|
||||
self.max_payload_size + " " + self.interval_time_ms + " " + self.buffer_size + " " + self.burst_size + " " + self.interval_burst_time_ms + \
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceSiriHTTP(Experience):
|
||||
@ -68,12 +67,12 @@ class ExperienceSiriHTTP(Experience):
|
||||
|
||||
def getSiriServerCmd(self):
|
||||
s = "python3 " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/siri_server.py &>" + ExperienceSiriHTTP.SERVER_LOG + "&"
|
||||
"/utils/siri_server.py &>" + ExperienceSiriHTTP.SERVER_LOG + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
def getSiriClientCmd(self):
|
||||
s = ExperienceSiriHTTP.JAVA_BIN + " -jar " + os.path.dirname(os.path.abspath(__file__)) + "/siriClient.jar " + \
|
||||
s = ExperienceSiriHTTP.JAVA_BIN + " -jar " + os.path.dirname(os.path.abspath(__file__)) + "/utils/siriClient.jar " + \
|
||||
self.mpConfig.getServerIP() + " 8080 " + self.run_time + " " + self.query_size + " " + self.response_size + \
|
||||
" " + self.delay_query_response + " " + self.min_payload_size + " " + \
|
||||
self.max_payload_size + " " + self.interval_time_ms + " " + self.buffer_size + " " + self.burst_size + " " + self.interval_burst_time_ms + \
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceSiriMsg(Experience):
|
||||
@ -21,7 +20,7 @@ class ExperienceSiriMsg(Experience):
|
||||
def ping(self):
|
||||
self.mpTopo.commandTo(self.mpConfig.client, "rm " + \
|
||||
ExperienceSiriMsg.PING_OUTPUT )
|
||||
count = self.xpParam.getParam(MpParamXp.PINGCOUNT)
|
||||
count = self.xpParam.getParam(ExperienceParameter.PINGCOUNT)
|
||||
for i in range(0, self.mpConfig.getClientInterfaceCount()):
|
||||
cmd = self.pingCommand(self.mpConfig.getClientIP(i),
|
||||
self.mpConfig.getServerIP(), n = count)
|
||||
@ -37,19 +36,19 @@ class ExperienceSiriMsg(Experience):
|
||||
"""
|
||||
todo : param LD_PRELOAD ??
|
||||
"""
|
||||
self.run_time = self.xpParam.getParam(MpParamXp.SIRIRUNTIME)
|
||||
self.query_size = self.xpParam.getParam(MpParamXp.SIRIQUERYSIZE)
|
||||
self.response_size = self.xpParam.getParam(MpParamXp.SIRIRESPONSESIZE)
|
||||
self.delay_query_response = self.xpParam.getParam(MpParamXp.SIRIDELAYQUERYRESPONSE)
|
||||
self.min_payload_size = self.xpParam.getParam(MpParamXp.SIRIMINPAYLOADSIZE)
|
||||
self.max_payload_size = self.xpParam.getParam(MpParamXp.SIRIMAXPAYLOADSIZE)
|
||||
self.interval_time_ms = self.xpParam.getParam(MpParamXp.SIRIINTERVALTIMEMS)
|
||||
self.buffer_size = self.xpParam.getParam(MpParamXp.SIRIBUFFERSIZE)
|
||||
self.burst_size = self.xpParam.getParam(MpParamXp.SIRIBURSTSIZE)
|
||||
self.interval_burst_time_ms = self.xpParam.getParam(MpParamXp.SIRIINTERVALBURSTTIMEMS)
|
||||
self.client_sleep = self.xpParam.getParam(MpParamXp.MSGCLIENTSLEEP)
|
||||
self.server_sleep = self.xpParam.getParam(MpParamXp.MSGSERVERSLEEP)
|
||||
self.nb_requests = self.xpParam.getParam(MpParamXp.MSGNBREQUESTS)
|
||||
self.run_time = self.xpParam.getParam(ExperienceParameter.SIRIRUNTIME)
|
||||
self.query_size = self.xpParam.getParam(ExperienceParameter.SIRIQUERYSIZE)
|
||||
self.response_size = self.xpParam.getParam(ExperienceParameter.SIRIRESPONSESIZE)
|
||||
self.delay_query_response = self.xpParam.getParam(ExperienceParameter.SIRIDELAYQUERYRESPONSE)
|
||||
self.min_payload_size = self.xpParam.getParam(ExperienceParameter.SIRIMINPAYLOADSIZE)
|
||||
self.max_payload_size = self.xpParam.getParam(ExperienceParameter.SIRIMAXPAYLOADSIZE)
|
||||
self.interval_time_ms = self.xpParam.getParam(ExperienceParameter.SIRIINTERVALTIMEMS)
|
||||
self.buffer_size = self.xpParam.getParam(ExperienceParameter.SIRIBUFFERSIZE)
|
||||
self.burst_size = self.xpParam.getParam(ExperienceParameter.SIRIBURSTSIZE)
|
||||
self.interval_burst_time_ms = self.xpParam.getParam(ExperienceParameter.SIRIINTERVALBURSTTIMEMS)
|
||||
self.client_sleep = self.xpParam.getParam(ExperienceParameter.MSGCLIENTSLEEP)
|
||||
self.server_sleep = self.xpParam.getParam(ExperienceParameter.MSGSERVERSLEEP)
|
||||
self.nb_requests = self.xpParam.getParam(ExperienceParameter.MSGNBREQUESTS)
|
||||
|
||||
def prepare(self):
|
||||
Experience.prepare(self)
|
||||
@ -68,12 +67,12 @@ class ExperienceSiriMsg(Experience):
|
||||
|
||||
def getSiriServerCmd(self):
|
||||
s = "python3 " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/siri_server.py &>" + ExperienceSiriMsg.SERVER_LOG + "&"
|
||||
"/utils/siri_server.py &>" + ExperienceSiriMsg.SERVER_LOG + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
def getSiriClientCmd(self):
|
||||
s = ExperienceSiriMsg.JAVA_BIN + " -jar " + os.path.dirname(os.path.abspath(__file__)) + "/siriClient.jar " + \
|
||||
s = ExperienceSiriMsg.JAVA_BIN + " -jar " + os.path.dirname(os.path.abspath(__file__)) + "/utils/siriClient.jar " + \
|
||||
self.mpConfig.getServerIP() + " 8080 " + self.run_time + " " + self.query_size + " " + self.response_size + \
|
||||
" " + self.delay_query_response + " " + self.min_payload_size + " " + \
|
||||
self.max_payload_size + " " + self.interval_time_ms + " " + self.buffer_size + " " + self.burst_size + " " + self.interval_burst_time_ms + \
|
||||
@ -83,13 +82,13 @@ class ExperienceSiriMsg(Experience):
|
||||
|
||||
def getMsgServerCmd(self):
|
||||
s = "python3 " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/msg_server.py --sleep " + self.server_sleep + " &>" + ExperienceSiriMsg.MSG_SERVER_LOG + "&"
|
||||
"/utils/msg_server.py --sleep " + self.server_sleep + " &>" + ExperienceSiriMsg.MSG_SERVER_LOG + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
||||
def getMsgClientCmd(self):
|
||||
s = "python3 " + os.path.dirname(os.path.abspath(__file__)) + \
|
||||
"/msg_client.py --sleep " + self.client_sleep + " --nb " + self.nb_requests + \
|
||||
"/utils/msg_client.py --sleep " + self.client_sleep + " --nb " + self.nb_requests + \
|
||||
" --bulk >" + ExperienceSiriMsg.MSG_CLIENT_LOG + " 2>" + ExperienceSiriMsg.MSG_CLIENT_ERR + "&"
|
||||
print(s)
|
||||
return s
|
||||
|
@ -1,5 +1,4 @@
|
||||
from core.experience import Experience, ExperienceParameter
|
||||
from mpPvAt import MpPvAt
|
||||
import os
|
||||
|
||||
class ExperienceVLC(Experience):
|
||||
|
@ -1,102 +0,0 @@
|
||||
import math
|
||||
|
||||
|
||||
class MpLinkCharacteristics:
|
||||
|
||||
tcNetemParent = "1:1"
|
||||
tcHtbClassid = "10"
|
||||
tcNetemHandle = "1:10"
|
||||
|
||||
def bandwidthDelayProductDividedByMTU(self):
|
||||
rtt = 2 * float(self.delay)
|
||||
""" Since bandwidth is in Mbps and rtt in ms """
|
||||
bandwidthDelayProduct = (float(self.bandwidth) * 125000.0) * (rtt / 1000.0)
|
||||
return int(math.ceil(bandwidthDelayProduct * 1.0 / 1500.0))
|
||||
|
||||
def bufferSize(self):
|
||||
return (1500.0 * self.bandwidthDelayProductDividedByMTU()) + (float(self.bandwidth) * 1000.0 * float(self.queuingDelay) / 8)
|
||||
|
||||
def extractQueuingDelay(self, queueSize, bandwidth, delay, mtu=1500):
|
||||
# rtt = 2 * float(delay)
|
||||
# bdp_queue_size = int((float(rtt) * float(bandwidth) * 1024 * 1024) / (int(mtu) * 8 * 1000))
|
||||
# if int(queueSize) <= bdp_queue_size:
|
||||
# Returning 0 seems to bypass everything, then only limited by CPU.
|
||||
# This is not what we want...
|
||||
# return 1
|
||||
|
||||
# queuingQueueSize = int(queueSize) - bdp_queue_size
|
||||
queuingDelay = (int(queueSize) * int(mtu) * 8.0 * 1000.0) / (float(bandwidth) * 1024 * 1024)
|
||||
return max(int(queuingDelay), 1)
|
||||
|
||||
def __init__(self, id, delay, queueSize, bandwidth, loss, back_up=False):
|
||||
self.id = id
|
||||
self.delay = delay
|
||||
self.queueSize = queueSize
|
||||
self.bandwidth = bandwidth
|
||||
self.loss = loss
|
||||
self.queuingDelay = str(self.extractQueuingDelay(queueSize, bandwidth, delay))
|
||||
self.netemAt = []
|
||||
self.back_up = back_up
|
||||
|
||||
def addNetemAt(self, n):
|
||||
if len(self.netemAt) == 0:
|
||||
n.delta = n.at
|
||||
self.netemAt.append(n)
|
||||
else:
|
||||
if n.at > self.netemAt[-1].at:
|
||||
n.delta = n.at - self.netemAt[-1].at
|
||||
self.netemAt.append(n)
|
||||
else:
|
||||
print("Do not take into account " + n.__str__() + \
|
||||
"because ooo !")
|
||||
pass
|
||||
|
||||
def buildBwCmd(self, ifname):
|
||||
cmd = ""
|
||||
for n in self.netemAt:
|
||||
cmd = cmd + "sleep {}".format(n.delta)
|
||||
cmd = cmd + " && tc qdisc del dev {} root ".format(ifname)
|
||||
cmd = cmd + " ; tc qdisc add dev {} root handle 5:0 tbf rate {}mbit burst 15000 limit {} &&".format(ifname, self.bandwidth, int(self.bufferSize()))
|
||||
|
||||
cmd = cmd + " true &"
|
||||
return cmd
|
||||
|
||||
def buildNetemCmd(self, ifname):
|
||||
cmd = ""
|
||||
for n in self.netemAt:
|
||||
cmd = cmd + "sleep " + str(n.delta)
|
||||
cmd = cmd + " && tc qdisc del dev " + ifname + " root "
|
||||
cmd = cmd + " ; tc qdisc add dev {} root handle 10: netem {} delay {}ms limit 50000 &&".format(ifname, n.cmd, self.delay)
|
||||
|
||||
cmd = cmd + " true &"
|
||||
return cmd
|
||||
|
||||
def buildPolicingCmd(self, ifname):
|
||||
cmd = ""
|
||||
for n in self.netemAt:
|
||||
cmd = cmd + "sleep {}".format(n.delta)
|
||||
cmd = cmd + " && tc qdisc del dev {} ingress".format(ifname)
|
||||
cmd = cmd + " ; tc qdisc add dev {} handle ffff: ingress".format(ifname)
|
||||
cmd = cmd + " && tc filter add dev {} parent ffff: u32 match u32 0 0 police rate {}mbit burst {} drop && ".format(ifname, self.bandwidth, int(self.bufferSize() * 1.2))
|
||||
|
||||
cmd = cmd + " true &"
|
||||
return cmd
|
||||
|
||||
def asDict(self):
|
||||
d = {}
|
||||
d['bw'] = float(self.bandwidth)
|
||||
d['delay'] = self.delay + "ms"
|
||||
d['loss'] = float(self.loss)
|
||||
d['max_queue_size'] = int(self.queueSize)
|
||||
return d
|
||||
|
||||
def __str__(self):
|
||||
s = "Link id : " + str(self.id) + "\n"
|
||||
s = s + "\tDelay : " + str(self.delay) + "\n"
|
||||
s = s + "\tQueue Size : " + str(self.queueSize) + "\n"
|
||||
s = s + "\tBandwidth : " + str(self.bandwidth) + "\n"
|
||||
s = s + "\tLoss : " + str(self.loss) + "\n"
|
||||
s = s + "\tBack up : " + str(self.back_up) + "\n"
|
||||
for l in self.netemAt:
|
||||
s = s + "\t" + l.__str__() + "\n"
|
||||
return s
|
@ -1,9 +0,0 @@
|
||||
class MpNetemAt:
|
||||
def __init__(self, at, cmd):
|
||||
self.at = at
|
||||
self.cmd = cmd
|
||||
self.delta = 0
|
||||
|
||||
def __str__(self):
|
||||
return "Netem... at " + str(self.at) + "(" + str(self.delta) + \
|
||||
") will be " + self.cmd
|
@ -1,9 +0,0 @@
|
||||
class MpPvAt:
|
||||
def __init__(self, at, cmd):
|
||||
self.at = at
|
||||
self.cmd = cmd
|
||||
self.delta = 0
|
||||
|
||||
def __str__(self):
|
||||
return "Pv... at " + str(self.at) + "(" + str(self.delta) + \
|
||||
") will be " + self.cmd
|
@ -1,13 +1,14 @@
|
||||
from core.experience import Experience, ExperienceParameter, ExperienceParameter
|
||||
from core.topo import Topo, TopoParameter
|
||||
|
||||
from mininet_builder import MininetBuilder
|
||||
|
||||
from mpMultiInterfaceTopo import MpMultiInterfaceTopo
|
||||
from mpMultiInterfaceConfig import MpMultiInterfaceConfig
|
||||
from mpMultiInterfaceCongConfig import MpMultiInterfaceCongConfig
|
||||
from mpMultiInterfaceCongTopo import MpMultiInterfaceCongTopo
|
||||
from mpECMPSingleInterfaceConfig import MpECMPSingleInterfaceConfig
|
||||
from mpTwoInterfaceCongestionConfig import MpTwoInterfaceCongestionConfig
|
||||
from mpMininetBuilder import MpMininetBuilder
|
||||
from mpExperiencePing import ExperiencePing
|
||||
from mpExperienceNCPV import ExperienceNCPV
|
||||
from mpExperienceNC import ExperienceNC
|
||||
@ -46,7 +47,7 @@ class MpXpRunner:
|
||||
|
||||
def defBuilder(self, builderType):
|
||||
if builderType == Topo.mininetBuilder:
|
||||
self.topoBuilder = MpMininetBuilder()
|
||||
self.topoBuilder = MininetBuilder()
|
||||
else:
|
||||
raise Exception("I can not find the builder " +
|
||||
builderType)
|
||||
|
0
utils/__init__.py
Normal file
0
utils/__init__.py
Normal file
Loading…
Reference in New Issue
Block a user