You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.8 KiB
69 lines
2.8 KiB
# 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'])
|