DCNDCNDCNDCN

#include "ns3/core-module.h"

#include "ns3/network-module.h"

#include "ns3/internet-module.h"

#include "ns3/point-to-point-module.h"

#include "ns3/applications-module.h"

#include "ns3/netanim-module.h"

#include "ns3/ipv4-global-routing-helper.h"

#include "ns3/flow-monitor-helper.h"


 

using namespace ns3;

using namespace std;

NS_LOG_COMPONENT_DEFINE("DCNusingNS3");

int main(int argc, char *argv[])

{

CommandLine cmd;

bool ECMProuting = true;

cmd.AddValue ("ECMProuting", "ECMP routing (To enable type 'true') ", ECMProuting);

cmd.Parse (argc, argv);

Time::SetResolution (Time::NS);

LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);

LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);

Config::SetDefault("ns3::Ipv4GlobalRouting::RandomEcmpRouting",BooleanValue(ECMProuting));

uint32_t Corequeuesize,Leafqueuesize;

Corequeuesize = 8;

Leafqueuesize = 4;

PointToPointHelper NodeToSW;

NodeToSW.SetDeviceAttribute ("DataRate", StringValue ("10Gbps"));

NodeToSW.SetChannelAttribute ("Delay", StringValue ("200ns"));

PointToPointHelper SWToSW_50ns;

SWToSW_50ns.SetDeviceAttribute ("DataRate", StringValue ("40Gbps"));

SWToSW_50ns.SetChannelAttribute ("Delay", StringValue ("50ns"));

//SWToSW_50ns.SetQueue("ns3::DropTailQueue", "MaxPackets", UintegerValue(Corequeuesize));

PointToPointHelper SWToSW_70ns;

SWToSW_70ns.SetDeviceAttribute ("DataRate", StringValue ("40Gbps"));

SWToSW_70ns.SetChannelAttribute ("Delay", StringValue ("70ns"));

//SWToSW_70ns.SetQueue("ns3::DropTailQueue", "MaxPackets", UintegerValue(Leafqueuesize));

NodeContainer pod0,pod1,pod2,pod3,core;

pod0.Create (8);

pod1.Create (8);

pod2.Create (8);

pod3.Create (8);

core.Create (4);

InternetStackHelper Stack;

Stack.Install( pod0);

Stack.Install( pod1);

Stack.Install( pod2);

Stack.Install( pod3);

Stack.Install( core);

//Creating Topology

NetDeviceContainer pod0_dev,pod0_dev2,pod0_dev3,pod0_dev4,pod0_dev5,pod0_dev6,pod0_dev7,pod0_dev8;

pod0_dev = NodeToSW.Install( pod0.Get(0), pod0.Get(4));

pod0_dev2 = NodeToSW.Install( pod0.Get(1), pod0.Get(4));

pod0_dev3 = NodeToSW.Install( pod0.Get(2), pod0.Get(5));

pod0_dev4 = NodeToSW.Install( pod0.Get(3), pod0.Get(5));

pod0_dev5 = SWToSW_50ns.Install( pod0.Get(4), pod0.Get(6));

pod0_dev6 = SWToSW_70ns.Install( pod0.Get(4), pod0.Get(7));

pod0_dev7 = SWToSW_50ns.Install( pod0.Get(5), pod0.Get(6));

pod0_dev8 = SWToSW_70ns.Install( pod0.Get(5), pod0.Get(7));

NetDeviceContainer pod1_dev,pod1_dev2,pod1_dev3,pod1_dev4,pod1_dev5,pod1_dev6,pod1_dev7,pod1_dev8;

pod1_dev = NodeToSW.Install( pod1.Get(0), pod1.Get(4));

pod1_dev2 = NodeToSW.Install( pod1.Get(1), pod1.Get(4));

pod1_dev3 = NodeToSW.Install( pod1.Get(2), pod1.Get(5));

pod1_dev4 = NodeToSW.Install( pod1.Get(3), pod1.Get(5));

pod1_dev5 = SWToSW_50ns.Install( pod1.Get(4), pod1.Get(6));

pod1_dev6 = SWToSW_70ns.Install( pod1.Get(4), pod1.Get(7));

pod1_dev7 = SWToSW_50ns.Install( pod1.Get(5), pod1.Get(6));

pod1_dev8 = SWToSW_70ns.Install( pod1.Get(5), pod1.Get(7));

NetDeviceContainer pod2_dev,pod2_dev2,pod2_dev3,pod2_dev4,pod2_dev5,pod2_dev6,pod2_dev7,pod2_dev8;

pod2_dev = NodeToSW.Install( pod2.Get(0), pod2.Get(4));

pod2_dev2 = NodeToSW.Install( pod2.Get(1), pod2.Get(4));

pod2_dev3 = NodeToSW.Install( pod2.Get(2), pod2.Get(5));

pod2_dev4 = NodeToSW.Install( pod2.Get(3), pod2.Get(5));

pod2_dev5 = SWToSW_50ns.Install( pod2.Get(4), pod2.Get(6));

pod2_dev6 = SWToSW_70ns.Install( pod2.Get(4), pod2.Get(7));

pod2_dev7 = SWToSW_50ns.Install( pod2.Get(5), pod2.Get(6));

pod2_dev8 = SWToSW_70ns.Install( pod2.Get(5), pod2.Get(7));

NetDeviceContainer pod3_dev,pod3_dev2,pod3_dev3,pod3_dev4,pod3_dev5,pod3_dev6,pod3_dev7,pod3_dev8;

pod3_dev = NodeToSW.Install( pod3.Get(0), pod3.Get(4));

pod3_dev2 = NodeToSW.Install( pod3.Get(1), pod3.Get(4));

pod3_dev3 = NodeToSW.Install( pod3.Get(2), pod3.Get(5));

pod3_dev4 = NodeToSW.Install( pod3.Get(3), pod3.Get(5));

pod3_dev5 = SWToSW_50ns.Install( pod3.Get(4), pod3.Get(6));

pod3_dev6 = SWToSW_70ns.Install( pod3.Get(4), pod3.Get(7));

pod3_dev7 = SWToSW_50ns.Install( pod3.Get(5), pod3.Get(6));

pod3_dev8 = SWToSW_70ns.Install( pod3.Get(5), pod3.Get(7));

//Core router connections

NetDeviceContainer core_dev,core_dev2,core_dev3,core_dev4,core_dev5,core_dev6,core_dev7,core_dev8;

NetDeviceContainer core_dev9,core_dev10,core_dev11,core_dev12,core_dev13,core_dev14,core_dev15,core_dev16;

core_dev = SWToSW_50ns.Install( pod0.Get(6), core.Get(0));

core_dev2 = SWToSW_50ns.Install( pod1.Get(6), core.Get(0));

core_dev3 = SWToSW_50ns.Install( pod2.Get(6), core.Get(0));

core_dev4 = SWToSW_50ns.Install( pod3.Get(6), core.Get(0));

core_dev5 = SWToSW_50ns.Install( pod0.Get(6), core.Get(1));

core_dev6 = SWToSW_50ns.Install( pod1.Get(6), core.Get(1));

core_dev7 = SWToSW_50ns.Install( pod2.Get(6), core.Get(1));

core_dev8 = SWToSW_50ns.Install( pod3.Get(6), core.Get(1));

core_dev9 = SWToSW_50ns.Install( pod0.Get(7), core.Get(2));

core_dev10 = SWToSW_50ns.Install( pod1.Get(7), core.Get(2));

core_dev11 = SWToSW_50ns.Install( pod2.Get(7), core.Get(2));

core_dev12 = SWToSW_50ns.Install( pod3.Get(7), core.Get(2));

core_dev13 = SWToSW_50ns.Install( pod0.Get(7), core.Get(3));

core_dev14 = SWToSW_50ns.Install( pod1.Get(7), core.Get(3));

core_dev15 = SWToSW_50ns.Install( pod2.Get(7), core.Get(3));

core_dev16 = SWToSW_50ns.Install( pod3.Get(7), core.Get(3));

//Assigning the IP address

Ipv4AddressHelper address;

Ipv4InterfaceContainer pod0_Iface,pod0_Iface2,pod0_Iface3,pod0_Iface4,pod0_Iface5,pod0_Iface6,pod0_Iface7,pod0_Iface8;

address.SetBase("10.0.0.0","255.255.255.0");

pod0_Iface = address.Assign (pod0_dev);

address.SetBase("10.0.1.0","255.255.255.0");

pod0_Iface2 = address.Assign(pod0_dev2);

address.SetBase("10.0.2.0","255.255.255.0");

pod0_Iface3 = address.Assign(pod0_dev3);

address.SetBase("10.0.3.0","255.255.255.0");

pod0_Iface4 = address.Assign(pod0_dev4);

address.SetBase("10.1.0.0","255.255.0.0");

pod0_Iface5 = address.Assign(pod0_dev5);

address.SetBase("10.2.0.0","255.255.0.0");

pod0_Iface6 = address.Assign(pod0_dev6);

address.SetBase("10.1.1.0","255.255.255.0");

pod0_Iface7 = address.Assign(pod0_dev7);

address.SetBase("10.2.1.0","255.255.255.0");

pod0_Iface8 = address.Assign(pod0_dev8);

Ipv4InterfaceContainer pod1_Iface,pod1_Iface2,pod1_Iface3,pod1_Iface4,pod1_Iface5,pod1_Iface6,pod1_Iface7,pod1_Iface8;

address.SetBase("20.0.0.0","255.255.255.0");

pod1_Iface = address.Assign (pod1_dev);

address.SetBase("20.0.1.0","255.255.255.0");

pod1_Iface2 = address.Assign(pod1_dev2);

address.SetBase("20.0.2.0","255.255.255.0");

pod1_Iface3 = address.Assign(pod1_dev3);

address.SetBase("20.0.3.0","255.255.255.0");

pod1_Iface4 = address.Assign(pod1_dev4);

address.SetBase("20.1.0.0","255.255.0.0");

pod1_Iface5 = address.Assign(pod1_dev5);

address.SetBase("20.2.0.0","255.255.0.0");

pod1_Iface6 = address.Assign(pod1_dev6);

address.SetBase("20.1.1.0","255.255.255.0");

pod1_Iface7 = address.Assign(pod1_dev7);

address.SetBase("20.2.1.0","255.255.255.0");

pod1_Iface8 = address.Assign(pod1_dev8);

Ipv4InterfaceContainer pod2_Iface,pod2_Iface2,pod2_Iface3,pod2_Iface4,pod2_Iface5,pod2_Iface6,pod2_Iface7,pod2_Iface8;

address.SetBase("30.0.0.0","255.255.255.0");

pod2_Iface = address.Assign (pod2_dev);

address.SetBase("30.0.1.0","255.255.255.0");

pod2_Iface2 = address.Assign(pod2_dev2);

address.SetBase("30.0.2.0","255.255.255.0");

pod2_Iface3 = address.Assign(pod2_dev3);

address.SetBase("30.0.3.0","255.255.255.0");

pod2_Iface4 = address.Assign(pod2_dev4);

address.SetBase("30.1.0.0","255.255.0.0");

pod2_Iface5 = address.Assign(pod2_dev5);

address.SetBase("30.2.0.0","255.255.0.0");

pod2_Iface6 = address.Assign(pod2_dev6);

address.SetBase("30.1.1.0","255.255.255.0");

pod2_Iface7 = address.Assign(pod2_dev7);

address.SetBase("30.2.1.0","255.255.255.0");

pod2_Iface8 = address.Assign(pod2_dev8);

Ipv4InterfaceContainer pod3_Iface,pod3_Iface2,pod3_Iface3,pod3_Iface4,pod3_Iface5,pod3_Iface6,pod3_Iface7,pod3_Iface8;

address.SetBase("40.0.0.0","255.255.255.0");

pod3_Iface = address.Assign (pod3_dev);

address.SetBase("40.0.1.0","255.255.255.0");

pod3_Iface2 = address.Assign(pod3_dev2);

address.SetBase("40.0.2.0","255.255.255.0");

pod3_Iface3 = address.Assign(pod3_dev3);

address.SetBase("40.0.3.0","255.255.255.0");

pod3_Iface4 = address.Assign(pod3_dev4);

address.SetBase("40.1.0.0","255.255.0.0");

pod3_Iface5 = address.Assign(pod3_dev5);

address.SetBase("40.2.0.0","255.255.0.0");

pod3_Iface6 = address.Assign(pod3_dev6);

address.SetBase("40.1.1.0","255.255.255.0");

pod3_Iface7 = address.Assign(pod3_dev7);

address.SetBase("40.2.1.0","255.255.255.0");

pod3_Iface8 = address.Assign(pod3_dev8);

//Core router Ifaces

Ipv4InterfaceContainer core_Iface,core_Iface2,core_Iface3,core_Iface4,core_Iface5,core_Iface6,core_Iface7,core_Iface8;

Ipv4InterfaceContainer core_Iface9,core_Iface10,core_Iface11,core_Iface12,core_Iface13,core_Iface14,core_Iface15,core_Iface16;

address.SetBase("50.0.1.0","255.255.255.0");

core_Iface = address.Assign(core_dev);

address.SetBase("50.1.2.0","255.255.255.0");

core_Iface2 = address.Assign(core_dev2);

address.SetBase("50.1.3.0","255.255.255.0");

core_Iface3 = address.Assign(core_dev3);

address.SetBase("50.1.4.0","255.255.255.0");

core_Iface4 = address.Assign(core_dev4);

address.SetBase("50.2.1.0","255.255.255.0");

core_Iface5 = address.Assign(core_dev5);

address.SetBase("50.2.2.0","255.255.255.0");

core_Iface6 = address.Assign(core_dev6);

address.SetBase("50.2.3.0","255.255.255.0");

core_Iface7 = address.Assign(core_dev7);

address.SetBase("50.2.4.0","255.255.255.0");

core_Iface8 = address.Assign(core_dev8);

address.SetBase("50.3.1.0","255.255.255.0");

core_Iface9 = address.Assign(core_dev9);

address.SetBase("50.3.2.0","255.255.255.0");

core_Iface10 = address.Assign(core_dev10);

address.SetBase("50.3.3.0","255.255.255.0");

core_Iface11 = address.Assign(core_dev11);

address.SetBase("50.3.4.0","255.255.255.0");

core_Iface12 = address.Assign(core_dev12);

address.SetBase("50.4.1.0","255.255.255.0");

core_Iface13 = address.Assign(core_dev13);

address.SetBase("50.4.2.0","255.255.255.0");

core_Iface14 = address.Assign(core_dev14);

address.SetBase("50.4.3.0","255.255.255.0");

core_Iface15 = address.Assign(core_dev15);

address.SetBase("50.4.4.0","255.255.255.0");

core_Iface16 = address.Assign(core_dev16);

//Routing tables

Ipv4GlobalRoutingHelper:: PopulateRoutingTables();


 

//tcp flow

int tcpSegmentSize = 1024;

uint32_t maxBytes = 1000000; // 0 means "unlimited"

Config::SetDefault ("ns3::TcpSocket::SegmentSize", UintegerValue (tcpSegmentSize));

Config::SetDefault ("ns3::TcpSocket::DelAckCount", UintegerValue (0));

uint16_t port = 80,port2 = 90;

Address sinkAaddr(InetSocketAddress (Ipv4Address::GetAny (), port));

Address sinkAaddr2(InetSocketAddress (Ipv4Address::GetAny (), port2));

Address sinkAaddr3(InetSocketAddress (Ipv4Address::GetAny (), port));

Address sinkAaddr4(InetSocketAddress (Ipv4Address::GetAny (), port2));

PacketSinkHelper sink ("ns3::TcpSocketFactory", sinkAaddr);

PacketSinkHelper sink2 ("ns3::TcpSocketFactory", sinkAaddr2);

PacketSinkHelper sink3 ("ns3::TcpSocketFactory", sinkAaddr3);

PacketSinkHelper sink4 ("ns3::TcpSocketFactory", sinkAaddr4);

ApplicationContainer sinkApp = sink.Install (pod0.Get(2));

ApplicationContainer sinkApp2 = sink2.Install (pod0.Get(3));

ApplicationContainer sinkApp3 = sink3.Install (pod1.Get(0));

ApplicationContainer sinkApp4 = sink4.Install (pod1.Get(1));

sinkApp.Start (Seconds (1));

sinkApp.Stop (Seconds (2.5));

sinkApp2.Start (Seconds (1));

sinkApp2.Stop (Seconds (2.5));

sinkApp3.Start (Seconds (1));

sinkApp3.Stop (Seconds (2.5));

sinkApp4.Start (Seconds (1));

sinkApp4.Stop (Seconds (2.5));

Address sinkAddr(InetSocketAddress(pod0_Iface3.GetAddress (0), port));

Address sinkAddr2(InetSocketAddress(pod0_Iface4.GetAddress (0), port2));

Address sinkAddr3(InetSocketAddress(pod1_Iface.GetAddress (0), port));

Address sinkAddr4(InetSocketAddress(pod1_Iface2.GetAddress (0), port2));

BulkSendHelper sourceAhelper ("ns3::TcpSocketFactory", sinkAddr);

BulkSendHelper sourceAhelper2 ("ns3::TcpSocketFactory", sinkAddr2);

BulkSendHelper sourceAhelper3 ("ns3::TcpSocketFactory", sinkAddr3);

BulkSendHelper sourceAhelper4 ("ns3::TcpSocketFactory", sinkAddr4);

sourceAhelper.SetAttribute ("MaxBytes", UintegerValue (maxBytes));

sourceAhelper.SetAttribute ("SendSize", UintegerValue (tcpSegmentSize));

sourceAhelper2.SetAttribute ("MaxBytes", UintegerValue (maxBytes));

sourceAhelper2.SetAttribute ("SendSize", UintegerValue (tcpSegmentSize));

sourceAhelper3.SetAttribute ("MaxBytes", UintegerValue (maxBytes));

sourceAhelper3.SetAttribute ("SendSize", UintegerValue (tcpSegmentSize));

sourceAhelper4.SetAttribute ("MaxBytes", UintegerValue (maxBytes));

sourceAhelper4.SetAttribute ("SendSize", UintegerValue (tcpSegmentSize));

ApplicationContainer sourceAppsA = sourceAhelper.Install (pod3.Get (0));

ApplicationContainer sourceAppsA2 = sourceAhelper2.Install (pod3.Get (3));

ApplicationContainer sourceAppsA3 = sourceAhelper3.Install (pod2.Get (2));

ApplicationContainer sourceAppsA4 = sourceAhelper4.Install (pod2.Get (3));

sourceAppsA.Start (Seconds (1.5));

sourceAppsA.Stop (Seconds (2.5));

sourceAppsA2.Start (Seconds (1.5));

sourceAppsA2.Stop (Seconds (2.5));

sourceAppsA3.Start (Seconds (1.5));

sourceAppsA3.Stop (Seconds (2.5));

sourceAppsA4.Start (Seconds (1.5));

sourceAppsA4.Stop (Seconds (2.5));

//NodeToSW.EnablePcapAll ("FatTree");

NodeToSW.EnablePcapAll("DCN_FatTree_Pcap");

//Flow Statstics

FlowMonitorHelper flowmonHelper;

flowmonHelper.InstallAll();

AnimationInterface anim ("animation.xml");

anim.SetConstantPosition(pod0.Get(0),1.0, 20.0);

anim.SetConstantPosition(pod0.Get(1),2.0, 20.0);

anim.SetConstantPosition(pod0.Get(2),3.0, 20.0);

anim.SetConstantPosition(pod0.Get(3),4.0, 20.0);

anim.SetConstantPosition(pod0.Get(4),1.5, 16.0);

anim.SetConstantPosition(pod0.Get(5),3.5, 16.0);

anim.SetConstantPosition(pod0.Get(6),1.5, 12.0);

anim.SetConstantPosition(pod0.Get(7),3.5, 12.0);

anim.SetConstantPosition(pod1.Get(0),6.0, 20.0);

anim.SetConstantPosition(pod1.Get(1),7.0, 20.0);

anim.SetConstantPosition(pod1.Get(2),8.0, 20.0);

anim.SetConstantPosition(pod1.Get(3),9.0, 20.0);

anim.SetConstantPosition(pod1.Get(4),6.5, 16.0);

anim.SetConstantPosition(pod1.Get(5),8.5, 16.0);

anim.SetConstantPosition(pod1.Get(6),6.5, 12.0);

anim.SetConstantPosition(pod1.Get(7),8.5, 12.0);

//NodeTo

anim.SetConstantPosition(pod2.Get(0),11.0, 20.0);

anim.SetConstantPosition(pod2.Get(1),12.0, 20.0);

anim.SetConstantPosition(pod2.Get(2),13.0, 20.0);

anim.SetConstantPosition(pod2.Get(3),14.0, 20.0);

anim.SetConstantPosition(pod2.Get(4),11.5, 16.0);

anim.SetConstantPosition(pod2.Get(5),13.5, 16.0);

anim.SetConstantPosition(pod2.Get(6),11.5, 12.0);

anim.SetConstantPosition(pod2.Get(7),13.5, 12.0);

anim.SetConstantPosition(pod3.Get(0),16.0, 20.0);

anim.SetConstantPosition(pod3.Get(1),17.0, 20.0);

anim.SetConstantPosition(pod3.Get(2),18.0, 20.0);

anim.SetConstantPosition(pod3.Get(3),19.0, 20.0);

anim.SetConstantPosition(pod3.Get(4),16.5, 16.0);

anim.SetConstantPosition(pod3.Get(5),18.5, 16.0);

anim.SetConstantPosition(pod3.Get(6),16.5, 12.0);

anim.SetConstantPosition(pod3.Get(7),18.5, 12.0);

anim.SetConstantPosition(core.Get(0),2.5, 7.0);

anim.SetConstantPosition(core.Get(1),7.5, 7.0);

anim.SetConstantPosition(core.Get(2),12.5, 7.0);

anim.SetConstantPosition(core.Get(3),17.5, 7.0);

Simulator::Stop (Seconds (2.0));

Simulator::Run ();

NS_LOG_INFO ("Running the Simulation.");

flowmonHelper.SerializeToXmlFile ("DCN_FatTree_FlowStat.flowmon", true, true);

NS_LOG_INFO ("Flowmon file creating.");

NS_LOG_INFO ("Done.");

Simulator::Destroy ();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_48978047

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值