def __allocate_udp_port(self, remote_hypervisor): """allocate a new src and dst udp port from hypervisors""" # Allocate a UDP port for the local side of the NIO src_udp = self.p.udp self.p.udp = self.p.udp + 1 debug('new base UDP port for qemuwrapper at ' + self.p.name + ':' + str(self.p.port) + ' is now: ' + str(self.p.udp)) # Now allocate one for the destination side dst_udp = remote_hypervisor.udp remote_hypervisor.udp = remote_hypervisor.udp + 1 debug('new base UDP port for dynamips at ' + remote_hypervisor.host + ':' + str(remote_hypervisor.port) + ' is now: ' + str(remote_hypervisor.udp)) return (src_udp, dst_udp)
def __allocate_udp_port(self, remote_hypervisor): """allocate a new src and dst udp port from hypervisors""" # Allocate a UDP port for the local side of the NIO src_udp = self.p.udp self.p.udp = self.p.udp + 1 debug('new base UDP port for pemuwrapper at ' + self.p.name + ':' + str(self.p.port) + ' is now: ' + str(self.p.udp)) # Now allocate one for the destination side dst_udp = remote_hypervisor.udp remote_hypervisor.udp = remote_hypervisor.udp + 1 debug('new base UDP port for dynamips at ' + remote_hypervisor.host + ':' + str(remote_hypervisor.port) + ' is now: ' + str(remote_hypervisor.udp)) return (src_udp, dst_udp)
def connect_to_emulated_device(self, local_port, remote_emulated_device, remote_port): debugmsg(2, "AnyVBoxEmuDevice::connect_to_emulated_device(%s, %s, %s)" % (str(local_port), unicode(remote_emulated_device), str(remote_port))) from qemu_lib import Qemu, QemuDevice, AnyEmuDevice if self.nios.has_key(local_port) and self.nios[local_port] != None: debug("%s: port %i has already a UDP connection" % (self.name, local_port)) return (src_udp, dst_udp) = self.__allocate_udp_port(remote_emulated_device.p) """ # WARNING: This code crashes on multi-host setups: (when connecting to Dynamips switch) if self.p.host == remote_emulated_device.p.host: # source and dest adapters are on the same dynamips server, perform loopback binding optimization src_ip = '127.0.0.1' dst_ip = '127.0.0.1' elif (self.p.host == 'localhost' or self.p.host == '127.0.0.1' or self.p.host == '::1') and (remote_emulated_device.p.host == 'localhost' or remote_emulated_device.p.host == '127.0.0.1' or remote_emulated_device.p.host == '::1'): # 'localhost', IP: '127.0.0.1' and IPv6 '::1' are equal. src_ip = '127.0.0.1' dst_ip = '127.0.0.1' else: # source and dest are on different dynamips servers src_ip = self.p.name dst_ip = remote_emulated_device.p.host """ src_ip = self.p.name dst_ip = remote_emulated_device.p.host debugmsg(2, "dynagen_vbox_lib.py: src_ip = %s" % str(src_ip)) debugmsg(2, "dynagen_vbox_lib.py: dst_ip = %s" % str(dst_ip)) if src_ip != dst_ip: if (self.isLocalhost(src_ip)) or (self.isLocalhost(dst_ip)): if (self.isLocalhost(src_ip) is False) or (self.isLocalhost(dst_ip) is False): dowarning('In case of multi-server operation, make sure you do not use "localhost" or "127.0.0.1" string in definition of dynamips hypervisor. Use actual IP addresses instead.') #create the local virtualized device side of UDP connection send(self.p, 'vbox create_udp %s %i %i %s %i' % (self.name, local_port, src_udp, dst_ip, dst_udp)) self.nios[local_port] = UDPConnection(src_udp, dst_ip, dst_udp, self, local_port) #create the remote device side of UDP connection if isinstance(remote_emulated_device, AnyVBoxEmuDevice): debugmsg(3, "remote_emulated_device is AnyVBoxEmuDevice") send(remote_emulated_device.p, 'vbox create_udp %s %i %i %s %i' % (remote_emulated_device.name, remote_port, dst_udp, src_ip, src_udp)) if isinstance(remote_emulated_device, AnyEmuDevice): debugmsg(3, "remote_emulated_device is AnyEmuDevice") send(remote_emulated_device.p, 'qemu create_udp %s %i %s %i %s %i' % (remote_emulated_device.name, remote_port, dst_ip, dst_udp, src_ip, src_udp)) remote_emulated_device.nios[remote_port] = UDPConnection(dst_udp, src_ip, src_udp, remote_emulated_device, remote_port) #set reverse nios self.nios[local_port].reverse_nio = remote_emulated_device.nios[remote_port] remote_emulated_device.nios[remote_port].reverse_nio = self.nios[local_port]
def connect_to_emulated_device(self, local_port, remote_emulated_device, remote_port): debugmsg( 2, "AnyVBoxEmuDevice::connect_to_emulated_device(%s, %s, %s)" % (str(local_port), unicode(remote_emulated_device), str(remote_port))) from qemu_lib import Qemu, QemuDevice, AnyEmuDevice if self.nios.has_key(local_port) and self.nios[local_port] != None: debug("%s: port %i has already a UDP connection" % (self.name, local_port)) return (src_udp, dst_udp) = self.__allocate_udp_port(remote_emulated_device.p) """ # WARNING: This code crashes on multi-host setups: (when connecting to Dynamips switch) if self.p.host == remote_emulated_device.p.host: # source and dest adapters are on the same dynamips server, perform loopback binding optimization src_ip = '127.0.0.1' dst_ip = '127.0.0.1' elif (self.p.host == 'localhost' or self.p.host == '127.0.0.1' or self.p.host == '::1') and (remote_emulated_device.p.host == 'localhost' or remote_emulated_device.p.host == '127.0.0.1' or remote_emulated_device.p.host == '::1'): # 'localhost', IP: '127.0.0.1' and IPv6 '::1' are equal. src_ip = '127.0.0.1' dst_ip = '127.0.0.1' else: # source and dest are on different dynamips servers src_ip = self.p.name dst_ip = remote_emulated_device.p.host """ src_ip = self.p.name dst_ip = remote_emulated_device.p.host debugmsg(2, "dynagen_vbox_lib.py: src_ip = %s" % str(src_ip)) debugmsg(2, "dynagen_vbox_lib.py: dst_ip = %s" % str(dst_ip)) if src_ip != dst_ip: if (self.isLocalhost(src_ip)) or (self.isLocalhost(dst_ip)): if (self.isLocalhost(src_ip) is False) or (self.isLocalhost(dst_ip) is False): dowarning( 'In case of multi-server operation, make sure you do not use "localhost" or "127.0.0.1" string in definition of dynamips hypervisor. Use actual IP addresses instead.' ) #create the local virtualized device side of UDP connection send( self.p, 'vbox create_udp %s %i %i %s %i' % (self.name, local_port, src_udp, dst_ip, dst_udp)) self.nios[local_port] = UDPConnection(src_udp, dst_ip, dst_udp, self, local_port) #create the remote device side of UDP connection if isinstance(remote_emulated_device, AnyVBoxEmuDevice): debugmsg(3, "remote_emulated_device is AnyVBoxEmuDevice") send( remote_emulated_device.p, 'vbox create_udp %s %i %i %s %i' % (remote_emulated_device.name, remote_port, dst_udp, src_ip, src_udp)) if isinstance(remote_emulated_device, AnyEmuDevice): debugmsg(3, "remote_emulated_device is AnyEmuDevice") send( remote_emulated_device.p, 'qemu create_udp %s %i %s %i %s %i' % (remote_emulated_device.name, remote_port, dst_ip, dst_udp, src_ip, src_udp)) remote_emulated_device.nios[remote_port] = UDPConnection( dst_udp, src_ip, src_udp, remote_emulated_device, remote_port) #set reverse nios self.nios[local_port].reverse_nio = remote_emulated_device.nios[ remote_port] remote_emulated_device.nios[remote_port].reverse_nio = self.nios[ local_port]
def connect_to_dynamips(self, local_port, dynamips, remote_slot, remote_int, remote_port): if self.nios.has_key(local_port) and self.nios[local_port] != None: debug("%s: port %i has already a UDP connection" % (self.name, local_port)) return #figure out the destionation port according to interface descritors debugmsg( 2, "AnyVBoxEmuDevice::connect_to_dynamips(%s, dynamips, dynamips, %s, %s)" % (str(local_port), str(remote_int), str(remote_port))) #debugmsg(2, "AnyVBoxEmuDevice::connect_to_dynamips()") debugmsg(3, "remote_slot.adapter = %s" % str(remote_slot.adapter)) if remote_slot.adapter in [ 'ETHSW', 'ATMSW', 'ATMBR', 'FRSW', 'Bridge', 'Hub' ]: # This is a virtual switch that doesn't provide interface descriptors dst_port = remote_port else: # Look at the interfaces dict to find out what the real port is as # as far as dynamips is concerned try: dst_port = remote_slot.interfaces[remote_int][remote_port] except KeyError: raise DynamipsError, 'invalid interface' debugmsg( 3, "AnyVBoxEmuDevice::connect_to_dynamips() validate_connect") #validate the connection if not validate_connect('e', remote_int, self.p, self, local_port, dynamips, remote_slot, remote_port): return (src_udp, dst_udp) = self.__allocate_udp_port(dynamips) debugmsg(3, "self.p.host = %s" % self.p.host) debugmsg(3, "dynamips.host = %s" % dynamips.host) """ # WARNING: This code crashes on multi-host setups: (when connecting to Dynamips switch) if self.p.host == dynamips.host: # source and dest adapters are on the same dynamips server, perform loopback binding optimization src_ip = '127.0.0.1' dst_ip = '127.0.0.1' elif (self.p.host == 'localhost' or self.p.host == '127.0.0.1' or self.p.host == '::1') and (dynamips.host == 'localhost' or dynamips.host == '127.0.0.1' or dynamips.host == '::1'): # 'localhost', IP: '127.0.0.1' and IPv6 '::1' are equal. src_ip = '127.0.0.1' dst_ip = '127.0.0.1' else: # source and dest are on different dynamips servers src_ip = self.p.name dst_ip = dynamips.host #check whether the user did not make a mistake in multi-server .net file #if src_ip == 'localhost' or src_ip =='127.0.0.1' or dst_ip =='localhost' or dst_ip == '127.0.0.1': # dowarning('Connecting %s port %s to %s slot %s port %s:\nin case of multi-server operation make sure you do not use "localhost" string in definition of dynamips hypervisor.\n'% (self.name, local_port, remote_slot.router.name, remote_slot.adapter, remote_port)) """ src_ip = self.p.name dst_ip = dynamips.host debugmsg(2, "dynagen_vbox_lib.py: src_ip = %s" % str(src_ip)) debugmsg(2, "dynagen_vbox_lib.py: dst_ip = %s" % str(dst_ip)) if src_ip != dst_ip: if (self.isLocalhost(src_ip)) or (self.isLocalhost(dst_ip)): if (self.isLocalhost(src_ip) is False) or (self.isLocalhost(dst_ip) is False): dowarning( 'In case of multi-server operation, make sure you do not use "localhost" or "127.0.0.1" string in definition of dynamips hypervisor. Use actual IP addresses instead.' ) debugmsg( 3, "dynagen_vbox_lib.py: 'vbox create_udp self.name=%s local_port=%i src_udp=%i dst_ip=%s dst_udp=%i'" % (self.name, local_port, src_udp, dst_ip, dst_udp)) #create the virtualized device side of UDP connection send( self.p, 'vbox create_udp %s %i %i %s %i' % (self.name, local_port, src_udp, dst_ip, dst_udp)) self.nios[local_port] = UDPConnection(src_udp, dst_ip, dst_udp, self, local_port) #create the dynamips side of UDP connection - the NIO and connect it to the router remote_nio = NIO_udp(dynamips, dst_udp, src_ip, src_udp, None, remote_slot, dst_port) if isinstance(remote_slot, Bridge): # Bridges don't use ports remote_slot.nio(nio=remote_nio) else: remote_slot.nio(port=dst_port, nio=remote_nio) #set reverse nios remote_nio.reverse_nio = self.nios[local_port] self.nios[local_port].reverse_nio = remote_nio
def connect_to_dynamips(self, local_port, dynamips, remote_slot, remote_int, remote_port): if self.nios.has_key(local_port) and self.nios[local_port] != None: debug("%s: port %i has already a UDP connection" % (self.name, local_port)) return #figure out the destionation port according to interface descritors debugmsg(2, "AnyVBoxEmuDevice::connect_to_dynamips(%s, dynamips, dynamips, %s, %s)" % (str(local_port), str(remote_int), str(remote_port))) #debugmsg(2, "AnyVBoxEmuDevice::connect_to_dynamips()") debugmsg(3, "remote_slot.adapter = %s" % str(remote_slot.adapter)) if remote_slot.adapter in ['ETHSW', 'ATMSW', 'ATMBR', 'FRSW', 'Bridge', 'Hub']: # This is a virtual switch that doesn't provide interface descriptors dst_port = remote_port else: # Look at the interfaces dict to find out what the real port is as # as far as dynamips is concerned try: dst_port = remote_slot.interfaces[remote_int][remote_port] except KeyError: raise DynamipsError, 'invalid interface' debugmsg(3, "AnyVBoxEmuDevice::connect_to_dynamips() validate_connect") #validate the connection if not validate_connect('e', remote_int, self.p, self, local_port, dynamips, remote_slot, remote_port): return (src_udp, dst_udp) = self.__allocate_udp_port(dynamips) debugmsg(3, "self.p.host = %s" % self.p.host) debugmsg(3, "dynamips.host = %s" % dynamips.host) """ # WARNING: This code crashes on multi-host setups: (when connecting to Dynamips switch) if self.p.host == dynamips.host: # source and dest adapters are on the same dynamips server, perform loopback binding optimization src_ip = '127.0.0.1' dst_ip = '127.0.0.1' elif (self.p.host == 'localhost' or self.p.host == '127.0.0.1' or self.p.host == '::1') and (dynamips.host == 'localhost' or dynamips.host == '127.0.0.1' or dynamips.host == '::1'): # 'localhost', IP: '127.0.0.1' and IPv6 '::1' are equal. src_ip = '127.0.0.1' dst_ip = '127.0.0.1' else: # source and dest are on different dynamips servers src_ip = self.p.name dst_ip = dynamips.host #check whether the user did not make a mistake in multi-server .net file #if src_ip == 'localhost' or src_ip =='127.0.0.1' or dst_ip =='localhost' or dst_ip == '127.0.0.1': # dowarning('Connecting %s port %s to %s slot %s port %s:\nin case of multi-server operation make sure you do not use "localhost" string in definition of dynamips hypervisor.\n'% (self.name, local_port, remote_slot.router.name, remote_slot.adapter, remote_port)) """ src_ip = self.p.name dst_ip = dynamips.host debugmsg(2, "dynagen_vbox_lib.py: src_ip = %s" % str(src_ip)) debugmsg(2, "dynagen_vbox_lib.py: dst_ip = %s" % str(dst_ip)) if src_ip != dst_ip: if (self.isLocalhost(src_ip)) or (self.isLocalhost(dst_ip)): if (self.isLocalhost(src_ip) is False) or (self.isLocalhost(dst_ip) is False): dowarning('In case of multi-server operation, make sure you do not use "localhost" or "127.0.0.1" string in definition of dynamips hypervisor. Use actual IP addresses instead.') debugmsg(3, "dynagen_vbox_lib.py: 'vbox create_udp self.name=%s local_port=%i src_udp=%i dst_ip=%s dst_udp=%i'" % (self.name, local_port, src_udp, dst_ip, dst_udp)) #create the virtualized device side of UDP connection send(self.p, 'vbox create_udp %s %i %i %s %i' % (self.name, local_port, src_udp, dst_ip, dst_udp)) self.nios[local_port] = UDPConnection(src_udp, dst_ip, dst_udp, self, local_port) #create the dynamips side of UDP connection - the NIO and connect it to the router remote_nio = NIO_udp(dynamips, dst_udp, src_ip, src_udp, None, remote_slot, dst_port) if isinstance(remote_slot, Bridge): # Bridges don't use ports remote_slot.nio(nio=remote_nio) else: remote_slot.nio(port=dst_port, nio=remote_nio) #set reverse nios remote_nio.reverse_nio = self.nios[local_port] self.nios[local_port].reverse_nio = remote_nio