Adding authors and correcting licence information
[nepi.git] / test / resources / ns3 / ns3wrapper.py
1 #!/usr/bin/env python
2 #
3 #    NEPI, a framework to manage network experiments
4 #    Copyright (C) 2013 INRIA
5 #
6 #    This program is free software: you can redistribute it and/or modify
7 #    it under the terms of the GNU General Public License as published by
8 #    the Free Software Foundation, either version 3 of the License, or
9 #    (at your option) any later version.
10 #
11 #    This program is distributed in the hope that it will be useful,
12 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #    GNU General Public License for more details.
15 #
16 #    You should have received a copy of the GNU General Public License
17 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 #
19 # Author: Alina Quereilhac <alina.quereilhac@inria.fr>
20
21
22 # Test based on ns-3 csma/examples/csma-ping.cc file
23 #
24 # Network topology
25 #
26 #       n0    n1   n2   n3
27 #       |     |    |    |
28 #       -----------------
29 #
30 #  node n0 sends IGMP traffic to node n3
31
32
33 from nepi.resources.ns3.ns3wrapper import NS3Wrapper
34
35 import os.path
36 import time
37 import tempfile
38 import unittest
39
40 class NS3WrapperTest(unittest.TestCase):
41     def setUp(self):
42         pass
43
44     def test_csma_ping(self):
45         wrapper = NS3Wrapper()
46
47         ### create 4  nodes
48         # NodeContainer c;
49         c = wrapper.create("NodeContainer")
50
51         # c.Create (4);
52         wrapper.invoke(c, "Create", 4)
53
54         ### connect the nodes to a shared channel
55         # CsmaHelper csma;
56         csma = wrapper.create("CsmaHelper")
57
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)
62
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)
67
68         # csma.SetDeviceAttribute ("EncapsulationMode", StringValue ("Llc"));
69         encap = wrapper.create("StringValue", "Llc")
70         wrapper.invoke(csma, "SetDeviceAttribute", "EncapsulationMode", encap)
71
72         # NetDeviceContainer devs = csma.Install (c);
73         devs = wrapper.invoke(csma, "Install", c)
74
75         ### add IP stack to all nodes
76         # InternetStackHelper ipStack;
77         ipStack = wrapper.create("InternetStackHelper")
78         
79         # ipStack.Install (c);
80         wrapper.invoke(ipStack, "Install", c)
81
82         ### assign ip addresses
83         #Ipv4AddressHelper ip;
84         ip = wrapper.create("Ipv4AddressHelper")
85
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)
90
91         # Ipv4InterfaceContainer addresses = ip.Assign (devs);
92         addresses = wrapper.invoke(ip, "Assign", devs)
93
94         ### Create source
95         config = wrapper.singleton("Config")
96         
97         # Config::SetDefault ("ns3::Ipv4RawSocketImpl::Protocol", StringValue ("2"));
98         proto = wrapper.create("StringValue", "2")
99         wrapper.invoke(config, "SetDefault", "ns3::Ipv4RawSocketImpl::Protocol", proto)
100
101         # InetSocketAddress dst = InetSocketAddress (addresses.GetAddress (3));
102         addr3 = wrapper.invoke(addresses, "GetAddress", 3)
103         dst = wrapper.create("InetSocketAddress", addr3)
104
105         # OnOffHelper onoff = OnOffHelper ("ns3::Ipv4RawSocketFactory", dst);
106         onoff = wrapper.create("OnOffHelper", "ns3::Ipv4RawSocketFactory", dst)
107
108         # onoff.SetAttribute ("OnTime", RandomVariableValue (ConstantVariable (1.0)));
109         cv1 = wrapper.create("ConstantVariable", 1.0)
110         rand1 = wrapper.create("RandomVariableValue", cv1)
111         wrapper.invoke(onoff, "SetAttribute", "OnTime", rand1)
112
113         # onoff.SetAttribute ("OffTime", RandomVariableValue (ConstantVariable (0.0)));
114         cv2 = wrapper.create("ConstantVariable", 0.0)
115         rand2 = wrapper.create("RandomVariableValue", cv2)
116         wrapper.invoke(onoff, "SetAttribute", "OffTime", rand2)
117
118         # onoff.SetAttribute ("DataRate", DataRateValue (DataRate (15000)));
119         dr2 = wrapper.create("DataRate", 15000)
120         drv2 = wrapper.create("DataRateValue", dr2)
121         wrapper.invoke(onoff, "SetAttribute", "DataRate", drv2)
122
123         # onoff.SetAttribute ("PacketSize", UintegerValue (1200));
124         uiv = wrapper.create("UintegerValue", 1200)
125         wrapper.invoke(onoff, "SetAttribute", "PacketSize", uiv)
126
127         # ApplicationContainer apps = onoff.Install (c.Get (0));
128         n1 = wrapper.invoke(c, "Get", 0)
129         apps = wrapper.invoke(onoff, "Install", n1)
130         
131         # apps.Start (Seconds (1.0));
132         s1 = wrapper.create("Seconds", 1.0)
133         wrapper.invoke(apps, "Start", s1)
134         
135         # apps.Stop (Seconds (10.0));
136         s2 = wrapper.create("Seconds", 10.0)
137         wrapper.invoke(apps, "Stop", s2)
138
139         ### create sink
140         # PacketSinkHelper sink = PacketSinkHelper ("ns3::Ipv4RawSocketFactory", dst);
141         sink = wrapper.create("PacketSinkHelper", "ns3::Ipv4RawSocketFactory", dst)
142         
143         # apps = sink.Install (c.Get (3));
144         n3 = wrapper.invoke(c, "Get", 3)
145         apps = wrapper.invoke (sink, "Install", n3)
146         
147         # apps.Start (Seconds (0.0));
148         s3 = wrapper.create ("Seconds", 0.0)
149         wrapper.invoke (apps, "Start", s3)
150         
151         # apps.Stop (Seconds (11.0));
152         s4 = wrapper.create ("Seconds", 11.0)
153         wrapper.invoke (apps, "Stop", s4)
154
155         ### create pinger
156         #V4PingHelper ping = V4PingHelper (addresses.GetAddress (2));
157         addr2 = wrapper.invoke(addresses, "GetAddress", 2)
158         ping = wrapper.create("V4PingHelper", addr2)
159         
160         #NodeContainer pingers;
161         pingers = wrapper.create("NodeContainer")
162         
163         #pingers.Add (c.Get (0));
164         n0 = wrapper.invoke(c, "Get", 0)
165         wrapper.invoke(pingers, "Add", n0)
166         
167         #pingers.Add (c.Get (1));
168         n1 = wrapper.invoke(c, "Get", 1)
169         wrapper.invoke(pingers, "Add", n1)
170         
171         #pingers.Add (c.Get (3));
172         n3 = wrapper.invoke(c, "Get", 3)
173         wrapper.invoke(pingers, "Add", n3)
174         
175         #apps = ping.Install (pingers);
176         apps = wrapper.invoke(ping, "Install", pingers)
177         
178         #apps.Start (Seconds (2.0));
179         s5 = wrapper.create ("Seconds", 2.0)
180         wrapper.invoke (apps, "Start", s5)
181         
182         #apps.Stop (Seconds (5.0));
183         s6 = wrapper.create ("Seconds", 5.0)
184         wrapper.invoke (apps, "Stop", s6)
185
186         def SinkRx(packet, address):
187             print packet
188
189         def PingRtt(context, rtt):
190             print context, rtt
191
192         ### configure tracing
193         #csma.EnablePcapAll ("csma-ping", false);
194         wrapper.invoke(csma, "EnablePcapAll", "csma-ping", False)
195        
196         # No binging for callback
197         #Config::ConnectWithoutContext ("/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", 
198         # MakeCallback (&SinkRx));
199         #cb = wrapper.create("MakeCallback", SinkRx)
200         #wrapper.invoke(config, "ConnectWithoutContext", 
201         #        "/NodeList/3/ApplicationList/0/$ns3::PacketSink/Rx", cb)
202
203         # Config::Connect ("/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt", 
204         # MakeCallback (&PingRtt));
205         #cb2 = wrapper.create("MakeCallback", PingRtt)
206         #wrapper.invoke(config, "ConnectWithoutContext", 
207         #        "/NodeList/*/ApplicationList/*/$ns3::V4Ping/Rtt", 
208         #        cb2)
209
210         # Packet::EnablePrinting ();
211         packet = wrapper.singleton("Packet")
212         wrapper.invoke(packet, "EnablePrinting")
213
214         ### run Simulation
215         # Simulator::Run ();
216         simulator = wrapper.singleton("Simulator")
217         wrapper.invoke(simulator, "Run")
218
219         # Simulator::Destroy ();
220         wrapper.invoke(simulator, "Destroy")
221
222 if __name__ == '__main__':
223     unittest.main()
224