2 # -*- coding: utf-8 -*-
10 # This example is based on the ns-3 wifi-hidden-terminal.cc example.
13 from nepi.core.design import ExperimentDescription, FactoriesProvider
14 from nepi.core.execute import ExperimentController
18 def create_node(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 tcp = ns3_desc.create("ns3::TcpL4Protocol")
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 node.connector("protos").connect(tcp.connector("node"))
30 mobility = ns3_desc.create("ns3::ConstantPositionMobilityModel")
31 node.connector("mobility").connect(mobility.connector("node"))
33 return (node, mobility)
35 def create_wifi_device(ns3_desc, node, channel):
36 dev = ns3_desc.create("ns3::WifiNetDevice")
37 node.connector("devs").connect(dev.connector("node"))
38 manager = ns3_desc.create("ns3::ConstantRateWifiManager")
39 manager.set_attribute_value("DataMode", "DsssRate2Mbps")
40 manager.set_attribute_value("ControlMode", "DsssRate1Mbps")
41 dev.connector("manager").connect(manager.connector("dev"))
43 mac = ns3_desc.create("ns3::AdhocWifiMac")
44 mac.set_attribute_value("Standard", "WIFI_PHY_STANDARD_80211b")
45 mac.set_attribute_value("QosSupported", False)
46 dev.connector("mac").connect(mac.connector("dev"))
48 phy = ns3_desc.create("ns3::YansWifiPhy")
49 phy.set_attribute_value("Standard", "WIFI_PHY_STANDARD_80211b")
50 dev.connector("phy").connect(phy.connector("dev"))
51 channel.connector("phys").connect(phy.connector("chan"))
52 # Without the error model it doesn'y work!!
53 error = ns3_desc.create("ns3::NistErrorRateModel")
54 phy.connector("err").connect(error.connector("phy"))
58 root_dir = tempfile.mkdtemp()
60 exp_desc = ExperimentDescription()
63 ns3_provider = FactoriesProvider(testbed_id)
64 ns3_desc = exp_desc.add_testbed_description(ns3_provider)
65 ns3_desc.set_attribute_value("homeDirectory", root_dir)
66 #ns3_desc.set_attribute_value("SimulatorImplementationType", "ns3::RealtimeSimulatorImpl")
67 #ns3_desc.set_attribute_value("ChecksumEnabled", True)
69 # 0. Enable or disable CTS/RTS
72 # 1 & 2 & 6. Create 3 nodes with their mobility models, and Install TCP/IP stack & assign IP addresses
73 (node1, mob1) = create_node(ns3_desc)
74 (node2, mob2) = create_node(ns3_desc)
75 (node3, mob3) = create_node(ns3_desc)
77 # 3. Create propagation loss matrix
78 matrix = ns3_desc.create("ns3::MatrixPropagationLossModel")
79 matrix.set_attribute_value("DefaultLoss", 200.0)
81 mp1 = ns3_desc.create("ns3::Nepi::MobilityPair")
82 mp1.connector("matrix").connect(matrix.connector("mobpair"))
83 mp1.set_attribute_value("Loss", 50.0)
84 mp1.connector("ma").connect(mob1.connector("mp"))
85 mp1.connector("mb").connect(mob2.connector("mp"))
87 mp2 = ns3_desc.create("ns3::Nepi::MobilityPair")
88 mp2.connector("matrix").connect(matrix.connector("mobpair"))
89 mp2.set_attribute_value("Loss", 50.0)
90 mp2.connector("ma").connect(mob3.connector("mp"))
91 mp2.connector("mb").connect(mob2.connector("mp"))
93 # 4. Create & setup wifi channel
94 channel = ns3_desc.create("ns3::YansWifiChannel")
95 channel.connector("loss").connect(matrix.connector("chan"))
96 # DEBUG: Works with ns3::LogDistancePropagationLossModel but now with ns3::MatrixPropagationLossModel
97 # loss = ns3_desc.create("ns3::LogDistancePropagationLossModel")
98 # channel.connector("loss").connect(loss.connector("prev"))
99 delay = ns3_desc.create("ns3::ConstantSpeedPropagationDelayModel")
100 channel.connector("delay").connect(delay.connector("chan"))
102 # 5. Install wireless devices
104 dev1 = create_wifi_device(ns3_desc, node1, channel)
105 ip1 = dev1.add_address()
106 ip1.set_attribute_value("Address", "10.0.0.1")
107 ip1.set_attribute_value("NetPrefix", 8)
109 dev2 = create_wifi_device(ns3_desc, node2, channel)
110 ip2 = dev2.add_address()
111 ip2.set_attribute_value("Address", "10.0.0.2")
112 ip2.set_attribute_value("NetPrefix", 8)
114 dev3 = create_wifi_device(ns3_desc, node3, channel)
115 ip3 = dev3.add_address()
116 ip3.set_attribute_value("Address", "10.0.0.3")
117 ip3.set_attribute_value("NetPrefix", 8)
119 app = ns3_desc.create("ns3::V4Ping")
120 app.set_attribute_value("Remote", "10.0.0.3")
121 app.set_attribute_value("Verbose", True)
122 app.set_attribute_value("StartTime", "0s")
123 app.set_attribute_value("StopTime", "20s")
125 app.connector("node").connect(node1.connector("apps"))
127 xml = exp_desc.to_xml()
129 controller = ExperimentController(xml, root_dir)
132 while not controller.is_finished(app.guid):
136 controller.shutdown()