def _createBackhaul(self, enbNode, throughput = '1Gbps', delay=0): addrHelper = ns.internet.Ipv4AddressHelper() # Might not need this one... self._ref(addrHelper) addrHelper.SetBase(Ipv4Address("10.0.0.0"), Ipv4Mask("255.255.255.252")) p2ph = ns.point_to_point.PointToPointHelper() p2ph.SetDeviceAttribute("DataRate", StringValue(throughput)) p2ph.SetDeviceAttribute("Mtu", UintegerValue(2000)) p2ph.SetChannelAttribute("Delay", TimeValue(MilliSeconds(delay))) sgwEnbDevices = p2ph.Install(self.sgw, enbNode) sgwEnbIpIfaces = addrHelper.Assign(sgwEnbDevices) addrHelper.NewNetwork() sgwS1uAddress = sgwEnbIpIfaces.GetAddress(0) enbS1uAddress = sgwEnbIpIfaces.GetAddress(1) self.epcHelper.AddS1Interface(enbNode, enbS1uAddress, sgwS1uAddress)
def mkPath(name): return StringValue(mkPathRaw(name))
mkPath("DlRlcStats")) Config.SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename", mkPath("UlRlcStats")) Config.SetDefault("ns3::RadioBearerStatsCalculator::DlPdcpOutputFilename", mkPath("DlPdcpStats")) Config.SetDefault("ns3::RadioBearerStatsCalculator::UlPdcpOutputFilename", mkPath("UlPdcpStats")) Config.SetDefault("ns3::PhyStatsCalculator::DlRsrpSinrFilename", mkPath("DlRsrpSinrStats")) Config.SetDefault("ns3::PhyStatsCalculator::UlSinrFilename", mkPath("UlSinrStats")) # Heavy and not helpful, for now Config.SetDefault("ns3::PhyStatsCalculator::UlInterferenceFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyRxStatsCalculator::DlRxOutputFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyRxStatsCalculator::UlRxOutputFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyTxStatsCalculator::DlTxOutputFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyTxStatsCalculator::UlTxOutputFilename", StringValue("/dev/null")) # Approximately the ms sampling interval for SINR/RSRP Config.SetDefault("ns3::LteEnbPhy::UeSinrSamplePeriod", UintegerValue(100)) Config.SetDefault("ns3::LteUePhy::RsrpSinrSamplePeriod", UintegerValue(100)) serverStats, clientStats = judge.runNS3Simulation( flight,
def runNS3Simulation(self, flight, start='2020-07-01T08', end=None, burstArrivals=1, burstLength=1, upload=True, download=False): """ Runs an NS3 simulation of this flight, one cycle. Except for short runs, it is better to use the runner*.py files. """ # By default, run a single cycle if end is None: end = pd.to_datetime(start) + pd.offsets.Second( int(flight.cycleTime)) dt = int((end - pd.to_datetime(start)).total_seconds()) from ns.core import Vector, MilliSeconds, Seconds, StringValue from thesis.simulation import SimulationContext import ns.mobility from ns.mobility import PathMobilityModelSegments as Seg import ns.flow_monitor flh = ns.flow_monitor.FlowMonitorHelper() with SimulationContext() as sim: # Add our entities sim.addEnbFlight(flight) for user in self._scene.users: sim.addUser(*user) sim._finalizeNodes() # For WS paper, upload for idx in range(len(self._scene.users)): # Create traffic generators ueNode = sim.ueNodes.Get(idx) ueNetDev = sim.ueLteDevs.Get(idx) ueIp = sim.ueIpIface.GetAddress(idx) sinkAddr = ns.network.InetSocketAddress( sim.remoteHostAddr, 9000 + idx) packetSinkHelper = ns.applications.PacketSinkHelper( "ns3::UdpSocketFactory", sinkAddr) sim.serverApps.Add(packetSinkHelper.Install(sim.remoteHost)) MbpsTarget = 1 h = ns.applications.PPBPHelper("ns3::UdpSocketFactory", sinkAddr) # Supposed to be how many active "bursts" we have, but appears to be how many started per second h.SetAttribute( "MeanBurstArrivals", StringValue("ns3::ConstantRandomVariable[Constant=%f]" % burstArrivals)) # Duration in seconds of each burst h.SetAttribute( "MeanBurstTimeLength", StringValue("ns3::ConstantRandomVariable[Constant=%f]" % burstLength)) h.SetAttribute("BurstIntensity", StringValue("1Mb/s")) app = h.Install(ueNode) sim.clientApps.Add(app) # We do a brief look at the download direction too for idx in range(len(self._scene.users)): # Create traffic generators ueNode = sim.ueNodes.Get(idx) ueNetDev = sim.ueLteDevs.Get(idx) ueIp = sim.ueIpIface.GetAddress(idx) sinkAddr = ns.network.InetSocketAddress(ueIp, 8000 + idx) packetSinkHelper = ns.applications.PacketSinkHelper( "ns3::UdpSocketFactory", sinkAddr) sim.serverApps.Add(packetSinkHelper.Install(ueNode)) MbpsTarget = 1 h = ns.applications.PPBPHelper("ns3::UdpSocketFactory", sinkAddr) # Supposed to be how many active "bursts" we have, but appears to be how many started per second h.SetAttribute( "MeanBurstArrivals", StringValue("ns3::ConstantRandomVariable[Constant=%f]" % burstArrivals)) # Duration in seconds of each burst h.SetAttribute( "MeanBurstTimeLength", StringValue("ns3::ConstantRandomVariable[Constant=%f]" % burstLength)) h.SetAttribute("BurstIntensity", StringValue("1Mb/s")) app = h.Install(sim.remoteHost) sim.clientApps.Add(app) # Set up traces sim.lteHelper.EnableRlcTraces() sim.lteHelper.EnablePhyTraces() flh.InstallAll() sim.startAndMonitorApps(resolution=10) sim.stopAppsAt(dt) sim.run(dt + 10) return sim.serverAppStats, sim.clientAppStats
def mkPathRaw(name): return './out/%s_%s_run%d_usr%d_rad%.2f_ul%d_dl%d.txt' % (name, args.trajectory, args.run, args.users, args.radius, args.upload, args.download) def mkPath(name): return StringValue(mkPathRaw(name)) Config.SetDefault("ns3::RadioBearerStatsCalculator::DlRlcOutputFilename", mkPath("DlRlcStats")) Config.SetDefault("ns3::RadioBearerStatsCalculator::UlRlcOutputFilename", mkPath("UlRlcStats")) Config.SetDefault("ns3::RadioBearerStatsCalculator::DlPdcpOutputFilename", mkPath("DlPdcpStats")) Config.SetDefault("ns3::RadioBearerStatsCalculator::UlPdcpOutputFilename", mkPath("UlPdcpStats")) Config.SetDefault("ns3::PhyStatsCalculator::DlRsrpSinrFilename", mkPath("DlRsrpSinrStats")) Config.SetDefault("ns3::PhyStatsCalculator::UlSinrFilename", mkPath("UlSinrStats")) # Heavy and not helpful, for now Config.SetDefault("ns3::PhyStatsCalculator::UlInterferenceFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyRxStatsCalculator::DlRxOutputFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyRxStatsCalculator::UlRxOutputFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyTxStatsCalculator::DlTxOutputFilename", StringValue("/dev/null")) Config.SetDefault("ns3::PhyTxStatsCalculator::UlTxOutputFilename", StringValue("/dev/null")) # Approximately the ms sampling interval for SINR/RSRP Config.SetDefault("ns3::LteEnbPhy::UeSinrSamplePeriod", UintegerValue(100)) Config.SetDefault("ns3::LteUePhy::RsrpSinrSamplePeriod", UintegerValue(100)) serverStats, clientStats = judge.runNS3Simulation( flight, # One 24 hour period start = pd.to_datetime('2020-11-29T08'), # Test time
import ns from ns.point_to_point import PointToPointHelper from ns.point_to_point_layout import PointToPointDumbbellHelper from ns.core import Simulator, Seconds, UintegerValue, TimeValue, CommandLine, MilliSeconds, StringValue, PointerValue, ObjectFactory, DoubleValue from ns.internet import InternetStackHelper from ns.internet import Ipv4AddressHelper, Ipv4GlobalRoutingHelper from ns.network import Ipv4Address, Ipv4Mask, Node, RateErrorModel from ns.applications import UdpEchoServerHelper, UdpEchoClientHelper import ns.visualizer import sys command_line = CommandLine() command_line.Parse(sys.argv) point_to_point_helper = PointToPointHelper() point_to_point_helper.SetDeviceAttribute("DataRate", StringValue("5Mbps")) point_to_point_helper.SetChannelAttribute("Delay", StringValue("2ms")) point_to_point_helper_bottleneck = PointToPointHelper() point_to_point_helper_bottleneck.SetDeviceAttribute("DataRate", StringValue("5Mbps")) point_to_point_helper_bottleneck.SetChannelAttribute("Delay", StringValue("2ms")) object_factory = ns.core.ObjectFactory() object_factory.SetTypeId("ns3::RateErrorModel") object_factory.Set("ErrorRate", ns.core.DoubleValue(100)) error_model = object_factory.Create() point_to_point_helper_bottleneck.SetDeviceAttribute("ReceiveErrorModel", PointerValue(error_model)) point_to_point_dumbbell_helper = PointToPointDumbbellHelper(
def __enter__(self): # Reset our IP address space when we re-setup the simulation # XXX This may be ill-advised... ns.internet.Ipv4AddressGenerator.Reset() # TODO move a bunch of these we don't care about into _ref instead of naming # NB These MUST NOT be re-invoked in the same process without resetting IP address space self.lteHelper = ns.lte.LteHelper() self.epcHelper = ns.lte.NoBackhaulEpcHelper() self.ipv4h = ns.internet.Ipv4AddressHelper() self.lteHelper.SetEpcHelper(self.epcHelper) self.pgw = self.epcHelper.GetPgwNode() # Create our remote host and internet link self.remoteHostContainer = ns.network.NodeContainer() self.remoteHostContainer.Create(1) self.remoteHost = self.remoteHostContainer.Get(0) self.internet = ns.internet.InternetStackHelper() self.internet.Install(self.remoteHostContainer) # Create our backhaul self.p2ph = ns.point_to_point.PointToPointHelper() self.p2ph.SetDeviceAttribute("DataRate", StringValue("1Gbps")) self.p2ph.SetDeviceAttribute("Mtu", UintegerValue(int(1500))) self.p2ph.SetChannelAttribute("Delay", TimeValue(MilliSeconds(int(20)))) self.internetDevices = self.p2ph.Install(self.pgw, self.remoteHost) self.ipv4h.SetBase(Ipv4Address("1.0.0.0"), Ipv4Mask("255.0.0.0")) self.internetIpInterfaces = self.ipv4h.Assign(self.internetDevices) # 0 is loopback, 1 is p2p self.remoteHostAddr = self.internetIpInterfaces.GetAddress(1) self.routingHelper = ns.internet.Ipv4StaticRoutingHelper() self.remoteHostIpv4 = self.remoteHost.GetObject(Ipv4.GetTypeId()) self.remoteHostStaticRouting = self.routingHelper.GetStaticRouting(self.remoteHostIpv4) self.remoteHostStaticRouting.AddNetworkRouteTo(Ipv4Address("7.0.0.0"), Ipv4Mask("255.0.0.0"), 1) # SGW node self.sgw = self.epcHelper.GetSgwNode() # Apparently SGW needs a mobility model? self.sgwLp = ns.mobility.ListPositionAllocator() self.sgwLp.Add(ns.core.Vector(0, 0, 0)) self.sgwMob = ns.mobility.MobilityHelper() self.sgwMob.SetMobilityModel("ns3::ConstantPositionMobilityModel") self.sgwMob.SetPositionAllocator(self.sgwLp) self.sgwMob.Install(self.sgw) # UE and ENB Nodes, to be populated self.ueNodes = ns.network.NodeContainer() self.enbNodes = ns.network.NodeContainer() self.userPositions = ns.mobility.ListPositionAllocator() self.enbMobilities = [] # Application containers self.clientApps = ns.network.ApplicationContainer() self.serverApps = ns.network.ApplicationContainer() self.dlPort = 1100 self.ulPort = 2000 return self
import ns import sys import ns.visualizer from ns.core import CommandLine, StringValue, Seconds, Simulator, TimeValue from ns.point_to_point import PointToPointHelper from ns.point_to_point_layout import PointToPointStarHelper from ns.internet import InternetStackHelper, Ipv4AddressHelper, Ipv4GlobalRoutingHelper from ns.network import Ipv4Address, Ipv4Mask, Address, ApplicationContainer, AddressValue, InetSocketAddress from ns.applications import OnOffHelper, PacketSinkHelper commandLine = CommandLine() commandLine.Parse(sys.argv) # Build Star Topology pointToPointHelper = PointToPointHelper() pointToPointHelper.SetDeviceAttribute("DataRate", StringValue("5Mbps")) pointToPointHelper.SetChannelAttribute("Delay", StringValue("2ms")) pointToPointStarHelper = PointToPointStarHelper(5, pointToPointHelper) # Install Internet Stack On All Nodes internetStackHelper = InternetStackHelper() pointToPointStarHelper.InstallStack(internetStackHelper) # Assign IP Address pointToPointStarHelper.AssignIpv4Addresses( Ipv4AddressHelper(Ipv4Address("10.1.1.0"), Ipv4Mask("255.255.255.0"))) # Create A Packet Sink On The Star "Hub" To Recieve Packets hubLocalAddress = Address(InetSocketAddress(Ipv4Address.GetAny(), 50000)) packetSinkHelper = PacketSinkHelper("ns3::TcpSocketFactory", hubLocalAddress) hubApp = ApplicationContainer()
net2Nodes = NodeContainer() net2Nodes.Add(net1Nodes.Get(1)) net2Nodes.Create(1) print(net2Nodes) net3Nodes = NodeContainer() net3Nodes.Add(net1Nodes.Get(1)) net3Nodes.Create(1) print(net3Nodes) # source to center link pointToPointHelperSourceToCenter = PointToPointHelper() pointToPointHelperSourceToCenter.SetDeviceAttribute("DataRate", StringValue("5Mbps")) pointToPointHelperSourceToCenter.SetChannelAttribute("Delay", StringValue("2ms")) pointToPointHelperSourceToCenter.SetQueue("ns3::DropTailQueue") devices1 = NetDeviceContainer() devices1 = pointToPointHelperSourceToCenter.Install(net1Nodes) devices2 = NetDeviceContainer() devices2 = pointToPointHelperSourceToCenter.Install(net2Nodes) # bottleneck link pointToPointHelperBottleneck = PointToPointHelper() pointToPointHelperBottleneck.SetDeviceAttribute("DataRate",