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