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()
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"))
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")
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")
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"))
74 def add_ip_address(self, iface, address):
75 ip = iface.add_address()
76 ip.set_attribute_value("Address", address)
79 exp_desc = ExperimentDescription()
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")
87 node1 = self.add_ns3_node(ns3_desc)
88 node2 = self.add_ns3_node(ns3_desc)
89 node3 = self.add_ns3_node(ns3_desc)
91 channel = ns3_desc.create("ns3::SimpleOfdmWimaxChannel")
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)
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")
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")
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"))
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"))
124 xml = exp_desc.to_xml()
125 controller = ExperimentController(xml, self.root_dir)
127 while not (controller.is_finished(udp_server.guid) and controller.is_finished(udp_client.guid)):
131 controller.shutdown()
135 #shutil.rmtree(self.root_dir)
138 if __name__ == '__main__':
139 example = Roads09Example()