Added support for ns-3 Wimax module. wimax_ns3.py example not working: SS never regis...
[nepi.git] / examples / wimax_ns3.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from nepi.core.design import ExperimentDescription, FactoriesProvider
5 from nepi.core.execute import ExperimentController
6 from optparse import OptionParser, SUPPRESS_HELP
7 from nepi.util import proxy
8 import os
9 import shutil
10 import tempfile
11 import test_util
12 import time
13
14 class Roads09Example(object):
15     def __init__(self):
16         self.root_dir = tempfile.mkdtemp()
17         print self.root_dir
18
19     def add_ns3_node(self, ns3_desc):
20         node = ns3_desc.create("ns3::Node")
21         ipv4 = ns3_desc.create("ns3::Ipv4L3Protocol")
22         arp  = ns3_desc.create("ns3::ArpL3Protocol")
23         icmp = ns3_desc.create("ns3::Icmpv4L4Protocol")
24         udp = ns3_desc.create("ns3::UdpL4Protocol")
25         node.connector("protos").connect(ipv4.connector("node"))
26         node.connector("protos").connect(arp.connector("node"))
27         node.connector("protos").connect(icmp.connector("node"))
28         node.connector("protos").connect(udp.connector("node"))
29         return node
30
31     def add_ns3_wimax_bs(self, ns3_desc, node, channel):
32         bs = ns3_desc.create("ns3::BaseStationNetDevice")
33         node.connector("devs").connect(bs.connector("node"))
34         bs.connector("chan").connect(channel.connector("devs"))
35         phy = ns3_desc.create("ns3::SimpleOfdmWimaxPhy")
36         bs.connector("phy").connect(phy.connector("dev"))
37         uplink = ns3_desc.create("ns3::UplinkSchedulerSimple")
38         bs.connector("uplnk").connect(uplink.connector("dev"))
39         bssched = ns3_desc.create("ns3::BSSchedulerSimple")
40         bs.connector("dwnlnk").connect(bssched.connector("dev"))
41         bs.enable_trace("WimaxPcapTrace")
42         bs.enable_trace("WimaxAsciiTrace")
43         return bs
44
45     def add_ns3_wimax_ss(self, ns3_desc, node, channel):
46         ss = ns3_desc.create("ns3::SubscriberStationNetDevice")
47         node.connector("devs").connect(ss.connector("node"))
48         ss.connector("chan").connect(channel.connector("devs"))
49         phy = ns3_desc.create("ns3::SimpleOfdmWimaxPhy")
50         ss.connector("phy").connect(phy.connector("dev"))
51         ss.enable_trace("WimaxPcapTrace")
52         ss.enable_trace("WimaxAsciiTrace")
53         return ss
54
55     def add_ns3_service_flow(self, ns3_desc, ss, src_address, src_mask,
56             dst_address, dst_mask, src_portlow, src_porthigh, dst_portlow,
57             dst_porthigh, protocol, priority, direction, scheduling_type):
58         classifier = ns3_desc.create("ns3::IpcsClassifierRecord")
59         classifier.set_attribute_value("SrcAddress", src_address)
60         classifier.set_attribute_value("SrcMask", src_mask)
61         classifier.set_attribute_value("DstAddress", dst_address)
62         classifier.set_attribute_value("DstMask", dst_mask)
63         classifier.set_attribute_value("SrcPortLow", src_portlow)
64         classifier.set_attribute_value("SrcPortHigh",src_porthigh)
65         classifier.set_attribute_value("DstPortLow", dst_portlow)
66         classifier.set_attribute_value("DstPortHigh", dst_porthigh)
67         classifier.set_attribute_value("Protocol", protocol)
68         classifier.set_attribute_value("Priority", priority)
69         sflow = ns3_desc.create("ns3::ServiceFlow")
70         sflow.set_attribute_value("Direction", direction)
71         sflow.set_attribute_value("SchedulingType", scheduling_type)
72         sflow.connector("classif").connect(classifier.connector("sflow"))
73         ss.connector("sflows").connect(sflow.connector("dev"))
74
75     def add_ip_address(self, iface, address):
76         ip = iface.add_address()
77         ip.set_attribute_value("Address", address)
78
79     def run(self):
80         exp_desc = ExperimentDescription()
81
82         testbed_version = "3_9_RC3"
83         testbed_id = "ns3"
84         ns3_provider = FactoriesProvider(testbed_id, testbed_version)
85         ns3_desc = exp_desc.add_testbed_description(ns3_provider)
86         ns3_desc.set_attribute_value("homeDirectory", self.root_dir)
87
88         node1 = self.add_ns3_node(ns3_desc)
89         node2 = self.add_ns3_node(ns3_desc)
90         node3 = self.add_ns3_node(ns3_desc)
91
92         channel = ns3_desc.create("ns3::SimpleOfdmWimaxChannel")
93
94         ss1 = self.add_ns3_wimax_ss(ns3_desc, node1, channel)
95         ss2 = self.add_ns3_wimax_ss(ns3_desc, node2, channel)
96         bs = self.add_ns3_wimax_bs(ns3_desc, node3, channel)
97
98         self.add_ns3_service_flow(ns3_desc, ss1, "0.0.0.0", "0.0.0.0",
99                 "10.1.1.1", "255.255.255.255", 0, 65000, 100, 100, 
100                 "UdpL4Protocol", 1, "SF_DIRECTION_DOWN", "SF_TYPE_RTPS")
101         self.add_ns3_service_flow(ns3_desc, ss2, "10.1.1.2", "255.255.255.255",
102                 "0.0.0.0", "0.0.0.0", 0, 65000, 100, 100, "UdpL4Protocol",
103                 1, "SF_DIRECTION_UP", "SF_TYPE_RTPS")
104
105         self.add_ip_address(ss1, "10.1.1.1")
106         self.add_ip_address(ss2, "10.1.1.2")
107         self.add_ip_address(bs, "10.1.1.3")
108
109         udp_server = ns3_desc.create("ns3::UdpServer")
110         udp_server.set_attribute_value("Port", 100)
111         udp_server.set_attribute_value("StartTime", "1s")
112         udp_server.set_attribute_value("StopTime", "8s")
113         udp_server.connector("node").connect(node1.connector("apps"))
114
115         udp_client = ns3_desc.create("ns3::UdpClient")
116         udp_client.set_attribute_value("RemotePort", 100)
117         udp_client.set_attribute_value("RemoteAddress", "10.1.1.1")
118         udp_client.set_attribute_value("MaxPackets", 1200)
119         udp_client.set_attribute_value("Interval", "0.5s")
120         udp_client.set_attribute_value("PacketSize", 1024)
121         udp_client.set_attribute_value("StartTime", "1s")
122         udp_client.set_attribute_value("StopTime", "8s")
123         udp_client.connector("node").connect(node2.connector("apps"))
124
125         xml = exp_desc.to_xml()
126         controller = ExperimentController(xml, self.root_dir)
127         controller.start()
128         while not (controller.is_finished(udp_server.guid) and controller.is_finished(udp_client.guid)):
129             time.sleep(0.5)
130         time.sleep(0.1)
131         controller.stop()
132         controller.shutdown()
133
134     def clean(self):
135         shutil.rmtree(self.root_dir)
136
137 if __name__ == '__main__':
138     example = Roads09Example()
139     example.run()
140     example.clean()
141