From e3e45004b4fca429971b4caaaf7cede322bb3e5c Mon Sep 17 00:00:00 2001 From: Quentin De Coninck Date: Wed, 31 May 2017 14:51:01 +0200 Subject: [PATCH] adding QUIC Siri experience: Siri traffic using QUIC instead of TCP --- src/mpExperience.py | 1 + src/mpExperienceQUICSiri.py | 82 +++++++++++++++++++++++++++++++++++++ src/mpParamXp.py | 1 + src/mpXpRunner.py | 3 ++ 4 files changed, 87 insertions(+) create mode 100644 src/mpExperienceQUICSiri.py diff --git a/src/mpExperience.py b/src/mpExperience.py index 9c1cf03..bd0efbc 100644 --- a/src/mpExperience.py +++ b/src/mpExperience.py @@ -20,6 +20,7 @@ class MpExperience: SIRIHTTP = "sirihttp" SIRIMSG = "sirimsg" QUIC = "quic" + QUICSIRI = "quicsiri" def __init__(self, xpParam, mpTopo, mpConfig): self.xpParam = xpParam diff --git a/src/mpExperienceQUICSiri.py b/src/mpExperienceQUICSiri.py new file mode 100644 index 0000000..bf55fdf --- /dev/null +++ b/src/mpExperienceQUICSiri.py @@ -0,0 +1,82 @@ +from mpExperience import MpExperience +from mpParamXp import MpParamXp +import os + + +class MpExperienceQUICSiri(MpExperience): + GO_BIN = "/usr/local/go/bin/go" + SERVER_LOG = "quic_server.log" + CLIENT_LOG = "quic_client.log" + CLIENT_GO_FILE = "~/go/src/github.com/lucas-clemente/quic-go/example/siri/client/siri.go" + SERVER_GO_FILE = "~/go/src/github.com/lucas-clemente/quic-go/example/siri/siri.go" + PING_OUTPUT = "ping.log" + + def __init__(self, xpParamFile, mpTopo, mpConfig): + MpExperience.__init__(self, xpParamFile, mpTopo, mpConfig) + self.loadParam() + self.ping() + MpExperience.classicRun(self) + + def ping(self): + self.mpTopo.commandTo(self.mpConfig.client, "rm " + \ + MpExperienceQUICSiri.PING_OUTPUT ) + count = self.xpParam.getParam(MpParamXp.PINGCOUNT) + for i in range(0, self.mpConfig.getClientInterfaceCount()): + cmd = self.pingCommand(self.mpConfig.getClientIP(i), + self.mpConfig.getServerIP(), n = count) + self.mpTopo.commandTo(self.mpConfig.client, cmd) + + def pingCommand(self, fromIP, toIP, n=5): + s = "ping -c " + str(n) + " -I " + fromIP + " " + toIP + \ + " >> " + MpExperienceQUICSiri.PING_OUTPUT + print(s) + return s + + def loadParam(self): + """ + todo : param LD_PRELOAD ?? + """ + self.run_time = self.xpParam.getParam(MpParamXp.QUICSIRIRUNTIME) + self.multipath = self.xpParam.getParam(MpParamXp.QUICMULTIPATH) + + def prepare(self): + MpExperience.prepare(self) + self.mpTopo.commandTo(self.mpConfig.client, "rm " + \ + MpExperienceQUICSiri.CLIENT_LOG ) + self.mpTopo.commandTo(self.mpConfig.server, "rm " + \ + MpExperienceQUICSiri.SERVER_LOG ) + + def getQUICSiriServerCmd(self): + s = MpExperienceQUICSiri.GO_BIN + " run " + MpExperienceQUICSiri.SERVER_GO_FILE + s += " -addr 0.0.0.0:8080 &>" + MpExperienceQUICSiri.SERVER_LOG + " &" + print(s) + return s + + def getQUICClientCmd(self): + s = MpExperienceQUICSiri.GO_BIN + " run " + MpExperienceQUICSiri.CLIENT_GO_FILE + s += " -addr " + self.mpConfig.getServerIP() + ":8080 -runTime " + self.run_time + "s" + if int(self.multipath) > 0: + s += " -m" + s += " &>" + MpExperienceQUICSiri.CLIENT_LOG + print(s) + return s + + def clean(self): + MpExperience.clean(self) + + + def run(self): + cmd = self.getQUICSiriServerCmd() + self.mpTopo.commandTo(self.mpConfig.server, "netstat -sn > netstat_server_before") + self.mpTopo.commandTo(self.mpConfig.server, cmd) + + self.mpTopo.commandTo(self.mpConfig.client, "sleep 2") + cmd = self.getQUICSiriClientCmd() + self.mpTopo.commandTo(self.mpConfig.client, "netstat -sn > netstat_client_before") + self.mpTopo.commandTo(self.mpConfig.client, cmd) + self.mpTopo.commandTo(self.mpConfig.server, "netstat -sn > netstat_server_after") + self.mpTopo.commandTo(self.mpConfig.client, "netstat -sn > netstat_client_after") + self.mpTopo.commandTo(self.mpConfig.server, "pkill -f " + MpExperienceQUICSiri.SERVER_GO_FILE) + self.mpTopo.commandTo(self.mpConfig.client, "sleep 2") + # Need to delete the go-build directory in tmp; could lead to no more space left error + self.mpTopo.commandTo(self.mpConfig.client, "rm -r /tmp/go-build*") diff --git a/src/mpParamXp.py b/src/mpParamXp.py index 580a403..0222235 100644 --- a/src/mpParamXp.py +++ b/src/mpParamXp.py @@ -65,6 +65,7 @@ class MpParamXp(MpParam): MSGNBREQUESTS = "msgNbRequests" MSGBYTES = "msgBytes" QUICMULTIPATH = "quicMultipath" + QUICSIRIRUNTIME = "quicSiriRunTime" PRIOPATH0 = "prioPath0" PRIOPATH1 = "prioPath1" BACKUPPATH0 = "backupPath0" diff --git a/src/mpXpRunner.py b/src/mpXpRunner.py index b18fe15..6320454 100644 --- a/src/mpXpRunner.py +++ b/src/mpXpRunner.py @@ -23,6 +23,7 @@ from mpExperienceMsg import MpExperienceMsg from mpExperienceSiriHTTP import MpExperienceSiriHTTP from mpExperienceSiriMsg import MpExperienceSiriMsg from mpExperienceQUIC import MpExperienceQUIC +from mpExperienceQUICSiri import MpExperienceQUICSiri from mpExperienceNone import MpExperienceNone from mpExperience import MpExperience from mpECMPSingleInterfaceTopo import MpECMPSingleInterfaceTopo @@ -134,6 +135,8 @@ class MpXpRunner: MpExperienceSiriMsg(self.xpParam, self.mpTopo, self.mpTopoConfig) elif xp == MpExperience.QUIC: MpExperienceQUIC(self.xpParam, self.mpTopo, self.mpTopoConfig) + elif xp == MpExperience.QUICSIRI: + MpExperienceQUICSiri(self.xpParam, self.mpTopo, self.mpTopoConfig) else: print("Unfound xp type..." + xp)