void part2() { cout << "Seting up Part B with C" << endl; string rateHR = "100Mbps"; //data rate b/w hosts and routers string latencyHR = "20ms"; //latency b/w hosts and routers string rateRR = "10Mbps"; //data rate b/w routers string latencyRR = "50ms"; //latenc b/w routers uint32_t packetSize = 1.2*1024; //1.2KB uint32_t queueSizeHR = (100000*20)/packetSize; //100Mbps uint32_t queueSizeRR = (10000*50)/packetSize; //10Mbps uint32_t numSender = 3; double errorP = 0.000001; Config::SetDefault("ns3::DropTailQueue::Mode", StringValue("QUEUE_MODE_PACKETS")); //Creating channel without IP address PointToPointHelper p2pHR, p2pRR; p2pHR.SetDeviceAttribute("DataRate", StringValue(rateHR)); p2pHR.SetChannelAttribute("Delay", StringValue(latencyHR)); p2pHR.SetQueue("ns3::DropTailQueue", "MaxPackets", UintegerValue(queueSizeHR)); p2pRR.SetDeviceAttribute("DataRate", StringValue(rateRR)); p2pRR.SetChannelAttribute("Delay", StringValue(latencyRR)); p2pRR.SetQueue("ns3::DropTailQueue", "MaxPackets", UintegerValue(queueSizeRR)); //Adding some errorrate Ptr<RateErrorModel> em = CreateObjectWithAttributes<RateErrorModel> ("ErrorRate", DoubleValue (errorP)); //create nodes(routers, senders and recievers) NodeContainer routers, senders, recievers; routers.Create(2); senders.Create(numSender); recievers.Create(numSender); NetDeviceContainer routerDevices = p2pRR.Install(routers); NetDeviceContainer leftRouterDevices, rightRouterDevices, senderDevices, recieverDevices; //Adding links for(uint32_t i = 0; i < numSender; ++i) { NetDeviceContainer cleft = p2pHR.Install(routers.Get(0), senders.Get(i)); leftRouterDevices.Add(cleft.Get(0)); senderDevices.Add(cleft.Get(1)); cleft.Get(0)->SetAttribute("ReceiveErrorModel", PointerValue(em)); NetDeviceContainer cright = p2pHR.Install(routers.Get(1), recievers.Get(i)); rightRouterDevices.Add(cright.Get(0)); recieverDevices.Add(cright.Get(1)); cright.Get(0)->SetAttribute("ReceiveErrorModel", PointerValue(em)); } //Install Internet Stack InternetStackHelper stack; stack.Install(routers); stack.Install(senders); stack.Install(recievers); //Adding IP addresses Ipv4AddressHelper routerIP = Ipv4AddressHelper("10.3.0.0", "255.255.255.0"); Ipv4AddressHelper senderIP = Ipv4AddressHelper("10.1.0.0", "255.255.255.0"); Ipv4AddressHelper recieverIP = Ipv4AddressHelper("10.2.0.0", "255.255.255.0"); Ipv4InterfaceContainer routerIFC, senderIFCs, recieverIFCs, leftRouterIFCs, rightRouterIFCs; routerIFC = routerIP.Assign(routerDevices); for(uint32_t i = 0; i < numSender; ++i) { NetDeviceContainer senderDevice; senderDevice.Add(senderDevices.Get(i)); senderDevice.Add(leftRouterDevices.Get(i)); Ipv4InterfaceContainer senderIFC = senderIP.Assign(senderDevice); senderIFCs.Add(senderIFC.Get(0)); leftRouterIFCs.Add(senderIFC.Get(1)); senderIP.NewNetwork(); NetDeviceContainer recieverDevice; recieverDevice.Add(recieverDevices.Get(i)); recieverDevice.Add(rightRouterDevices.Get(i)); Ipv4InterfaceContainer recieverIFC = recieverIP.Assign(recieverDevice); recieverIFCs.Add(recieverIFC.Get(0)); rightRouterIFCs.Add(recieverIFC.Get(1)); recieverIP.NewNetwork(); } /******************************************************************** PART (2) start 2 other flows while one is progress -> measure throughput and CWND of each flow at steady state -> Also find the max throuhput per flow ********************************************************************/ cout << "Part B Starting" << endl; double durationGap = 100; double oneFlowStart = 0; double otherFlowStart = 20; uint32_t port = 9000; uint32_t numPackets = 10000000; string transferSpeed = "400Mbps"; //TCP Reno from H1 to H4 cout << "Flow from H1 -> H4 : TcpReno" << endl; cout << "Writing to app6_h1_h4_b.cwnd (congestion window) and app6_h1_h4_b.tp (throughput)" << endl; AsciiTraceHelper asciiTraceHelper; Ptr<OutputStreamWrapper> stream1CWND = asciiTraceHelper.CreateFileStream("app6_h1_h4_b.cwnd"); Ptr<OutputStreamWrapper> stream1PD = asciiTraceHelper.CreateFileStream("app6_h1_h4_b.congestion_loss"); Ptr<OutputStreamWrapper> stream1TP = asciiTraceHelper.CreateFileStream("app6_h1_h4_b.tp"); Ptr<OutputStreamWrapper> stream1GP = asciiTraceHelper.CreateFileStream("app6_h1_h4_b.gp"); Ptr<Socket> ns3TcpSocket1 = uniFlow(InetSocketAddress(recieverIFCs.GetAddress(0), port), port, "TcpReno", senders.Get(0), recievers.Get(0), oneFlowStart, oneFlowStart+durationGap, packetSize, numPackets, transferSpeed, oneFlowStart, oneFlowStart+durationGap); ns3TcpSocket1->TraceConnectWithoutContext("CongestionWindow", MakeBoundCallback (&CwndChange, stream1CWND, 0)); ns3TcpSocket1->TraceConnectWithoutContext("Drop", MakeBoundCallback (&packetDrop, stream1PD, 0, 1)); std::string sink_ = "/NodeList/5/ApplicationList/0/$ns3::PacketSink/Rx"; Config::Connect(sink_, MakeBoundCallback(&ReceivedPacket, stream1TP, oneFlowStart)); std::string sink = "/NodeList/5/ApplicationList/0/$ns3::PacketSink/Rx"; Config::Connect(sink, MakeBoundCallback(&ReceivedPacket, stream1GP, 0)); //TCP Tahoe from H2 to H5 cout << "Flow from H2 -> H5 : TcpTahoe" << endl; cout << "Writing to app6_h2_h5_b.cwnd (congestion window) and app6_h2_h5_b.tp (throughput)" << endl; Ptr<OutputStreamWrapper> stream2CWND = asciiTraceHelper.CreateFileStream("app6_h2_h5_b.cwnd"); Ptr<OutputStreamWrapper> stream2PD = asciiTraceHelper.CreateFileStream("app6_h2_h5_b.congestion_loss"); Ptr<OutputStreamWrapper> stream2TP = asciiTraceHelper.CreateFileStream("app6_h2_h5_b.tp"); Ptr<OutputStreamWrapper> stream2GP = asciiTraceHelper.CreateFileStream("app6_h2_h5_b.gp"); Ptr<Socket> ns3TcpSocket2 = uniFlow(InetSocketAddress(recieverIFCs.GetAddress(1), port), port, "TcpTahoe", senders.Get(1), recievers.Get(1), otherFlowStart, otherFlowStart+durationGap, packetSize, numPackets, transferSpeed, otherFlowStart, otherFlowStart+durationGap); ns3TcpSocket2->TraceConnectWithoutContext("CongestionWindow", MakeBoundCallback (&CwndChange, stream2CWND, 0)); ns3TcpSocket2->TraceConnectWithoutContext("Drop", MakeBoundCallback (&packetDrop, stream2PD, 0, 2)); sink_ = "/NodeList/6/ApplicationList/0/$ns3::PacketSink/Rx"; Config::Connect(sink_, MakeBoundCallback(&ReceivedPacket, stream2TP, otherFlowStart)); sink = "/NodeList/6/ApplicationList/0/$ns3::PacketSink/Rx"; Config::Connect(sink, MakeBoundCallback(&ReceivedPacket, stream2GP, 0)); //TCP WestWood from H3 to H6 cout << "Flow from H3 -> H6 : TcpWestwood" << endl; cout << "Writing to app6_h3_h6_b.cwnd (congestion window) and app6_h3_h6_b.tp (throughput)" << endl; Ptr<OutputStreamWrapper> stream3CWND = asciiTraceHelper.CreateFileStream("app6_h3_h6_b.cwnd"); Ptr<OutputStreamWrapper> stream3PD = asciiTraceHelper.CreateFileStream("app6_h3_h6_b.congestion_loss"); Ptr<OutputStreamWrapper> stream3TP = asciiTraceHelper.CreateFileStream("app6_h3_h6_b.tp"); Ptr<OutputStreamWrapper> stream3GP = asciiTraceHelper.CreateFileStream("app6_h3_h6_b.gp"); Ptr<Socket> ns3TcpSocket3 = uniFlow(InetSocketAddress(recieverIFCs.GetAddress(2), port), port, "TcpWestwood", senders.Get(2), recievers.Get(2), otherFlowStart, otherFlowStart+durationGap, packetSize, numPackets, transferSpeed, otherFlowStart, otherFlowStart+durationGap); ns3TcpSocket3->TraceConnectWithoutContext("CongestionWindow", MakeBoundCallback (&CwndChange, stream3CWND, 0)); ns3TcpSocket3->TraceConnectWithoutContext("Drop", MakeBoundCallback (&packetDrop, stream3PD, 0, 3)); sink = "/NodeList/7/ApplicationList/0/$ns3::PacketSink/Rx"; Config::Connect(sink, MakeBoundCallback(&ReceivedPacket, stream3GP, 0)); sink_ = "/NodeList/7/ApplicationList/0/$ns3::PacketSink/Rx"; Config::Connect(sink_, MakeBoundCallback(&ReceivedPacket, stream3TP, otherFlowStart)); //Turning on Static Global Routing Ipv4GlobalRoutingHelper::PopulateRoutingTables(); Ptr<FlowMonitor> flowmon; FlowMonitorHelper flowmonHelper; flowmon = flowmonHelper.InstallAll(); Simulator::Stop(Seconds(durationGap+otherFlowStart)); //animation("anim4.xml", routers, senders, recievers); //animation Simulator::Run(); flowmon->CheckForLostPackets(); cout << "Part b throughput into app6_b.tp" << endl; //Ptr<OutputStreamWrapper> streamTP = asciiTraceHelper.CreateFileStream("app6_b.tp"); Ptr<Ipv4FlowClassifier> classifier = DynamicCast<Ipv4FlowClassifier>(flowmonHelper.GetClassifier()); std::map<FlowId, FlowMonitor::FlowStats> stats = flowmon->GetFlowStats(); for (std::map<FlowId, FlowMonitor::FlowStats>::const_iterator i = stats.begin(); i != stats.end(); ++i) { Ipv4FlowClassifier::FiveTuple t = classifier->FindFlow (i->first); if(t.sourceAddress == "10.1.0.1") { if(mapDrop.find(1)==mapDrop.end()) mapDrop[1] = 0; *stream1PD->GetStream() << "TcpReno Flow " << i->first << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n"; *stream1PD->GetStream() << "Net Packet Lost: " << i->second.lostPackets << "\n"; *stream1PD->GetStream() << "Packet Lost due to buffer overflow: " << mapDrop[1] << "\n"; *stream1PD->GetStream() << "Packet Lost due to Congestion: " << i->second.lostPackets - mapDrop[1] << "\n"; *stream1PD->GetStream() << "Max throughput: " << mapMaxThroughput["/NodeList/5/$ns3::Ipv4L3Protocol/Rx"] << std::endl; } else if(t.sourceAddress == "10.1.1.1") { if(mapDrop.find(2)==mapDrop.end()) mapDrop[2] = 0; *stream2PD->GetStream() << "TcpTahoe Flow " << i->first << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n"; *stream2PD->GetStream() << "Net Packet Lost: " << i->second.lostPackets << "\n"; *stream2PD->GetStream() << "Packet Lost due to buffer overflow: " << mapDrop[2] << "\n"; *stream2PD->GetStream() << "Packet Lost due to Congestion: " << i->second.lostPackets - mapDrop[2] << "\n"; *stream2PD->GetStream() << "Max throughput: " << mapMaxThroughput["/NodeList/6/$ns3::Ipv4L3Protocol/Rx"] << std::endl; } else if(t.sourceAddress == "10.1.2.1") { if(mapDrop.find(3)==mapDrop.end()) mapDrop[3] = 0; *stream3PD->GetStream() << "TcpWestWood Flow " << i->first << " (" << t.sourceAddress << " -> " << t.destinationAddress << ")\n"; *stream3PD->GetStream() << "Net Packet Lost: " << i->second.lostPackets << "\n"; *stream3PD->GetStream() << "Packet Lost due to buffer overflow: " << mapDrop[3] << "\n"; *stream3PD->GetStream() << "Packet Lost due to Congestion: " << i->second.lostPackets - mapDrop[3] << "\n"; *stream3PD->GetStream() << "Max throughput: " << mapMaxThroughput["/NodeList/7/$ns3::Ipv4L3Protocol/Rx"] << std::endl; } } //flowmon->SerializeToXmlFile("app6_b.flowmon", true, true); Simulator::Destroy(); }