diff --git a/examples/csma-bridge.py b/examples/csma-bridge.py new file mode 100644 index 000000000..b5778fea0 --- /dev/null +++ b/examples/csma-bridge.py @@ -0,0 +1,155 @@ +# /* +# * This program is free software; you can redistribute it and/or modify +# * it under the terms of the GNU General Public License version 2 as +# * published by the Free Software Foundation +# * +# * This program is distributed in the hope that it will be useful, +# * but WITHOUT ANY WARRANTY; without even the implied warranty of +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# * GNU General Public License for more details. +# * +# * You should have received a copy of the GNU General Public License +# * along with this program; if not, write to the Free Software +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# */ + +# Network topology +# +# n0 n1 +# | | +# ---------- +# | Switch | +# ---------- +# | | +# n2 n3 +# +# +# - CBR/UDP flows from n0 to n1 and from n3 to n0 +# - DropTail queues +# - Tracing of queues and packet receptions to file "csma-bridge.tr" + +import ns3 + + +def main(argv): + # + # Make the random number generators generate reproducible results. + # + ns3.RandomVariable.UseGlobalSeed(1, 1, 2, 3, 5, 8) + + # + # Allow the user to override any of the defaults and the above Bind() at + # run-time, via command-line arguments + # + cmd = ns3.CommandLine() + cmd.Parse(argv) + + # + # Explicitly create the nodes required by the topology(shown above). + # + print "Create nodes." + terminals = ns3.NodeContainer() + terminals.Create(4) + + csmaSwitch = ns3.NodeContainer() + csmaSwitch.Create(1) + + print "Build Topology" + csma = ns3.CsmaHelper() + csma.SetChannelAttribute("DataRate", ns3.DataRateValue(ns3.DataRate(5000000))) + csma.SetChannelAttribute("Delay", ns3.TimeValue(ns3.MilliSeconds(2))) + + # Create the csma links, from each terminal to the switch + + terminalDevices = ns3.NetDeviceContainer() + switchDevices = ns3.NetDeviceContainer() + + for i in range(4): + link = csma.Install(ns3.NodeContainer(ns3.NodeContainer(terminals.Get(i)), csmaSwitch)) + terminalDevices.Add(link.Get(0)) + switchDevices.Add(link.Get(1)) + + # Create the bridge netdevice, which will do the packet switching + switchNode = csmaSwitch.Get(0) + bridgeDevice = ns3.BridgeNetDevice() + switchNode.AddDevice(bridgeDevice) + + for portIter in range(switchDevices.GetN()): + bridgeDevice.AddBridgePort(switchDevices.Get(portIter)) + + # Add internet stack to the terminals + internet = ns3.InternetStackHelper() + internet.Install(terminals) + + # We've got the "hardware" in place. Now we need to add IP addresses. + # + print "Assign IP Addresses." + ipv4 = ns3.Ipv4AddressHelper() + ipv4.SetBase(ns3.Ipv4Address("10.1.1.0"), ns3.Ipv4Mask("255.255.255.0")) + ipv4.Assign(terminalDevices) + + # + # Create an OnOff application to send UDP datagrams from node zero to node 1. + # + print "Create Applications." + port = 9 # Discard port(RFC 863) + + onoff = ns3.OnOffHelper("ns3::UdpSocketFactory", + ns3.Address(ns3.InetSocketAddress(ns3.Ipv4Address("10.1.1.2"), port))) + onoff.SetAttribute("OnTime", ns3.RandomVariableValue(ns3.ConstantVariable(1))) + onoff.SetAttribute("OffTime", ns3.RandomVariableValue(ns3.ConstantVariable(0))) + + app = onoff.Install(ns3.NodeContainer(terminals.Get(0))) + # Start the application + app.Start(ns3.Seconds(1.0)) + app.Stop(ns3.Seconds(10.0)) + + # Create an optional packet sink to receive these packets + sink = ns3.PacketSinkHelper("ns3::UdpSocketFactory", + ns3.Address(ns3.InetSocketAddress(ns3.Ipv4Address.GetAny(), port))) + sink.Install(ns3.NodeContainer(terminals.Get(1))) + + # + # Create a similar flow from n3 to n0, starting at time 1.1 seconds + # + onoff.SetAttribute("Remote", + ns3.AddressValue(ns3.InetSocketAddress(ns3.Ipv4Address("10.1.1.1"), port))) + app2 = onoff.Install(ns3.NodeContainer(terminals.Get(3))) + + sink.Install(ns3.NodeContainer(terminals.Get(0))) + + app2.Start(ns3.Seconds(1.1)) + app2.Stop(ns3.Seconds(10.0)) + + # + # Configure tracing of all enqueue, dequeue, and NetDevice receive events. + # Trace output will be sent to the file "csma-bridge.tr" + # + #print "Configure Tracing." + #std.ofstream ascii + #ascii.open("csma-bridge.tr") + #CsmaHelper.EnableAsciiAll(ascii) + + # + # Also configure some tcpdump traces; each interface will be traced. + # The output files will be named: + # csma-bridge.pcap-- + # and can be read by the "tcpdump -r" command(use "-tt" option to + # display timestamps correctly) + # + ns3.CsmaHelper.EnablePcapAll("csma-bridge") + + # + # Now, do the actual simulation. + # + print "Run Simulation." + ns3.Simulator.Run() + ns3.Simulator.Destroy() + print "Done." + + + +if __name__ == '__main__': + import sys + main(sys.argv) +