2 # -*- coding: utf-8 -*-
11 # n1 --- n2 ----- n3 --- n4
16 from nepi.core.design import ExperimentDescription, FactoriesProvider
17 from nepi.core.execute import ExperimentController
22 user = getpass.getuser()
23 root_dir = tempfile.mkdtemp()
25 def create_ns3_node(ns3_desc):
26 node = ns3_desc.create("ns3::Node")
27 ipv4 = ns3_desc.create("ns3::Ipv4L3Protocol")
28 arp = ns3_desc.create("ns3::ArpL3Protocol")
29 icmp = ns3_desc.create("ns3::Icmpv4L4Protocol")
30 udp = ns3_desc.create("ns3::UdpL4Protocol")
31 node.connector("protos").connect(ipv4.connector("node"))
32 node.connector("protos").connect(arp.connector("node"))
33 node.connector("protos").connect(icmp.connector("node"))
34 node.connector("protos").connect(udp.connector("node"))
37 exp_desc = ExperimentDescription()
39 ns3_provider = FactoriesProvider("ns3")
40 ns3_desc = exp_desc.add_testbed_description(ns3_provider)
41 ns3_desc.set_attribute_value("homeDirectory", root_dir)
42 ns3_desc.set_attribute_value("SimulatorImplementationType", "ns3::RealtimeSimulatorImpl")
43 ns3_desc.set_attribute_value("ChecksumEnabled", True)
45 node1 = create_ns3_node(ns3_desc)
46 iface12 = ns3_desc.create("ns3::PointToPointNetDevice")
47 queue12 = ns3_desc.create("ns3::DropTailQueue")
48 node1.connector("devs").connect(iface12.connector("node"))
49 iface12.connector("queue").connect(queue12.connector("dev"))
50 ip12 = iface12.add_address()
51 ip12.set_attribute_value("Address", "10.0.0.1")
53 node2 = create_ns3_node(ns3_desc)
54 iface21 = ns3_desc.create("ns3::PointToPointNetDevice")
55 queue21 = ns3_desc.create("ns3::DropTailQueue")
56 node2.connector("devs").connect(iface21.connector("node"))
57 iface21.connector("queue").connect(queue21.connector("dev"))
58 ip21 = iface21.add_address()
59 ip21.set_attribute_value("Address", "10.0.0.2")
61 chan = ns3_desc.create("ns3::PointToPointChannel")
62 iface12.connector("chan").connect(chan.connector("dev2"))
63 iface21.connector("chan").connect(chan.connector("dev2"))
65 iface23 = ns3_desc.create("ns3::FdNetDevice")
66 node2.connector("devs").connect(iface23.connector("node"))
67 ip23 = iface23.add_address()
68 ip23.set_attribute_value("Address", "10.0.1.1")
70 netns_provider = FactoriesProvider("netns")
71 netns_desc = exp_desc.add_testbed_description(netns_provider)
72 netns_desc.set_attribute_value("homeDirectory", root_dir)
73 #netns_desc.set_attribute_value("enableDebug", True)
75 node3 = netns_desc.create("Node")
76 iface32 = netns_desc.create("TapNodeInterface")
77 iface32.set_attribute_value("up", True)
78 node3.connector("devs").connect(iface32.connector("node"))
79 ip32 = iface32.add_address()
80 ip32.set_attribute_value("Address", "10.0.1.2")
82 iface23.connector("->fd").connect(iface32.connector("fd->"))
84 iface34 = netns_desc.create("P2PNodeInterface")
85 iface34.set_attribute_value("up", True)
86 node3.connector("devs").connect(iface34.connector("node"))
87 ip34 = iface34.add_address()
88 ip34.set_attribute_value("Address", "10.0.2.1")
90 node4 = netns_desc.create("Node")
91 node4.set_attribute_value("forward_X11", True)
92 iface43 = netns_desc.create("P2PNodeInterface")
93 iface43.set_attribute_value("up", True)
94 node4.connector("devs").connect(iface43.connector("node"))
95 ip43 = iface43.add_address()
96 ip43.set_attribute_value("Address", "10.0.2.2")
98 iface34.connector("p2p").connect(iface43.connector("p2p"))
100 route = node1.add_route()
101 route.set_attribute_value("Destination", "10.0.2.0")
102 route.set_attribute_value("NextHop", "10.0.0.2")
104 route = node2.add_route()
105 route.set_attribute_value("Destination", "10.0.2.0")
106 route.set_attribute_value("NextHop", "10.0.1.2")
108 route = node3.add_route()
109 route.set_attribute_value("Destination", "10.0.0.0")
110 route.set_attribute_value("NextHop", "10.0.1.1")
112 route = node4.add_route()
113 route.set_attribute_value("Destination", "10.0.0.0")
114 route.set_attribute_value("NextHop", "10.0.2.1")
116 app = netns_desc.create("Application")
117 app.set_attribute_value("command", "ping -qc 3 10.0.0.1")
118 app.set_attribute_value("user", user)
119 app.connector("node").connect(node4.connector("apps"))
120 app.enable_trace("stdout")
122 xml = exp_desc.to_xml()
124 controller = ExperimentController(xml, root_dir)
127 while not controller.is_finished(app.guid):
130 result = controller.trace(app.guid, "stdout")
133 controller.shutdown()