2 # -*- coding: utf-8 -*-
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
14 class Roads09Example(object):
16 self.root_dir = tempfile.mkdtemp()
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"))
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")
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")
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"))
75 def add_ip_address(self, iface, address):
76 ip = iface.add_address()
77 ip.set_attribute_value("Address", address)
80 exp_desc = ExperimentDescription()
82 testbed_version = "3_9_RC3"
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)
88 node1 = self.add_ns3_node(ns3_desc)
89 node2 = self.add_ns3_node(ns3_desc)
90 node3 = self.add_ns3_node(ns3_desc)
92 channel = ns3_desc.create("ns3::SimpleOfdmWimaxChannel")
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)
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")
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")
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"))
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"))
125 xml = exp_desc.to_xml()
126 controller = ExperimentController(xml, self.root_dir)
128 while not (controller.is_finished(udp_server.guid) and controller.is_finished(udp_client.guid)):
132 controller.shutdown()
135 shutil.rmtree(self.root_dir)
137 if __name__ == '__main__':
138 example = Roads09Example()