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