No uplink transmission using TCP

169 views
Skip to first unread message

Faris Syahmi Samidi

unread,
Dec 27, 2019, 10:28:50 AM12/27/19
to ns-3-users
Hi everyone, im working on creating a multiple traffic flow using TCP in both uplink and downlink transmission. However i found that, i cant manage to get the uplink data to flow from the remote host that being attached with the UE's.

Really need some help on this subject. Any insight also very appreciated. Thank you

My code are as below:


#include "ns3/mmwave-helper.h"
#include "ns3/epc-helper.h"
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/ipv4-global-routing-helper.h"
#include "ns3/internet-module.h"
#include "ns3/mobility-module.h"
#include "ns3/applications-module.h"
#include "ns3/point-to-point-helper.h"
#include "ns3/config-store.h"
#include "ns3/mmwave-point-to-point-epc-helper.h"
#include "ns3/rng-seed-manager.h"
//#include "ns3/gtk-config-store.h"
#include <sstream>
#include <string>
#include "ns3/netanim-module.h"
#include "ns3/log.h"
#include "ns3/flow-monitor-module.h"

using namespace ns3;
using namespace mmwave;

/**
 * It instantiates several eNodeB,
 * attaches one UE per eNodeB starts a flow for each UE to  and from a remote host.
 * It also  starts yet another flow between each UE pair.
 */
NS_LOG_COMPONENT_DEFINE ("MmWaveEpcTdma");
int
main (int argc, char *argv[])
{
    //LogComponentEnable ("LteUeRrc", LOG_LEVEL_ALL);
    //LogComponentEnable ("LteEnbRrc", LOG_LEVEL_ALL);
    //    LogComponentEnable("mmWavePointToPointEpcHelper",LOG_LEVEL_ALL);
    //    LogComponentEnable("EpcUeNas",LOG_LEVEL_ALL);
//        LogComponentEnable ("MmWaveSpectrumPhy", LOG_LEVEL_DEBUG);
//    LogComponentEnable ("MmWaveBeamforming", LOG_LEVEL_DEBUG);
//    LogComponentEnable ("MmWaveUePhy", LOG_LEVEL_DEBUG);
    LogComponentEnable ("MmWaveEnbPhy", LOG_LEVEL_DEBUG);
//    LogComponentEnable ("MmWaveFlexTtiMacScheduler", LOG_LEVEL_DEBUG);
//    LogComponentEnable ("MmWaveFlexTtiMaxWeightMacScheduler", LOG_LEVEL_DEBUG);
    //LogComponentEnable ("OnOffApplication", LOG_LEVEL_INFO);
//    LogComponentEnable ("LteRlcAm", LOG_LEVEL_LOGIC);
    //LogComponentEnable ("LteRlcUm", LOG_LEVEL_LOGIC);
    //LogComponentEnable ("MmWaveUeMac", LOG_LEVEL_LOGIC);
    //LogComponentEnable ("UdpClient", LOG_LEVEL_INFO);
//    LogComponentEnable ("TcpClient", LOG_LEVEL_INFO);
    //LogComponentEnable ("PacketSink", LOG_LEVEL_INFO);
    //LogComponentEnable("PropagationLossModel",LOG_LEVEL_ALL);


    uint16_t numEnb = 1;
    uint16_t numUe = 1;
    double simTime = 1.0;  //5.0
    double interPacketInterval = 100;  // 500 microseconds
    double minDistance = 10.0;  // eNB-UE distance in meters
    double maxDistance = 200.0;  // eNB-UE distance in meters
    bool harqEnabled = true;
    bool rlcAmEnabled = false;
    bool fixedTti = false;
    unsigned symPerSf = 24;
    double sfPeriod = 100.0;
    unsigned run = 0;


    // Command line arguments
    CommandLine cmd;
    cmd.AddValue("numEnb", "Number of eNBs", numEnb);
    cmd.AddValue("numUe", "Number of UEs per eNB", numUe);
    cmd.AddValue("simTime", "Total duration of the simulation [s])", simTime);
    cmd.AddValue("interPacketInterval", "Inter-packet interval [us])", interPacketInterval);
    cmd.AddValue("harq", "Enable Hybrid ARQ", harqEnabled);
    cmd.AddValue("rlcAm", "Enable RLC-AM", rlcAmEnabled);
    cmd.AddValue("symPerSf", "OFDM symbols per subframe", symPerSf);
    cmd.AddValue("sfPeriod", "Subframe period = 4.16 * symPerSf", sfPeriod);
    cmd.AddValue("fixedTti", "Fixed TTI scheduler", fixedTti);
    cmd.AddValue("run", "run for RNG (for generating different deterministic sequences for different drops)", fixedTti);
    cmd.Parse(argc, argv);

    Config::SetDefault ("ns3::MmWaveHelper::RlcAmEnabled", BooleanValue(rlcAmEnabled));
    Config::SetDefault ("ns3::MmWaveHelper::HarqEnabled", BooleanValue(harqEnabled));
    Config::SetDefault ("ns3::MmWaveFlexTtiMacScheduler::HarqEnabled", BooleanValue(harqEnabled));
    Config::SetDefault ("ns3::MmWaveFlexTtiMaxWeightMacScheduler::HarqEnabled", BooleanValue(harqEnabled));
    Config::SetDefault ("ns3::MmWaveFlexTtiMaxWeightMacScheduler::FixedTti", BooleanValue(fixedTti));
    Config::SetDefault ("ns3::MmWaveFlexTtiMaxWeightMacScheduler::SymPerSlot", UintegerValue(6));
    Config::SetDefault ("ns3::MmWavePhyMacCommon::ResourceBlockNum", UintegerValue(1));
    Config::SetDefault ("ns3::MmWavePhyMacCommon::ChunkPerRB", UintegerValue(72));
    Config::SetDefault ("ns3::MmWavePhyMacCommon::SymbolsPerSubframe", UintegerValue(symPerSf));
    Config::SetDefault ("ns3::MmWavePhyMacCommon::SubframePeriod", DoubleValue(sfPeriod));
    Config::SetDefault ("ns3::MmWavePhyMacCommon::TbDecodeLatency", UintegerValue(200.0));
    Config::SetDefault ("ns3::MmWaveBeamforming::LongTermUpdatePeriod", TimeValue (MilliSeconds (100000.0)));
    Config::SetDefault ("ns3::LteEnbRrc::SystemInformationPeriodicity", TimeValue (MilliSeconds (5.0)));
    //Config::SetDefault ("ns3::MmWavePropagationLossModel::ChannelStates", StringValue ("n"));
    Config::SetDefault ("ns3::LteRlcAm::ReportBufferStatusTimer", TimeValue(MicroSeconds(100.0)));
    Config::SetDefault ("ns3::LteRlcUmLowLat::ReportBufferStatusTimer", TimeValue(MicroSeconds(100.0)));
    Config::SetDefault ("ns3::LteEnbRrc::SrsPeriodicity", UintegerValue (320));
    Config::SetDefault ("ns3::LteEnbRrc::FirstSibTime", UintegerValue (2));

    // the applications on this example start very early.
    // Use the IDEAL mode in RRC (no radio messages are exchanged for RRC control ops)
    // and set to the minimum the latency on the S1-AP link to speed up the link and bearers setup
    Config::SetDefault ("ns3::MmWaveHelper::UseIdealRrc", BooleanValue(true));
    Config::SetDefault ("ns3::MmWavePointToPointEpcHelper::S1apLinkDelay", TimeValue(Seconds(0)));

    RngSeedManager::SetSeed (1234);
    RngSeedManager::SetRun (run);

    Ptr<MmWaveHelper> mmwaveHelper = CreateObject<MmWaveHelper> ();
    mmwaveHelper->SetSchedulerType ("ns3::MmWaveFlexTtiMaxWeightMacScheduler");
    //mmwaveHelper->SetSchedulerType ("ns3::MmWaveFlexTtiMacScheduler");
    Ptr<MmWavePointToPointEpcHelper>  epcHelper = CreateObject<MmWavePointToPointEpcHelper> ();
    mmwaveHelper->SetEpcHelper (epcHelper);
    mmwaveHelper->SetHarqEnabled (harqEnabled);

    ConfigStore inputConfig;
    inputConfig.ConfigureDefaults();

    // parse again so you can override default values from the command line
    cmd.Parse(argc, argv);

    Ptr<Node> pgw = epcHelper->GetPgwNode ();

    // Create a single RemoteHost
    NodeContainer remoteHostContainer;
    remoteHostContainer.Create (1);
    Ptr<Node> remoteHost = remoteHostContainer.Get (0);
    InternetStackHelper internet;
    internet.Install (remoteHostContainer);

    // Create the Internet
    PointToPointHelper p2ph;
    p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s")));
    p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500));
    p2ph.SetChannelAttribute ("Delay", TimeValue (MicroSeconds (100.0)));
    NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost);
    Ipv4AddressHelper ipv4h;
    ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
    Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
    // interface 0 is localhost, 1 is the p2p device
    Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);

    Ipv4StaticRoutingHelper ipv4RoutingHelper;
    Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ());
    remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);

    NodeContainer ueNodes;
    NodeContainer enbNodes;
    enbNodes.Create(numEnb);
    ueNodes.Create(numUe);

    // Install Mobility Model
    Ptr<ListPositionAllocator> enbPositionAlloc = CreateObject<ListPositionAllocator> ();
    enbPositionAlloc->Add (Vector (0.0, 0.0, 0.0));
    MobilityHelper enbmobility;
    enbmobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
    enbmobility.SetPositionAllocator(enbPositionAlloc);
    enbmobility.Install (enbNodes);

    MobilityHelper uemobility;
    Ptr<ListPositionAllocator> uePositionAlloc = CreateObject<ListPositionAllocator> ();
    Ptr<UniformRandomVariable> distRv = CreateObject<UniformRandomVariable> ();

    for (unsigned i = 0; i < numUe; i++)
    {
        double dist = distRv->GetValue (minDistance, maxDistance);
        uePositionAlloc->Add (Vector (dist, 0.0, 0.0));
    }
    uemobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
    uemobility.SetPositionAllocator(uePositionAlloc);
    uemobility.Install (ueNodes);

    // Install mmWave Devices to the nodes
    NetDeviceContainer enbmmWaveDevs = mmwaveHelper->InstallEnbDevice (enbNodes);
    NetDeviceContainer uemmWaveDevs = mmwaveHelper->InstallUeDevice (ueNodes);

    // Install the IP stack on the UEs
    internet.Install (ueNodes);
    Ipv4InterfaceContainer ueIpIface;
    ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (uemmWaveDevs));
    // Assign IP address to UEs, and install applications
    for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
    {
        Ptr<Node> ueNode = ueNodes.Get (u);
        // Set the default gateway for the UE
        Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ueNode->GetObject<Ipv4> ());
        ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
    }

    mmwaveHelper->AttachToClosestEnb (uemmWaveDevs, enbmmWaveDevs);

    // Install and start applications on UEs and remote host
    uint16_t dlPort = 1234;
    uint16_t ulPort = 2000;
    uint16_t otherPort = 3000;
    ApplicationContainer clientApps;
    ApplicationContainer serverApps;
    uint32_t packetSize = 1400;

    double dataRateMB = 100e6;  // 100 MBps
    double onTimeSec = 5e-6; // packetSize / dataRateMB;
    std::stringstream ss;
    ss << "ns3::ConstantRandomVariable[Constant=" << onTimeSec << "]";
    std::cout << "OnTime == " << ss.str() << std::endl;
    OnOffHelper dlClient ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
    OnOffHelper ulClient ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
    dlClient.SetAttribute ("PacketSize", UintegerValue (packetSize));
    ulClient.SetAttribute ("PacketSize", UintegerValue (packetSize));
    dlClient.SetAttribute ("DataRate", DataRateValue (8*dataRateMB));
    ulClient.SetAttribute ("DataRate", DataRateValue (8*dataRateMB));
    dlClient.SetAttribute ("OnTime", StringValue (ss.str ()));
    ulClient.SetAttribute ("OnTime", StringValue (ss.str ()));
    ss.str("");
    ss << "ns3::ExponentialRandomVariable[Mean=" << interPacketInterval*1e-6 << "]";
    std::cout << "OffTime == " << ss.str() << std::endl;
    dlClient.SetAttribute ("OffTime", StringValue (ss.str ()));
    ulClient.SetAttribute ("OffTime", StringValue (ss.str ()));

    for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
    {
        ++ulPort;
        ++otherPort;
        PacketSinkHelper dlPacketSinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort));
        PacketSinkHelper ulPacketSinkHelper ("ns3::TcpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), ulPort));
        serverApps.Add (dlPacketSinkHelper.Install (ueNodes.Get(u)));
        serverApps.Add (ulPacketSinkHelper.Install (remoteHost));
        dlClient.SetAttribute ("Remote", AddressValue (InetSocketAddress (ueIpIface.GetAddress (u), dlPort)));
        clientApps.Add (dlClient.Install (remoteHost));
        ulClient.SetAttribute ("Remote", AddressValue (InetSocketAddress (remoteHostAddr, ulPort)));
        clientApps.Add (ulClient.Install (ueNodes.Get (u)));
     }
     
    serverApps.Start (Seconds (0.003));
    clientApps.Start (Seconds (0.003));
    mmwaveHelper->EnableTraces ();
   
   
    // 8. Install FlowMonitor on all nodes
  FlowMonitorHelper flowmon;
  Ptr<FlowMonitor> monitor = flowmon.InstallAll ();
   
    // Uncomment to enable PCAP tracing
    p2ph.EnablePcapAll("caseTCP 100MBps Bi-directional");
    AnimationInterface anim("animcaseTCP100MBpsBidirectional");
    Simulator::Stop(Seconds(simTime));
    Simulator::Run();
   
    //flow monitor
  monitor->CheckForLostPackets ();
  Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier> (flowmon.GetClassifier ());
  std::map<FlowId, FlowMonitor::FlowStats> stats = monitor->GetFlowStats ();
  for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin (); i != stats.end (); ++i)
    {
      // first 2 FlowIds are for ECHO apps, we don't want to display them
      if (i->first > 0)
        {
          Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first);
          std::cout << "Flow " << i->first - 0 << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n";
          std::cout << "  Tx Bytes:   " << i->second.txBytes << "\n";
          std::cout << "  Rx Bytes:   " << i->second.rxBytes << "\n";
          std::cout << "  Tx Packets:   " << i->second.txPackets << "\n";
          std::cout << "  Rx Packets:   " << i->second.rxPackets << "\n";
          std::cout << "  Lost Packets:   " << i->second.txPackets - i->second.rxPackets << "\n";
          std::cout << "  Times Forwarded:   " << float(i->second.timesForwarded) << "\n";
          std::cout << "  Mean Hop Count:   " << float(i->second.timesForwarded) / i->second.rxPackets + 1 << "\n";
          std::cout << "  Mean Delay:   " << i->second.delaySum.GetSeconds() / i->second.rxPackets << "\n";
          std::cout << "  Sum Delay:   " << i->second.delaySum.GetSeconds() << "\n";
          std::cout << "  Mean Jitter:   " << i->second.jitterSum.GetSeconds() / (i->second.rxPackets-1)<< "\n";
          std::cout << "  Last Delay:   " << i->second.lastDelay.GetSeconds() << "\n";
          std::cout << "  Throughput: " << i->second.rxBytes * 8.0 / 10.0 / 1000 / 1000  << " Mbytes\n";
          std::cout << "  Delay Histogram:   " << i->second.delayHistogram.GetNBins ()  << "\n";
          std::cout << "  Jitter Histogram:   " << i->second.jitterHistogram.GetNBins ()  << "\n";
          std::cout << "  Packet Size Histogram:   " << i->second.packetSizeHistogram.GetNBins ()  << "\n";
          std::cout << "  Flow Interruptions Histogram:   " << i->second.flowInterruptionsHistogram.GetNBins ()  << "\n";            
        }
    }
    /*GtkConfigStore config;
  config.ConfigureAttributes();*/

    Simulator::Destroy();
    return 0;

}


TCPmultiflow.cc
Reply all
Reply to author
Forward
0 new messages