Adding support for "ns3::MatrixPropagationLossModel" ... not yet working.
[nepi.git] / src / nepi / testbeds / ns3 / connection_metadata.py
index 6d14a26..865e4f8 100644 (file)
@@ -1,4 +1,3 @@
-#!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
 from constants import TESTBED_ID
@@ -48,12 +47,12 @@ def connect_mac_device(testbed_instance, mac_guid, device_guid):
     device = testbed_instance._elements[device_guid]
     device.SetMac(mac)
 
-def connect_errormodel_device(testbed_instance, model_guid, device_guid):
+def connect_error_model_device(testbed_instance, model_guid, device_guid):
     model = testbed_instance._elements[model_guid]
     device = testbed_instance._elements[device_guid]
     device.SetReceiveErrorModel(model)
 
-def connect_errormodel_phy(testbed_instance, err_guid, phy_guid):
+def connect_error_model_phy(testbed_instance, err_guid, phy_guid):
     err = testbed_instance._elements[err_guid]
     phy = testbed_instance._elements[phy_guid]
     phy.SetErrorRateModel(err)
@@ -96,10 +95,15 @@ def connect_node_other(testbed_instance, node_guid, other_guid):
     other = testbed_instance._elements[other_guid]
     node.AggregateObject(other)
 
-def connect_station_sflow(testbed_instance, station_guid, sflow_guid):
-    station = testbed_instance._elements[station_guid]
+def connect_ss_sflow(testbed_instance, station_guid, sflow_guid):
+    ss = testbed_instance._elements[station_guid]
     sflow = testbed_instance._elements[sflow_guid]
-    station.AddServiceFlow(sflow)
+    ss.AddServiceFlow(sflow)
+
+#def connect_bs_sflow(testbed_instance, station_guid, sflow_guid):
+#    bs = testbed_instance._elements[station_guid]
+#    sflow = testbed_instance._elements[sflow_guid]
+#    bs.GetServiceFlowManager().AddServiceFlow (sflow)
 
 def connect_bstation_linksched(testbed_instance, bstation_guid, linksched_guid):
     bstation = testbed_instance._elements[bstation_guid]
@@ -113,48 +117,39 @@ def connect_classifier_sflow(testbed_instance, classifier_guid, sflow_guid):
     sflow.SetConvergenceSublayerParam (csparam); 
 
 def connect_fd(testbed_instance, fdnd_guid, cross_data):
-    fdnd = testbed_instance._elements[fdnd_guid]
-    endpoint = fdnd.GetEndpoint()
-    # XXX: check the method StringToBuffer of ns3::FdNetDevice
-    # to see how the address should be decoded
-    address = endpoint.replace(":", "").decode('hex')[2:]
-    testbed_instance.set(fdnd_guid, "LinuxSocketAddress", address)
-    
-    # If it's a non-abstract socket, add the path
-    if not address.startswith('\x00'):
-        address = os.path.join( testbed_instance.root_directory, address )
+    def recvfd(sock, fdnd):
+        (fd, msg) = passfd.recvfd(sock)
+        # Store a reference to the endpoint to keep the socket alive
+        fdnd.SetFileDescriptor(fd)
     
+    import threading
+    import passfd
+    import socket
+    sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
+    sock.bind("")
+    address = sock.getsockname()
     # Set tun standard contract attributes
-    testbed_instance.set(fdnd_guid, "tun_addr", address )
+    testbed_instance.set(fdnd_guid, "tun_addr", address)
     testbed_instance.set(fdnd_guid, "tun_proto", "fd")
     testbed_instance.set(fdnd_guid, "tun_port", 0)
-    testbed_instance.set(fdnd_guid, "tun_key", ("\xfa"*32).encode("base64")) # unimportant, fds aren't encrypted
+    testbed_instance.set(fdnd_guid, "tun_key", ("\xfa"*32).encode("base64").strip()) # unimportant, fds aren't encrypted
+    fdnd = testbed_instance._elements[fdnd_guid]
+    t = threading.Thread(target=recvfd, args=(sock,fdnd))
+    t.start()
 
 def connect_tunchannel_fd(testbed_instance, tun_guid, fdnd_guid):
     fdnd = testbed_instance._elements[fdnd_guid]
     tun = testbed_instance._elements[tun_guid]
 
-    # XXX: check the method StringToBuffer of ns3::FdNetDevice
-    # to see how the address should be decoded
-    endpoint = fdnd.GetEndpoint()
-    address = endpoint.replace(":", "").decode('hex')[2:]
-    testbed_instance.set(fdnd_guid, "LinuxSocketAddress", address)
-    
     # Create socket pair to connect the FDND and the TunChannel with it
     import socket
     sock1, sock2 = socket.socketpair(
         socket.AF_UNIX, socket.SOCK_SEQPACKET)
 
-    # Send one endpoint to the FDND
-    import passfd
-    import socket
-    sock = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
-    sock.connect(address)
-    passfd.sendfd(sock, sock1.fileno(), '0')
-    
     # Store a reference to the endpoint to keep the socket alive
     fdnd._endpoint_socket = sock1
-    
+    fdnd.SetFileDescriptor(sock1.fileno())
+   
     # Send the other endpoint to the TUN channel
     tun.tun_socket = sock2
     
@@ -287,6 +282,36 @@ connector_types = dict({
                 "max": 1,
                 "min": 0
             }),
+    "mobpair": dict({
+                "help": "Connector from MatrixPropagationLossModel to MobilityPair", 
+                "name": "mobpair",
+                "max": -1,
+                "min": 0
+            }),
+   "matrix": dict({
+                "help": "Connector from MobilityPair to MatrixPropagationLossModel", 
+                "name": "matrix",
+                "max": 1,
+                "min": 0
+            }),
+    "mp": dict({
+                "help": "Connector from MobilityModel to MobilityPair", 
+                "name": "mp",
+                "max": -1,
+                "min": 0
+            }),
+    "ma": dict({
+                "help": "Connector to the 'ma' source mobility model, in the context of a mobility loss pair ", 
+                "name": "ma",
+                "max": 1,
+                "min": 0 
+            }),
+    "mb": dict({
+                "help": "Connector to the 'mb' destination mobility model, in the context of a mobility loss pair ", 
+                "name": "mb",
+                "max": 1,
+                "min": 1
+            }),
     "tcp": dict({
                 "help": "Connector for ip-ip tunneling over TCP link", 
                 "name": "tcp",
@@ -377,13 +402,13 @@ connections = [
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::SubscriberStationNetDevice", "node" ),
-            "init_code": connect_dummy,   
+            "init_code": connect_node_device,   
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::Node", "devs" ),
             "to":   ( "ns3", "ns3::BaseStationNetDevice", "node" ),
-            "init_code": connect_dummy,   
+            "init_code": connect_node_device,   
             "can_cross": False
     }),
     dict({
@@ -494,34 +519,40 @@ connections = [
             "init_code": connect_mac_device,
             "can_cross": False
     }),
+    dict({
+            "from": ( "ns3", "ns3::AdhocWifiMac", "dev" ),
+            "to":   ( "ns3", "ns3::WifiNetDevice", "mac" ),
+            "init_code": connect_mac_device,
+            "can_cross": False
+    }),
     dict({
             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
+            "init_code": connect_error_model_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::RateErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
+            "init_code": connect_error_model_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::CsmaNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
+            "init_code": connect_error_model_device,
             "can_cross": False
     }),
     dict({
             "from": ( "ns3", "ns3::ListErrorModel", "dev" ),
             "to":   ( "ns3", "ns3::PointToPointNetDevice", "err" ),
-            "init_code": connect_errormodel_device,
+            "init_code": connect_error_model_device,
             "can_cross": False
     }),
     dict({
         "from": ( "ns3", "ns3::NistErrorRateModel", "phy" ),        
         "to":   ( "ns3", "ns3::YansWifiPhy", "err" ),
-        "init_code": connect_errormodel_phy,
+        "init_code": connect_error_model_phy,
         "can_cross": False
     }),
     dict({
@@ -667,6 +698,59 @@ connections = [
         "init_code": connect_node_other,
         "can_cross": False
     }),
+
+
+    dict({
+        "from": ( "ns3", "ns3::Nepi::MobilityPair", "matrix" ),
+        "to":   ( "ns3", "ns3::MatrixPropagationLossModel", "mobpair" ),
+        "init_code": connect_dummy,
+        "can_cross": False
+    }),
+    dict({
+        "from": ( "ns3", "ns3::Nepi::MobilityPair", "ma" ),
+        "to":   ( "ns3", "ns3::ConstantVelocityMobilityModel", "mp" ),
+        "init_code": connect_dummy,
+        "can_cross": False
+    }),
+    dict({
+        "from": ( "ns3", "ns3::Nepi::MobilityPair", "mb" ),
+        "to":   ( "ns3", "ns3::ConstantVelocityMobilityModel", "mp" ),
+        "init_code": connect_dummy,
+        "can_cross": False
+    }),
+    dict({
+        "from": ( "ns3", "ns3::Nepi::MobilityPair", "ma" ),
+        "to":   ( "ns3", "ns3::ConstantAccelerationMobilityModel", "mp" ),
+        "init_code": connect_dummy,
+        "can_cross": False
+    }),
+    dict({
+        "from": ( "ns3", "ns3::Nepi::MobilityPair", "mb" ),
+        "to":   ( "ns3", "ns3::ConstantAccelerationMobilityModel", "mp" ),
+        "init_code": connect_dummy,
+        "can_cross": False
+    }),
+    dict({
+        "from": ( "ns3", "ns3::Nepi::MobilityPair", "ma" ),
+        "to":   ( "ns3", "ns3::ConstantPositionMobilityModel", "mp" ),
+        "init_code": connect_dummy,
+        "can_cross": False
+    }),
+    dict({
+        "from": ( "ns3", "ns3::Nepi::MobilityPair", "mb" ),
+        "to":   ( "ns3", "ns3::ConstantPositionMobilityModel", "mp" ),
+        "init_code": connect_dummy,
+        "can_cross": False
+    }),
+    dict({
+        "from": ( "ns3", "ns3::MatrixPropagationLossModel", "chan" ),  
+        "to":   ( "ns3", "ns3::YansWifiChannel", "loss" ),
+        "init_code": connect_loss_channel,
+        "can_cross": False
+    }),
+
+
+
     dict({
         "from": ( "ns3", "ns3::Node", "mobility" ),
         "to":   ( "ns3", "ns3::ConstantAccelerationMobilityModel", "node" ),
@@ -718,15 +802,15 @@ connections = [
     dict({
         "from": ( "ns3", "ns3::SubscriberStationNetDevice", "sflows" ),
         "to":   ( "ns3", "ns3::ServiceFlow", "dev" ),
-        "init_code": connect_station_sflow,
-        "can_cross": False
-    }),
-    dict({
-        "from": ( "ns3", "ns3::BaseStationNetDevice", "sflows" ),
-        "to":   ( "ns3", "ns3::ServiceFlow", "dev" ),
-        "init_code": connect_station_sflow,
+        "init_code": connect_ss_sflow,
         "can_cross": False
     }),
+#    dict({
+#        "from": ( "ns3", "ns3::BaseStationNetDevice", "sflows" ),
+#        "to":   ( "ns3", "ns3::ServiceFlow", "dev" ),
+#        "init_code": connect_bs_sflow,
+#        "can_cross": False
+#    }),
     dict({
         "from": ( "ns3", "ns3::BaseStationNetDevice", "uplnk" ),
         "to":   ( "ns3", "ns3::UplinkSchedulerSimple", "dev" ),