routing support added for ns3 testbed
[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_tap(tesbed_instance, fd, tap):
65     # TODO!
66     pass
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             "code": connect_node_device,
192             "can_cross": False
193     }),
194     dict({
195             "from": ( "ns3", "ns3::Node", "devs" ),
196             "to":   ( "ns3", "ns3::CsmaNetDevice", "node" ),
197             "code": connect_node_device,
198             "can_cross": False
199     }),
200     dict({
201             "from": ( "ns3", "ns3::Node", "devs" ),
202             "to":   ( "ns3", "ns3::EmuNetDevice", "node" ),
203             "code": connect_node_device,
204             "can_cross": False
205     }),
206     dict({
207             "from": ( "ns3", "ns3::Node", "devs" ),
208             "to":   ( "ns3", "ns3::PointToPointNetDevice", "node" ),
209             "code": connect_node_device,
210             "can_cross": False
211     }),
212     dict({
213             "from": ( "ns3", "ns3::Node", "devs" ),
214             "to":   ( "ns3", "ns3::SimpleNetDevice", "node" ),
215             "code": connect_node_device,
216             "can_cross": False
217     }),
218     dict({
219             "from": ( "ns3", "ns3::Node", "devs" ),
220             "to":   ( "ns3", "ns3::FileDescriptorNetDevice", "node" ),
221             "code": connect_node_device,
222             "can_cross": False
223     }),
224     dict({
225             "from": ( "ns3", "ns3::Node", "devs" ),
226             "to":   ( "ns3", "ns3::WifiNetDevice", "node" ),
227             "code": connect_node_device,   
228             "can_cross": False
229     }),
230     dict({
231             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
232             "to":   ( "ns3", "ns3::CsmaNetDevice", "queue" ),
233             "code": connect_queue_device,
234             "can_cross": False
235     }),
236     dict({
237             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
238             "to":   ( "ns3", "ns3::EmuNetDevice", "queue" ),
239             "code": connect_queue_device,
240             "can_cross": False
241     }),
242     dict({
243             "from": ( "ns3", "ns3::DropTailQueue", "dev" ),
244             "to":   ( "ns3", "ns3::PointToPointNetDevice", "queue" ),
245             "code": connect_queue_device,
246             "can_cross": False
247     }),
248     dict({
249             "from": ( "ns3", "ns3::ArfWifiManager", "dev" ),
250             "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
251             "code": connect_manager_device,
252             "can_cross": False
253     }),
254     dict({
255             "from": ( "ns3", "ns3::ConstantRateWifiManager", "dev" ),
256             "to":   ( "ns3", "ns3::WifiNetDevice", "manager" ),  
257             "code": connect_manager_device,
258             "can_cross": False
259     }),
260     dict({
261             "from": ( "ns3", "ns3::YansWifiPhy", "dev" ),
262             "to":   ( "ns3", "ns3::WifiNetDevice", "phy" ),  
263             "code": connect_phy_device,
264             "can_cross": False
265     }),
266     dict({
267             "from": ( "ns3", "ns3::QapWifiMac", "dev" ),
268             "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
269             "code": connect_mac_device,
270             "can_cross": False
271     }),
272     dict({
273             "from": ( "ns3", "ns3::QstaWifiMac", "dev" ),
274             "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
275             "code": connect_mac_device,
276             "can_cross": False
277     }),
278     dict({
279             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
280             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
281             "code": connect_errormodel_device,
282             "can_cross": False
283     }),
284     dict({
285             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
286             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
287             "code": connect_errormodel_device,
288             "can_cross": False
289     }),
290     dict({
291             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
292             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
293             "code": connect_errormodel_device,
294             "can_cross": False
295     }),
296     dict({
297             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
298             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
299             "code": connect_errormodel_device,
300             "can_cross": False
301     }),
302     dict({
303         "from": ( "ns3", "ns3::NistErrorRateModel", "phy" ),        
304         "to":   ( "ns3", "ns3::YansWifiPhy", "err" ),
305         "code": connect_errormodel_phy,
306         "can_cross": False
307     }),
308     dict({
309         "from": ( "ns3", "ns3::CsmaChannel", "devs" ),
310         "to":   ( "ns3", "ns3::CsmaNetDevice", "chan" ),
311         "code": connect_channel_device,
312         "can_cross": False
313     }),
314     dict({
315         "from": ( "ns3", "ns3::PointToPointChannel", "dev2" ),
316         "to":   ( "ns3", "ns3::PointToPointNetDevice", "chan" ),
317         "code": connect_channel_device,
318         "can_cross": False
319     }),
320     dict({
321         "from": ( "ns3", "ns3::SimpleChannel", "devs" ),
322         "to":   ( "ns3", "ns3::SimpleNetDevice", "chan" ),
323         "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         "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         "code": connect_loss_channel,
336         "can_cross": False
337     }),
338     dict({
339         "from": ( "ns3", "ns3::LogDistancePropagationLossModel", "prev" ),
340         "to":   ( "ns3", "ns3::LogDistancePropagationLossModel", "next" ),  
341         "code": connect_next_loss,
342         "can_cross": False
343     }),
344     dict({
345         "from": ( "ns3", "ns3::ConstantSpeedPropagationDelayModel", "chan" ),
346         "to":   ( "ns3", "ns3::YansWifiChannel", "delay" ),  
347         "code": connect_delay_channel,
348         "can_cross": False
349     }),
350     dict({
351         "from": ( "ns3", "ns3::Node", "apps" ),
352         "to":   ( "ns3", "ns3::OnOffApplication", "node" ),
353         "code": connect_node_application,
354         "can_cross": False
355     }),
356     dict({
357         "from": ( "ns3", "ns3::Node", "apps" ),
358         "to":   ( "ns3", "ns3::PacketSink", "node" ),
359         "code": connect_node_application,
360         "can_cross": False
361     }),
362     dict({
363         "from": ( "ns3", "ns3::Node", "apps" ),
364         "to":   ( "ns3", "ns3::UdpEchoClient", "node" ),
365         "code": connect_node_application,
366         "can_cross": False
367     }),
368     dict({
369         "from": ( "ns3", "ns3::Node", "apps" ),
370         "to":   ( "ns3", "ns3::UdpEchoServer", "node" ),
371         "code": connect_node_application,
372         "can_cross": False
373     }),
374     dict({
375         "from": ( "ns3", "ns3::Node", "apps" ),
376         "to":   ( "ns3", "ns3::V4Ping", "node" ),
377         "code": connect_node_application,
378         "can_cross": False
379     }),
380     dict({
381         "from": ( "ns3", "ns3::Node", "protos" ),
382         "to":   ( "ns3", "ns3::ArpL3Protocol", "node" ),
383         "code": connect_node_other,
384         "can_cross": False
385     }),
386     dict({
387         "from": ( "ns3", "ns3::Node", "protos" ),
388         "to":   ( "ns3", "ns3::Icmpv4L4Protocol", "node" ),
389         "code": connect_node_other,
390         "can_cross": False
391     }),
392     dict({
393         "from": ( "ns3", "ns3::Node", "protos" ),
394         "to":   ( "ns3", "ns3::Ipv4L3Protocol", "node" ),
395         "code": connect_node_other,
396         "can_cross": False
397     }),
398     dict({
399         "from": ( "ns3", "ns3::Node", "protos" ),
400         "to":   ( "ns3", "ns3::UdpL4Protocol", "node" ),
401         "code": connect_node_other,
402         "can_cross": False
403     }),
404     dict({
405         "from": ( "ns3", "ns3::Node", "protos" ),
406         "to":   ( "ns3", "ns3::TcpL4Protocol", "node" ),
407         "code": connect_node_other,
408         "can_cross": False
409     }),
410     dict({
411         "from": ( "ns3", "ns3::Node", "mobility" ),
412         "to":   ( "ns3", "ns3::ConstantAccelerationMobilityModel", "node" ),
413         "code": connect_node_other,
414         "can_cross": False
415     }),
416     dict({
417         "from": ( "ns3", "ns3::Node", "mobility" ),
418         "to":   ( "ns3", "ns3::ConstantPositionMobilityModel", "node" ),
419         "code": connect_node_other,
420         "can_cross": False
421     }),
422     dict({
423         "from": ( "ns3", "ns3::Node", "mobility" ),
424         "to":   ( "ns3", "ns3::ConstantVelocityMobilityModel", "node" ),
425         "code": connect_node_other,
426         "can_cross": False
427     }),
428     dict({
429         "from": ( "ns3", "ns3::Node", "mobility" ),
430         "to":   ( "ns3", "ns3::HierarchicalMobilityModel", "node" ),
431         "code": connect_node_other,
432         "can_cross": False
433     }),
434     dict({
435         "from": ( "ns3", "ns3::Node", "mobility" ),
436         "to":   ( "ns3", "ns3::RandomDirection2dMobilityModel", "node" ),
437         "code": connect_node_other,
438         "can_cross": False
439     }),
440     dict({
441         "from": ( "ns3", "ns3::Node", "mobility" ),
442         "to":   ( "ns3", "ns3::RandomWalk2dMobilityModel", "node" ),
443         "code": connect_node_other,
444         "can_cross": False
445     }),
446     dict({
447         "from": ( "ns3", "ns3::Node", "mobility" ),
448         "to":   ( "ns3", "ns3::RandomWaypointMobilityModel", "node" ),
449         "code": connect_node_other,
450         "can_cross": False
451     }),
452     dict({
453         "from": ( "ns3", "ns3::FileDescriptorNetDevice", "fd" ),
454         "to":   ( "netns", "TapNodeInterface", "fd" ),
455         "code": connect_fd_tap,
456         "can_cross": False
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     "csmapcap_promisc": dict({
466                 "name": "CsmaPromiscPcapTrace",
467                 "help": "Trace to sniff packets from a Csma network device in promiscuous mode"
468               }),
469     "csmapcap": dict({
470                 "name": "CsmaPcapTrace",
471                 "help": "Trace to sniff packets from a Csma network device"
472               }),
473     "fdpcap": dict({
474                 "name": "FileDescriptorPcapTrace",
475                 "help": "Trace to sniff packets from a FileDescriptor network device"
476               }),
477     "yanswifipcap": dict({
478                 "name": "YansWifiPhyPcapTrace",
479                 "help": "Trace to sniff packets from a Wifi network device"
480               }),
481 })
482
483 factories_order = ["ns3::BasicEnergySource",
484     "ns3::WifiRadioEnergyModel",
485     "ns3::BSSchedulerRtps",
486     "ns3::BSSchedulerSimple",
487     "ns3::SubscriberStationNetDevice",
488     "ns3::BaseStationNetDevice",
489     "ns3::UdpTraceClient",
490     "ns3::UdpServer",
491     "ns3::UdpClient",
492     "ns3::FlowMonitor",
493     "ns3::Radvd",
494     "ns3::Ping6",
495     "ns3::flame::FlameProtocol",
496     "ns3::flame::FlameRtable",
497     "ns3::dot11s::AirtimeLinkMetricCalculator",
498     "ns3::dot11s::HwmpProtocol",
499     "ns3::dot11s::HwmpRtable",
500     "ns3::dot11s::PeerManagementProtocol",
501     "ns3::dot11s::PeerLink",
502     "ns3::MeshWifiInterfaceMac",
503     "ns3::MeshPointDevice",
504     "ns3::UanMacRcGw",
505     "ns3::UanMacRc",
506     "ns3::UanPhyCalcSinrDual",
507     "ns3::UanPhyPerGenDefault",
508     "ns3::UanPhyDual",
509     "ns3::UanPropModelThorp",
510     "ns3::UanMacCw",
511     "ns3::UanNoiseModelDefault",
512     "ns3::UanMacAloha",
513     "ns3::UanPropModelIdeal",
514     "ns3::UanTransducerHd",
515     "ns3::UanPhyCalcSinrDefault",
516     "ns3::UanPhyGen",
517     "ns3::UanPhyCalcSinrFhFsk",
518     "ns3::UanPhyPerUmodem",
519     "ns3::UanChannel",
520     "ns3::V4Ping",
521     "ns3::AthstatsWifiTraceSink",
522     "ns3::FlameStack",
523     "ns3::Dot11sStack",
524     "ns3::NonCommunicatingNetDevice",
525     "ns3::HalfDuplexIdealPhy",
526     "ns3::AlohaNoackNetDevice",
527     "ns3::SpectrumAnalyzer",
528     "ns3::WaveformGenerator",
529     "ns3::MultiModelSpectrumChannel",
530     "ns3::SingleModelSpectrumChannel",
531     "ns3::MsduStandardAggregator",
532     "ns3::EdcaTxopN",
533     "ns3::QstaWifiMac",
534     "ns3::QapWifiMac",
535     "ns3::QadhocWifiMac",
536     "ns3::MinstrelWifiManager",
537     "ns3::CaraWifiManager",
538     "ns3::AarfcdWifiManager",
539     "ns3::OnoeWifiManager",
540     "ns3::AmrrWifiManager",
541     "ns3::ConstantRateWifiManager",
542     "ns3::IdealWifiManager",
543     "ns3::AarfWifiManager",
544     "ns3::ArfWifiManager",
545     "ns3::WifiNetDevice",
546     "ns3::NqstaWifiMac",
547     "ns3::NqapWifiMac",
548     "ns3::AdhocWifiMac",
549     "ns3::DcaTxop",
550     "ns3::WifiMacQueue",
551     "ns3::YansWifiChannel",
552     "ns3::YansWifiPhy",
553     "ns3::NistErrorRateModel",
554     "ns3::YansErrorRateModel",
555     "ns3::WaypointMobilityModel",
556     "ns3::ConstantAccelerationMobilityModel",
557     "ns3::RandomDirection2dMobilityModel",
558     "ns3::RandomWalk2dMobilityModel",
559     "ns3::SteadyStateRandomWaypointMobilityModel",
560     "ns3::RandomWaypointMobilityModel",
561     "ns3::GaussMarkovMobilityModel",
562     "ns3::ConstantVelocityMobilityModel",
563     "ns3::ConstantPositionMobilityModel",
564     "ns3::ListPositionAllocator",
565     "ns3::GridPositionAllocator",
566     "ns3::RandomRectanglePositionAllocator",
567     "ns3::RandomBoxPositionAllocator",
568     "ns3::RandomDiscPositionAllocator",
569     "ns3::UniformDiscPositionAllocator",
570     "ns3::HierarchicalMobilityModel",
571     "ns3::aodv::RoutingProtocol",
572     "ns3::UdpEchoServer",
573     "ns3::UdpEchoClient",
574     "ns3::PacketSink",
575     "ns3::OnOffApplication",
576     "ns3::VirtualNetDevice",
577     "ns3::FileDescriptorNetDevice",
578     "ns3::TapBridge",
579     "ns3::BridgeChannel",
580     "ns3::BridgeNetDevice",
581     "ns3::EmuNetDevice",
582     "ns3::CsmaChannel",
583     "ns3::CsmaNetDevice",
584     "ns3::PointToPointRemoteChannel",
585     "ns3::PointToPointChannel",
586     "ns3::PointToPointNetDevice",
587     "ns3::NscTcpL4Protocol",
588     "ns3::Icmpv6L4Protocol",
589     "ns3::Ipv6OptionPad1",
590     "ns3::Ipv6OptionPadn",
591     "ns3::Ipv6OptionJumbogram",
592     "ns3::Ipv6OptionRouterAlert",
593     "ns3::Ipv6ExtensionHopByHop",
594     "ns3::Ipv6ExtensionDestination",
595     "ns3::Ipv6ExtensionFragment",
596     "ns3::Ipv6ExtensionRouting",
597     "ns3::Ipv6ExtensionLooseRouting",
598     "ns3::Ipv6ExtensionESP",
599     "ns3::Ipv6ExtensionAH",
600     "ns3::Ipv6L3Protocol",
601     "ns3::LoopbackNetDevice",
602     "ns3::Icmpv4L4Protocol",
603     "ns3::RttMeanDeviation",
604     "ns3::ArpL3Protocol",
605     "ns3::TcpL4Protocol",
606     "ns3::UdpL4Protocol",
607     "ns3::Ipv4L3Protocol",
608     "ns3::SimpleNetDevice",
609     "ns3::SimpleChannel",
610     "ns3::PacketSocket",
611     "ns3::DropTailQueue",
612     "ns3::Node",
613     "ns3::FriisSpectrumPropagationLossModel",
614     "ns3::Cost231PropagationLossModel",
615     "ns3::JakesPropagationLossModel",
616     "ns3::RandomPropagationLossModel",
617     "ns3::FriisPropagationLossModel",
618     "ns3::TwoRayGroundPropagationLossModel",
619     "ns3::LogDistancePropagationLossModel",
620     "ns3::ThreeLogDistancePropagationLossModel",
621     "ns3::NakagamiPropagationLossModel",
622     "ns3::FixedRssLossModel",
623     "ns3::MatrixPropagationLossModel",
624     "ns3::RangePropagationLossModel",
625     "ns3::RandomPropagationDelayModel",
626     "ns3::ConstantSpeedPropagationDelayModel",
627     "ns3::RateErrorModel",
628     "ns3::ListErrorModel",
629     "ns3::ReceiveListErrorModel",
630     "ns3::PacketBurst",
631     "ns3::EnergySourceContainer"
632  ]
633
634 testbed_attributes = dict({
635         "ns3_bindings": dict({
636                 "name": "ns3Bindings",
637                 "help": "Location of the ns-3 python binding",
638                 "type": Attribute.STRING,
639                 "flags": Attribute.DesignOnly,
640                 "validation_function": validation.is_string # TODO: validation.is_path
641             }),
642          "ns3_library": dict({
643                 "name": "ns3Library",
644                 "help": "Location of the ns-3 library .so file",
645                 "type": Attribute.STRING,
646                 "flags": Attribute.DesignOnly,
647                 "validation_function": validation.is_string # TODO: validation.is_path
648             }),
649          "simu_impl_type": dict({
650                 "name": "SimulatorImplementationType",
651                 "help": "The object class to use as the simulator implementation",
652                 "type": Attribute.STRING,
653                 "flags": Attribute.DesignOnly,
654                 "validation_function": validation.is_string
655             }),
656           "checksum": dict({
657                 "name": "ChecksumEnabled",
658                 "help": "A global switch to enable all checksums for all protocols",
659                 "type": Attribute.BOOL,
660                 "value": False,
661                 "flags": Attribute.DesignOnly,
662                 "validation_function": validation.is_bool
663             }),
664           "home_directory": dict({
665                 "name": "homeDirectory",
666                 "help": "Path to the directory where traces and other files \
667                         will be stored",
668                 "type": Attribute.STRING,
669                 "value": "",
670                 "flags": Attribute.DesignOnly,
671                 "validation_function": validation.is_string
672             })
673 })
674
675 class VersionedMetadataInfo(metadata.VersionedMetadataInfo):
676     @property
677     def connector_types(self):
678         return connector_types
679
680     @property
681     def connections(self):
682         return connections
683
684     @property
685     def attributes(self):
686         from attributes_metadata_v3_9_RC3 import attributes
687         return attributes
688
689     @property
690     def traces(self):
691         return traces
692
693     @property
694     def create_order(self):
695         return factories_order
696
697     @property
698     def configure_order(self):
699         return factories_order
700
701     @property
702     def factories_info(self):
703         from factories_metadata_v3_9_RC3 import factories_info
704         return factories_info
705
706     @property
707     def testbed_attributes(self):
708         return testbed_attributes
709