3 from nepi.core.design import ExperimentDescription, FactoriesProvider
4 from nepi.core.execute import ExperimentController
9 def add_ns3_random_mobility(node, ns3_desc, x, y, z, speed,
10 bounds_width, bounds_height):
11 position = "%d:%d:%d" % (x, y, z)
12 bounds = "0|%d|0|%d" % (bounds_width, bounds_height)
13 speed = "Constant:%d" % speed
14 mobility = ns3_desc.create("ns3::RandomDirection2dMobilityModel")
15 mobility.set_attribute_value("Position", position)
16 mobility.set_attribute_value("Bounds", bounds)
17 mobility.set_attribute_value("Speed", speed)
18 mobility.set_attribute_value("Pause", "Constant:1")
19 node.connector("mobility").connect(mobility.connector("node"))
22 def add_ns3_constant_mobility(node, ns3_desc, x, y, z):
23 mobility = ns3_desc.create("ns3::ConstantPositionMobilityModel")
24 position = "%d:%d:%d" % (x, y, z)
25 mobility.set_attribute_value("Position", position)
26 node.connector("mobility").connect(mobility.connector("node"))
29 def add_ns3_wifi_channel(ns3_desc):
30 channel = ns3_desc.create("ns3::YansWifiChannel")
31 delay = ns3_desc.create("ns3::ConstantSpeedPropagationDelayModel")
32 loss = ns3_desc.create("ns3::LogDistancePropagationLossModel")
33 channel.connector("delay").connect(delay.connector("chan"))
34 channel.connector("loss").connect(loss.connector("prev"))
37 def add_ip_address(iface, address):
38 ip = iface.add_address()
39 ip.set_attribute_value("Address", address)
41 def add_route(node, destination, netprefix, nexthop):
42 route = node.add_route()
43 route.set_attribute_value("Destination", destination)
44 route.set_attribute_value("NetPrefix", netprefix)
45 route.set_attribute_value("NextHop", nexthop)
47 def add_ns3_wifi(node, ns3_desc, access_point = False):
48 wifi = ns3_desc.create("ns3::WifiNetDevice")
49 node.connector("devs").connect(wifi.connector("node"))
51 phy = ns3_desc.create("ns3::YansWifiPhy")
52 error = ns3_desc.create("ns3::NistErrorRateModel")
53 manager = ns3_desc.create("ns3::ArfWifiManager")
55 mac = ns3_desc.create("ns3::ApWifiMac")
57 mac = ns3_desc.create("ns3::StaWifiMac")
59 phy.set_attribute_value("Standard", "WIFI_PHY_STANDARD_80211a")
60 mac.set_attribute_value("Standard", "WIFI_PHY_STANDARD_80211a")
61 phy.connector("err").connect(error.connector("phy"))
62 wifi.connector("phy").connect(phy.connector("dev"))
63 wifi.connector("mac").connect(mac.connector("dev"))
64 wifi.connector("manager").connect(manager.connector("dev"))
65 #phy.enable_trace("YansWifiPhyPcapTrace")
68 def add_netns_tap(node, netns_desc):
69 tap = netns_desc.create("TapNodeInterface")
70 tap.set_attribute_value("up", True)
71 node.connector("devs").connect(tap.connector("node"))
74 def add_ns3_fdnd(node, ns3_desc):
75 fdnd = ns3_desc.create("ns3::FdNetDevice")
76 node.connector("devs").connect(fdnd.connector("node"))
77 #fdnd.enable_trace("FileDescriptorPcapTrace")
80 def add_ns3_node(ns3_desc):
81 node = ns3_desc.create("ns3::Node")
82 ipv4 = ns3_desc.create("ns3::Ipv4L3Protocol")
83 arp = ns3_desc.create("ns3::ArpL3Protocol")
84 icmp = ns3_desc.create("ns3::Icmpv4L4Protocol")
85 udp = ns3_desc.create("ns3::UdpL4Protocol")
86 node.connector("protos").connect(ipv4.connector("node"))
87 node.connector("protos").connect(arp.connector("node"))
88 node.connector("protos").connect(icmp.connector("node"))
89 node.connector("protos").connect(udp.connector("node"))
92 user = getpass.getuser()
93 root_dir = tempfile.mkdtemp()
94 movie = "/home/alina/repos/nepi/big_buck_bunny_240p_mpeg4_lq.ts"
95 bounds_width = bounds_height = 200
99 exp_desc = ExperimentDescription()
101 ns3_provider = FactoriesProvider("ns3")
102 ns3_desc = exp_desc.add_testbed_description(ns3_provider)
103 ns3_dir = tempfile.mkdtemp()
104 ns3_desc.set_attribute_value("rootDirectory", ns3_dir)
105 ns3_desc.set_attribute_value("SimulatorImplementationType", "ns3::RealtimeSimulatorImpl")
106 ns3_desc.set_attribute_value("ChecksumEnabled", True)
108 netns_provider = FactoriesProvider("netns")
109 netns_desc1 = exp_desc.add_testbed_description(netns_provider)
110 netns_dir1 = tempfile.mkdtemp()
111 netns_desc1.set_attribute_value("rootDirectory", netns_dir1)
112 netns_desc1.set_attribute_value("enableDebug", True)
113 netns_desc1.set_attribute_value("useSudo", True)
114 netns_desc1.set_attribute_value("deployment_communication", "LOCAL")
115 netns_desc1.set_attribute_value("deployment_mode", "DAEMON")
117 netns_provider = FactoriesProvider("netns")
118 netns_desc2 = exp_desc.add_testbed_description(netns_provider)
119 netns_dir2 = tempfile.mkdtemp()
120 netns_desc2.set_attribute_value("rootDirectory", netns_dir2)
121 netns_desc2.set_attribute_value("enableDebug", True)
122 netns_desc2.set_attribute_value("useSudo", True)
123 netns_desc2.set_attribute_value("deployment_communication", "LOCAL")
124 netns_desc2.set_attribute_value("deployment_mode", "DAEMON")
126 node1 = netns_desc1.create("Node")
127 node1.set_attribute_value("forward_X11", True)
128 tap1 = netns_desc1.create("TapNodeInterface")
129 tap1.set_attribute_value("up", True)
130 node1.connector("devs").connect(tap1.connector("node"))
131 ip = tap1.add_address()
132 ip.set_attribute_value("Address", "10.0.0.1")
134 node2 = add_ns3_node(ns3_desc)
135 fdnd1 = add_ns3_fdnd(node2, ns3_desc)
136 add_ip_address(fdnd1, "10.0.0.2")
138 fdnd1.connector("->fd").connect(tap1.connector("fd->"))
140 mobility1 = add_ns3_constant_mobility(node2, ns3_desc, x, y, 0)
141 wifi1, phy1 = add_ns3_wifi(node2, ns3_desc, access_point = False)
142 add_ip_address(wifi1, "10.0.1.1")
144 node3 = add_ns3_node(ns3_desc)
145 mobility2 = add_ns3_random_mobility(node3, ns3_desc, x, y, 0,
146 speed, bounds_width, bounds_height)
147 wifi2, phy2 = add_ns3_wifi(node3, ns3_desc, access_point = True)
148 add_ip_address(wifi2, "10.0.1.2")
150 wifichan = add_ns3_wifi_channel(ns3_desc)
151 phy1.connector("chan").connect(wifichan.connector("phys"))
152 phy2.connector("chan").connect(wifichan.connector("phys"))
154 fdnd2 = add_ns3_fdnd(node3, ns3_desc)
155 add_ip_address(fdnd2, "10.0.2.1")
157 node4 = netns_desc2.create("Node")
158 node4.set_attribute_value("forward_X11", True)
159 tap2 = netns_desc2.create("TapNodeInterface")
160 tap2.set_attribute_value("up", True)
161 node4.connector("devs").connect(tap2.connector("node"))
162 ip = tap2.add_address()
163 ip.set_attribute_value("Address", "10.0.2.2")
165 fdnd2.connector("->fd").connect(tap2.connector("fd->"))
167 route = node1.add_route()
168 route.set_attribute_value("Destination", "10.0.2.0")
169 route.set_attribute_value("NextHop", "10.0.0.2")
171 route = node1.add_route()
172 route.set_attribute_value("Destination", "10.0.1.0")
173 route.set_attribute_value("NextHop", "10.0.0.2")
175 route = node2.add_route()
176 route.set_attribute_value("Destination", "10.0.2.0")
177 route.set_attribute_value("NextHop", "10.0.1.2")
179 route = node3.add_route()
180 route.set_attribute_value("Destination", "10.0.0.0")
181 route.set_attribute_value("NextHop", "10.0.1.1")
183 route = node4.add_route()
184 route.set_attribute_value("Destination", "10.0.1.0")
185 route.set_attribute_value("NextHop", "10.0.2.1")
187 route = node4.add_route()
188 route.set_attribute_value("Destination", "10.0.0.0")
189 route.set_attribute_value("NextHop", "10.0.2.1")
191 app1 = netns_desc1.create("Application")
193 command = "xauth -b quit; vlc -I dummy -vvv %s --sout '#rtp{dst=%s,port=5004,mux=ts}' vlc://quit" \
196 app1.set_attribute_value("command", command)
197 app1.set_attribute_value("user", user)
198 app1.connector("node").connect(node1.connector("apps"))
200 app4 = netns_desc2.create("Application")
201 command = "xauth -b quit; vlc --ffmpeg-threads=1 rtp://%s:5004/test.ts" % server
203 app4.set_attribute_value("command", command)
204 app4.set_attribute_value("user", user)
205 app4.connector("node").connect(node4.connector("apps"))
207 xml = exp_desc.to_xml()
209 controller = ExperimentController(xml, root_dir)
212 while not controller.is_finished(app4.guid):
216 controller.shutdown()