Files
unison/examples/realtime/realtime-udp-echo.py
2024-11-08 18:01:13 +00:00

111 lines
3.0 KiB
Python

#
# * SPDX-License-Identifier: GPL-2.0-only
# Network topology
#
# n0 n1 n2 n3
# | | | |
# =================
# LAN
#
# - UDP flows from n0 to n1 and back
# - DropTail queues
# - Tracing of queues and packet receptions to file "udp-echo.tr"
try:
from ns import ns
except ModuleNotFoundError:
raise SystemExit(
"Error: ns3 Python module not found;"
" Python bindings may not be enabled"
" or your PYTHONPATH might not be properly configured"
)
def main(argv):
#
# Allow the user to override any of the defaults and the above Bind() at
# run-time, via command-line arguments
#
cmd = ns.CommandLine()
cmd.Parse(argv)
#
# But since this is a realtime script, don't allow the user to mess with
# that.
#
ns.GlobalValue.Bind("SimulatorImplementationType", ns.StringValue("ns3::RealtimeSimulatorImpl"))
#
# Explicitly create the nodes required by the topology (shown above).
#
print("Create nodes.")
n = ns.NodeContainer()
n.Create(4)
internet = ns.InternetStackHelper()
internet.Install(n)
#
# Explicitly create the channels required by the topology (shown above).
#
print("Create channels.")
csma = ns.CsmaHelper()
csma.SetChannelAttribute("DataRate", ns.DataRateValue(ns.DataRate(5000000)))
csma.SetChannelAttribute("Delay", ns.TimeValue(ns.MilliSeconds(2)))
csma.SetDeviceAttribute("Mtu", ns.UintegerValue(1400))
d = csma.Install(n)
#
# We've got the "hardware" in place. Now we need to add IP addresses.
#
print("Assign IP Addresses.")
ipv4 = ns.Ipv4AddressHelper()
ipv4.SetBase(ns.Ipv4Address("10.1.1.0"), ns.Ipv4Mask("255.255.255.0"))
i = ipv4.Assign(d)
print("Create Applications.")
#
# Create a UdpEchoServer application on node one.
#
port = 9 # well-known echo port number
server = ns.UdpEchoServerHelper(port)
apps = server.Install(n.Get(1))
apps.Start(ns.Seconds(1))
apps.Stop(ns.Seconds(10))
#
# Create a UdpEchoClient application to send UDP datagrams from node zero to
# node one.
#
packetSize = 1024
maxPacketCount = 500
interPacketInterval = ns.Seconds(0.01)
client = ns.UdpEchoClientHelper(i.GetAddress(1).ConvertTo(), port)
client.SetAttribute("MaxPackets", ns.UintegerValue(maxPacketCount))
client.SetAttribute("Interval", ns.TimeValue(interPacketInterval))
client.SetAttribute("PacketSize", ns.UintegerValue(packetSize))
apps = client.Install(n.Get(0))
apps.Start(ns.Seconds(2))
apps.Stop(ns.Seconds(10))
ascii = ns.AsciiTraceHelper()
csma.EnableAsciiAll(ascii.CreateFileStream("realtime-udp-echo.tr"))
csma.EnablePcapAll("realtime-udp-echo", False)
#
# Now, do the actual simulation.
#
print("Run Simulation.")
ns.Simulator.Stop(ns.Seconds(10))
ns.Simulator.Run()
ns.Simulator.Destroy()
print("Done.")
if __name__ == "__main__":
import sys
main(sys.argv)