69 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| # Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
 | |
| # Use of this source code is governed by a BSD-style license that can be
 | |
| # found in the LICENSE file.
 | |
| 
 | |
| DOC = """\
 | |
| lansim is a LAN simulator that runs over a TAP network interface and
 | |
| allows to simulate network traffic on that interface from Python code.
 | |
| 
 | |
| A TAP interface is a virtual network kernel device that acts as any
 | |
| other network interface, except that instead of sending and receiving
 | |
| the traffic through a hardware interface it allows a given program to
 | |
| handle that traffic through a socket. It is essentially a
 | |
| bi-directional pipe where one side is a network interface and the
 | |
| other side is a socket on a program.
 | |
| 
 | |
| The lansim Simulator class allows a Python function to attend all the
 | |
| outbound traffic matching certain rules and take an action over that
 | |
| like send back a packet to this interface. The kernel network stack
 | |
| will see this packet as an inbound packet from the fake interface.
 | |
| These actions can also be time driven, like a simulation timeout or
 | |
| send a ping packet every second.
 | |
| 
 | |
| This simulator is useful on situations where you can't fake a network
 | |
| service using the normal kernel network stack. For example, if you
 | |
| need to fake a network of several hosts publishing services via mDNS
 | |
| with multicast you can write those services using this simulator but
 | |
| it's more complicated to do the same using the system's network stack
 | |
| since an outbound multicast packet will be sent out on the real
 | |
| interface.
 | |
| 
 | |
| The Simulator class requires a TAP network interface and allows other
 | |
| Python classes to subscribe to its traffic. The TAP interface needs to
 | |
| be up when the Simulator runs.
 | |
| 
 | |
| For example, to create a tap interface you can do the following:
 | |
| 
 | |
|     tap = tuntap.TunTap(tuntap.IFF_TAP, name="faketap")
 | |
|     print "Interface running on", tap.name
 | |
| 
 | |
| This will create a TAP interface with a name like "faketap0". You can
 | |
| then configure it manually, or just bring it up without an IP address
 | |
| if you have a Python class implementing a fake DHCP server to
 | |
| configure it later. To set the IP address manually, you can use any
 | |
| system command like "ip" or "ifconfig", or from Python in this way:
 | |
| 
 | |
|     tap.set_addr("192.168.0.123")
 | |
|     tap.up()
 | |
| 
 | |
| A very simple example of the usage of this simulator is the
 | |
| following, where three hosts are created on the faketap0 interface
 | |
| and will respond to ARP requests. Running the command
 | |
| "arping -I faketap0 192.168.0.4" will show two responses for that
 | |
| given IP address:
 | |
| 
 | |
|     simu = simulator.SimulatorThread(tap)
 | |
| 
 | |
|     host_a = host.SimpleHost(simu, '12:34:56:78:90:AB', '192.168.0.3')
 | |
|     host_b = host.SimpleHost(simu, '12:34:56:78:90:CD', '192.168.0.4')
 | |
|     host_c = host.SimpleHost(simu, '12:34:56:78:90:EF', '192.168.0.4')
 | |
| 
 | |
|     simu.start() # Run the thread.
 | |
|     print "Press enter to stop the simulation."
 | |
|     raw_input()
 | |
|     simu.stop()
 | |
|     simu.join()
 | |
| """
 | |
| 
 | |
| job.setup_dep(['lansim'])
 |