815c0f14b79324bc7e83c787aafe6984f0781fc1
[nepi.git] / test / resources / ns3 / ns3wrapper.py
1 #!/usr/bin/env python
2 # Test based on ns-3 csma/examples/csma-ping.cc file
3 #
4 # Network topology
5 #
6 #       n0    n1   n2   n3
7 #       |     |    |    |
8 #       -----------------
9 #
10 #  node n0 sends IGMP traffic to node n3
11
12
13 from nepi.resources.ns3.ns3wrapper import NS3Wrapper
14
15 import os.path
16 import time
17 import tempfile
18 import unittest
19
20 class NS3WrapperTest(unittest.TestCase):
21     def setUp(self):
22         pass
23
24     def test_csma_ping(self):
25         wrapper = NS3Wrapper()
26
27         ### create 4  nodes
28         # NodeContainer c;
29         c = wrapper.create("NodeContainer")
30
31         # c.Create (4);
32         wrapper.invoke(c, "Create", 4)
33
34         ### connect the nodes to a shared channel
35         # CsmaHelper csma;
36         csma = wrapper.create("CsmaHelper")
37
38         # csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
39         dr = wrapper.create("DataRate", 5000000)
40         drv = wrapper.create("DataRateValue", dr)
41         wrapper.invoke(csma, "SetChannelAttribute", "DataRate", drv)
42
43         # csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
44         ms = wrapper.create("MilliSeconds", 2)
45         delay = wrapper.create("TimeValue", ms)
46         wrapper.invoke(csma, "SetChannelAttribute", "Delay", delay)
47
48         # csma.SetDeviceAttribute ("EncapsulationMode", StringValue ("Llc"));
49         encap = wrapper.create("StringValue", "Llc")
50         wrapper.invoke(csma, "SetDeviceAttribute", "EncapsulationMode", encap)
51
52         # NetDeviceContainer devs = csma.Install (c);
53         devs = wrapper.invoke(csma, "Install", c)
54
55         ### add IP stack to all nodes
56         # InternetStackHelper ipStack;
57         ipStack = wrapper.create("InternetStackHelper")
58         
59         # ipStack.Install (c);
60         wrapper.invoke(ipStack, "Install", c)
61
62         ### assign ip addresses
63         #Ipv4AddressHelper ip;
64         ip = wrapper.create("Ipv4AddressHelper")
65
66         # ip.SetBase ("192.168.1.0", "255.255.255.0");
67         ip4 = wrapper.create("Ipv4Address", "192.168.1.0")
68         mask4 = wrapper.create("Ipv4Mask", "255.255.255.0")
69         wrapper.invoke(ip, "SetBase", ip4, mask4)
70
71         # Ipv4InterfaceContainer addresses = ip.Assign (devs);
72         addresses = wrapper.invoke(ip, "Assign", devs)
73
74         ### Create source
75         config = wrapper.singleton("Config")
76         
77         # Config::SetDefault ("ns3::Ipv4RawSocketImpl::Protocol", StringValue ("2"));
78         proto = wrapper.create("StringValue", "2")
79         wrapper.invoke(config, "SetDefault", "ns3::Ipv4RawSocketImpl::Protocol", proto)
80
81         # InetSocketAddress dst = InetSocketAddress (addresses.GetAddress (3));
82         addr3 = wrapper.invoke(addresses, "GetAddress", 3)
83         dst = wrapper.create("InetSocketAddress", addr3)
84
85         # OnOffHelper onoff = OnOffHelper ("ns3::Ipv4RawSocketFactory", dst);
86         onoff = wrapper.create("OnOffHelper", "ns3::Ipv4RawSocketFactory", dst)
87
88         # onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1.0)));
89         cv1 = wrapper.create("ConstantVariable", 1.0)
90         rand1 = wrapper.create("RandomVariableValue", cv1)
91         wrapper.invoke(onoff, "SetAttribute", "OnTime", rand1)
92
93         # onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0.0)));
94         cv2 = wrapper.create("ConstantVariable", 0.0)
95         rand2 = wrapper.create("RandomVariableValue", cv2)
96         wrapper.invoke(onoff, "SetAttribute", "OffTime", rand2)
97
98         # onoff.SetAttribute ("DataRate", DataRateValue (DataRate (15000)));
99         dr2 = wrapper.create("DataRate", 15000)
100         drv2 = wrapper.create("DataRateValue", dr2)
101         wrapper.invoke(onoff, "SetAttribute", "DataRate", drv2)
102
103         # onoff.SetAttribute ("PacketSize", UintegerValue (1200));
104         uiv = wrapper.create("UintegerValue", 1200)
105         wrapper.invoke(onoff, "SetAttribute", "PacketSize", uiv)
106
107         # ApplicationContainer apps = onoff.Install (c.Get (0));
108         n1 = wrapper.invoke(c, "Get", 0)
109         apps = wrapper.invoke(onoff, "Install", n1)
110         
111         # apps.Start (Seconds (1.0));
112         s1 = wrapper.create("Seconds", 1.0)
113         wrapper.invoke(apps, "Start", s1)
114         
115         # apps.Stop (Seconds (10.0));
116         s2 = wrapper.create("Seconds", 10.0)
117         wrapper.invoke(apps, "Stop", s2)
118
119         ### create sink
120         # PacketSinkHelper sink = PacketSinkHelper ("ns3::Ipv4RawSocketFactory", dst);
121         sink = wrapper.create("PacketSinkHelper", "ns3::Ipv4RawSocketFactory", dst)
122         
123         # apps = sink.Install (c.Get (3));
124         n3 = wrapper.invoke(c, "Get", 3)
125         apps = wrapper.invoke (sink, "Install", n3)
126         
127         # apps.Start (Seconds (0.0));
128         s3 = wrapper.create ("Seconds", 0.0)
129         wrapper.invoke (apps, "Start", s3)
130         
131         # apps.Stop (Seconds (11.0));
132         s4 = wrapper.create ("Seconds", 11.0)
133         wrapper.invoke (apps, "Stop", s4)
134
135         ### create pinger
136         #V4PingHelper ping = V4PingHelper (addresses.GetAddress (2));
137         addr2 = wrapper.invoke(addresses, "GetAddress", 2)
138         ping = wrapper.create("V4PingHelper", addr2)
139         
140         #NodeContainer pingers;
141         pingers = wrapper.create("NodeContainer")
142         
143         #pingers.Add (c.Get (0));
144         n0 = wrapper.invoke(c, "Get", 0)
145         wrapper.invoke(pingers, "Add", n0)
146         
147         #pingers.Add (c.Get (1));
148         n1 = wrapper.invoke(c, "Get", 1)
149         wrapper.invoke(pingers, "Add", n1)
150         
151         #pingers.Add (c.Get (3));
152         n3 = wrapper.invoke(c, "Get", 3)
153         wrapper.invoke(pingers, "Add", n3)
154         
155         #apps = ping.Install (pingers);
156         apps = wrapper.invoke(ping, "Install", pingers)
157         
158         #apps.Start (Seconds (2.0));
159         s5 = wrapper.create ("Seconds", 2.0)
160         wrapper.invoke (apps, "Start", s5)
161         
162         #apps.Stop (Seconds (5.0));
163         s6 = wrapper.create ("Seconds", 5.0)
164         wrapper.invoke (apps, "Stop", s6)
165
166         def SinkRx(packet, address):
167             print packet
168
169         def PingRtt(context, rtt):
170             print context, rtt
171
172         ### configure tracing
173         #csma.EnablePcapAll ("csma-ping", false);
174         wrapper.invoke(csma, "EnablePcapAll", "csma-ping", False)
175        
176         # No binging for callback
177         #Config::ConnectWithoutContext ("/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", 
178         # MakeCallback (&SinkRx));
179         #cb = wrapper.create("MakeCallback", SinkRx)
180         #wrapper.invoke(config, "ConnectWithoutContext", 
181         #        "/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", cb)
182
183         # Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt", 
184         # MakeCallback (&PingRtt));
185         #cb2 = wrapper.create("MakeCallback", PingRtt)
186         #wrapper.invoke(config, "ConnectWithoutContext", 
187         #        "/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt", 
188         #        cb2)
189
190         # Packet::EnablePrinting ();
191         packet = wrapper.singleton("Packet")
192         wrapper.invoke(packet, "EnablePrinting")
193
194         ### run Simulation
195         # Simulator::Run ();
196         simulator = wrapper.singleton("Simulator")
197         wrapper.invoke(simulator, "Run")
198
199         # Simulator::Destroy ();
200         wrapper.invoke(simulator, "Destroy")
201
202 if __name__ == '__main__':
203     unittest.main()
204