Adding support for "ns3::MatrixPropagationLossModel" ... not yet working.
[nepi.git] / examples / ns3_wifi_hidden_terminal.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 #
5 # Experiment Topology:
6 #
7 #  n1 --- n2 --- n3
8
9 #
10 # This example is based on the ns-3 wifi-hidden-terminal.cc example.
11 #
12
13 from nepi.core.design import ExperimentDescription, FactoriesProvider
14 from nepi.core.execute import ExperimentController
15 import tempfile
16 import time
17
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"))
32     
33     return (node, mobility)
34
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"))
42
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"))
47
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
53     return dev
54
55 root_dir = tempfile.mkdtemp()
56
57 exp_desc = ExperimentDescription()
58
59 testbed_id = "ns3"
60 ns3_provider = FactoriesProvider(testbed_id)
61 ns3_desc = exp_desc.add_testbed_description(ns3_provider)
62 ns3_desc.set_attribute_value("homeDirectory", root_dir)
63 # 0. Enable or disable CTS/RTS
64 # ??
65
66 # 1 & 2 & 6. Create 3 nodes with their mobility models, and Install TCP/IP stack & assign IP addresses
67 (node1, mob1) = create_node(ns3_desc)
68 (node2, mob2) = create_node(ns3_desc)
69 (node3, mob3) = create_node(ns3_desc)
70
71 #  3. Create propagation loss matrix
72 matrix = ns3_desc.create("ns3::MatrixPropagationLossModel")
73 matrix.set_attribute_value("DefaultLoss", 200.0)
74
75 mp1 = ns3_desc.create("ns3::Nepi::MobilityPair")
76 mp1.connector("matrix").connect(matrix.connector("mobpair"))
77 mp1.set_attribute_value("Loss", 50.0)
78 mp1.connector("ma").connect(mob1.connector("mp"))
79 mp1.connector("mb").connect(mob2.connector("mp"))
80
81 mp2 = ns3_desc.create("ns3::Nepi::MobilityPair")
82 mp2.connector("matrix").connect(matrix.connector("mobpair"))
83 mp2.set_attribute_value("Loss", 50.0)
84 mp2.connector("ma").connect(mob3.connector("mp"))
85 mp2.connector("mb").connect(mob2.connector("mp"))
86
87 # 4. Create & setup wifi channel
88 channel = ns3_desc.create("ns3::YansWifiChannel")
89 channel.connector("loss").connect(matrix.connector("chan"))
90 delay = ns3_desc.create("ns3::ConstantSpeedPropagationDelayModel")
91 channel.connector("delay").connect(delay.connector("chan"))
92
93 # 5. Install wireless devices
94 dev1 = create_wifi_device(ns3_desc, node1, channel)
95 ip1 = dev1.add_address()
96 ip1.set_attribute_value("Address", "10.0.0.1")
97 ip1.set_attribute_value("NetPrefix", 8)
98
99 dev2 = create_wifi_device(ns3_desc, node2, channel)
100 ip2 = dev2.add_address()
101 ip2.set_attribute_value("Address", "10.0.0.2")
102 ip2.set_attribute_value("NetPrefix", 8)
103
104 dev3 = create_wifi_device(ns3_desc, node3, channel)
105 ip3 = dev3.add_address()
106 ip3.set_attribute_value("Address", "10.0.0.3")
107 ip3.set_attribute_value("NetPrefix", 8)
108
109 app = ns3_desc.create("ns3::V4Ping")
110 app.set_attribute_value("Remote", "10.0.0.3")
111 app.set_attribute_value("Verbose", True)
112 app.set_attribute_value("StartTime", "0s")
113 app.set_attribute_value("StopTime", "20s")
114
115 app.connector("node").connect(node1.connector("apps"))
116
117 xml = exp_desc.to_xml()
118
119 controller = ExperimentController(xml, root_dir)
120 controller.start()
121
122 controller.stop()
123 controller.shutdown()