def nextSubnetHost(self, addr, mask, gw): try: last_ip = self.subnetHostLastIP[subnetStr(addr, mask)] except KeyError: last_ip = gw pieces = last_ip.split('.') pieces[3] = str(1 + int(pieces[3])) next_ip = '.'.join(pieces) self.subnetHostLastIP[subnetStr(addr, mask)] = next_ip return next_ip
def buildRouter(self, network, r, create_edge, create_srs): r.name = r.name.encode('ascii', 'ignore') router = network.addSwitch(r.name + '-rtr', dpid=self.padDpid(r.self_dpid)) nat = network.addSwitch(r.name + '-nat', dpid=self.padDpid(r.nat_dpid)) network.addLink(router, nat, **self.linkopts) translator = network.addSwitch(r.name + '-tr', dpid=self.padDpid(r.tr_dpid)) acl_table = network.addSwitch(r.name + '-acl', dpid=self.padDpid(r.acl_dpid)) for (i, s) in enumerate(r.subnets): s.gw = s.gw.encode('ascii', 'ignore') N = i + 1 inPt = 2 * N - 1 outPt = 2 * N rtrPt = N + 1 network.addLink(acl_table, translator, port1=outPt, port2=inPt, **self.linkopts) network.addLink(translator, router, port1=outPt, port2=rtrPt, **self.linkopts) if not create_srs: continue srs = self.subnetRootSwitch[subnetStr(s.addr, s.mask)] network.addLink(srs, acl_table, port2=inPt, **self.linkopts) # if there's room for hosts, add an edge switch with some hosts! if s.mask < 30 and create_edge: self.globalEdgeSwCount += 1 edge_switch = network.addSwitch('s' + str(self.globalEdgeSwCount)) network.addLink(srs, edge_switch, **self.linkopts) for h in irange(1, self.numHostsPerSubnet): self.globalHostCount += 1 name = "host%d" % self.globalHostCount ip = self.nextSubnetHost(s.addr, s.mask, s.gw) host = network.addHost(name, ip='%s/%d' % (ip, s.mask), defaultRoute='dev %s-eth0 via %s' % (name, s.gw)) network.addLink(host, edge_switch, **self.linkopts) # Finally, add hosts which represents our BGP peers for p in r.peers: self.globalPeerCount += 1 name = "peer%d" % self.globalPeerCount peer = network.addHost(name, ip='%s/%d' % (p.ip, p.mask), mac=p.mac) network.addLink(router, peer, **self.linkopts) self.networksToLaunch[name] = p.networks
def nextSubnetHost(self, addr, mask, gw): try: last_ip = self.subnetHostLastIP[subnetStr(addr, mask)] except KeyError: last_ip = gw pieces = last_ip.split('.') pieces[3] = str(1 + int(pieces[3])) next_ip = '.'.join(pieces) # If IP has been used by the gw, find a nother available one if next_ip in self.gwIPList: pieces = next_ip.split('.') pieces[3] = str(1 + int(pieces[3])) next_ip = '.'.join(pieces) self.subnetHostLastIP[subnetStr(addr, mask)] = next_ip return next_ip
def buildRouter(self, network, r, create_edge, create_srs): r.name = r.name.encode('ascii', 'ignore') router = network.addSwitch(r.name + '-rtr', dpid=self.padDpid(r.self_dpid)) nat = network.addSwitch(r.name + '-nat', dpid=self.padDpid(r.nat_dpid)) network.addLink(router, nat, **self.linkopts) translator = network.addSwitch(r.name + '-tr', dpid=self.padDpid(r.tr_dpid)) acl_table = network.addSwitch(r.name + '-acl', dpid=self.padDpid(r.acl_dpid)) vlan = network.addSwitch(r.name + '-vlan', dpid=self.padDpid(r.vlan_dpid)) for (i, s) in enumerate(r.subnets): s.gw = s.gw.encode('ascii', 'ignore') N = i + 1 inPt = 2 * N - 1 outPt = 2 * N rtrPt = N + 1 network.addLink(vlan, acl_table, port1=r.num_physical + N, port2=inPt, **self.linkopts) network.addLink(acl_table, translator, port1=outPt, port2=inPt, **self.linkopts) network.addLink(translator, router, port1=outPt, port2=rtrPt, **self.linkopts) if not create_srs: return # Don't create anything for p in r.ports: # Not a vlan tag if p.vlan_type == '': s = filter(lambda x: p.id in x.physical_portid, r.subnets)[0] srs = self.subnetRootSwitch[subnetStr(s.addr, s.mask)] network.addLink(srs, vlan, port2=p.id, **self.linkopts) # if there's room for hosts, add an edge switch with some hosts! if s.mask < 30 and create_edge: self.globalEdgeSwCount += 1 edge_switch = network.addSwitch( 's' + str(self.globalEdgeSwCount)) network.addLink(srs, edge_switch, **self.linkopts) for h in irange(1, self.numHostsPerSubnet): self.globalHostCount += 1 name = "host%d" % self.globalHostCount ip = self.nextSubnetHost(s.addr, s.mask, s.gw) host = network.addHost( name, ip='%s/%d' % (ip, s.mask), defaultRoute='dev %s-eth0 via %s' % (name, s.gw)) network.addLink(host, edge_switch, **self.linkopts) elif p.vlan_type.lower() == 'access': s = filter(lambda x: p.id in x.physical_portid, r.subnets) if len(s) == 0: print "Warning! %s:%s is not in a subnet!" % (r.name, p.name) continue s = s[0] if s.mask < 30 and create_edge: self.globalHostCount += 1 name = "host%d" % self.globalHostCount ip = self.nextSubnetHost(s.addr, s.mask, s.gw) host = network.addHost(name, ip='%s/%d' % (ip, s.mask), defaultRoute='dev %s-eth0 via %s' % (name, s.gw)) network.addLink(host, vlan, port2=p.id, **self.linkopts) elif p.vlan_type.lower() == 'trunk': self.trunkPorts[r.name.lower(), p.name.lower()] = p.id
def buildRouter(self, network, r, create_edge, create_srs): r.name = r.name.encode('ascii', 'ignore') router = network.addSwitch(r.name + '-rtr', dpid=self.padDpid(r.self_dpid)) nat = network.addSwitch(r.name + '-nat', dpid=self.padDpid(r.nat_dpid)) network.addLink(router, nat, **self.linkopts) translator = network.addSwitch(r.name + '-tr', dpid=self.padDpid(r.tr_dpid)) acl_table = network.addSwitch(r.name + '-acl', dpid=self.padDpid(r.acl_dpid)) vlan = network.addSwitch(r.name + '-vlan', dpid=self.padDpid(r.vlan_dpid)) for (i, s) in enumerate(r.subnets): s.gw = s.gw.encode('ascii', 'ignore') N = i + 1 inPt = 2 * N - 1 outPt = 2 * N rtrPt = N + 1 network.addLink(vlan, acl_table, port1=r.num_physical+N, port2=inPt, **self.linkopts) network.addLink(acl_table, translator, port1=outPt, port2=inPt, **self.linkopts) network.addLink(translator, router, port1=outPt, port2=rtrPt, **self.linkopts) if not create_srs: return # Don't create anything for p in r.ports: # Not a vlan tag if p.vlan_type == '': s = filter(lambda x: p.id in x.physical_portid, r.subnets)[0] srs = self.subnetRootSwitch[subnetStr(s.addr, s.mask)] network.addLink(srs, vlan, port2=p.id, **self.linkopts) # if there's room for hosts, add an edge switch with some hosts! if s.mask < 30 and create_edge: self.globalEdgeSwCount += 1 edge_switch = network.addSwitch('s' + str(self.globalEdgeSwCount)) network.addLink(srs, edge_switch, **self.linkopts) for h in irange(1, self.numHostsPerSubnet): self.globalHostCount += 1 name = "host%d" % self.globalHostCount ip = self.nextSubnetHost(s.addr, s.mask, s.gw) host = network.addHost(name, ip='%s/%d' % (ip, s.mask), defaultRoute='dev %s-eth0 via %s' % (name, s.gw)) network.addLink(host, edge_switch, **self.linkopts) elif p.vlan_type.lower() == 'access': s = filter(lambda x: p.id in x.physical_portid, r.subnets) if len(s) == 0: print "Warning! %s:%s is not in a subnet!" % (r.name, p.name) continue s = s[0] if s.mask < 30 and create_edge: self.globalHostCount += 1 name = "host%d" % self.globalHostCount ip = self.nextSubnetHost(s.addr, s.mask, s.gw) host = network.addHost(name, ip='%s/%d' % (ip, s.mask), defaultRoute='dev %s-eth0 via %s' % (name, s.gw)) network.addLink(host, vlan, port2 = p.id, **self.linkopts) elif p.vlan_type.lower() == 'trunk': self.trunkPorts[r.name.lower(), p.name.lower()] = p.id