def buildFromTopo( self, topo=None ): """Build mininet from a topology object At the end of this function, everything should be connected and up.""" # Possibly we should clean up here and/or validate # the topo if self.cleanup: pass info( '*** Creating network\n' ) if self.controllers: # Add a default controller info( '*** Adding controller\n' ) classes = self.controller if type( classes ) is not list: classes = [ classes ] for i, cls in enumerate( classes ): self.addController( 'c%d' % i, cls ) info( '*** Adding hosts:\n' ) for hostName in topo.hosts(): #aqui ele adiciona os hosts mesmo. Funcao self.addHost retorna o host adicionado! So precisa entao pegar esse host, passar pra classe MetricsCollector e ja era. Ou se preferir, tem uma lista com todos os hosts self.hosts. self.addHost( hostName, **topo.nodeInfo( hostName ) ) info( hostName + ' ' ) #info( hostName + '\n' ) if self.switches: info( '\n*** Adding switches:\n' ) for switchName in topo.switches(): self.addSwitch( switchName, **topo.nodeInfo( switchName) ) info( switchName + ' ' ) info( '\n*** Adding links:\n' ) #pdb.set_trace() for srcName, dstName in topo.links(sort=True): src, dst = self.nameToNode[ srcName ], self.nameToNode[ dstName ] params = topo.linkInfo( srcName, dstName ) srcPort, dstPort = topo.port( srcName, dstName ) self.addLink( src, dst, srcPort, dstPort, **params ) if self.isCCNhost(src): src.setIP(ipStr(ipParse(self.ccnNetBase) + 1) + '/30', intf=src.name + '-eth' + str(srcPort)) dst.setIP(ipStr(ipParse(self.ccnNetBase) + 2) + '/30', intf=dst.name + '-eth' + str(dstPort)) self.ccnNetBase=nextCCNnet(self.ccnNetBase) info( '(%s, %s) ' % ( src.name, dst.name ) ) info( '\n' )
def configureRoutedControlNetwork(self, ip="192.168.123.1", prefixLen=16): """Configure a routed control network on controller and switches. For use with the user datapath only right now.""" controller = self.controllers[0] info(controller.name + " <->") cip = ip snum = ipParse(ip) for switch in self.switches: info(" " + switch.name) link = self.link(switch, controller, port1=0) sintf, cintf = link.intf1, link.intf2 switch.controlIntf = sintf snum += 1 while snum & 0xFF in [0, 255]: snum += 1 sip = ipStr(snum) cintf.setIP(cip, prefixLen) sintf.setIP(sip, prefixLen) controller.setHostRoute(sip, cintf) switch.setHostRoute(cip, sintf) info("\n") info("*** Testing control network\n") while not cintf.isUp(): info("*** Waiting for", cintf, "to come up\n") sleep(1) for switch in self.switches: while not sintf.isUp(): info("*** Waiting for", sintf, "to come up\n") sleep(1) if self.ping(hosts=[switch, controller]) != 0: error("*** Error: control network test failed\n") exit(1) info("\n")
def configureRoutedControlNetwork( self, ip='192.168.123.1', prefixLen=16 ): """Configure a routed control network on controller and switches. For use with the user datapath only right now. """ controller = self.controllers[ 0 ] info( controller.name + ' <->' ) cip = ip snum = ipParse( ip ) for switch in self.switches: info( ' ' + switch.name ) sintf, cintf = createLink( switch, controller ) snum += 1 while snum & 0xff in [ 0, 255 ]: snum += 1 sip = ipStr( snum ) controller.setIP( cintf, cip, prefixLen ) switch.setIP( sintf, sip, prefixLen ) controller.setHostRoute( sip, cintf ) switch.setHostRoute( cip, sintf ) info( '\n' ) info( '*** Testing control network\n' ) while not controller.intfIsUp( cintf ): info( '*** Waiting for', cintf, 'to come up\n' ) sleep( 1 ) for switch in self.switches: while not switch.intfIsUp( sintf ): info( '*** Waiting for', sintf, 'to come up\n' ) sleep( 1 ) if self.ping( hosts=[ switch, controller ] ) != 0: error( '*** Error: control network test failed\n' ) exit( 1 ) info( '\n' )
def configureRoutedControlNetwork(self, ip='192.168.123.1', prefixLen=16): """Configure a routed control network on controller and switches. For use with the user datapath only right now.""" controller = self.controllers[0] info(controller.name + ' <->') cip = ip snum = ipParse(ip) for switch in self.switches: info(' ' + switch.name) link = self.link(switch, controller, port1=0) sintf, cintf = link.intf1, link.intf2 switch.controlIntf = sintf snum += 1 while snum & 0xff in [0, 255]: snum += 1 sip = ipStr(snum) cintf.setIP(cip, prefixLen) sintf.setIP(sip, prefixLen) controller.setHostRoute(sip, cintf) switch.setHostRoute(cip, sintf) info('\n') info('*** Testing control network\n') while not cintf.isUp(): info('*** Waiting for', cintf, 'to come up\n') sleep(1) for switch in self.switches: while not sintf.isUp(): info('*** Waiting for', sintf, 'to come up\n') sleep(1) if self.ping(hosts=[switch, controller]) != 0: error('*** Error: control network test failed\n') exit(1) info('\n')
def write_rtablefile(self, router): rtablefile = "rtable.%s" % router.name info( '*** Writing rtable file %s\n' % rtablefile) visited, path = dijkstra(self.graph, router.name) try: with open(rtablefile, 'w') as f: for i in range(0, len(router.ips)): iface = '%s-eth%d' % (router.name, i+1) ip = router.ips[i] mask = router.masks[i] subnet = ipStr(ipParse(ip) & ipParse(mask)) f.write('%s 0.0.0.0 %s eth%d\n' % (subnet, mask, i+1)) for rt in self.vrouters.values(): if (rt.name == router.name): continue local = None remote = None reached = path[rt.name] while (reached != router.name): if (reached.split('.')[0] in self.vrouters): remote = local local = reached reached = path[reached] localrt = self.vrouters[local.split('.')[0]] localport = int(local.split('.')[1]) remotert = self.vrouters[remote.split('.')[0]] remoteport = int(remote.split('.')[1]) info("Reach %s from %s via %s.%d and %s.%d\n" % ( rt.name, router.name, localrt.name, localport, remotert.name, remoteport)) gw = remotert.ips[remoteport-1] for i in range(0, len(rt.ips)): iface = '%s-eth%d' % (rt.name, i+1) ip = rt.ips[i] mask = rt.masks[i] subnet = ipStr(ipParse(ip) & ipParse(mask)) if (subnet in router.subnets): continue f.write('%s %s %s eth%d\n' % (subnet, gw, mask, localport)) router.subnets.append(subnet) f.close() except EnvironmentError: sys.exit("Couldn't write IP file" % ipfile)
def __init__(self, name, addrs): self.name = name self.ips = [] self.prefixes = [] self.masks = [] self.subnets = [] self.ifaces = 0 self.switch = None for addr in addrs: ip = addr.split("/")[0] prefix = int(addr.split("/")[1]) mask = prefixToMask(prefix) subnet = ipStr(ipParse(ip) & ipParse(mask)) self.ips.append(ip) self.prefixes.append(prefix) self.masks.append(mask) self.subnets.append(subnet)
def write_rtablefile(self, router): rtablefile = "rtable.%s" % router.name info('*** Writing rtable file %s\n' % rtablefile) visited, path = dijkstra(self.graph, router.name) try: with open(rtablefile, 'w') as f: for i in range(0, len(router.ips)): iface = '%s-eth%d' % (router.name, i + 1) ip = router.ips[i] mask = router.masks[i] subnet = ipStr(ipParse(ip) & ipParse(mask)) f.write('%s 0.0.0.0 %s eth%d\n' % (subnet, mask, i + 1)) for rt in self.vrouters.values(): if (rt.name == router.name): continue local = None remote = None reached = path[rt.name] while (reached != router.name): if (reached.split('.')[0] in self.vrouters): remote = local local = reached reached = path[reached] localrt = self.vrouters[local.split('.')[0]] localport = int(local.split('.')[1]) remotert = self.vrouters[remote.split('.')[0]] remoteport = int(remote.split('.')[1]) info("Reach %s from %s via %s.%d and %s.%d\n" % (rt.name, router.name, localrt.name, localport, remotert.name, remoteport)) gw = remotert.ips[remoteport - 1] for i in range(0, len(rt.ips)): iface = '%s-eth%d' % (rt.name, i + 1) ip = rt.ips[i] mask = rt.masks[i] subnet = ipStr(ipParse(ip) & ipParse(mask)) if (subnet in router.subnets): continue f.write('%s %s %s eth%d\n' % (subnet, gw, mask, localport)) router.subnets.append(subnet) f.close() except EnvironmentError: sys.exit("Couldn't write IP file" % ipfile)
def buildFromTopo( self, topo=None ): """Build mininet from a topology object At the end of this function, everything should be connected and up.""" # Possibly we should clean up here and/or validate # the topo if self.cleanup: pass info( '*** Creating network\n' ) if not self.controllers and self.controller: # Add a default controller info( '*** Adding controller\n' ) classes = self.controller if type( classes ) is not list: classes = [ classes ] for i, cls in enumerate( classes ): self.addController( 'c%d' % i, cls ) info( '*** Adding hosts:\n' ) for hostName in topo.hosts(): self.addHost( hostName, **topo.nodeInfo( hostName ) ) info( hostName + ' ' ) info( '\n*** Adding switches:\n' ) for switchName in topo.switches(): self.addSwitch( switchName, **topo.nodeInfo( switchName) ) info( switchName + ' ' ) info( '\n*** Adding links:\n' ) for srcName, dstName in topo.links(sort=True): src, dst = self.nameToNode[ srcName ], self.nameToNode[ dstName ] params = topo.linkInfo( srcName, dstName ) srcPort, dstPort = topo.port( srcName, dstName ) self.addLink( src, dst, srcPort, dstPort, **params ) if self.isCCNhost(src): src.setIP(ipStr(ipParse(self.ccnNetBase) + 1) + '/30', intf=src.name + '-eth' + str(srcPort)) dst.setIP(ipStr(ipParse(self.ccnNetBase) + 2) + '/30', intf=dst.name + '-eth' + str(dstPort)) self.ccnNetBase=nextCCNnet(self.ccnNetBase) info( '(%s, %s) ' % ( src.name, dst.name ) ) info( '\n' )
def ethernetPairConnectivity(self): ndnNetBase = '10.0.0.0' interfaces = [] for host in self.net.hosts: for intf in host.intfList(): link = intf.link node1, node2 = link.intf1.node, link.intf2.node if isinstance(node1, Switch) or isinstance(node2, Switch): continue if link.intf1 not in interfaces and link.intf2 not in interfaces: interfaces.append(link.intf1) interfaces.append(link.intf2) node1.setIP(ipStr(ipParse(ndnNetBase) + 1) + '/30', intf=link.intf1) node2.setIP(ipStr(ipParse(ndnNetBase) + 2) + '/30', intf=link.intf2) ndnNetBase = ipStr(ipParse(ndnNetBase) + 4)
def buildFromTopo( self, topo=None ): """Build mininet from a topology object At the end of this function, everything should be connected and up.""" # Possibly we should clean up here and/or validate # the topo if self.cleanup: pass info( '*** Creating network\n' ) if not self.controllers: # Add a default controller info( '*** Adding controller\n' ) classes = self.controller if type( classes ) is not list: classes = [ classes ] for i, cls in enumerate( classes ): self.addController( 'c%d' % i, cls ) info( '*** Adding hosts:\n' ) for hostName in topo.hosts(): self.addHost( hostName, **topo.nodeInfo( hostName ) ) info( hostName + ' ' ) info( '\n*** Adding switches:\n' ) for switchName in topo.switches(): self.addSwitch( switchName, **topo.nodeInfo( switchName) ) info( switchName + ' ' ) info( '\n*** Adding links:\n' ) for srcName, dstName in topo.links(sort=True): src, dst = self.nameToNode[ srcName ], self.nameToNode[ dstName ] params = topo.linkInfo( srcName, dstName ) srcPort, dstPort = topo.port( srcName, dstName ) self.addLink( src, dst, srcPort, dstPort, **params ) if self.isCCNhost(src): src.setIP(ipStr(ipParse(self.ccnNetBase) + 1) + '/30', intf=src.name + '-eth' + str(srcPort)) dst.setIP(ipStr(ipParse(self.ccnNetBase) + 2) + '/30', intf=dst.name + '-eth' + str(dstPort)) self.ccnNetBase=nextCCNnet(self.ccnNetBase) info( '(%s, %s) ' % ( src.name, dst.name ) ) info( '\n' )
def execute(options): "Create a network based on template_file" template_file = options.templateFile install_dir='/usr/local/etc/mini-ndn/' if template_file == '': template_file = install_dir + 'default-topology.conf' if options.testbed: template_file = install_dir + 'minindn.testbed.conf' if os.path.exists(template_file) == False: info('No template file given and default template file cannot be found. Exiting...\n') quit() # Update nfd.conf file used by Mini-NDN to match the currently installed version of NFD nfdConfFile = "%s/nfd.conf" % install_dir os.system("sudo cp /usr/local/etc/ndn/nfd.conf.sample %s" % nfdConfFile) os.system("sudo sed -i \'s|default_level [A-Z]*$|default_level $LOG_LEVEL|g\' %s" % nfdConfFile) topo = NdnTopo(template_file, options.workDir) t = datetime.datetime.now() if topo.isTCLink == True and topo.isLimited == True: net = Mininet(topo,host=CpuLimitedNdnHost,link=TCLink) elif topo.isTCLink == True and topo.isLimited == False: net = Mininet(topo,host=NdnHost,link=TCLink) elif topo.isTCLink == False and topo.isLimited == True: net = Mininet(topo,host=CpuLimitedNdnHost) else: net = Mininet(topo,host=NdnHost,controller=RemoteController) # [PZ] probable alternative is to have net=Mininet(...,build=False) and add something like # net.addController(name='c0', controller=RemoteController, ip='127.0.0.1') # ..and then have net.build() t2 = datetime.datetime.now() delta = t2 - t info('Setup time: ' + str(delta.seconds) + '\n') net.start() # Giving proper IPs to intf so neighbor nodes can communicate # This is one way of giving connectivity, another way could be # to insert a switch between each pair of neighbors ndnNetBase = "1.0.0.0" sdnNetBase = "2.0.0.0" sdnHostCount = 0 interfaces = [] for host in net.hosts: for intf in host.intfList(): link = intf.link node1, node2 = link.intf1.node, link.intf2.node # if node1 in net.switches or node2 in net.switches: # print "%s or %s is a switch" % (node1.name, node2.name) # continue if node1 in net.hosts and node2 in net.switches: sdnHostCount += 1 if sdnHostCount > 254: print "too many sdn hosts" exit() node1.setIP(ipStr(ipParse(sdnNetBase) + sdnHostCount) + '/24', intf=link.intf1) continue if node2 in net.hosts and node1 in net.switches: sdnHostCount += 1 if sdnHostCount > 254: print "too many sdn hosts" exit() node2.setIP(ipStr(ipParse(sdnNetBase) + sdnHostCount) + '/24', intf=link.intf2) continue if link.intf1 not in interfaces and link.intf2 not in interfaces: interfaces.append(link.intf1) interfaces.append(link.intf2) node1.setIP(ipStr(ipParse(ndnNetBase) + 1) + '/30', intf=link.intf1) node2.setIP(ipStr(ipParse(ndnNetBase) + 2) + '/30', intf=link.intf2) ndnNetBase = ipStr(ipParse(ndnNetBase) + 4) nodes = "" # Used later to check prefix name in checkFIB # NLSR initialization for host in net.hosts: nodes += str(host.name) + "," conf = next(x for x in hosts_conf if x.name == host.name) host.nlsrParameters = conf.nlsrParameters if options.nFaces is not None: host.nlsrParameters["max-faces-per-prefix"] = options.nFaces if options.hr is True: host.nlsrParameters["hyperbolic-state"] = "on" # Generate NLSR configuration file configGenerator = NlsrConfigGenerator(host) configGenerator.createConfigFile() # Start NLSR host.nlsr = Nlsr(host) host.nlsr.start() nodes = nodes[0:-1] for host in net.hosts: if 'app' in host.params: if host.params['app'] != '': app = host.params['app'] print "Starting " + app + " on node " + host.name print(host.cmd(app)) # Load experiment experimentName = options.experimentName if experimentName is not None: print "Loading experiment: %s" % experimentName experimentArgs = { "net": net, "nodes": nodes, "ctime": options.ctime, "nPings": options.nPings, "strategy": Nfd.STRATEGY_BEST_ROUTE_V3 } experiment = ExperimentManager.create(experimentName, experimentArgs) if experiment is not None: experiment.start() else: print "ERROR: Experiment '%s' does not exist" % experimentName return if options.isCliEnabled is True: CLI(net) net.stop()
def nextCCNnet(curCCNnet): netNum = ipParse(curCCNnet) return ipStr(netNum+4)
from errno import EEXIST from signal import SIGALRM, alarm, signal from itertools import tee from argparse import Action, ArgumentParser from shutil import copy2, rmtree from logging import basicConfig, INFO, getLogger from time import sleep GRID_MODULE_LISTEN_PORT = '12347' LOCAL_IP = '192.168.0.0' LOCAL_PREFIX = 16 # Local addresses of the LAN 192.168.0.0/16 with the prefix # (except network and broadcast addresses) LOCAL_ADDRS = ('{}/{}'.format(ipAdd(i + 1, LOCAL_PREFIX, ipParse(LOCAL_IP)), LOCAL_PREFIX) for i in range((1 << (32 - LOCAL_PREFIX)) - 2)) GLOBAL_IP = '10.0.0.0' GLOBAL_PREFIX = 8 SUBNET_PREFIX = 24 # Host addresses within each subnet with the subnet prefix. # There is only one host address (10.x.y.1/24) in each subnet # where each subnet is of the form 10.x.y.0/24 # and is part of the CIDR block 10.0.0.0/8. HOST_ADDRS = ('{}/{}'.format( ipAdd(1 + i * (1 << (32 - SUBNET_PREFIX)), GLOBAL_PREFIX, ipParse(GLOBAL_IP)), SUBNET_PREFIX) for i in range(1 << (SUBNET_PREFIX - GLOBAL_PREFIX)))
def _get_host_ip_index(self, host): """Returns the ip index within the mininet subnet.""" return mininet_util.ipParse(host.IP()) - self.net.ipBaseNum