CONPRO-1551 Adding support for LE bi directional request. 55/223455/1
authorKush <kush.agrawal@samsung.com>
Wed, 22 Jan 2020 13:20:46 +0000 (18:50 +0530)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Thu, 30 Jan 2020 01:54:17 +0000 (10:54 +0900)
Issue : Currently Tizen LE Server only supports sending response
        and LE Client supports sending request and response for response.
        But in some scenarios if server tries to send request using same BLE
        connection, then that is not possible.

Solution: This patch will allow LE server to send Request using same BLE connection

https://github.sec.samsung.net/RS7-IOTIVITY/IoTivity/pull/654
(cherry-picked from af41fb6485fdb0bb02bfd92e6e4993a0b1596a36)

Change-Id: Ie2a0bb3add5e56565d0059ac2d42dfd68336c958
Signed-off-by: Kush <kush.agrawal@samsung.com>
Signed-off-by: DoHyun Pyun <dh79.pyun@samsung.com>
resource/csdk/connectivity/api/cacommon.h
resource/csdk/connectivity/src/bt_le_adapter/caleadapter.c

index 002794c..d1e53f7 100755 (executable)
@@ -403,7 +403,9 @@ typedef enum
     CA_RESPONSE_DATA,
     CA_ERROR_DATA,
     CA_RESPONSE_FOR_RES,
-    CA_NETWORK_COMMAND
+    CA_NETWORK_COMMAND,
+    CA_REQUEST_DATA_SERVER_INIT,
+    CA_RESPONSE_DATA_CLIENT_INIT
 } CADataType_t;
 
 typedef enum
index d3245f0..4d9bf62 100644 (file)
@@ -117,6 +117,11 @@ static char g_localBLEAddress[18] = { 0 };
  */
 static CABLEAdapter_t g_adapterType = ADAPTER_EMPTY;
 
+/**
+ * Variable to define current adapter type.
+ */
+static CABLEAdapter_t g_currentDeviceRole = ADAPTER_EMPTY;
+
 #ifdef __WITH_DTLS__
 static CADataType_t g_dataType = CA_REQUEST_DATA;
 #endif
@@ -2772,9 +2777,18 @@ static int32_t CASendLEUnicastData(const CAEndpoint_t *endpoint,
         OIC_LOG(ERROR, CALEADAPTER_TAG, "g_adapterType is Empty");
     }
 
+    if(dataType == CA_REQUEST_DATA && g_currentDeviceRole == ADAPTER_SERVER){
+        OIC_LOG(DEBUG, CALEADAPTER_TAG, "Request Message from server" );
+        dataType = CA_REQUEST_DATA_SERVER_INIT;
+    } else if (dataType == CA_RESPONSE_DATA && g_currentDeviceRole == ADAPTER_CLIENT) {
+        OIC_LOG(DEBUG, CALEADAPTER_TAG, "Response Message from client" );
+        dataType = CA_RESPONSE_DATA_CLIENT_INIT;
+    }
+
     oc_mutex_lock(g_bleIsServerMutex);
     if (ADAPTER_SERVER == g_adapterType ||
-            (ADAPTER_BOTH_CLIENT_SERVER == g_adapterType && CA_RESPONSE_DATA == dataType))
+            (ADAPTER_BOTH_CLIENT_SERVER == g_adapterType && CA_RESPONSE_DATA == dataType) ||
+            (ADAPTER_BOTH_CLIENT_SERVER == g_adapterType && CA_REQUEST_DATA_SERVER_INIT== dataType))
     {
 #ifdef __WITH_DTLS__
         if (endpoint && endpoint->flags & CA_SECURE)
@@ -2802,6 +2816,13 @@ static int32_t CASendLEUnicastData(const CAEndpoint_t *endpoint,
 #else
         result = CALEAdapterServerSendData(endpoint, data, dataLen);
 #endif
+
+        if(g_currentDeviceRole == ADAPTER_EMPTY)
+        {
+             OIC_LOG(INFO, CALEADAPTER_TAG, "Setting current device role as server" );
+             g_currentDeviceRole = ADAPTER_SERVER;
+        }
+
         if (CA_STATUS_OK != result)
         {
             oc_mutex_unlock(g_bleIsServerMutex);
@@ -2816,7 +2837,8 @@ static int32_t CASendLEUnicastData(const CAEndpoint_t *endpoint,
     }
     else if (ADAPTER_CLIENT == g_adapterType ||
             (ADAPTER_BOTH_CLIENT_SERVER == g_adapterType && CA_REQUEST_DATA == dataType) ||
-            (ADAPTER_BOTH_CLIENT_SERVER == g_adapterType && CA_RESPONSE_FOR_RES == dataType))
+            (ADAPTER_BOTH_CLIENT_SERVER == g_adapterType && CA_RESPONSE_FOR_RES == dataType) ||
+            (ADAPTER_BOTH_CLIENT_SERVER == g_adapterType && CA_RESPONSE_DATA_CLIENT_INIT== dataType))
     {
 #ifdef __WITH_DTLS__
         if (endpoint && endpoint->flags & CA_SECURE)
@@ -2844,6 +2866,13 @@ static int32_t CASendLEUnicastData(const CAEndpoint_t *endpoint,
 #else
         result = CALEAdapterClientSendData(endpoint, data, dataLen);
 #endif
+
+        if(g_currentDeviceRole == ADAPTER_EMPTY)
+        {
+             OIC_LOG(INFO, CALEADAPTER_TAG, "Setting current device role as client" );
+             g_currentDeviceRole = ADAPTER_CLIENT;
+        }
+
         if (CA_STATUS_OK != result)
         {
             oc_mutex_unlock(g_bleIsServerMutex);