feat(qsccp): Add qsccp scenario

This commit is contained in:
baihe@pku.edu.cn committed 2023-12-22 14:01:24 +00:00
1 parent 9665f5c9c1
commit 964d7c6ed9
14 files changed
+1014 -15

No files matched your search

+3
View File
@@ -16,3 +16,6 @@ dl
# Vagrant # Vagrant
.vagrant .vagrant
venv/
.vscode
+24 -12
View File
@@ -52,14 +52,16 @@ def run():
c = topo.addHost('c') c = topo.addHost('c')
# add links # add links
topo.addLink(a, b, delay='10ms', bw=10) # bw = bandwidth topo.addLink(a, b, delay='10ms', bw=2.5) # bw = bandwidth
topo.addLink(b, c, delay='10ms', bw=10) topo.addLink(b, c, delay='10ms', bw=2.5)
info(topo.links(withInfo=True))
ndn = Minindn(topo=topo) ndn = Minindn(topo=topo)
ndn.start() ndn.start()
# configure and start nfd on each node # configure and start nfd on each node
info("Configuring NFD\n") info("Configuring NFD111\n")
AppManager(ndn, ndn.net.hosts, Nfd, logLevel="DEBUG") AppManager(ndn, ndn.net.hosts, Nfd, logLevel="DEBUG")
""" """
@@ -68,15 +70,25 @@ def run():
It can also be set manually as follows. The important bit to note here It can also be set manually as follows. The important bit to note here
is the use of the Nfdc command is the use of the Nfdc command
""" """
links = {"a":["b"], "b":["c"]} for link in topo.links(withInfo=True):
for first in links: node1, node2, node_info = link
for second in links[first]: host1 = ndn.net[node1]
host1 = ndn.net[first] host2 = ndn.net[node2]
host2 = ndn.net[second] interface = host2.connectionsTo(host1)[0][0]
interface = host2.connectionsTo(host1)[0][0] interface_ip = interface.IP()
interface_ip = interface.IP() bandwidth = interface.params.get("bw", 100) * 1000000
Nfdc.createFace(host1, interface_ip) info(f"Setting up route from {node1} to {node2} with bandwidth {bandwidth}\n")
Nfdc.registerRoute(host1, PREFIX, interface_ip, cost=0) Nfdc.createFace(host1, interface_ip, bandwidth=bandwidth)
Nfdc.registerRoute(host1, PREFIX, interface_ip, cost=0)
# links = {"a":["b"], "b":["c"]}
# for first in links:
# for second in links[first]:
# host1 = ndn.net[first]
# host2 = ndn.net[second]
# interface = host2.connectionsTo(host1)[0][0]
# interface_ip = interface.IP()
# Nfdc.createFace(host1, interface_ip)
# Nfdc.registerRoute(host1, PREFIX, interface_ip, cost=0)
# Start ping server # Start ping server
info("Starting pings...\n") info("Starting pings...\n")
+111
View File
@@ -0,0 +1,111 @@
# -*- Mode:python; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
#
# Copyright (C) 2015-2021, The University of Memphis,
# Arizona Board of Regents,
# Regents of the University of California.
#
# This file is part of Mini-NDN.
# See AUTHORS.md for a complete list of Mini-NDN authors and contributors.
#
# Mini-NDN is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Mini-NDN is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Mini-NDN, e.g., in COPYING.md file.
# If not, see <http://www.gnu.org/licenses/>.
from subprocess import PIPE
from mininet.log import setLogLevel, info
from mininet.topo import Topo
from minindn.minindn import Minindn
from minindn.apps.app_manager import AppManager
from minindn.util import MiniNDNCLI, getPopen
from minindn.apps.nfd import Nfd
from minindn.helpers.nfdc import Nfdc
PREFIX = "/A"
def printOutput(output):
_out = output.decode("utf-8").split("\n")
for _line in _out:
info(_line + "\n")
def run():
Minindn.cleanUp()
Minindn.verifyDependencies()
# Topology can be created/modified using Mininet topo object
topo = Topo()
info("Setup\n")
# add hosts
a = topo.addHost('a')
b = topo.addHost('b')
# add links
topo.addLink(a, b, delay='10ms', bw=10) # bw = bandwidth
info(topo.links(withInfo=True))
ndn = Minindn(topo=topo)
ndn.start()
# configure and start nfd on each node
info("Configuring NFD\n")
AppManager(ndn, ndn.net.hosts, Nfd, logLevel="INFO")
"""
There are multiple ways of setting up routes in Mini-NDN
refer: https://minindn.memphis.edu/experiment.html#routing-options
It can also be set manually as follows. The important bit to note here
is the use of the Nfdc command
"""
for link in topo.links(withInfo=True):
node1, node2, node_info = link
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
interface_ip = interface.IP()
bandwidth = interface.params.get("bw", 100) * 1000000
info(f"Setting up route from {node1} to {node2} with bandwidth {bandwidth}\n")
Nfdc.createFace(host1, interface_ip, bandwidth=bandwidth)
Nfdc.registerRoute(host1, PREFIX, interface_ip, cost=0)
# Start cc server
info("Starting cc...\n")
qsccp_server_log = open(f"{ndn.workDir}/qsccp-demo/qsccp-server.log", "w")
getPopen(ndn.net["b"], "cc-producer --prefix {}".format(PREFIX), stdout=qsccp_server_log,\
stderr=qsccp_server_log)
# start cc client
qsccp_client_log = open(f"{ndn.workDir}/qsccp-demo/qsccp-client.log", "w")
ping1 = getPopen(ndn.net["a"], "qsccp-client --prefix {} --timingStop 10000".format(PREFIX), stdout=qsccp_client_log, stderr=qsccp_client_log)
ping1.wait()
# printOutput(ping1.stdout.read())
# interface = ndn.net["b"].connectionsTo(ndn.net["a"])[0][0]
# info("Failing link\n") # failing link by setting link loss to 100%
# interface.config(delay="10ms", bw=10, loss=100)
# info ("\n starting ping2 client \n")
# ping2 = getPopen(ndn.net["a"], "ndnping {} -c 5".format(PREFIX), stdout=PIPE, stderr=PIPE)
# ping2.wait()
# printOutput(ping2.stdout.read())
# interface.config(delay="10ms", bw=10, loss=0) # bringing back the link
info("\nExperiment Completed!\n")
MiniNDNCLI(ndn.net)
ndn.stop()
if __name__ == '__main__':
setLogLevel("info")
run()
+3 -2
View File
@@ -76,11 +76,12 @@ class Nfdc(object):
Minindn.sleep(SLEEP_TIME) Minindn.sleep(SLEEP_TIME)
@staticmethod @staticmethod
def createFace(node, remoteNodeAddress, protocol='udp', isPermanent=False, allowExisting=True): def createFace(node, remoteNodeAddress, protocol='udp', isPermanent=False, allowExisting=True, bandwidth=100000000):
'''Create face in node's NFD instance. Returns FaceID of created face or -1 if failed.''' '''Create face in node's NFD instance. Returns FaceID of created face or -1 if failed.'''
cmd = ('nfdc face create {}://{} {}'.format( cmd = ('nfdc face create {}://{} bandwidth {} persistency {}'.format(
protocol, protocol,
remoteNodeAddress, remoteNodeAddress,
int(bandwidth),
'permanent' if isPermanent else 'persistent' 'permanent' if isPermanent else 'persistent'
)) ))
output = node.cmd(cmd) output = node.cmd(cmd)
+2
View File
@@ -295,6 +295,7 @@ class Minindn(object):
host.cmd('export HOME={} && cd ~'.format(homeDir)) host.cmd('export HOME={} && cd ~'.format(homeDir))
def nfdcBatchProcessing(self, station, faces): def nfdcBatchProcessing(self, station, faces):
print("???")
# Input format: [IP, protocol, isPermanent] # Input format: [IP, protocol, isPermanent]
batch_file = open("{}/{}/nfdc.batch".format(Minindn.workDir, station.name), "w") batch_file = open("{}/{}/nfdc.batch".format(Minindn.workDir, station.name), "w")
lines = [] lines = []
@@ -370,5 +371,6 @@ class Minindn(object):
else: else:
created_faces[nodeB].append(nodeALink) created_faces[nodeB].append(nodeALink)
for station_name in batch_faces.keys(): for station_name in batch_faces.keys():
print("========= {} =========".format(station_name))
self.nfdcBatchProcessing(self.net[station_name], batch_faces[station_name]) self.nfdcBatchProcessing(self.net[station_name], batch_faces[station_name])
return created_faces return created_faces
+168
View File
@@ -0,0 +1,168 @@
import os
import time
from subprocess import PIPE
from mininet.log import setLogLevel, info
from mininet.topo import Topo
from mininet.link import TCLink
from minindn.minindn import Minindn
from minindn.apps.app_manager import AppManager
from minindn.util import MiniNDNCLI, getPopen
from minindn.apps.nfd import Nfd
from minindn.helpers.nfdc import Nfdc
PREFIX = "/A"
def printOutput(output):
_out = output.decode("utf-8").split("\n")
for _line in _out:
info(_line + "\n")
def addRoute(ndn, node1: str, node2: str, prefix: str):
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
info(f"Setting up route from {node1} to {node2} with interface {interface.IP()} => {prefix}\n")
Nfdc.registerRoute(host1, prefix, interface.IP(), cost=0)
def run():
Minindn.cleanUp()
Minindn.verifyDependencies()
ndn = Minindn(
topoFile=os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"topologies",
"qsccp1.conf",
)
)
ndn.start()
# configure and start nfd on each node
info("Configuring NFD\n")
AppManager(ndn, ndn.net.hosts, Nfd, logLevel="INFO")
for link in ndn.topo.links(withInfo=True):
node1, node2, node_info = link
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
interface_ip = interface.IP()
bandwidth = interface.params.get("bw", 100) * 1000000
info(f"Setting up route from {node1} to {node2} with bandwidth {bandwidth}\n")
Nfdc.createFace(host1, interface_ip, bandwidth=bandwidth)
addRoute(ndn, "c1", "r1", "/A")
addRoute(ndn, "c2", "r1", "/B")
addRoute(ndn, "c3", "r1", "/C")
addRoute(ndn, "c4", "r1", "/D")
addRoute(ndn, "r1", "r2", "/A")
addRoute(ndn, "r1", "r2", "/B")
addRoute(ndn, "r1", "r2", "/C")
addRoute(ndn, "r1", "r2", "/D")
addRoute(ndn, "r2", "r3", "/A")
addRoute(ndn, "r2", "r3", "/B")
addRoute(ndn, "r2", "r3", "/C")
addRoute(ndn, "r2", "r3", "/D")
addRoute(ndn, "r3", "r4", "/A")
addRoute(ndn, "r3", "r4", "/B")
addRoute(ndn, "r3", "r4", "/C")
addRoute(ndn, "r3", "r4", "/D")
addRoute(ndn, "r4", "p1", "/A")
addRoute(ndn, "r4", "p2", "/B")
addRoute(ndn, "r4", "p3", "/C")
addRoute(ndn, "r4", "p4", "/D")
# Start cc server
info("Starting cc...\n")
qsccp_server_log = open(f"{ndn.workDir}/p1/qsccp-server.log", "w")
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/A"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p2/qsccp-server.log", "w")
getPopen(
ndn.net["p2"],
"cc-producer --prefix {}".format("/B"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p3/qsccp-server.log", "w")
getPopen(
ndn.net["p3"],
"cc-producer --prefix {}".format("/C"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p4/qsccp-server.log", "w")
getPopen(
ndn.net["p4"],
"cc-producer --prefix {}".format("/D"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
total_time = 120000
# start cc client
qsccp_client_log = open(f"{ndn.workDir}/c1/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c1"],
f"qsccp-client --prefix /A --timingStop {total_time} --fixedRate 1000000 --tos 2",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c2/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c2"],
f"qsccp-client --prefix /B --timingStop {total_time} --tos 5 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c3/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c3"],
f"qsccp-client --prefix /C --timingStop {total_time} --tos 6 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c4/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c4"],
f"qsccp-client --prefix /D/1 --timingStop {total_time} --tos 7 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
ping1.wait()
# printOutput(ping1.stdout.read())
# interface = ndn.net["b"].connectionsTo(ndn.net["a"])[0][0]
# info("Failing link\n") # failing link by setting link loss to 100%
# interface.config(delay="10ms", bw=10, loss=100)
# info ("\n starting ping2 client \n")
# ping2 = getPopen(ndn.net["a"], "ndnping {} -c 5".format(PREFIX), stdout=PIPE, stderr=PIPE)
# ping2.wait()
# printOutput(ping2.stdout.read())
# interface.config(delay="10ms", bw=10, loss=0) # bringing back the link
info("\nExperiment Completed!\n")
MiniNDNCLI(ndn.net)
ndn.stop()
if __name__ == "__main__":
setLogLevel("info")
run()
+166
View File
@@ -0,0 +1,166 @@
import os
import time
from subprocess import PIPE
from mininet.log import setLogLevel, info
from mininet.topo import Topo
from mininet.link import TCLink
from minindn.minindn import Minindn
from minindn.apps.app_manager import AppManager
from minindn.util import MiniNDNCLI, getPopen
from minindn.apps.nfd import Nfd
from minindn.helpers.nfdc import Nfdc
def printOutput(output):
_out = output.decode("utf-8").split("\n")
for _line in _out:
info(_line + "\n")
def addRoute(ndn, node1: str, node2: str, prefix: str):
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
info(f"Setting up route from {node1} to {node2} with interface {interface.IP()} => {prefix}\n")
Nfdc.registerRoute(host1, prefix, interface.IP(), cost=0)
def run():
Minindn.cleanUp()
Minindn.verifyDependencies()
ndn = Minindn(
topoFile=os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"topologies",
"qsccp2.conf",
)
)
ndn.start()
# configure and start nfd on each node
info("Configuring NFD\n")
AppManager(ndn, ndn.net.hosts, Nfd, logLevel="INFO")
for link in ndn.topo.links(withInfo=True):
node1, node2, node_info = link
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
interface_ip = interface.IP()
bandwidth = interface.params.get("bw", 100) * 1000000
info(f"Setting up route from {node1} to {node2} with bandwidth {bandwidth}\n")
Nfdc.createFace(host1, interface_ip, bandwidth=bandwidth)
addRoute(ndn, "c1", "r1", "/A")
addRoute(ndn, "c2", "r1", "/B")
addRoute(ndn, "c3", "r1", "/C")
addRoute(ndn, "r1", "r2", "/A")
addRoute(ndn, "r1", "r2", "/B")
addRoute(ndn, "r1", "r2", "/C")
addRoute(ndn, "r1", "r3", "/A")
addRoute(ndn, "r1", "r3", "/B")
addRoute(ndn, "r1", "r3", "/C")
addRoute(ndn, "r2", "p1", "/A")
addRoute(ndn, "r2", "p1", "/B")
addRoute(ndn, "r2", "p1", "/C")
addRoute(ndn, "r3", "p2", "/A")
addRoute(ndn, "r3", "p3", "/B")
addRoute(ndn, "r3", "p4", "/C")
Nfdc.setStrategy(ndn.net["r1"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r1"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r1"], "/C", "QSCCP/%FD%01")
# Start cc server
info("Starting cc...\n")
qsccp_server_log = open(f"{ndn.workDir}/p1/qsccp-server.log", "w")
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/A"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/B"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/C"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p2/qsccp-server.log", "w")
getPopen(
ndn.net["p2"],
"cc-producer --prefix {}".format("/A"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p3/qsccp-server.log", "w")
getPopen(
ndn.net["p3"],
"cc-producer --prefix {}".format("/B"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p4/qsccp-server.log", "w")
getPopen(
ndn.net["p4"],
"cc-producer --prefix {}".format("/C"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
# start cc client
qsccp_client_log = open(f"{ndn.workDir}/c1/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c1"],
f"qsccp-client --prefix /A --timingStop 90000 --tos 5 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c2/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c2"],
f"qsccp-client --prefix /B --timingStop 120000 --delayStart 30000 --tos 6 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c3/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c3"],
f"qsccp-client --prefix /C --timingStop 150000 --delayStart 60000 --tos 7 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
ping1.wait()
# printOutput(ping1.stdout.read())
# interface = ndn.net["b"].connectionsTo(ndn.net["a"])[0][0]
# info("Failing link\n") # failing link by setting link loss to 100%
# interface.config(delay="10ms", bw=10, loss=100)
# info ("\n starting ping2 client \n")
# ping2 = getPopen(ndn.net["a"], "ndnping {} -c 5".format(PREFIX), stdout=PIPE, stderr=PIPE)
# ping2.wait()
# printOutput(ping2.stdout.read())
# interface.config(delay="10ms", bw=10, loss=0) # bringing back the link
info("\nExperiment Completed!\n")
MiniNDNCLI(ndn.net)
ndn.stop()
if __name__ == "__main__":
setLogLevel("info")
run()
+213
View File
@@ -0,0 +1,213 @@
import os
import time
from subprocess import PIPE
from mininet.log import setLogLevel, info
from mininet.topo import Topo
from mininet.link import TCLink
from minindn.minindn import Minindn
from minindn.apps.app_manager import AppManager
from minindn.util import MiniNDNCLI, getPopen
from minindn.apps.nfd import Nfd
from minindn.helpers.nfdc import Nfdc
def printOutput(output):
_out = output.decode("utf-8").split("\n")
for _line in _out:
info(_line + "\n")
def addRoute(ndn, node1: str, node2: str, prefix: str):
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
info(
f"Setting up route from {node1} to {node2} with interface {interface.IP()} => {prefix}\n"
)
Nfdc.registerRoute(host1, prefix, interface.IP(), cost=0)
def run():
Minindn.cleanUp()
Minindn.verifyDependencies()
ndn = Minindn(
topoFile=os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"topologies",
"qsccp3.1.conf",
)
)
ndn.start()
# configure and start nfd on each node
info("Configuring NFD\n")
AppManager(ndn, ndn.net.hosts, Nfd, logLevel="INFO")
for link in ndn.topo.links(withInfo=True):
node1, node2, node_info = link
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
interface_ip = interface.IP()
bandwidth = interface.params.get("bw", 100) * 1000000
info(f"Setting up route from {node1} to {node2} with bandwidth {bandwidth}\n")
Nfdc.createFace(host1, interface_ip, bandwidth=bandwidth)
addRoute(ndn, "c1", "r1", "/A")
addRoute(ndn, "c2", "r1", "/B")
addRoute(ndn, "c3", "r1", "/C")
addRoute(ndn, "r1", "r2", "/A")
addRoute(ndn, "r1", "r2", "/B")
addRoute(ndn, "r1", "r2", "/C")
addRoute(ndn, "r2", "r3", "/A")
addRoute(ndn, "r2", "r3", "/B")
addRoute(ndn, "r2", "r3", "/C")
addRoute(ndn, "r2", "r4", "/A")
addRoute(ndn, "r2", "r4", "/B")
addRoute(ndn, "r2", "r4", "/C")
addRoute(ndn, "r2", "r5", "/A")
addRoute(ndn, "r2", "r5", "/B")
addRoute(ndn, "r2", "r5", "/C")
addRoute(ndn, "r4", "r3", "/A")
addRoute(ndn, "r4", "r3", "/B")
addRoute(ndn, "r4", "r3", "/C")
addRoute(ndn, "r4", "r5", "/A")
addRoute(ndn, "r4", "r5", "/B")
addRoute(ndn, "r4", "r5", "/C")
addRoute(ndn, "r3", "r6", "/A")
addRoute(ndn, "r3", "r6", "/B")
addRoute(ndn, "r3", "r6", "/C")
addRoute(ndn, "r5", "r6", "/A")
addRoute(ndn, "r5", "r6", "/B")
addRoute(ndn, "r5", "r6", "/C")
addRoute(ndn, "r6", "p1", "/A")
addRoute(ndn, "r6", "p1", "/B")
addRoute(ndn, "r6", "p1", "/C")
addRoute(ndn, "r6", "p2", "/A")
addRoute(ndn, "r6", "p3", "/B")
addRoute(ndn, "r6", "p4", "/C")
Nfdc.setStrategy(ndn.net["r1"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r1"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r1"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r2"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r2"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r2"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r3"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r3"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r3"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r4"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r4"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r4"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r5"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r5"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r5"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r6"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r6"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r6"], "/C", "QSCCP/%FD%01")
# Start cc server
info("Starting cc...\n")
qsccp_server_log = open(f"{ndn.workDir}/p1/qsccp-server.log", "w")
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/A"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/B"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/C"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p2/qsccp-server.log", "w")
getPopen(
ndn.net["p2"],
"cc-producer --prefix {}".format("/A"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p3/qsccp-server.log", "w")
getPopen(
ndn.net["p3"],
"cc-producer --prefix {}".format("/B"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p4/qsccp-server.log", "w")
getPopen(
ndn.net["p4"],
"cc-producer --prefix {}".format("/C"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
# start cc client
qsccp_client_log = open(f"{ndn.workDir}/c1/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c1"],
f"qsccp-client --prefix /A --timingStop 320000 --tos 5",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c2/qsccp-client.log", "w")
getPopen(
ndn.net["c2"],
f"qsccp-client --prefix /B --timingStop 320000 --delayStart 80000 --tos 5 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c3/qsccp-client.log", "w")
getPopen(
ndn.net["c3"],
f"qsccp-client --prefix /C --timingStop 320000 --delayStart 160000 --delayGreedy 240000 --greedyRate 10000000 --tos 5 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
ping1.wait()
# printOutput(ping1.stdout.read())
# interface = ndn.net["b"].connectionsTo(ndn.net["a"])[0][0]
# info("Failing link\n") # failing link by setting link loss to 100%
# interface.config(delay="10ms", bw=10, loss=100)
# info ("\n starting ping2 client \n")
# ping2 = getPopen(ndn.net["a"], "ndnping {} -c 5".format(PREFIX), stdout=PIPE, stderr=PIPE)
# ping2.wait()
# printOutput(ping2.stdout.read())
# interface.config(delay="10ms", bw=10, loss=0) # bringing back the link
info("\nExperiment Completed!\n")
MiniNDNCLI(ndn.net)
ndn.stop()
if __name__ == "__main__":
setLogLevel("info")
run()
+212
View File
@@ -0,0 +1,212 @@
import os
import time
from subprocess import PIPE
from mininet.log import setLogLevel, info
from mininet.topo import Topo
from mininet.link import TCLink
from minindn.minindn import Minindn
from minindn.apps.app_manager import AppManager
from minindn.util import MiniNDNCLI, getPopen
from minindn.apps.nfd import Nfd
from minindn.helpers.nfdc import Nfdc
def printOutput(output):
_out = output.decode("utf-8").split("\n")
for _line in _out:
info(_line + "\n")
def addRoute(ndn, node1: str, node2: str, prefix: str):
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
info(
f"Setting up route from {node1} to {node2} with interface {interface.IP()} => {prefix}\n"
)
Nfdc.registerRoute(host1, prefix, interface.IP(), cost=0)
def run():
Minindn.cleanUp()
Minindn.verifyDependencies()
ndn = Minindn(
topoFile=os.path.join(
os.path.dirname(os.path.dirname(os.path.realpath(__file__))),
"topologies",
"qsccp3.2.conf",
)
)
ndn.start()
# configure and start nfd on each node
info("Configuring NFD\n")
AppManager(ndn, ndn.net.hosts, Nfd, logLevel="INFO")
for link in ndn.topo.links(withInfo=True):
node1, node2, node_info = link
host1 = ndn.net[node1]
host2 = ndn.net[node2]
interface = host2.connectionsTo(host1)[0][0]
interface_ip = interface.IP()
bandwidth = interface.params.get("bw", 100) * 1000000
info(f"Setting up route from {node1} to {node2} with bandwidth {bandwidth}\n")
Nfdc.createFace(host1, interface_ip, bandwidth=bandwidth)
addRoute(ndn, "c1", "r1", "/A")
addRoute(ndn, "c2", "r1", "/B")
addRoute(ndn, "c3", "r1", "/C")
addRoute(ndn, "r1", "r2", "/A")
addRoute(ndn, "r1", "r2", "/B")
addRoute(ndn, "r1", "r2", "/C")
addRoute(ndn, "r2", "r3", "/A")
addRoute(ndn, "r2", "r3", "/B")
addRoute(ndn, "r2", "r3", "/C")
addRoute(ndn, "r2", "r4", "/A")
addRoute(ndn, "r2", "r4", "/B")
addRoute(ndn, "r2", "r4", "/C")
addRoute(ndn, "r2", "r5", "/A")
addRoute(ndn, "r2", "r5", "/B")
addRoute(ndn, "r2", "r5", "/C")
addRoute(ndn, "r4", "r3", "/A")
addRoute(ndn, "r4", "r3", "/B")
addRoute(ndn, "r4", "r3", "/C")
addRoute(ndn, "r4", "r5", "/A")
addRoute(ndn, "r4", "r5", "/B")
addRoute(ndn, "r4", "r5", "/C")
addRoute(ndn, "r3", "r6", "/A")
addRoute(ndn, "r3", "r6", "/B")
addRoute(ndn, "r3", "r6", "/C")
addRoute(ndn, "r5", "r6", "/A")
addRoute(ndn, "r5", "r6", "/B")
addRoute(ndn, "r5", "r6", "/C")
addRoute(ndn, "r6", "p1", "/A")
addRoute(ndn, "r6", "p1", "/B")
addRoute(ndn, "r6", "p1", "/C")
addRoute(ndn, "r6", "p2", "/A")
addRoute(ndn, "r6", "p3", "/B")
addRoute(ndn, "r6", "p4", "/C")
Nfdc.setStrategy(ndn.net["r1"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r1"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r1"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r2"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r2"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r2"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r3"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r3"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r3"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r4"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r4"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r4"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r5"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r5"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r5"], "/C", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r6"], "/A", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r6"], "/B", "QSCCP/%FD%01")
Nfdc.setStrategy(ndn.net["r6"], "/C", "QSCCP/%FD%01")
# Start cc server
info("Starting cc...\n")
qsccp_server_log = open(f"{ndn.workDir}/p1/qsccp-server.log", "w")
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/A"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/B"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
getPopen(
ndn.net["p1"],
"cc-producer --prefix {}".format("/C"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p2/qsccp-server.log", "w")
getPopen(
ndn.net["p2"],
"cc-producer --prefix {}".format("/A"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p3/qsccp-server.log", "w")
getPopen(
ndn.net["p3"],
"cc-producer --prefix {}".format("/B"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
qsccp_server_log = open(f"{ndn.workDir}/p4/qsccp-server.log", "w")
getPopen(
ndn.net["p4"],
"cc-producer --prefix {}".format("/C"),
stdout=qsccp_server_log,
stderr=qsccp_server_log,
)
# start cc client
qsccp_client_log = open(f"{ndn.workDir}/c1/qsccp-client.log", "w")
ping1 = getPopen(
ndn.net["c1"],
f"qsccp-client --prefix /A --timingStop 320000 --tos 5",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c2/qsccp-client.log", "w")
getPopen(
ndn.net["c2"],
f"qsccp-client --prefix /B --timingStop 320000 --delayStart 80000 --tos 5 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
qsccp_client_log = open(f"{ndn.workDir}/c3/qsccp-client.log", "w")
getPopen(
ndn.net["c3"],
f"qsccp-client --prefix /C --timingStop 320000 --delayStart 160000 --delayGreedy 240000 --greedyRate 10000000 --tos 5 --initialSendRate 50000",
stdout=qsccp_client_log,
stderr=qsccp_client_log,
)
ping1.wait()
# printOutput(ping1.stdout.read())
# interface = ndn.net["b"].connectionsTo(ndn.net["a"])[0][0]
# info("Failing link\n") # failing link by setting link loss to 100%
# interface.config(delay="10ms", bw=10, loss=100)
# info ("\n starting ping2 client \n")
# ping2 = getPopen(ndn.net["a"], "ndnping {} -c 5".format(PREFIX), stdout=PIPE, stderr=PIPE)
# ping2.wait()
# printOutput(ping2.stdout.read())
# interface.config(delay="10ms", bw=10, loss=0) # bringing back the link
info("\nExperiment Completed!\n")
MiniNDNCLI(ndn.net)
ndn.stop()
if __name__ == "__main__":
setLogLevel("info")
run()
+26
View File
@@ -0,0 +1,26 @@
[nodes]
C1: _
C2: _
C3: _
C4: _
R1: _
R2: _
R3: _
R4: _
P1: _
P2: _
P3: _
P4: _
[links]
C1:R1 delay=10ms bw=100
C2:R1 delay=10ms bw=100
C3:R1 delay=10ms bw=100
C4:R1 delay=10ms bw=100
R1:R2 delay=10ms bw=100
R2:R3 delay=10ms bw=10
R3:R4 delay=10ms bw=100
R4:P1 delay=10ms bw=100
R4:P2 delay=10ms bw=100
R4:P3 delay=10ms bw=100
R4:P4 delay=10ms bw=100
+22
View File
@@ -0,0 +1,22 @@
[nodes]
C1: _
C2: _
C3: _
R1: _
R2: _
R3: _
P1: _
P2: _
P3: _
P4: _
[links]
C1:R1 delay=10ms bw=100
C2:R1 delay=10ms bw=100
C3:R1 delay=10ms bw=100
R1:R2 delay=10ms bw=5
R1:R3 delay=10ms bw=5
R2:P1 delay=10ms bw=100
R3:P2 delay=10ms bw=100
R3:P3 delay=10ms bw=100
R3:P4 delay=10ms bw=100
+31
View File
@@ -0,0 +1,31 @@
[nodes]
C1: _
C2: _
C3: _
R1: _
R2: _
R3: _
R4: _
R5: _
R6: _
P1: _
P2: _
P3: _
P4: _
[links]
C1:R1 delay=10ms bw=100
C2:R1 delay=10ms bw=100
C3:R1 delay=10ms bw=100
R1:R2 delay=10ms bw=100
R2:R3 delay=10ms bw=1
R2:R4 delay=5ms bw=8
R2:R5 delay=10ms bw=5
R4:R3 delay=5ms bw=6
R4:R5 delay=5ms bw=2
R3:R6 delay=10ms bw=7
R5:R6 delay=10ms bw=7
R6:P1 delay=10ms bw=100
R6:P2 delay=10ms bw=100
R6:P3 delay=10ms bw=100
R6:P4 delay=10ms bw=100
+31
View File
@@ -0,0 +1,31 @@
[nodes]
C1: _
C2: _
C3: _
R1: _
R2: _
R3: _
R4: _
R5: _
R6: _
P1: _
P2: _
P3: _
P4: _
[links]
C1:R1 delay=10ms bw=100
C2:R1 delay=10ms bw=100
C3:R1 delay=10ms bw=100
R1:R2 delay=10ms bw=100
R2:R3 delay=10ms bw=3.5
R2:R4 delay=10ms bw=7
R2:R5 delay=20ms bw=3.5
R4:R3 delay=5ms bw=3.5
R4:R5 delay=5ms bw=3.5
R3:R6 delay=5ms bw=7
R5:R6 delay=10ms bw=7
R6:P1 delay=10ms bw=100
R6:P2 delay=10ms bw=100
R6:P3 delay=10ms bw=100
R6:P4 delay=10ms bw=100
+2 -1
View File
@@ -36,6 +36,7 @@ DEP_INFO=(
["CXX"]="ndn-cxx,ndn-cxx,libndn-cxx-dev,https://github.com/named-data/ndn-cxx.git,ndn-cxx" ["CXX"]="ndn-cxx,ndn-cxx,libndn-cxx-dev,https://github.com/named-data/ndn-cxx.git,ndn-cxx"
["NFD"]="NFD,NFD,nfd,https://github.com/named-data/NFD.git,NFD" ["NFD"]="NFD,NFD,nfd,https://github.com/named-data/NFD.git,NFD"
["PSYNC"]="PSync,PSync,libpsync-dev,https://github.com/named-data/PSync.git,PSync" ["PSYNC"]="PSync,PSync,libpsync-dev,https://github.com/named-data/PSync.git,PSync"
["CHRONOSYNC"]="ChronoSync,ChronoSync,ChronoSync,https://github.com/named-data/ChronoSync.git"
["NLSR"]="NLSR,NLSR,nlsr,https://github.com/named-data/NLSR.git,NLSR" ["NLSR"]="NLSR,NLSR,nlsr,https://github.com/named-data/NLSR.git,NLSR"
["TOOLS"]="ndn-tools,NDN Essential Tools,ndn-tools,https://github.com/named-data/ndn-tools.git,ndn-tools" ["TOOLS"]="ndn-tools,NDN Essential Tools,ndn-tools,https://github.com/named-data/ndn-tools.git,ndn-tools"
["TRAFFIC"]="ndn-traffic-generator,NDN Traffic Generator,ndn-traffic-generator,https://github.com/named-data/ndn-traffic-generator.git,ndn-traffic-generator" ["TRAFFIC"]="ndn-traffic-generator,NDN Traffic Generator,ndn-traffic-generator,https://github.com/named-data/ndn-traffic-generator.git,ndn-traffic-generator"
@@ -233,7 +234,7 @@ if [[ $PPA_AVAIL -ne 1 ]] || [[ $NO_PPA -eq 1 ]]; then
fi fi
# dep install order, excluding ndn-cxx # dep install order, excluding ndn-cxx
DEPLIST=(NFD PSYNC NLSR TOOLS TRAFFIC INFOEDIT MININET) DEPLIST=(NFD PSYNC CHRONOSYNC NLSR TOOLS TRAFFIC INFOEDIT MININET)
if [[ $NO_WIFI -ne 1 ]]; then if [[ $NO_WIFI -ne 1 ]]; then
DEPLIST+=(MNWIFI) DEPLIST+=(MNWIFI)
fi fi