More changes to make cross connections work... not working still
[nepi.git] / src / nepi / testbeds / ns3 / metadata_v3_9_RC3.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 from constants import TESTBED_ID
5 from nepi.core import metadata
6 from nepi.core.attributes import Attribute
7 from nepi.util import validation
8
9 ### Connection functions ####
10
11 def connect_node_device(testbed_instance, node, device):
12     node.AddDevice(device)
13
14 def connect_queue_device(testbed_instance, queue, device):
15     device.SetQueue(queue)
16
17 def connect_manager_device(testbed_instance, manager, device):
18     device.SetRemoteStationManager(manager)
19
20 def connect_phy_device(testbed_instance, phy, device):
21     device.SetPhy(phy)
22     phy.SetDevice(device)
23     # search for the node asociated with the device
24     node_guid = testbed_instance.get_connected(guid, "node", "devs")
25     if len(node_guid) == 0:
26         raise RuntimeError("Can't instantiate interface %d outside netns \
27                 node" % guid)
28     node = testbed_instance.elements[node_guid[0]]
29     phy.SetMobility(node)
30
31 def connect_mac_device(testbed_instance, mac, device):
32     device.SetMac(mac)
33
34 def connect_errormodel_device(testbed_instance, model, device):
35     device.SetReceiveErrorModel(model)
36
37 def connect_errormodel_phy(testbed_instance, err, phy):
38     phy.SetErrorRateModel(err)
39
40 def connect_channel_device(testbed_instance, channel, device):
41     device.Attach(channel)
42
43 def connect_simple_channel_device(testbed_instance, channel, device):
44     device.SetChannel(channel)
45
46 def connect_loss_channel(testbed_instance, loss, channel):
47     channel.SetPropagationLossModel(loss)
48
49 def connect_next_loss(testbed_instance, prev, next):
50     prev.SetNext(next)
51
52 def connect_delay_channel(testbed_instance, delay, channel):
53     channel.SetPropagationDelayModel(delay)
54
55 def connect_node_application(testbed_instance, node, application):
56     node.AddApplication(application)
57 # works for ArpL3Protocol, Ipv4L3Protocol, UdpL4Protocol, TcpL4Protocol,
58 # NscTcpL4Protocol, MobilityModel (every subclass), 
59 # RoutingProtocol (every subclass)
60
61 def connect_node_other(tesbed_instance, node, other):
62     node.AggregateObject(other)
63
64 def connect_fd(testbed_instance, fdnd, cross_data):
65     address = fdnd.socket_address
66     fdnd.set_attribute_value("LinuxSocketAddress", address)
67
68 ### Connector information ###
69
70 connector_types = dict({
71     "node": dict({
72                 "help": "Connector to a ns3::Node object (mandatory)",
73                 "name": "node",
74                 "max": 1,
75                 "min": 1
76             }),
77     "devs": dict({
78                 "help": "Connector to network interfaces",
79                 "name": "devs",
80                 "max": -1,
81                 "min": 0
82             }),
83     "dev2": dict({
84                 "help": "Connector to exactly two network interfaces (mandatory)",
85                 "name": "dev2",
86                 "max": 2,
87                 "min": 2
88             }),
89     "dev": dict({
90                 "help": "Connector to exactly one network interface (mandatory)",
91                 "name": "dev",
92                 "max": 1,
93                 "min": 1
94             }),
95     "apps": dict({
96                 "help": "Connector to applications", 
97                 "name": "apps",
98                 "max": -1,
99                 "min": 0
100             }),
101     "protos": dict({
102                 "help": "Connector to network stacks and protocols", 
103                 "name": "protos",
104                 "max": -1,
105                 "min": 0
106             }),
107     "chan": dict({
108                 "help": "Connector to a channel for the device (mandatory)", 
109                 "name": "chan",
110                 "max": 1,
111                 "min": 1
112             }),
113     "queue": dict({
114                 "help": "Connector to a queueing discipline (mandatory)", 
115                 "name": "queue",
116                 "max": 1,
117                 "min": 1
118             }),
119     "err": dict({
120                 "help": "Connector to an error model for the device", 
121                 "name": "err",
122                 "max": 1,
123                 "min": 0
124             }),
125     "fd": dict({
126                 "help": "Connector to interconnect devices with file descriptors",
127                 "name": "fd",
128                 "max": 1,
129                 "min": 0
130             }),
131     "phy": dict({
132                 "help": "Connector to interconnect elements with a PHY wifi model", 
133                 "name": "phy",
134                 "max": 1,
135                 "min": 0
136             }),
137     "phys": dict({
138                 "help": "Connector to interconnect a wifi channel with PHY wifi models", 
139                 "name": "phys",
140                 "max": -1,
141                 "min": 0
142             }),
143     "mac": dict({
144                 "help": "Connector to interconnect a device with a MAC wifi model", 
145                 "name": "mac",
146                 "max": 1,
147                 "min": 0
148             }),
149     "manager": dict({
150                 "help": "Connector to interconnect a wifi device with a wifi manager", 
151                 "name": "manager",
152                 "max": 1,
153                 "min": 0
154             }),
155     "delay": dict({
156                 "help": "Connector to a delay model", 
157                 "name": "delay",
158                 "max": 1,
159                 "min": 0
160             }),
161     "loss": dict({
162                 "help": "Connector to a loss model", 
163                 "name": "loss",
164                 "max": 1,
165                 "min": 0
166             }),
167     "prev": dict({
168                 "help": "Connector to the previous loss model", 
169                 "name": "prev",
170                 "max": 1,
171                 "min": 0
172             }),
173     "next": dict({
174                 "help": "Connector to the next loss model", 
175                 "name": "next",
176                 "max": 1,
177                 "min": 0
178             }),
179     "mobility": dict({
180                 "help": "Connector to a mobility model for the node", 
181                 "name": "mobility",
182                 "max": 1,
183                 "min": 0
184             }),
185     })
186
187 connections = [
188     dict({
189             "from": ( "ns3", "ns3::Node", "devs" ),
190             "to":   ( "ns3", "ns3::BridgeNetDevice", "node" ),
191             "init_code": connect_node_device,
192             "can_cross": False
193     }),
194     dict({
195             "from": ( "ns3", "ns3::Node", "devs" ),
196             "to":   ( "ns3", "ns3::CsmaNetDevice", "node" ),
197             "init_code": connect_node_device,
198             "can_cross": False
199     }),
200     dict({
201             "from": ( "ns3", "ns3::Node", "devs" ),
202             "to":   ( "ns3", "ns3::EmuNetDevice", "node" ),
203             "init_code": connect_node_device,
204             "can_cross": False
205     }),
206     dict({
207             "from": ( "ns3", "ns3::Node", "devs" ),
208             "to":   ( "ns3", "ns3::PointToPointNetDevice", "node" ),
209             "init_code": connect_node_device,
210             "can_cross": False
211     }),
212     dict({
213             "from": ( "ns3", "ns3::Node", "devs" ),
214             "to":   ( "ns3", "ns3::SimpleNetDevice", "node" ),
215             "init_code": connect_node_device,
216             "can_cross": False
217     }),
218     dict({
219             "from": ( "ns3", "ns3::Node", "devs" ),
220             "to":   ( "ns3", "ns3::FileDescriptorNetDevice", "node" ),
221             "init_code": connect_node_device,
222             "can_cross": False
223     }),
224     dict({
225             "from": ( "ns3", "ns3::Node", "devs" ),
226             "to":   ( "ns3", "ns3::WifiNetDevice", "node" ),
227             "init_code": connect_node_device,   
228             "can_cross": False
229     }),
230     dict({
231             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
232             "to":   ( "ns3", "ns3::CsmaNetDevice", "queue" ),
233             "init_code": connect_queue_device,
234             "can_cross": False
235     }),
236     dict({
237             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
238             "to":   ( "ns3", "ns3::EmuNetDevice", "queue" ),
239             "init_code": connect_queue_device,
240             "can_cross": False
241     }),
242     dict({
243             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
244             "to":   ( "ns3", "ns3::PointToPointNetDevice", "queue" ),
245             "init_code": connect_queue_device,
246             "can_cross": False
247     }),
248     dict({
249             "from": ( "ns3", "ns3::ArfWifiManager", "dev" ),
250             "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
251             "init_code": connect_manager_device,
252             "can_cross": False
253     }),
254     dict({
255             "from": ( "ns3", "ns3::ConstantRateWifiManager", "dev" ),
256             "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
257             "init_code": connect_manager_device,
258             "can_cross": False
259     }),
260     dict({
261             "from": ( "ns3", "ns3::YansWifiPhy", "dev" ),
262             "to":   ( "ns3", "ns3::WifiNetDevice", "phy" ),  
263             "init_code": connect_phy_device,
264             "can_cross": False
265     }),
266     dict({
267             "from": ( "ns3", "ns3::QapWifiMac", "dev" ),
268             "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
269             "init_code": connect_mac_device,
270             "can_cross": False
271     }),
272     dict({
273             "from": ( "ns3", "ns3::QstaWifiMac", "dev" ),
274             "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
275             "init_code": connect_mac_device,
276             "can_cross": False
277     }),
278     dict({
279             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
280             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
281             "init_code": connect_errormodel_device,
282             "can_cross": False
283     }),
284     dict({
285             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
286             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
287             "init_code": connect_errormodel_device,
288             "can_cross": False
289     }),
290     dict({
291             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
292             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
293             "init_code": connect_errormodel_device,
294             "can_cross": False
295     }),
296     dict({
297             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
298             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
299             "init_code": connect_errormodel_device,
300             "can_cross": False
301     }),
302     dict({
303         "from": ( "ns3", "ns3::NistErrorRateModel", "phy" ),        
304         "to":   ( "ns3", "ns3::YansWifiPhy", "err" ),
305         "init_code": connect_errormodel_phy,
306         "can_cross": False
307     }),
308     dict({
309         "from": ( "ns3", "ns3::CsmaChannel", "devs" ),
310         "to":   ( "ns3", "ns3::CsmaNetDevice", "chan" ),
311         "init_code": connect_channel_device,
312         "can_cross": False
313     }),
314     dict({
315         "from": ( "ns3", "ns3::PointToPointChannel", "dev2" ),
316         "to":   ( "ns3", "ns3::PointToPointNetDevice", "chan" ),
317         "init_code": connect_channel_device,
318         "can_cross": False
319     }),
320     dict({
321         "from": ( "ns3", "ns3::SimpleChannel", "devs" ),
322         "to":   ( "ns3", "ns3::SimpleNetDevice", "chan" ),
323         "init_code": connect_simple_channel_device,
324         "can_cross": False
325     }),
326     dict({
327         "from": ( "ns3", "ns3::YansWifiChannel", "phys" ),
328         "to":   ( "ns3", "ns3::YansWifiPhy", "chan" ),  
329         "init_code": connect_simple_channel_device,
330         "can_cross": False
331     }),
332     dict({
333         "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
334         "to":   ( "ns3", "ns3::YansWifiChannel", "loss" ),  
335         "init_code": connect_loss_channel,
336         "can_cross": False
337     }),
338     dict({
339         "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
340         "to":   ( "ns3", "ns3::LogDistancePropagationLossModel", "next" ),  
341         "init_code": connect_next_loss,
342         "can_cross": False
343     }),
344     dict({
345         "from": ( "ns3", "ns3::ConstantSpeedPropagationDelayModel", "chan" ),
346         "to":   ( "ns3", "ns3::YansWifiChannel", "delay" ),  
347         "init_code": connect_delay_channel,
348         "can_cross": False
349     }),
350     dict({
351         "from": ( "ns3", "ns3::Node", "apps" ),
352         "to":   ( "ns3", "ns3::OnOffApplication", "node" ),
353         "init_code": connect_node_application,
354         "can_cross": False
355     }),
356     dict({
357         "from": ( "ns3", "ns3::Node", "apps" ),
358         "to":   ( "ns3", "ns3::PacketSink", "node" ),
359         "init_code": connect_node_application,
360         "can_cross": False
361     }),
362     dict({
363         "from": ( "ns3", "ns3::Node", "apps" ),
364         "to":   ( "ns3", "ns3::UdpEchoClient", "node" ),
365         "init_code": connect_node_application,
366         "can_cross": False
367     }),
368     dict({
369         "from": ( "ns3", "ns3::Node", "apps" ),
370         "to":   ( "ns3", "ns3::UdpEchoServer", "node" ),
371         "init_code": connect_node_application,
372         "can_cross": False
373     }),
374     dict({
375         "from": ( "ns3", "ns3::Node", "apps" ),
376         "to":   ( "ns3", "ns3::V4Ping", "node" ),
377         "init_code": connect_node_application,
378         "can_cross": False
379     }),
380     dict({
381         "from": ( "ns3", "ns3::Node", "protos" ),
382         "to":   ( "ns3", "ns3::ArpL3Protocol", "node" ),
383         "init_code": connect_node_other,
384         "can_cross": False
385     }),
386     dict({
387         "from": ( "ns3", "ns3::Node", "protos" ),
388         "to":   ( "ns3", "ns3::Icmpv4L4Protocol", "node" ),
389         "init_code": connect_node_other,
390         "can_cross": False
391     }),
392     dict({
393         "from": ( "ns3", "ns3::Node", "protos" ),
394         "to":   ( "ns3", "ns3::Ipv4L3Protocol", "node" ),
395         "init_code": connect_node_other,
396         "can_cross": False
397     }),
398     dict({
399         "from": ( "ns3", "ns3::Node", "protos" ),
400         "to":   ( "ns3", "ns3::UdpL4Protocol", "node" ),
401         "init_code": connect_node_other,
402         "can_cross": False
403     }),
404     dict({
405         "from": ( "ns3", "ns3::Node", "protos" ),
406         "to":   ( "ns3", "ns3::TcpL4Protocol", "node" ),
407         "init_code": connect_node_other,
408         "can_cross": False
409     }),
410     dict({
411         "from": ( "ns3", "ns3::Node", "mobility" ),
412         "to":   ( "ns3", "ns3::ConstantAccelerationMobilityModel", "node" ),
413         "init_code": connect_node_other,
414         "can_cross": False
415     }),
416     dict({
417         "from": ( "ns3", "ns3::Node", "mobility" ),
418         "to":   ( "ns3", "ns3::ConstantPositionMobilityModel", "node" ),
419         "init_code": connect_node_other,
420         "can_cross": False
421     }),
422     dict({
423         "from": ( "ns3", "ns3::Node", "mobility" ),
424         "to":   ( "ns3", "ns3::ConstantVelocityMobilityModel", "node" ),
425         "init_code": connect_node_other,
426         "can_cross": False
427     }),
428     dict({
429         "from": ( "ns3", "ns3::Node", "mobility" ),
430         "to":   ( "ns3", "ns3::HierarchicalMobilityModel", "node" ),
431         "init_code": connect_node_other,
432         "can_cross": False
433     }),
434     dict({
435         "from": ( "ns3", "ns3::Node", "mobility" ),
436         "to":   ( "ns3", "ns3::RandomDirection2dMobilityModel", "node" ),
437         "init_code": connect_node_other,
438         "can_cross": False
439     }),
440     dict({
441         "from": ( "ns3", "ns3::Node", "mobility" ),
442         "to":   ( "ns3", "ns3::RandomWalk2dMobilityModel", "node" ),
443         "init_code": connect_node_other,
444         "can_cross": False
445     }),
446     dict({
447         "from": ( "ns3", "ns3::Node", "mobility" ),
448         "to":   ( "ns3", "ns3::RandomWaypointMobilityModel", "node" ),
449         "init_code": connect_node_other,
450         "can_cross": False
451     }),
452     dict({
453         "from": ( "ns3", "ns3::FileDescriptorNetDevice", "fd" ),
454         "to":   ( "netns", "TapNodeInterface", "fd" ),
455         "init_code": connect_fd,
456         "can_cross": True
457     }),
458 ]
459
460 traces = dict({
461     "p2ppcap": dict({
462                 "name": "P2PPcapTrace",
463                 "help": "Trace to sniff packets from a P2P network device"
464               }),
465     "p2pascii": dict({
466                 "name": "P2PAsciiTrace",
467                 "help": "Ascii trace from a P2P network device"
468               }),
469     "csmapcap_promisc": dict({
470                 "name": "CsmaPromiscPcapTrace",
471                 "help": "Trace to sniff packets from a Csma network device in promiscuous mode"
472               }),
473     "csmapcap": dict({
474                 "name": "CsmaPcapTrace",
475                 "help": "Trace to sniff packets from a Csma network device"
476               }),
477     "fdpcap": dict({
478                 "name": "FileDescriptorPcapTrace",
479                 "help": "Trace to sniff packets from a FileDescriptor network device"
480               }),
481     "yanswifipcap": dict({
482                 "name": "YansWifiPhyPcapTrace",
483                 "help": "Trace to sniff packets from a Wifi network device"
484               }),
485 })
486
487 factories_order = ["ns3::BasicEnergySource",
488     "ns3::WifiRadioEnergyModel",
489     "ns3::BSSchedulerRtps",
490     "ns3::BSSchedulerSimple",
491     "ns3::SubscriberStationNetDevice",
492     "ns3::BaseStationNetDevice",
493     "ns3::UdpTraceClient",
494     "ns3::UdpServer",
495     "ns3::UdpClient",
496     "ns3::FlowMonitor",
497     "ns3::Radvd",
498     "ns3::Ping6",
499     "ns3::flame::FlameProtocol",
500     "ns3::flame::FlameRtable",
501     "ns3::dot11s::AirtimeLinkMetricCalculator",
502     "ns3::dot11s::HwmpProtocol",
503     "ns3::dot11s::HwmpRtable",
504     "ns3::dot11s::PeerManagementProtocol",
505     "ns3::dot11s::PeerLink",
506     "ns3::MeshWifiInterfaceMac",
507     "ns3::MeshPointDevice",
508     "ns3::UanMacRcGw",
509     "ns3::UanMacRc",
510     "ns3::UanPhyCalcSinrDual",
511     "ns3::UanPhyPerGenDefault",
512     "ns3::UanPhyDual",
513     "ns3::UanPropModelThorp",
514     "ns3::UanMacCw",
515     "ns3::UanNoiseModelDefault",
516     "ns3::UanMacAloha",
517     "ns3::UanPropModelIdeal",
518     "ns3::UanTransducerHd",
519     "ns3::UanPhyCalcSinrDefault",
520     "ns3::UanPhyGen",
521     "ns3::UanPhyCalcSinrFhFsk",
522     "ns3::UanPhyPerUmodem",
523     "ns3::UanChannel",
524     "ns3::V4Ping",
525     "ns3::AthstatsWifiTraceSink",
526     "ns3::FlameStack",
527     "ns3::Dot11sStack",
528     "ns3::NonCommunicatingNetDevice",
529     "ns3::HalfDuplexIdealPhy",
530     "ns3::AlohaNoackNetDevice",
531     "ns3::SpectrumAnalyzer",
532     "ns3::WaveformGenerator",
533     "ns3::MultiModelSpectrumChannel",
534     "ns3::SingleModelSpectrumChannel",
535     "ns3::MsduStandardAggregator",
536     "ns3::EdcaTxopN",
537     "ns3::QstaWifiMac",
538     "ns3::QapWifiMac",
539     "ns3::QadhocWifiMac",
540     "ns3::MinstrelWifiManager",
541     "ns3::CaraWifiManager",
542     "ns3::AarfcdWifiManager",
543     "ns3::OnoeWifiManager",
544     "ns3::AmrrWifiManager",
545     "ns3::ConstantRateWifiManager",
546     "ns3::IdealWifiManager",
547     "ns3::AarfWifiManager",
548     "ns3::ArfWifiManager",
549     "ns3::WifiNetDevice",
550     "ns3::NqstaWifiMac",
551     "ns3::NqapWifiMac",
552     "ns3::AdhocWifiMac",
553     "ns3::DcaTxop",
554     "ns3::WifiMacQueue",
555     "ns3::YansWifiChannel",
556     "ns3::YansWifiPhy",
557     "ns3::NistErrorRateModel",
558     "ns3::YansErrorRateModel",
559     "ns3::WaypointMobilityModel",
560     "ns3::ConstantAccelerationMobilityModel",
561     "ns3::RandomDirection2dMobilityModel",
562     "ns3::RandomWalk2dMobilityModel",
563     "ns3::SteadyStateRandomWaypointMobilityModel",
564     "ns3::RandomWaypointMobilityModel",
565     "ns3::GaussMarkovMobilityModel",
566     "ns3::ConstantVelocityMobilityModel",
567     "ns3::ConstantPositionMobilityModel",
568     "ns3::ListPositionAllocator",
569     "ns3::GridPositionAllocator",
570     "ns3::RandomRectanglePositionAllocator",
571     "ns3::RandomBoxPositionAllocator",
572     "ns3::RandomDiscPositionAllocator",
573     "ns3::UniformDiscPositionAllocator",
574     "ns3::HierarchicalMobilityModel",
575     "ns3::aodv::RoutingProtocol",
576     "ns3::UdpEchoServer",
577     "ns3::UdpEchoClient",
578     "ns3::PacketSink",
579     "ns3::OnOffApplication",
580     "ns3::VirtualNetDevice",
581     "ns3::FileDescriptorNetDevice",
582     "ns3::TapBridge",
583     "ns3::BridgeChannel",
584     "ns3::BridgeNetDevice",
585     "ns3::EmuNetDevice",
586     "ns3::CsmaChannel",
587     "ns3::CsmaNetDevice",
588     "ns3::PointToPointRemoteChannel",
589     "ns3::PointToPointChannel",
590     "ns3::PointToPointNetDevice",
591     "ns3::NscTcpL4Protocol",
592     "ns3::Icmpv6L4Protocol",
593     "ns3::Ipv6OptionPad1",
594     "ns3::Ipv6OptionPadn",
595     "ns3::Ipv6OptionJumbogram",
596     "ns3::Ipv6OptionRouterAlert",
597     "ns3::Ipv6ExtensionHopByHop",
598     "ns3::Ipv6ExtensionDestination",
599     "ns3::Ipv6ExtensionFragment",
600     "ns3::Ipv6ExtensionRouting",
601     "ns3::Ipv6ExtensionLooseRouting",
602     "ns3::Ipv6ExtensionESP",
603     "ns3::Ipv6ExtensionAH",
604     "ns3::Ipv6L3Protocol",
605     "ns3::LoopbackNetDevice",
606     "ns3::Icmpv4L4Protocol",
607     "ns3::RttMeanDeviation",
608     "ns3::ArpL3Protocol",
609     "ns3::TcpL4Protocol",
610     "ns3::UdpL4Protocol",
611     "ns3::Ipv4L3Protocol",
612     "ns3::SimpleNetDevice",
613     "ns3::SimpleChannel",
614     "ns3::PacketSocket",
615     "ns3::DropTailQueue",
616     "ns3::Node",
617     "ns3::FriisSpectrumPropagationLossModel",
618     "ns3::Cost231PropagationLossModel",
619     "ns3::JakesPropagationLossModel",
620     "ns3::RandomPropagationLossModel",
621     "ns3::FriisPropagationLossModel",
622     "ns3::TwoRayGroundPropagationLossModel",
623     "ns3::LogDistancePropagationLossModel",
624     "ns3::ThreeLogDistancePropagationLossModel",
625     "ns3::NakagamiPropagationLossModel",
626     "ns3::FixedRssLossModel",
627     "ns3::MatrixPropagationLossModel",
628     "ns3::RangePropagationLossModel",
629     "ns3::RandomPropagationDelayModel",
630     "ns3::ConstantSpeedPropagationDelayModel",
631     "ns3::RateErrorModel",
632     "ns3::ListErrorModel",
633     "ns3::ReceiveListErrorModel",
634     "ns3::PacketBurst",
635     "ns3::EnergySourceContainer"
636  ]
637
638 testbed_attributes = dict({
639      "simu_impl_type": dict({
640             "name": "SimulatorImplementationType",
641             "help": "The object class to use as the simulator implementation",
642             "type": Attribute.STRING,
643             "flags": Attribute.DesignOnly,
644             "validation_function": validation.is_string
645         }),
646       "checksum": dict({
647             "name": "ChecksumEnabled",
648             "help": "A global switch to enable all checksums for all protocols",
649             "type": Attribute.BOOL,
650             "value": False,
651             "flags": Attribute.DesignOnly,
652             "validation_function": validation.is_bool
653         }),
654 })
655
656 class VersionedMetadataInfo(metadata.VersionedMetadataInfo):
657     @property
658     def connector_types(self):
659         return connector_types
660
661     @property
662     def connections(self):
663         return connections
664
665     @property
666     def attributes(self):
667         from attributes_metadata_v3_9_RC3 import attributes
668         return attributes
669
670     @property
671     def traces(self):
672         return traces
673
674     @property
675     def create_order(self):
676         return factories_order
677
678     @property
679     def configure_order(self):
680         return factories_order
681
682     @property
683     def factories_info(self):
684         from factories_metadata_v3_9_RC3 import factories_info
685         return factories_info
686
687     @property
688     def testbed_attributes(self):
689         return testbed_attributes
690