2 # -*- coding: utf-8 -*-
4 from constants import TESTBED_ID
6 from nepi.util.constants import CONNECTION_DELAY
7 from nepi.util.tunchannel_impl import \
8 crossconnect_tunchannel_peer_init, \
9 crossconnect_tunchannel_peer_compl
11 ### Connection functions ####
13 def connect_dummy(testbed_instance, guid1, guid2):
16 def connect_node_device(testbed_instance, node_guid, device_guid):
17 node = testbed_instance._elements[node_guid]
18 device = testbed_instance._elements[device_guid]
19 node.AddDevice(device)
21 def connect_queue_device(testbed_instance, queue_guid, device_guid):
22 queue = testbed_instance._elements[queue_guid]
23 device = testbed_instance._elements[device_guid]
24 device.SetQueue(queue)
26 def connect_manager_device(testbed_instance, manager_guid, device_guid):
27 manager = testbed_instance._elements[manager_guid]
28 device = testbed_instance._elements[device_guid]
29 device.SetRemoteStationManager(manager)
31 def connect_phy_device(testbed_instance, phy_guid, device_guid):
32 phy = testbed_instance._elements[phy_guid]
33 if hasattr(phy, "GetErrorRateModel") and phy.GetErrorRateModel() == None:
34 return CONNECTION_DELAY
35 device = testbed_instance._elements[device_guid]
38 # search for the node asociated with the device
39 node_guid = testbed_instance.get_connected(device_guid, "node", "devs")
40 if len(node_guid) == 0:
41 raise RuntimeError("Can't instantiate interface %d outside netns \
43 node = testbed_instance.elements[node_guid[0]]
46 def connect_mac_device(testbed_instance, mac_guid, device_guid):
47 mac = testbed_instance._elements[mac_guid]
48 device = testbed_instance._elements[device_guid]
51 def connect_errormodel_device(testbed_instance, model_guid, device_guid):
52 model = testbed_instance._elements[model_guid]
53 device = testbed_instance._elements[device_guid]
54 device.SetReceiveErrorModel(model)
56 def connect_errormodel_phy(testbed_instance, err_guid, phy_guid):
57 err = testbed_instance._elements[err_guid]
58 phy = testbed_instance._elements[phy_guid]
59 phy.SetErrorRateModel(err)
61 def connect_channel_device(testbed_instance, channel_guid, device_guid):
62 channel = testbed_instance._elements[channel_guid]
63 device = testbed_instance._elements[device_guid]
64 device.Attach(channel)
66 def connect_simple_channel_device(testbed_instance, channel_guid, device_guid):
67 channel = testbed_instance._elements[channel_guid]
68 device = testbed_instance._elements[device_guid]
69 device.SetChannel(channel)
71 def connect_loss_channel(testbed_instance, loss_guid, channel_guid):
72 loss = testbed_instance._elements[loss_guid]
73 channel = testbed_instance._elements[channel_guid]
74 channel.SetPropagationLossModel(loss)
76 def connect_next_loss(testbed_instance, prev_guid, next_guid):
77 prev = testbed_instance._elements[prev_guid]
78 next = testbed_instance._elements[next_guid]
81 def connect_delay_channel(testbed_instance, delay_guid, channel_guid):
82 delay = testbed_instance._elements[delay_guid]
83 channel = testbed_instance._elements[channel_guid]
84 channel.SetPropagationDelayModel(delay)
86 def connect_node_application(testbed_instance, node_guid, application_guid):
87 node = testbed_instance._elements[node_guid]
88 application = testbed_instance._elements[application_guid]
89 node.AddApplication(application)
90 # works for ArpL3Protocol, Ipv4L3Protocol, UdpL4Protocol, TcpL4Protocol,
91 # NscTcpL4Protocol, MobilityModel (every subclass),
92 # RoutingProtocol (every subclass)
94 def connect_node_other(testbed_instance, node_guid, other_guid):
95 node = testbed_instance._elements[node_guid]
96 other = testbed_instance._elements[other_guid]
97 node.AggregateObject(other)
99 def connect_station_sflow(testbed_instance, station_guid, sflow_guid):
100 station = testbed_instance._elements[station_guid]
101 sflow = testbed_instance._elements[sflow_guid]
102 station.AddServiceFlow(sflow)
104 def connect_bstation_linksched(testbed_instance, bstation_guid, linksched_guid):
105 bstation = testbed_instance._elements[bstation_guid]
106 linksched = testbed_instance._elements[linksched_guid]
107 linksched.SetBs(bstation)
109 def connect_classifier_sflow(testbed_instance, classifier_guid, sflow_guid):
110 classifier = testbed_instance._elements[classifier_guid]
111 sflow = testbed_instance._elements[sflow_guid]
112 csparam = testbed_instance.ns3.CsParameters(testbed_instance.ns3.CsParameters.ADD, classifier)
113 sflow.SetConvergenceSublayerParam (csparam);
115 def connect_fd(testbed_instance, fdnd_guid, cross_data):
116 fdnd = testbed_instance._elements[fdnd_guid]
117 endpoint = fdnd.GetEndpoint()
118 # XXX: check the method StringToBuffer of ns3::FileDescriptorNetDevice
119 # to see how the address should be decoded
120 address = endpoint.replace(":", "").decode('hex')[2:]
121 testbed_instance.set(fdnd_guid, "LinuxSocketAddress", address)
123 # If it's a non-abstract socket, add the path
124 if not address.startswith('\x00'):
125 address = os.path.join( testbed_instance.root_directory, address )
127 # Set tun standard contract attributes
128 testbed_instance.set(fdnd_guid, "tun_addr", address )
129 testbed_instance.set(fdnd_guid, "tun_proto", "fd")
130 testbed_instance.set(fdnd_guid, "tun_port", 0)
131 testbed_instance.set(fdnd_guid, "tun_key", "\xfa"*32) # unimportant, fds aren't encrypted
133 def connect_tunchannel_fd(testbed_instance, tun_guid, fdnd_guid):
134 fdnd = testbed_instance._elements[fdnd_guid]
135 tun = testbed_instance._elements[tun_guid]
137 # XXX: check the method StringToBuffer of ns3::FileDescriptorNetDevice
138 # to see how the address should be decoded
139 endpoint = fdnd.GetEndpoint()
140 address = endpoint.replace(":", "").decode('hex')[2:]
141 testbed_instance.set(fdnd_guid, "LinuxSocketAddress", address)
143 # Create socket pair to connect the FDND and the TunChannel with it
145 sock1, sock2 = socket.socketpair(
146 socket.AF_UNIX, socket.SOCK_SEQPACKET)
148 # Send one endpoint to the FDND
151 sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
152 sock.connect(address)
153 passfd.sendfd(sock, sock1.fileno(), '0')
155 # Store a reference to the endpoint to keep the socket alive
156 fdnd._endpoint_socket = sock1
158 # Send the other endpoint to the TUN channel
159 tun.tun_socket = sock2
161 # With this kind of tun_socket, NS3 will expect a PI header
162 # (sockets don't support the TUNGETIFF ioctl, so it will assume
163 # the default presence of PI headers)
167 ### Connector information ###
169 connector_types = dict({
171 "help": "Connector to a ns3::Node object (mandatory)",
177 "help": "Connector to network interfaces",
183 "help": "Connector to exactly two network interfaces (mandatory)",
189 "help": "Connector to exactly one network interface (mandatory)",
195 "help": "Connector to applications",
201 "help": "Connector to network stacks and protocols",
207 "help": "Connector to a channel for the device (mandatory)",
213 "help": "Connector to a queueing discipline (mandatory)",
219 "help": "Connector to an error model for the device",
225 "help": "Connector for file descriptor reception for devices with file descriptors",
231 "help": "Connector for file descriptor providing for devices with file descriptors",
237 "help": "Connector to a PHY wifi model",
243 "help": "Connector to a wifi channel with PHY wifi models",
249 "help": "Connector to a MAC wifi model",
255 "help": "Connector to a wifi manager",
261 "help": "Connector to a delay model",
267 "help": "Connector to a loss model",
273 "help": "Connector to the previous loss model",
279 "help": "Connector to the next loss model",
285 "help": "Connector to a mobility model",
291 "help": "Connector for ip-ip tunneling over TCP link",
297 "help": "Connector for ip-ip tunneling over UDP datagrams",
303 "help": "Connector to service flows",
309 "help": "Connector to a uplink scheduler",
315 "help": "Connector to a dowlink scheduler",
321 "help": "Connector to a classifier recod",
327 "help": "Connector to a service flow",
336 "from": ( "ns3", "ns3::Node", "devs" ),
337 "to": ( "ns3", "ns3::BridgeNetDevice", "node" ),
338 "init_code": connect_node_device,
342 "from": ( "ns3", "ns3::Node", "devs" ),
343 "to": ( "ns3", "ns3::CsmaNetDevice", "node" ),
344 "init_code": connect_node_device,
348 "from": ( "ns3", "ns3::Node", "devs" ),
349 "to": ( "ns3", "ns3::EmuNetDevice", "node" ),
350 "init_code": connect_node_device,
354 "from": ( "ns3", "ns3::Node", "devs" ),
355 "to": ( "ns3", "ns3::PointToPointNetDevice", "node" ),
356 "init_code": connect_node_device,
360 "from": ( "ns3", "ns3::Node", "devs" ),
361 "to": ( "ns3", "ns3::SimpleNetDevice", "node" ),
362 "init_code": connect_node_device,
366 "from": ( "ns3", "ns3::Node", "devs" ),
367 "to": ( "ns3", "ns3::FileDescriptorNetDevice", "node" ),
368 "init_code": connect_node_device,
372 "from": ( "ns3", "ns3::Node", "devs" ),
373 "to": ( "ns3", "ns3::WifiNetDevice", "node" ),
374 "init_code": connect_node_device,
378 "from": ( "ns3", "ns3::Node", "devs" ),
379 "to": ( "ns3", "ns3::SubscriberStationNetDevice", "node" ),
380 "init_code": connect_dummy,
384 "from": ( "ns3", "ns3::Node", "devs" ),
385 "to": ( "ns3", "ns3::BaseStationNetDevice", "node" ),
386 "init_code": connect_dummy,
390 "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
391 "to": ( "ns3", "ns3::CsmaNetDevice", "queue" ),
392 "init_code": connect_queue_device,
396 "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
397 "to": ( "ns3", "ns3::EmuNetDevice", "queue" ),
398 "init_code": connect_queue_device,
402 "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
403 "to": ( "ns3", "ns3::PointToPointNetDevice", "queue" ),
404 "init_code": connect_queue_device,
408 "from": ( "ns3", "ns3::ArfWifiManager", "dev" ),
409 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
410 "init_code": connect_manager_device,
414 "from": ( "ns3", "ns3::ConstantRateWifiManager", "dev" ),
415 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
416 "init_code": connect_manager_device,
420 "from": ( "ns3", "ns3::AarfcdWifiManager", "dev" ),
421 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
422 "init_code": connect_manager_device,
426 "from": ( "ns3", "ns3::AarfWifiManager", "dev" ),
427 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
428 "init_code": connect_manager_device,
432 "from": ( "ns3", "ns3::AmrrWifiManager", "dev" ),
433 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
434 "init_code": connect_manager_device,
438 "from": ( "ns3", "ns3::CaraWifiManager", "dev" ),
439 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
440 "init_code": connect_manager_device,
444 "from": ( "ns3", "ns3::IdealWifiManager", "dev" ),
445 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
446 "init_code": connect_manager_device,
450 "from": ( "ns3", "ns3::MinstrelWifiManager", "dev" ),
451 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
452 "init_code": connect_manager_device,
456 "from": ( "ns3", "ns3::OnoeWifiManager", "dev" ),
457 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
458 "init_code": connect_manager_device,
462 "from": ( "ns3", "ns3::RraaWifiManager", "dev" ),
463 "to": ( "ns3", "ns3::WifiNetDevice", "manager" ),
464 "init_code": connect_manager_device,
468 "from": ( "ns3", "ns3::YansWifiPhy", "dev" ),
469 "to": ( "ns3", "ns3::WifiNetDevice", "phy" ),
470 "init_code": connect_phy_device,
474 "from": ( "ns3", "ns3::SimpleOfdmWimaxPhy", "dev" ),
475 "to": ( "ns3", "ns3::SubscriberStationNetDevice", "phy" ),
476 "init_code": connect_phy_device,
480 "from": ( "ns3", "ns3::SimpleOfdmWimaxPhy", "dev" ),
481 "to": ( "ns3", "ns3::BaseStationNetDevice", "phy" ),
482 "init_code": connect_phy_device,
486 "from": ( "ns3", "ns3::QapWifiMac", "dev" ),
487 "to": ( "ns3", "ns3::WifiNetDevice", "mac" ),
488 "init_code": connect_mac_device,
492 "from": ( "ns3", "ns3::QstaWifiMac", "dev" ),
493 "to": ( "ns3", "ns3::WifiNetDevice", "mac" ),
494 "init_code": connect_mac_device,
498 "from": ( "ns3", "ns3::NqapWifiMac", "dev" ),
499 "to": ( "ns3", "ns3::WifiNetDevice", "mac" ),
500 "init_code": connect_mac_device,
504 "from": ( "ns3", "ns3::NqstaWifiMac", "dev" ),
505 "to": ( "ns3", "ns3::WifiNetDevice", "mac" ),
506 "init_code": connect_mac_device,
510 "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
511 "to": ( "ns3", "ns3::CsmaNetDevice", "err" ),
512 "init_code": connect_errormodel_device,
516 "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
517 "to": ( "ns3", "ns3::PointToPointNetDevice", "err" ),
518 "init_code": connect_errormodel_device,
522 "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
523 "to": ( "ns3", "ns3::CsmaNetDevice", "err" ),
524 "init_code": connect_errormodel_device,
528 "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
529 "to": ( "ns3", "ns3::PointToPointNetDevice", "err" ),
530 "init_code": connect_errormodel_device,
534 "from": ( "ns3", "ns3::NistErrorRateModel", "phy" ),
535 "to": ( "ns3", "ns3::YansWifiPhy", "err" ),
536 "init_code": connect_errormodel_phy,
540 "from": ( "ns3", "ns3::CsmaChannel", "devs" ),
541 "to": ( "ns3", "ns3::CsmaNetDevice", "chan" ),
542 "init_code": connect_channel_device,
546 "from": ( "ns3", "ns3::PointToPointChannel", "dev2" ),
547 "to": ( "ns3", "ns3::PointToPointNetDevice", "chan" ),
548 "init_code": connect_channel_device,
552 "from": ( "ns3", "ns3::SimpleChannel", "devs" ),
553 "to": ( "ns3", "ns3::SimpleNetDevice", "chan" ),
554 "init_code": connect_simple_channel_device,
558 "from": ( "ns3", "ns3::SimpleOfdmWimaxChannel", "devs" ),
559 "to": ( "ns3", "ns3::SubscriberStationNetDevice", "chan" ),
560 "init_code": connect_channel_device,
564 "from": ( "ns3", "ns3::SimpleOfdmWimaxChannel", "devs" ),
565 "to": ( "ns3", "ns3::BaseStationNetDevice", "chan" ),
566 "init_code": connect_channel_device,
570 "from": ( "ns3", "ns3::YansWifiChannel", "phys" ),
571 "to": ( "ns3", "ns3::YansWifiPhy", "chan" ),
572 "init_code": connect_simple_channel_device,
576 "from": ( "ns3", "ns3::YansWifiChannel", "phys" ),
577 "to": ( "ns3", "ns3::YansWifiPhy", "chan" ),
578 "init_code": connect_simple_channel_device,
582 "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
583 "to": ( "ns3", "ns3::YansWifiChannel", "loss" ),
584 "init_code": connect_loss_channel,
588 "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
589 "to": ( "ns3", "ns3::LogDistancePropagationLossModel", "next" ),
590 "init_code": connect_next_loss,
594 "from": ( "ns3", "ns3::ConstantSpeedPropagationDelayModel", "chan" ),
595 "to": ( "ns3", "ns3::YansWifiChannel", "delay" ),
596 "init_code": connect_delay_channel,
600 "from": ( "ns3", "ns3::Node", "apps" ),
601 "to": ( "ns3", "ns3::OnOffApplication", "node" ),
602 "init_code": connect_node_application,
606 "from": ( "ns3", "ns3::Node", "apps" ),
607 "to": ( "ns3", "ns3::PacketSink", "node" ),
608 "init_code": connect_node_application,
612 "from": ( "ns3", "ns3::Node", "apps" ),
613 "to": ( "ns3", "ns3::UdpEchoClient", "node" ),
614 "init_code": connect_node_application,
618 "from": ( "ns3", "ns3::Node", "apps" ),
619 "to": ( "ns3", "ns3::UdpEchoServer", "node" ),
620 "init_code": connect_node_application,
624 "from": ( "ns3", "ns3::Node", "apps" ),
625 "to": ( "ns3", "ns3::UdpClient", "node" ),
626 "init_code": connect_node_application,
630 "from": ( "ns3", "ns3::Node", "apps" ),
631 "to": ( "ns3", "ns3::UdpServer", "node" ),
632 "init_code": connect_node_application,
635 "from": ( "ns3", "ns3::Node", "apps" ),
636 "to": ( "ns3", "ns3::V4Ping", "node" ),
637 "init_code": connect_node_application,
641 "from": ( "ns3", "ns3::Node", "protos" ),
642 "to": ( "ns3", "ns3::ArpL3Protocol", "node" ),
643 "init_code": connect_node_other,
647 "from": ( "ns3", "ns3::Node", "protos" ),
648 "to": ( "ns3", "ns3::Icmpv4L4Protocol", "node" ),
649 "init_code": connect_node_other,
653 "from": ( "ns3", "ns3::Node", "protos" ),
654 "to": ( "ns3", "ns3::Icmpv6L4Protocol", "node" ),
655 "init_code": connect_node_other,
659 "from": ( "ns3", "ns3::Node", "protos" ),
660 "to": ( "ns3", "ns3::Ipv4L3Protocol", "node" ),
661 "init_code": connect_node_other,
665 "from": ( "ns3", "ns3::Node", "protos" ),
666 "to": ( "ns3", "ns3::Ipv6L3Protocol", "node" ),
667 "init_code": connect_node_other,
671 "from": ( "ns3", "ns3::Node", "protos" ),
672 "to": ( "ns3", "ns3::UdpL4Protocol", "node" ),
673 "init_code": connect_node_other,
677 "from": ( "ns3", "ns3::Node", "protos" ),
678 "to": ( "ns3", "ns3::TcpL4Protocol", "node" ),
679 "init_code": connect_node_other,
683 "from": ( "ns3", "ns3::Node", "mobility" ),
684 "to": ( "ns3", "ns3::ConstantAccelerationMobilityModel", "node" ),
685 "init_code": connect_node_other,
689 "from": ( "ns3", "ns3::Node", "mobility" ),
690 "to": ( "ns3", "ns3::ConstantPositionMobilityModel", "node" ),
691 "init_code": connect_node_other,
695 "from": ( "ns3", "ns3::Node", "mobility" ),
696 "to": ( "ns3", "ns3::ConstantVelocityMobilityModel", "node" ),
697 "init_code": connect_node_other,
701 "from": ( "ns3", "ns3::Node", "mobility" ),
702 "to": ( "ns3", "ns3::HierarchicalMobilityModel", "node" ),
703 "init_code": connect_node_other,
707 "from": ( "ns3", "ns3::Node", "mobility" ),
708 "to": ( "ns3", "ns3::RandomDirection2dMobilityModel", "node" ),
709 "init_code": connect_node_other,
713 "from": ( "ns3", "ns3::Node", "mobility" ),
714 "to": ( "ns3", "ns3::RandomWalk2dMobilityModel", "node" ),
715 "init_code": connect_node_other,
719 "from": ( "ns3", "ns3::Node", "mobility" ),
720 "to": ( "ns3", "ns3::RandomWaypointMobilityModel", "node" ),
721 "init_code": connect_node_other,
725 "from": ( "ns3", "ns3::Node", "mobility" ),
726 "to": ( "ns3", "ns3::WaypointMobilityModel", "node" ),
727 "init_code": connect_node_other,
731 "from": ( "ns3", "ns3::SubscriberStationNetDevice", "sflows" ),
732 "to": ( "ns3", "ns3::ServiceFlow", "dev" ),
733 "init_code": connect_station_sflow,
737 "from": ( "ns3", "ns3::BaseStationNetDevice", "sflows" ),
738 "to": ( "ns3", "ns3::ServiceFlow", "dev" ),
739 "init_code": connect_station_sflow,
743 "from": ( "ns3", "ns3::BaseStationNetDevice", "uplnk" ),
744 "to": ( "ns3", "ns3::UplinkSchedulerSimple", "dev" ),
745 "init_code": connect_bstation_linksched,
749 "from": ( "ns3", "ns3::BaseStationNetDevice", "uplnk" ),
750 "to": ( "ns3", "ns3::UplinkSchedulerRtps", "dev" ),
751 "init_code": connect_bstation_linksched,
755 "from": ( "ns3", "ns3::BaseStationNetDevice", "dwnlnk" ),
756 "to": ( "ns3", "ns3::BSSchedulerSimple", "dev" ),
757 "init_code": connect_bstation_linksched,
761 "from": ( "ns3", "ns3::BaseStationNetDevice", "dwnlnk" ),
762 "to": ( "ns3", "ns3::BSSchedulerRtps", "dev" ),
763 "init_code": connect_bstation_linksched,
767 "from": ( "ns3", "ns3::IpcsClassifierRecord", "sflow" ),
768 "to": ( "ns3", "ns3::ServiceFlow", "classif" ),
769 "init_code": connect_classifier_sflow,
773 "from": ( "ns3", "ns3::FileDescriptorNetDevice", "->fd" ),
774 "to": ( None, None, "fd->" ),
775 "init_code": connect_fd,
779 "from": ( "ns3", "ns3::Nepi::TunChannel", "fd->" ),
780 "to": ( "ns3", "ns3::FileDescriptorNetDevice", "->fd" ),
781 "init_code": connect_tunchannel_fd,
785 "from": ( "ns3", "ns3::Nepi::TunChannel", "tcp"),
786 "to": (None, None, "tcp"),
787 "init_code": functools.partial(crossconnect_tunchannel_peer_init,"tcp"),
788 "compl_code": functools.partial(crossconnect_tunchannel_peer_compl,"tcp"),
792 "from": ( "ns3", "ns3::Nepi::TunChannel", "udp"),
793 "to": (None, None, "udp"),
794 "init_code": functools.partial(crossconnect_tunchannel_peer_init,"udp"),
795 "compl_code": functools.partial(crossconnect_tunchannel_peer_compl,"udp"),