위 그림에서 가운데에 위치한 노드가 csma switch, 다른 4개가 터미널이다. 소스를 보자면, 처음에는 노드와 연결링크를 설정해 주고, 인터넷과 ip를 설정해 준 후 어플리케이션 onoff를 지정해준다. http://code.nsnam.org/ns-3-dev/file/03b1accee8d1/src/bridge/examples 에서 아래 소스(csma-bridge.cc, csma-bridge.py)를 확인할 수 있다.
실행방법(with visualizer)
./waf --run src/bridge/examples/csma-bridge --vis
./waf --pyrun src/bridge/examples/csma-bridge.py --vis
|
|
import ns.applications import ns.bridge import ns.core import ns.csma import ns.internet import ns.network
if __name__ == '__main__': import sys main(sys.argv) |
#include <iostream> #include <fstream> #include "ns3/core-module.h" #include "ns3/network-module.h" #include "ns3/applications-module.h" #include "ns3/bridge-module.h" #include "ns3/csma-module.h" #include "ns3/internet-module.h"
using namespace ns3; |
|
|
def main(argv): cmd = ns.core.CommandLine() cmd.Parse(argv)
terminals = ns.network.NodeContainer() terminals.Create(4)
csmaSwitch = ns.network.NodeContainer() csmaSwitch.Create(1)
csma = ns.csma.CsmaHelper() csma.SetChannelAttribute("DataRate", ns.network.DataRateValue(ns.network.DataRate(5000000))) csma.SetChannelAttribute("Delay", ns.core.TimeValue(ns.core.MilliSeconds(2)))
terminalDevices = ns.network.NetDeviceContainer() switchDevices = ns.network.NetDeviceContainer()
for i in range(4): link = csma.Install(ns.network.NodeContainer(ns.network.NodeContainer(terminals.Get(i)), csmaSwitch)) terminalDevices.Add(link.Get(0)) switchDevices.Add(link.Get(1))
switchNode = csmaSwitch.Get(0) bridgeDevice = ns.bridge.BridgeNetDevice() switchNode.AddDevice(bridgeDevice)
for portIter in range(switchDevices.GetN()): bridgeDevice.AddBridgePort(switchDevices.Get(portIter)) |
int main (int argc, char *argv[]) { CommandLine cmd; cmd.Parse (argc, argv);
NodeContainer terminals; terminals.Create (4);
NodeContainer csmaSwitch; csmaSwitch.Create (1);
CsmaHelper csma; csma.SetChannelAttribute ("DataRate", DataRateValue (5000000)); csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
NetDeviceContainer terminalDevices; NetDeviceContainer switchDevices;
for (int i = 0; i < 4; i++) { NetDeviceContainer link = csma.Install (NodeContainer (terminals.Get (i), csmaSwitch)); terminalDevices.Add (link.Get (0)); switchDevices.Add (link.Get (1)); }
Ptr<Node> switchNode = csmaSwitch.Get (0); BridgeHelper bridge; bridge.Install (switchNode, switchDevices); |
|
|
internet = ns.internet.InternetStackHelper() internet.Install(terminals)
ipv4 = ns.internet.Ipv4AddressHelper() ipv4.SetBase(ns.network.Ipv4Address("10.1.1.0"), ns.network.Ipv4Mask("255.255.255.0")) ipv4.Assign(terminalDevices)
port = 9 # Discard port(RFC 863)
onoff = ns.applications.OnOffHelper("ns3::UdpSocketFactory", ns.network.Address(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.2"), port))) onoff.SetAttribute("OnTime", ns.core.StringValue ("ns3::ConstantRandomVariable[Constant=1]")) onoff.SetAttribute("OffTime", ns.core.StringValue ("ns3::ConstantRandomVariable[Constant=0]")) |
InternetStackHelper internet; internet.Install (terminals);
Ipv4AddressHelper ipv4; ipv4.SetBase ("10.1.1.0", "255.255.255.0"); ipv4.Assign (terminalDevices);
uint16_t port = 9; // Discard port (RFC 863)
OnOffHelper onoff ("ns3::UdpSocketFactory", Address (InetSocketAddress (Ipv4Address ("10.1.1.2"), port)));
onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1))); onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0)));
|
|
|
app = onoff.Install(ns.network.NodeContainer(terminals.Get(0))) app.Start(ns.core.Seconds(1.0)) app.Stop(ns.core.Seconds(10.0))
sink = ns.applications.PacketSinkHelper("ns3::UdpSocketFactory", ns.network.Address(ns.network.InetSocketAddress(ns.network.Ipv4Address.GetAny(), port))) app = sink.Install(ns.network.NodeContainer(terminals.Get(1))) app.Start(ns.core.Seconds(0.0))
onoff.SetAttribute("Remote", ns.network.AddressValue(ns.network.InetSocketAddress(ns.network.Ipv4Address("10.1.1.1"), port))) app = onoff.Install(ns.network.NodeContainer(terminals.Get(3))) app.Start(ns.core.Seconds(1.1)) app.Stop(ns.core.Seconds(10.0))
app = sink.Install(ns.network.NodeContainer(terminals.Get(0))) app.Start(ns.core.Seconds(0.0))
#ascii = ns.network.AsciiTraceHelper(); #csma.EnableAsciiAll(ascii.CreateFileStream ("csma-bridge.tr"));
csma.EnablePcapAll("csma-bridge", False)
ns.core.Simulator.Run() ns.core.Simulator.Destroy() |
ApplicationContainer app = onoff.Install (terminals.Get (0)); app.Start (Seconds (1.0)); app.Stop (Seconds (10.0));
PacketSinkHelper sink ("ns3::UdpSocketFactory", Address (InetSocketAddress (Ipv4Address::GetAny (), port)));
app = sink.Install (terminals.Get (1)); app.Start (Seconds (0.0));
onoff.SetAttribute ("Remote", AddressValue (InetSocketAddress (Ipv4Address ("10.1.1.1"), port)));
app = onoff.Install (terminals.Get (3)); app.Start (Seconds (1.1)); app.Stop (Seconds (10.0));
app = sink.Install (terminals.Get (0)); app.Start (Seconds (0.0));
AsciiTraceHelper ascii; csma.EnableAsciiAll (ascii.CreateFileStream ("csma-bridge.tr"));
csma.EnablePcapAll ("csma-bridge", false);
Simulator::Run (); Simulator::Destroy (); }
|
댓글