static oc_cond g_threadWriteCharacteristicCond = NULL;
/**
+ * Mutex to synchronize the task for MTU Changed.
+ */
+static oc_mutex g_threadMTUChangedMutex = NULL;
+
+/**
+ * Condition for MTU Changed.
+ */
+static oc_cond g_threadMTUChangedCond = NULL;
+
+/**
* Flag to check status of write characteristic.
*/
static bool g_isSignalSetFlag = false;
OIC_LOG(DEBUG, TAG, "OUT");
}
+void CALEGattClientMTUChangedCb(bt_gatt_client_h client_handle, const bt_gatt_client_att_mtu_info_s *mtu_info, void *user_data)
+{
+ OIC_LOG(DEBUG, TAG, "IN");
+ oc_mutex_lock(g_threadMTUChangedMutex);
+ OIC_LOG(DEBUG, TAG, "MTU changed signal");
+ oc_cond_signal(g_threadMTUChangedCond);
+ oc_mutex_unlock(g_threadMTUChangedMutex);
+ OIC_LOG(DEBUG, TAG, "OUT");
+}
+
+
void CALEGattCharacteristicWriteCb(int result, bt_gatt_h reqHandle, void *userData)
{
(void)reqHandle;
OIC_LOG_V(DEBUG, TAG, "Service[%s] Found in %s",
uuids[i], scanInfo->remote_address);
ret = true;
- }else if(0 == strncasecmp(uuids[i], service_uuid,CUSTOM_UUID_LEN))
- {
- OIC_LOG_V(DEBUG, TAG, "Custom Service[%s] Found in %s",
- uuids[i], scanInfo->remote_address);
- ret = true;
}
OICFree(uuids[i]);
}
}
}
+ if (NULL == g_threadMTUChangedMutex)
+ {
+ g_threadMTUChangedMutex = oc_mutex_new();
+ if (NULL == g_threadMTUChangedMutex)
+ {
+ OIC_LOG(ERROR, TAG, "oc_mutex_new has failed");
+ return CA_STATUS_FAILED;
+ }
+ }
+
if (NULL == g_startTimerCond)
{
g_startTimerCond = oc_cond_new();
}
}
+ if (NULL == g_threadMTUChangedCond)
+ {
+ g_threadMTUChangedCond = oc_cond_new();
+ if (NULL == g_threadMTUChangedCond)
+ {
+ OIC_LOG(ERROR, TAG, "oc_cond_new failed");
+ return CA_STATUS_FAILED;
+ }
+ }
+
+
OIC_LOG(DEBUG, TAG, "OUT");
return CA_STATUS_OK;
}
oc_mutex_free(g_threadWriteCharacteristicMutex);
g_threadWriteCharacteristicMutex = NULL;
+ oc_mutex_free(g_threadMTUChangedMutex);
+ g_threadMTUChangedMutex = NULL;
+
oc_cond_free(g_startTimerCond);
g_startTimerCond = NULL;
g_threadWriteCharacteristicCond = NULL;
g_isSignalSetFlag = false;
+ oc_cond_free(g_threadMTUChangedCond);
+ g_threadMTUChangedCond = NULL;
+
OIC_LOG(DEBUG, TAG, "OUT");
}
return;
}
g_isScanningInProgress = false;
+ g_isUnicastScanInProgress= false;
}
else
{
"remote address is NULL", CA_STATUS_FAILED);
LEServerInfo *serverInfo = NULL;
+ unsigned int mtu_size;
oc_mutex_lock(g_LEServerListMutex);
if (CA_STATUS_OK != CAGetLEServerInfo(g_LEServerList, remoteAddress, &serverInfo))
{
{
OIC_LOG_V(ERROR, TAG,
"bt_gatt_client_get_service Failed with ret value [%s] ", CALEGetErrorMsg(ret));
- bt_gatt_client_destroy(serverInfo->clientHandle);
- CALEGattDisConnect(remoteAddress);
- return CA_STATUS_FAILED;
+ goto error_exit;
}
// Server will read data on this characteristic.
OIC_LOG_V(ERROR, TAG,
"bt_gatt_service_get_characteristic Failed with ret value [%s] ",
CALEGetErrorMsg(ret));
- bt_gatt_client_destroy(serverInfo->clientHandle);
- CALEGattDisConnect(remoteAddress);
- return CA_STATUS_FAILED;
+ goto error_exit;
}
// Server will notify data on this characteristic.
OIC_LOG_V(ERROR, TAG,
"bt_gatt_service_get_characteristic Failed with ret value [%s] ",
CALEGetErrorMsg(ret));
- bt_gatt_client_destroy(serverInfo->clientHandle);
- CALEGattDisConnect(remoteAddress);
- return CA_STATUS_FAILED;
+ goto error_exit;
}
//TODO: This data has to be freed while unsetting the callback.
if (NULL == addr)
{
OIC_LOG(ERROR, TAG, "addr is NULL");
- bt_gatt_client_destroy(serverInfo->clientHandle);
- CALEGattDisConnect(remoteAddress);
- return CA_STATUS_FAILED;
+ goto error_exit;
}
ret = bt_gatt_client_set_characteristic_value_changed_cb(readChrHandle,
OIC_LOG_V(ERROR, TAG,
"bt_gatt_client_set_characteristic_value_changed_cb Failed with ret value [%s]",
CALEGetErrorMsg(ret));
- bt_gatt_client_destroy(serverInfo->clientHandle);
- CALEGattDisConnect(remoteAddress);
- return CA_STATUS_FAILED;
+ goto error_exit;
+ }
+
+ ret = bt_gatt_client_set_att_mtu_changed_cb(serverInfo->clientHandle,
+ CALEGattClientMTUChangedCb,
+ (void *)serverInfo->remoteAddress);
+ if (BT_ERROR_NONE != ret)
+ {
+ OIC_LOG_V(ERROR, TAG,
+ "bt_gatt_client_set_att_mtu_changed_cb Failed with ret value [%s]",
+ CALEGetErrorMsg(ret));
+ goto error_exit;
}
+ oc_mutex_lock(g_threadMTUChangedMutex);
+ ret = bt_gatt_client_request_att_mtu_change(serverInfo->clientHandle, CA_SUPPORTED_BLE_MTU_SIZE - CA_BLE_MTU_HEADER_SIZE);
+ if (BT_ERROR_NONE != ret)
+ {
+ OIC_LOG_V(ERROR, TAG,
+ "bt_gatt_client_request_att_mtu_change Failed with ret value [%s]",
+ CALEGetErrorMsg(ret));
+ oc_mutex_unlock(g_threadMTUChangedMutex);
+ goto error_exit;
+ }
+
+ OIC_LOG(DEBUG, TAG, "wait for callback to notify MTU Changed Callback");
+ oc_cond_wait(g_threadMTUChangedCond, g_threadMTUChangedMutex);
+ oc_mutex_unlock(g_threadMTUChangedMutex);
+
+ OIC_LOG(DEBUG, TAG, "Done MTU");
+ ret = bt_gatt_client_get_att_mtu(serverInfo->clientHandle, &mtu_size);
+ if (BT_ERROR_NONE != ret)
+ {
+ OIC_LOG_V(ERROR, TAG,
+ "bt_gatt_client_get_att_mtu Failed with ret value [%s]",
+ CALEGetErrorMsg(ret));
+ goto error_exit;
+ }
+ OIC_LOG_V(DEBUG, TAG,"Negotiated MTU Size %d",mtu_size);
+
serverInfo->serviceHandle = serviceHandle;
serverInfo->readChar = readChrHandle;
serverInfo->writeChar = writeChrHandle;
serverInfo->status = LE_STATUS_SERVICES_DISCOVERED;
+ serverInfo->mtu_size = mtu_size;
while (serverInfo->pendingDataList)
{
OIC_LOG(DEBUG, TAG, "OUT");
return CA_STATUS_OK;
+
+error_exit:
+ bt_gatt_client_destroy(serverInfo->clientHandle);
+ oc_mutex_unlock(g_LEServerListMutex);
+ CALEGattDisConnect(remoteAddress);
+ return CA_STATUS_FAILED;
}
CAResult_t CAUpdateCharacteristicsToGattServer(const char *remoteAddress,
OIC_LOG(DEBUG, TAG, "OUT ");
return CA_STATUS_OK;
}
+
+uint16_t CALEClientGetMtuSize(const char* remote_address)
+{
+ LEServerInfo *serverInfo = NULL;
+ oc_mutex_lock(g_LEServerListMutex);
+ if (CA_STATUS_OK == CAGetLEServerInfo(g_LEServerList, remote_address, &serverInfo))
+ {
+ if (serverInfo->status == LE_STATUS_SERVICES_DISCOVERED){
+ OIC_LOG_V(DEBUG, TAG, "Mtu Size [%d]", serverInfo->mtu_size);
+ oc_mutex_unlock(g_LEServerListMutex);
+ return serverInfo->mtu_size;
+ }
+ }
+ oc_mutex_unlock(g_LEServerListMutex);
+ return CA_DEFAULT_BLE_MTU_SIZE;
+
+}