Apply the logic which can start transport type in initialize step.
authorjihwan.seo <jihwan.seo@samsung.com>
Mon, 16 Jan 2017 08:41:06 +0000 (17:41 +0900)
committerAshok Babu Channa <ashok.channa@samsung.com>
Mon, 23 Jan 2017 12:58:33 +0000 (12:58 +0000)
In case of some scenario that just one library is used
in here and there.
There are many resource wastes related unused transport adapter.
thru, It is better to provide it manually.

Change-Id: Id34bad8db3a323c723af95330ef243041ba6fa34
Signed-off-by: jihwan.seo <jihwan.seo@samsung.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/16433
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
Reviewed-by: Ashok Babu Channa <ashok.channa@samsung.com>
16 files changed:
resource/csdk/connectivity/api/cainterface.h
resource/csdk/connectivity/inc/cainterfacecontroller.h
resource/csdk/connectivity/inc/camessagehandler.h
resource/csdk/connectivity/src/caconnectivitymanager.c
resource/csdk/connectivity/src/cainterfacecontroller.c
resource/csdk/connectivity/src/camessagehandler.c
resource/csdk/connectivity/test/ca_api_unittest.cpp
resource/csdk/connectivity/test/cablocktransfertest.cpp
resource/csdk/octbstack_product.def
resource/csdk/stack/include/ocstack.h
resource/csdk/stack/src/ocstack.c
resource/examples/simpleclient.cpp
resource/examples/simpleserver.cpp
resource/include/OCApi.h
resource/src/InProcClientWrapper.cpp
resource/src/InProcServerWrapper.cpp

index b5ad39c..6a4916d 100644 (file)
@@ -85,10 +85,10 @@ void CARegisterKeepAliveHandler(CAKeepAliveConnectionCallback ConnHandler);
  * Initialize the connectivity abstraction module.
  * It will initialize adapters, thread pool and other modules based on the platform
  * compilation options.
- *
+ * @param[in]   transportType  transport type to initialize.
  * @return  ::CA_STATUS_OK or ::CA_STATUS_FAILED or ::CA_MEMORY_ALLOC_FAILED
  */
-CAResult_t CAInitialize();
+CAResult_t CAInitialize(CATransportAdapter_t transportType);
 
 /**
  * Terminate the connectivity abstraction module.
index fa15c25..c4e44b9 100644 (file)
@@ -50,8 +50,9 @@ void CAInitializeAdapters();
  * Initializes different adapters based on the compilation flags.
  * @param[in]   handle           thread pool handle created by message handler
  *                               for different adapters.
+ * @param[in]   transportType    transport type to initialize.
  */
-void CAInitializeAdapters(ca_thread_pool_t handle);
+void CAInitializeAdapters(ca_thread_pool_t handle, CATransportAdapter_t transportType);
 #endif
 
 /**
index cdd0e8d..c49e8c9 100644 (file)
@@ -76,9 +76,10 @@ void CASetInterfaceCallbacks(CARequestCallback ReqHandler, CAResponseCallback Re
 /**
  * Initialize the message handler by starting thread pool and initializing the
  * send and receive queue.
+ * @param[in]   transportType  transport type to initialize.
  * @return  ::CA_STATUS_OK or ERROR CODES (::CAResult_t error codes in cacommon.h).
  */
-CAResult_t CAInitializeMessageHandler();
+CAResult_t CAInitializeMessageHandler(CATransportAdapter_t transportType);
 
 /**
  * Terminate the message handler by stopping  the thread pool and destroying the queues.
index a170ade..e051f38 100644 (file)
@@ -55,14 +55,14 @@ extern void CAsetCredentialTypesCallback(CAgetCredentialTypesHandler credCallbac
 #endif // __WITH_DTLS__ or __WITH_TLS__
 
 
-CAResult_t CAInitialize()
+CAResult_t CAInitialize(CATransportAdapter_t transportType)
 {
     OIC_LOG_V(DEBUG, TAG, "IoTivity version is v%s", IOTIVITY_VERSION);
-    OIC_LOG(DEBUG, TAG, "CAInitialize");
+    OIC_LOG_V(DEBUG, TAG, "CAInitialize type : %d", transportType);
 
     if (!g_isInitialized)
     {
-        CAResult_t res = CAInitializeMessageHandler();
+        CAResult_t res = CAInitializeMessageHandler(transportType);
         if (res != CA_STATUS_OK)
         {
             OIC_LOG(ERROR, TAG, "CAInitialize has failed");
index 311549e..427c436 100644 (file)
@@ -288,39 +288,63 @@ static void CAAdapterErrorHandleCallback(const CAEndpoint_t *endpoint,
     }
 }
 
-void CAInitializeAdapters(ca_thread_pool_t handle)
+void CAInitializeAdapters(ca_thread_pool_t handle, CATransportAdapter_t transportType)
 {
-    OIC_LOG(DEBUG, TAG, "initialize adapters..");
+    OIC_LOG_V(DEBUG, TAG, "initialize adapters %d", transportType);
 
     // Initialize adapters and register callback.
 #ifdef IP_ADAPTER
-    CAInitializeIP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
-                   CAAdapterErrorHandleCallback, handle);
+    if ((transportType & CA_ADAPTER_IP) || (CA_DEFAULT_ADAPTER == transportType)
+            || (transportType & CA_ALL_ADAPTERS))
+    {
+        CAInitializeIP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+                       CAAdapterErrorHandleCallback, handle);
+    }
 #endif /* IP_ADAPTER */
 
 #ifdef EDR_ADAPTER
-    CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
-                    CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
+    if ((transportType & CA_ADAPTER_RFCOMM_BTEDR) || (CA_DEFAULT_ADAPTER == transportType)
+            || (transportType == CA_ALL_ADAPTERS))
+    {
+        CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+                        CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
+    }
 #endif /* EDR_ADAPTER */
 
 #ifdef LE_ADAPTER
-    CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
-                   CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
+    if ((transportType & CA_ADAPTER_GATT_BTLE) || (CA_DEFAULT_ADAPTER == transportType)
+            || (transportType == CA_ALL_ADAPTERS))
+    {
+        CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+                       CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
+    }
 #endif /* LE_ADAPTER */
 
 #ifdef RA_ADAPTER
-    CAInitializeRA(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
-                   handle);
+    if ((transportType & CA_ADAPTER_REMOTE_ACCESS) || (CA_DEFAULT_ADAPTER == transportType)
+            || (transportType == CA_ALL_ADAPTERS))
+    {
+        CAInitializeRA(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+                       handle);
+    }
 #endif /* RA_ADAPTER */
 
 #ifdef TCP_ADAPTER
-    CAInitializeTCP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
-                    CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
+    if ((transportType & CA_ADAPTER_TCP) || (CA_DEFAULT_ADAPTER == transportType)
+            || (transportType == CA_ALL_ADAPTERS))
+    {
+        CAInitializeTCP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+                        CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle);
+    }
 #endif /* TCP_ADAPTER */
 
 #ifdef NFC_ADAPTER
-    CAInitializeNFC(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
-                    CAAdapterErrorHandleCallback, handle);
+    if ((transportType & CA_ADAPTER_NFC) || (CA_DEFAULT_ADAPTER == transportType)
+            || (transportType == CA_ALL_ADAPTERS))
+    {
+        CAInitializeNFC(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback,
+                        CAAdapterErrorHandleCallback, handle);
+    }
 #endif /* NFC_ADAPTER */
 }
 
index 070cdcb..44869ee 100644 (file)
@@ -1052,7 +1052,7 @@ void CASetNetworkMonitorCallback(CANetworkMonitorCallback nwMonitorHandler)
     g_nwMonitorHandler = nwMonitorHandler;
 }
 
-CAResult_t CAInitializeMessageHandler()
+CAResult_t CAInitializeMessageHandler(CATransportAdapter_t transportType)
 {
     CASetPacketReceivedCallback(CAReceivedPacketCallback);
     CASetErrorHandleCallback(CAErrorHandler);
@@ -1130,7 +1130,7 @@ CAResult_t CAInitializeMessageHandler()
     }
 
     // initialize interface adapters by controller
-    CAInitializeAdapters(g_threadPoolHandle);
+    CAInitializeAdapters(g_threadPoolHandle, transportType);
 #else
     // retransmission initialize
     CAResult_t res = CARetransmissionInitialize(&g_retransmissionContext, NULL, CASendUnicastData,
index f76d819..8b760c1 100755 (executable)
@@ -33,7 +33,7 @@ class CATests : public testing::Test {
     protected:
     virtual void SetUp()
     {
-        CAInitialize();
+        CAInitialize(CA_DEFAULT_ADAPTER);
     }
 
     virtual void TearDown()
@@ -165,7 +165,7 @@ int32_t CAGetDtlsPskCredentials( CADtlsPskCredType_t type,
 // CAInitialize TC
 TEST(InitializeTest, CAInitializeTest)
 {
-    EXPECT_EQ(CA_STATUS_OK, CAInitialize());
+    EXPECT_EQ(CA_STATUS_OK, CAInitialize(CA_DEFAULT_ADAPTER));
     CATerminate();
 }
 
@@ -177,7 +177,7 @@ TEST_F(CATests, TerminateTest)
     char* check = (char *) "terminate success";
     EXPECT_STREQ(check, "terminate success");
 
-    CAInitialize();
+    CAInitialize(CA_DEFAULT_ADAPTER);
 }
 
 // CAStartListeningServer TC
index 6540348..0c6fae2 100644 (file)
@@ -31,7 +31,7 @@ class CABlockTransferTests : public testing::Test {
     protected:
     virtual void SetUp()
     {
-        CAInitialize();
+        CAInitialize(CA_ADAPTER_IP);
     }
 
     virtual void TearDown()
index ecb7cc6..825aef6 100644 (file)
@@ -70,6 +70,7 @@ OCGetServerInstanceIDString
 OCGetSupportedEndpointTpsFlags
 OCInit
 OCInit1
+OCInit2
 OCNotifyAllObservers
 OCNotifyListOfObservers
 OCPayloadDestroy
index cbc01c8..fc04c3f 100644 (file)
@@ -57,6 +57,19 @@ OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlag
 /**
  * This function Initializes the OC Stack.  Must be called prior to starting the stack.
  *
+ * @param mode            OCMode Host device is client, server, or client-server.
+ * @param serverFlags     OCTransportFlags Default server transport flags.
+ * @param clientFlags     OCTransportFlags Default client transport flags.
+ * @param transportType   OCTransportAdapter value to initialize.
+ *
+ * @return ::OC_STACK_OK on success, some other value upon failure.
+ */
+OCStackResult OCInit2(OCMode mode, OCTransportFlags serverFlags, OCTransportFlags clientFlags,
+                      OCTransportAdapter transportType);
+
+/**
+ * This function Initializes the OC Stack.  Must be called prior to starting the stack.
+ *
  * @param ipAddr      IP Address of host device. Deprecated parameter.
  * @param port        Port of host device. Deprecated parameter.
  * @param mode        OCMode Host device is client, server, or client-server.
index 03698d6..571c88b 100644 (file)
@@ -296,10 +296,10 @@ static void incrementSequenceNumber(OCResource * resPtr);
  *
  * Note: At least one interface must succeed to initialize. If all calls to @ref CASelectNetwork
  * return something other than @ref CA_STATUS_OK, then this function fails.
- *
+ * @param transportType  OCTransportAdapter value to select.
  * @return ::CA_STATUS_OK on success, some other value upon failure.
  */
-static CAResult_t OCSelectNetwork();
+static CAResult_t OCSelectNetwork(OCTransportAdapter transportType);
 
 /**
  * Convert CAResponseResult_t to OCStackResult.
@@ -2176,6 +2176,13 @@ OCStackResult OCInit(const char *ipAddr, uint16_t port, OCMode mode)
 
 OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlags clientFlags)
 {
+    OIC_LOG(DEBUG, TAG, "call OCInit1");
+    return OCInit2(mode, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS, OC_DEFAULT_ADAPTER);
+}
+
+OCStackResult OCInit2(OCMode mode, OCTransportFlags serverFlags, OCTransportFlags clientFlags,
+                      OCTransportAdapter transportType)
+{
     if(stackState == OC_STACK_INITIALIZED)
     {
         OIC_LOG(INFO, TAG, "Subsequent calls to OCInit() without calling \
@@ -2237,10 +2244,10 @@ OCStackResult OCInit1(OCMode mode, OCTransportFlags serverFlags, OCTransportFlag
     result = InitializeScheduleResourceList();
     VERIFY_SUCCESS(result, OC_STACK_OK);
 
-    result = CAResultToOCResult(CAInitialize());
+    result = CAResultToOCResult(CAInitialize((CATransportAdapter_t)transportType));
     VERIFY_SUCCESS(result, OC_STACK_OK);
 
-    result = CAResultToOCResult(OCSelectNetwork());
+    result = CAResultToOCResult(OCSelectNetwork(transportType));
     VERIFY_SUCCESS(result, OC_STACK_OK);
 
     result = CAResultToOCResult(CARegisterNetworkMonitorHandler(
@@ -4891,8 +4898,9 @@ const char* OCGetServerInstanceIDString(void)
     return sidStr;
 }
 
-CAResult_t OCSelectNetwork()
+CAResult_t OCSelectNetwork(OCTransportAdapter transportType)
 {
+    OIC_LOG_V(DEBUG, TAG, "OCSelectNetwork [%d]", transportType);
     CAResult_t retResult = CA_STATUS_FAILED;
     CAResult_t caResult = CA_STATUS_OK;
 
@@ -4916,11 +4924,19 @@ CAResult_t OCSelectNetwork()
         // If CA status is not initialized, CASelectNetwork() will not be called.
         if (caResult != CA_STATUS_NOT_INITIALIZED)
         {
-           caResult = CASelectNetwork(connTypes[i]);
-           if (caResult == CA_STATUS_OK)
-           {
-               retResult = CA_STATUS_OK;
-           }
+            if ((connTypes[i] & transportType) || (OC_DEFAULT_ADAPTER == transportType))
+            {
+                OIC_LOG_V(DEBUG, TAG, "call CASelectNetwork [%d]", connTypes[i]);
+                caResult = CASelectNetwork(connTypes[i]);
+                if (caResult == CA_STATUS_OK)
+                {
+                    retResult = CA_STATUS_OK;
+                }
+            }
+            else
+            {
+                OIC_LOG_V(DEBUG, TAG, "there is no transport type [%d]", connTypes[i]);
+            }
         }
     }
 
index 885d9aa..0c0149e 100644 (file)
@@ -516,8 +516,9 @@ int main(int argc, char* argv[]) {
     PlatformConfig cfg {
         OC::ServiceType::InProc,
         OC::ModeType::Both,
-        "0.0.0.0",
-        0,
+        OCConnectivityType::CT_ADAPTER_IP,
+        OCConnectivityType::CT_ADAPTER_IP,
+        (OCTransportAdapter)(OCTransportAdapter::OC_ADAPTER_IP|OCTransportAdapter::OC_ADAPTER_TCP),
         OC::QualityOfService::HighQos,
         &ps
     };
index 79b83d4..b232827 100644 (file)
@@ -672,8 +672,7 @@ int main(int argc, char* argv[])
     PlatformConfig cfg {
         OC::ServiceType::InProc,
         OC::ModeType::Server,
-        "0.0.0.0", // By setting to "0.0.0.0", it binds to all available interfaces
-        0,         // Uses randomly available port
+        (OCTransportAdapter)(OCTransportAdapter::OC_ADAPTER_IP|OCTransportAdapter::OC_ADAPTER_TCP),
         OC::QualityOfService::LowQos,
         &ps
     };
index ff2d212..100eec0 100644 (file)
@@ -146,6 +146,9 @@ namespace OC
         /** default flags for client. */
         OCConnectivityType         clientConnectivity;
 
+        /** transport type to initialize. */
+        OCTransportAdapter         transportType;
+
         /** not used. */
         std::string                ipAddress;
 
@@ -164,6 +167,7 @@ namespace OC
                 mode(ModeType::Both),
                 serverConnectivity(CT_DEFAULT),
                 clientConnectivity(CT_DEFAULT),
+                transportType(OC_DEFAULT_ADAPTER),
                 ipAddress("0.0.0.0"),
                 port(0),
                 QoS(QualityOfService::NaQos),
@@ -179,6 +183,7 @@ namespace OC
                 mode(mode_),
                 serverConnectivity(serverConnectivity_),
                 clientConnectivity(clientConnectivity_),
+                transportType(OC_DEFAULT_ADAPTER),
                 ipAddress(""),
                 port(0),
                 QoS(QoS_),
@@ -195,11 +200,45 @@ namespace OC
                 mode(mode_),
                 serverConnectivity(CT_DEFAULT),
                 clientConnectivity(CT_DEFAULT),
+                transportType(OC_DEFAULT_ADAPTER),
                 ipAddress(ipAddress_),
                 port(port_),
                 QoS(QoS_),
                 ps(ps_)
         {}
+            PlatformConfig(const ServiceType serviceType_,
+            const ModeType mode_,
+            OCTransportAdapter transportType_,
+            const QualityOfService QoS_,
+            OCPersistentStorage *ps_ = nullptr)
+                : serviceType(serviceType_),
+                mode(mode_),
+                serverConnectivity(CT_DEFAULT),
+                clientConnectivity(CT_DEFAULT),
+                transportType(transportType_),
+                ipAddress(""),
+                port(0),
+                QoS(QoS_),
+                ps(ps_)
+        {}
+            PlatformConfig(const ServiceType serviceType_,
+            const ModeType mode_,
+            OCConnectivityType serverConnectivity_,
+            OCConnectivityType clientConnectivity_,
+            OCTransportAdapter transportType_,
+            const QualityOfService QoS_,
+            OCPersistentStorage *ps_ = nullptr)
+                : serviceType(serviceType_),
+                mode(mode_),
+                serverConnectivity(serverConnectivity_),
+                clientConnectivity(clientConnectivity_),
+                transportType(transportType_),
+                ipAddress(""),
+                port(0),
+                QoS(QoS_),
+                ps(ps_)
+        {}
+
     };
 
     enum RequestHandlerFlag
index 9dccd59..872a812 100644 (file)
@@ -57,14 +57,16 @@ namespace OC
 
     OCStackResult InProcClientWrapper::start()
     {
-        OIC_LOG(INFO, TAG, "start ocplatform");
+        OIC_LOG_V(INFO, TAG, "start ocplatform for client : %d", m_cfg.transportType);
+
         if (m_cfg.mode == ModeType::Client)
         {
             OCTransportFlags serverFlags =
                             static_cast<OCTransportFlags>(m_cfg.serverConnectivity & CT_MASK_FLAGS);
             OCTransportFlags clientFlags =
                             static_cast<OCTransportFlags>(m_cfg.clientConnectivity & CT_MASK_FLAGS);
-            OCStackResult result = OCInit1(OC_CLIENT, serverFlags, clientFlags);
+            OCStackResult result = OCInit2(OC_CLIENT, serverFlags, clientFlags,
+                                           m_cfg.transportType);
 
             if (OC_STACK_OK != result)
             {
index 5cfe7fc..774094d 100644 (file)
@@ -266,10 +266,9 @@ namespace OC
 
     OCStackResult InProcServerWrapper::start()
     {
-        OIC_LOG(INFO, TAG, "start");
+        OIC_LOG_V(INFO, TAG, "start ocplatform for server : %d", m_cfg.transportType);
 
         OCMode initType;
-
         if(m_cfg.mode == ModeType::Server)
         {
             initType = OC_SERVER;
@@ -292,7 +291,8 @@ namespace OC
                             static_cast<OCTransportFlags>(m_cfg.serverConnectivity & CT_MASK_FLAGS);
         OCTransportFlags clientFlags =
                             static_cast<OCTransportFlags>(m_cfg.clientConnectivity & CT_MASK_FLAGS);
-        OCStackResult result = OCInit1(initType, serverFlags, clientFlags);
+        OCStackResult result = OCInit2(initType, serverFlags, clientFlags,
+                                       m_cfg.transportType);
 
         if(OC_STACK_OK != result)
         {