3 # NEPI, a framework to manage network experiments
4 # Copyright (C) 2013 INRIA
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License version 2 as
8 # published by the Free Software Foundation;
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
21 # Test based on ns-3 csma/examples/csma-ping.cc file
29 # node n0 sends IGMP traffic to node n3
32 from nepi.resources.ns3.ns3wrapper import NS3Wrapper
40 class NS3WrapperTest(unittest.TestCase):
44 def test_csma_ping(self):
45 wrapper = NS3Wrapper()
49 c = wrapper.create("NodeContainer")
52 wrapper.invoke(c, "Create", 4)
54 ### connect the nodes to a shared channel
56 csma = wrapper.create("CsmaHelper")
58 # csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
59 dr = wrapper.create("DataRate", 5000000)
60 drv = wrapper.create("DataRateValue", dr)
61 wrapper.invoke(csma, "SetChannelAttribute", "DataRate", drv)
63 # csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
64 ms = wrapper.create("MilliSeconds", 2)
65 delay = wrapper.create("TimeValue", ms)
66 wrapper.invoke(csma, "SetChannelAttribute", "Delay", delay)
68 # csma.SetDeviceAttribute ("EncapsulationMode", StringValue ("Llc"));
69 encap = wrapper.create("StringValue", "Llc")
70 wrapper.invoke(csma, "SetDeviceAttribute", "EncapsulationMode", encap)
72 # NetDeviceContainer devs = csma.Install (c);
73 devs = wrapper.invoke(csma, "Install", c)
75 ### add IP stack to all nodes
76 # InternetStackHelper ipStack;
77 ipStack = wrapper.create("InternetStackHelper")
79 # ipStack.Install (c);
80 wrapper.invoke(ipStack, "Install", c)
82 ### assign ip addresses
83 #Ipv4AddressHelper ip;
84 ip = wrapper.create("Ipv4AddressHelper")
86 # ip.SetBase ("192.168.1.0", "255.255.255.0");
87 ip4 = wrapper.create("Ipv4Address", "192.168.1.0")
88 mask4 = wrapper.create("Ipv4Mask", "255.255.255.0")
89 wrapper.invoke(ip, "SetBase", ip4, mask4)
91 # Ipv4InterfaceContainer addresses = ip.Assign (devs);
92 addresses = wrapper.invoke(ip, "Assign", devs)
95 # Config::SetDefault ("ns3::Ipv4RawSocketImpl::Protocol", StringValue ("2"));
96 proto = wrapper.create("StringValue", "2")
97 wrapper.invoke("singleton::Config", "SetDefault",
98 "ns3::Ipv4RawSocketImpl::Protocol", proto)
100 # InetSocketAddress dst = InetSocketAddress (addresses.GetAddress (3));
101 addr3 = wrapper.invoke(addresses, "GetAddress", 3)
102 dst = wrapper.create("InetSocketAddress", addr3)
104 # OnOffHelper onoff = OnOffHelper ("ns3::Ipv4RawSocketFactory", dst);
105 onoff = wrapper.create("OnOffHelper", "ns3::Ipv4RawSocketFactory", dst)
107 # onoff.SetAttribute ("DataRate", DataRateValue (DataRate (15000)));
108 dr2 = wrapper.create("DataRate", 15000)
109 drv2 = wrapper.create("DataRateValue", dr2)
110 wrapper.invoke(onoff, "SetAttribute", "DataRate", drv2)
112 # onoff.SetAttribute ("PacketSize", UintegerValue (1200));
113 uiv = wrapper.create("UintegerValue", 1200)
114 wrapper.invoke(onoff, "SetAttribute", "PacketSize", uiv)
116 # ApplicationContainer apps = onoff.Install (c.Get (0));
117 n1 = wrapper.invoke(c, "Get", 0)
118 apps = wrapper.invoke(onoff, "Install", n1)
120 # apps.Start (Seconds (1.0));
121 s1 = wrapper.create("Seconds", 1.0)
122 wrapper.invoke(apps, "Start", s1)
124 # apps.Stop (Seconds (10.0));
125 s2 = wrapper.create("Seconds", 10.0)
126 wrapper.invoke(apps, "Stop", s2)
129 # PacketSinkHelper sink = PacketSinkHelper ("ns3::Ipv4RawSocketFactory", dst);
130 sink = wrapper.create("PacketSinkHelper", "ns3::Ipv4RawSocketFactory", dst)
132 # apps = sink.Install (c.Get (3));
133 n3 = wrapper.invoke(c, "Get", 3)
134 apps = wrapper.invoke (sink, "Install", n3)
136 # apps.Start (Seconds (0.0));
137 s3 = wrapper.create ("Seconds", 0.0)
138 wrapper.invoke (apps, "Start", s3)
140 # apps.Stop (Seconds (11.0));
141 s4 = wrapper.create ("Seconds", 11.0)
142 wrapper.invoke (apps, "Stop", s4)
145 #V4PingHelper ping = V4PingHelper (addresses.GetAddress (2));
146 addr2 = wrapper.invoke(addresses, "GetAddress", 2)
147 ping = wrapper.create("V4PingHelper", addr2)
149 #NodeContainer pingers;
150 pingers = wrapper.create("NodeContainer")
152 #pingers.Add (c.Get (0));
153 n0 = wrapper.invoke(c, "Get", 0)
154 wrapper.invoke(pingers, "Add", n0)
156 #pingers.Add (c.Get (1));
157 n1 = wrapper.invoke(c, "Get", 1)
158 wrapper.invoke(pingers, "Add", n1)
160 #pingers.Add (c.Get (3));
161 n3 = wrapper.invoke(c, "Get", 3)
162 wrapper.invoke(pingers, "Add", n3)
164 #apps = ping.Install (pingers);
165 apps = wrapper.invoke(ping, "Install", pingers)
167 #apps.Start (Seconds (2.0));
168 s5 = wrapper.create ("Seconds", 2.0)
169 wrapper.invoke (apps, "Start", s5)
171 #apps.Stop (Seconds (5.0));
172 s6 = wrapper.create ("Seconds", 5.0)
173 wrapper.invoke (apps, "Stop", s6)
175 ### configure tracing
176 #csma.EnablePcapAll ("csma-ping", false);
177 wrapper.invoke(csma, "EnablePcapAll", "/tmp/csma-ping-pcap", False)
179 #csma.EnableAsciiAll ("csma-ping", false);
180 wrapper.invoke(csma, "EnableAsciiAll", "/tmp/csma-ping-ascii")
182 def SinkRx(packet, address):
185 def PingRtt(context, rtt):
188 # XXX: No biding for MakeCallback
189 #Config::ConnectWithoutContext ("/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx",
190 # MakeCallback (&SinkRx));
191 #cb = wrapper.create("MakeCallback", SinkRx)
192 #wrapper.invoke("singleton::Config", "ConnectWithoutContext",
193 # "/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", cb)
195 # Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt",
196 # MakeCallback (&PingRtt));
197 #cb2 = wrapper.create("MakeCallback", PingRtt)
198 #wrapper.invoke("singleton::Config", "ConnectWithoutContext",
199 # "/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt",
202 # Packet::EnablePrinting ();
203 wrapper.invoke("singleton::Packet", "EnablePrinting")
207 wrapper.invoke("singleton::Simulator", "Run")
209 # Simulator::Destroy ();
210 wrapper.invoke("singleton::Simulator", "Destroy")
212 p = subprocess.Popen("ls /tmp/csma-ping-* | wc -w", stdout = subprocess.PIPE,
213 stderr = subprocess.PIPE, shell = True)
214 (out, err) = p.communicate()
216 self.assertEquals(int(out), 8)
218 p = subprocess.Popen("rm /tmp/csma-ping-*", shell = True)
221 def test_start(self):
223 wrapper = NS3Wrapper()
226 c = wrapper.create("NodeContainer")
229 wrapper.invoke(c, "Create", 2)
231 ### connect the nodes to a shared channel
233 csma = wrapper.create("CsmaHelper")
235 # csma.SetChannelAttribute ("DataRate", DataRateValue (DataRate (5000000)));
236 dr = wrapper.create("DataRate", 5000000)
237 drv = wrapper.create("DataRateValue", dr)
238 wrapper.invoke(csma, "SetChannelAttribute", "DataRate", drv)
240 # csma.SetChannelAttribute ("Delay", TimeValue (MilliSeconds (2)));
241 ms = wrapper.create("MilliSeconds", 2)
242 delay = wrapper.create("TimeValue", ms)
243 wrapper.invoke(csma, "SetChannelAttribute", "Delay", delay)
245 # NetDeviceContainer devs = csma.Install (c);
246 devs = wrapper.invoke(csma, "Install", c)
248 ### add IP stack to all nodes
249 # InternetStackHelper ipStack;
250 ipStack = wrapper.create("InternetStackHelper")
252 # ipStack.Install (c);
253 wrapper.invoke(ipStack, "Install", c)
255 ### assign ip addresses
256 #Ipv4AddressHelper ip;
257 ip = wrapper.create("Ipv4AddressHelper")
259 # ip.SetBase ("192.168.1.0", "255.255.255.0");
260 ip4 = wrapper.create("Ipv4Address", "192.168.1.0")
261 mask4 = wrapper.create("Ipv4Mask", "255.255.255.0")
262 wrapper.invoke(ip, "SetBase", ip4, mask4)
264 # Ipv4InterfaceContainer addresses = ip.Assign (devs);
265 addresses = wrapper.invoke(ip, "Assign", devs)
268 #V4PingHelper ping = V4PingHelper (addresses.GetAddress (1));
269 addr1 = wrapper.invoke(addresses, "GetAddress", 1)
270 ping = wrapper.create("V4PingHelper", addr1)
271 btrue = wrapper.create("BooleanValue", True)
272 wrapper.invoke(ping, "SetAttribute", "Verbose", btrue)
274 #apps = ping.Install (pingers);
275 n0 = wrapper.invoke(c, "Get", 0)
276 apps = wrapper.invoke(ping, "Install", n0)
278 #apps.Start (Seconds (0.0));
279 s = wrapper.create ("Seconds", 0.0)
280 wrapper.invoke (apps, "Start", s)
282 #apps.Stop (Seconds (5.0));
283 s = wrapper.create ("Seconds", 5.0)
284 wrapper.invoke (apps, "Stop", s)
287 # Simulator::Stop (6.0);
288 wrapper.stop(time = "6s")
293 # wait until simulation is over
296 # TODO: Add assertions !!
298 def test_runtime_attr_modify(self):
299 wrapper = NS3Wrapper()
301 # Define a real time simulation
302 stype = wrapper.create("StringValue", "ns3::RealtimeSimulatorImpl")
303 wrapper.invoke("singleton::GlobalValue", "Bind", "SimulatorImplementationType", stype)
304 btrue = wrapper.create("BooleanValue", True)
305 wrapper.invoke("singleton::GlobalValue", "Bind", "ChecksumEnabled", btrue)
309 n1 = wrapper.create("Node")
311 ## Install internet stack
312 ipv41 = wrapper.create("Ipv4L3Protocol")
313 wrapper.invoke(n1, "AggregateObject", ipv41)
315 arp1 = wrapper.create("ArpL3Protocol")
316 wrapper.invoke(n1, "AggregateObject", arp1)
318 icmp1 = wrapper.create("Icmpv4L4Protocol")
319 wrapper.invoke(n1, "AggregateObject", icmp1)
322 lr1 = wrapper.create("Ipv4ListRouting")
323 wrapper.invoke(ipv41, "SetRoutingProtocol", lr1)
324 sr1 = wrapper.create("Ipv4StaticRouting")
325 wrapper.invoke(lr1, "AddRoutingProtocol", sr1, 1)
328 n2 = wrapper.create("Node")
330 ## Install internet stack
331 ipv42 = wrapper.create("Ipv4L3Protocol")
332 wrapper.invoke(n2, "AggregateObject", ipv42)
334 arp2 = wrapper.create("ArpL3Protocol")
335 wrapper.invoke(n2, "AggregateObject", arp2)
337 icmp2 = wrapper.create("Icmpv4L4Protocol")
338 wrapper.invoke(n2, "AggregateObject", icmp2)
341 lr2 = wrapper.create("Ipv4ListRouting")
342 wrapper.invoke(ipv42, "SetRoutingProtocol", lr2)
343 sr2 = wrapper.create("Ipv4StaticRouting")
344 wrapper.invoke(lr2, "AddRoutingProtocol", sr2, 1)
346 ##### Create p2p device and enable ascii tracing
348 p2pHelper = wrapper.create("PointToPointHelper")
349 asciiHelper = wrapper.create("AsciiTraceHelper")
352 p1 = wrapper.create("PointToPointNetDevice")
353 wrapper.invoke(n1, "AddDevice", p1)
354 q1 = wrapper.create("DropTailQueue")
355 wrapper.invoke(p1, "SetQueue", q1)
358 ifindex1 = wrapper.invoke(ipv41, "AddInterface", p1)
359 mask1 = wrapper.create("Ipv4Mask", "/30")
360 addr1 = wrapper.create("Ipv4Address", "10.0.0.1")
361 inaddr1 = wrapper.create("Ipv4InterfaceAddress", addr1, mask1)
362 wrapper.invoke(ipv41, "AddAddress", ifindex1, inaddr1)
363 wrapper.invoke(ipv41, "SetMetric", ifindex1, 1)
364 wrapper.invoke(ipv41, "SetUp", ifindex1)
366 # Enable collection of Ascii format to a specific file
367 filepath1 = "/tmp/trace-p2p-1.tr"
368 stream1 = wrapper.invoke(asciiHelper, "CreateFileStream", filepath1)
369 wrapper.invoke(p2pHelper, "EnableAscii", stream1, p1)
372 p2 = wrapper.create("PointToPointNetDevice")
373 wrapper.invoke(n2, "AddDevice", p2)
374 q2 = wrapper.create("DropTailQueue")
375 wrapper.invoke(p2, "SetQueue", q2)
378 ifindex2 = wrapper.invoke(ipv42, "AddInterface", p2)
379 mask2 = wrapper.create("Ipv4Mask", "/30")
380 addr2 = wrapper.create("Ipv4Address", "10.0.0.2")
381 inaddr2 = wrapper.create("Ipv4InterfaceAddress", addr2, mask2)
382 wrapper.invoke(ipv42, "AddAddress", ifindex2, inaddr2)
383 wrapper.invoke(ipv42, "SetMetric", ifindex2, 1)
384 wrapper.invoke(ipv42, "SetUp", ifindex2)
386 # Enable collection of Ascii format to a specific file
387 filepath2 = "/tmp/trace-p2p-2.tr"
388 stream2 = wrapper.invoke(asciiHelper, "CreateFileStream", filepath2)
389 wrapper.invoke(p2pHelper, "EnableAscii", stream2, p2)
392 chan = wrapper.create("PointToPointChannel")
393 wrapper.set(chan, "Delay", "0s")
394 wrapper.invoke(p1, "Attach", chan)
395 wrapper.invoke(p2, "Attach", chan)
398 ping = wrapper.create("V4Ping")
399 wrapper.invoke(n1, "AddApplication", ping)
400 wrapper.set (ping, "Remote", "10.0.0.2")
401 wrapper.set (ping, "Interval", "1s")
402 wrapper.set (ping, "Verbose", True)
403 wrapper.set (ping, "StartTime", "0s")
404 wrapper.set (ping, "StopTime", "20s")
407 wrapper.stop(time = "21s")
412 wrapper.set(chan, "Delay", "5s")
416 wrapper.set(chan, "Delay", "0s")
418 # wait until simulation is over
421 p = subprocess.Popen("rm /tmp/trace-p2p-*", shell = True)
424 # TODO: Add assertions !!
426 if __name__ == '__main__':