X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fcainterfacecontroller.c;h=5153b690dbea43be87fc7c1553b3a36a52e8c6cb;hb=8f51e668ae78cb8ea4e57576160ab99ddcd40a81;hp=6c4a81f511abe62decd1b180cc0f4c420e931d97;hpb=074d5ecdd557332ca4550e08f9718dfc35279f60;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/cainterfacecontroller.c b/resource/csdk/connectivity/src/cainterfacecontroller.c index 6c4a81f..5153b69 100644 --- a/resource/csdk/connectivity/src/cainterfacecontroller.c +++ b/resource/csdk/connectivity/src/cainterfacecontroller.c @@ -30,6 +30,7 @@ #include "cainterfacecontroller.h" #include "caedradapter.h" #include "caleadapter.h" +#include "canfcadapter.h" #include "caremotehandler.h" #include "cathreadpool.h" #include "caipadapter.h" @@ -39,57 +40,44 @@ #include "caraadapter.h" #endif -#define TAG "CA_INTRFC_CNTRLR" -#ifdef RA_ADAPTER -#include "caraadapter.h" +#ifdef TCP_ADAPTER +#include "catcpadapter.h" #endif +#define TAG "OIC_CA_INF_CTR" #define CA_MEMORY_ALLOC_CHECK(arg) {if (arg == NULL) \ {OIC_LOG(ERROR, TAG, "memory error");goto memory_error_exit;} } -#ifdef RA_ADAPTER -#define CA_TRANSPORT_TYPE_NUM 4 -#else -#define CA_TRANSPORT_TYPE_NUM 3 -#endif +static CAConnectivityHandler_t *g_adapterHandler = NULL; -static CAConnectivityHandler_t g_adapterHandler[CA_TRANSPORT_TYPE_NUM] = {}; +static uint32_t g_numberOfAdapters = 0; static CANetworkPacketReceivedCallback g_networkPacketReceivedCallback = NULL; -static CANetworkChangeCallback g_networkChangeCallback = NULL; +static CAAdapterStateChangedCB g_adapterChangeCallback = NULL; + +static CAConnectionStateChangedCB g_connChangeCallback = NULL; static CAErrorHandleCallback g_errorHandleCallback = NULL; static int CAGetAdapterIndex(CATransportAdapter_t cType) { - switch (cType) + for (uint32_t index=0 ; index < g_numberOfAdapters ; index++) { - case CA_ADAPTER_IP: - return 0; - case CA_ADAPTER_GATT_BTLE: - return 1; - case CA_ADAPTER_RFCOMM_BTEDR: - return 2; - - #ifdef RA_ADAPTER - case CA_ADAPTER_REMOTE_ACCESS: - return 3; - #endif - - default: - break; + if (cType == g_adapterHandler[index].cType ) + { + return index; + } } return -1; } -static void CARegisterCallback(CAConnectivityHandler_t handler, CATransportAdapter_t cType) +static void CARegisterCallback(CAConnectivityHandler_t handler) { - OIC_LOG(DEBUG, TAG, "IN"); - - if(handler.startAdapter == NULL || + if (handler.startAdapter == NULL || handler.startListenServer == NULL || + handler.stopListenServer == NULL || handler.startDiscoveryServer == NULL || handler.sendData == NULL || handler.sendDataToAll == NULL || @@ -101,19 +89,19 @@ static void CARegisterCallback(CAConnectivityHandler_t handler, CATransportAdapt OIC_LOG(ERROR, TAG, "connectivity handler is not enough to be used!"); return; } - - int index = CAGetAdapterIndex(cType); - - if (index == -1) + uint32_t numberofAdapters = g_numberOfAdapters + 1; + CAConnectivityHandler_t *adapterHandler = OICRealloc(g_adapterHandler, + (numberofAdapters) * sizeof(*adapterHandler)); + if (NULL == adapterHandler) { - OIC_LOG(ERROR, TAG, "unknown connectivity type!"); + OIC_LOG(ERROR, TAG, "Memory allocation failed during registration"); return; } + g_adapterHandler = adapterHandler; + g_numberOfAdapters = numberofAdapters; + g_adapterHandler[g_numberOfAdapters-1] = handler; - g_adapterHandler[index] = handler; - - OIC_LOG_V(DEBUG, TAG, "%d type adapter, register complete!", cType); - OIC_LOG(DEBUG, TAG, "OUT"); + OIC_LOG_V(DEBUG, TAG, "%d type adapter, register complete!", handler.cType); } #ifdef RA_ADAPTER @@ -123,37 +111,47 @@ CAResult_t CASetAdapterRAInfo(const CARAInfo_t *caraInfo) } #endif -static void CAReceivedPacketCallback(const CAEndpoint_t *endpoint, void *data, uint32_t dataLen) +static void CAReceivedPacketCallback(const CASecureEndpoint_t *sep, + const void *data, uint32_t dataLen) { - OIC_LOG(DEBUG, TAG, "IN"); - - // Call the callback. if (g_networkPacketReceivedCallback != NULL) { - g_networkPacketReceivedCallback(endpoint, data, dataLen); + g_networkPacketReceivedCallback(sep, data, dataLen); } else { - OICFree(data); - OIC_LOG(ERROR, TAG, "network packet received callback is NULL!"); } - - OIC_LOG(DEBUG, TAG, "OUT"); } -static void CANetworkChangedCallback(const CAEndpoint_t *info, CANetworkStatus_t status) +static void CAAdapterChangedCallback(CATransportAdapter_t adapter, CANetworkStatus_t status) { - OIC_LOG(DEBUG, TAG, "IN"); - // Call the callback. - if (g_networkChangeCallback != NULL) + if (g_adapterChangeCallback != NULL) { - g_networkChangeCallback(info, status); + if (CA_INTERFACE_UP == status) + { + g_adapterChangeCallback(adapter, true); + } + else if (CA_INTERFACE_DOWN == status) + { + g_adapterChangeCallback(adapter, false); + } } + OIC_LOG_V(DEBUG, TAG, "[%d]adapter status is changed to [%d]", adapter, status); +} - OIC_LOG(DEBUG, TAG, "OUT"); +#if defined(TCP_ADAPTER) || defined(EDR_ADAPTER) || defined(LE_ADAPTER) +static void CAConnectionChangedCallback(const CAEndpoint_t *info, bool isConnected) +{ + // Call the callback. + if (g_connChangeCallback != NULL) + { + g_connChangeCallback(info, isConnected); + } + OIC_LOG_V(DEBUG, TAG, "[%s] connection status is changed to [%d]", info->addr, isConnected); } +#endif static void CAAdapterErrorHandleCallback(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLen, @@ -172,48 +170,52 @@ void CAInitializeAdapters(ca_thread_pool_t handle) { OIC_LOG(DEBUG, TAG, "initialize adapters.."); - memset(g_adapterHandler, 0, sizeof(CAConnectivityHandler_t) * CA_TRANSPORT_TYPE_NUM); - // Initialize adapters and register callback. #ifdef IP_ADAPTER - CAInitializeIP(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback, + CAInitializeIP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback, CAAdapterErrorHandleCallback, handle); #endif /* IP_ADAPTER */ #ifdef EDR_ADAPTER - CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback, - CAAdapterErrorHandleCallback, handle); + CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback, + CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle); #endif /* EDR_ADAPTER */ #ifdef LE_ADAPTER - CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback, - CAAdapterErrorHandleCallback, handle); + CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback, + CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle); #endif /* LE_ADAPTER */ #ifdef RA_ADAPTER - CAInitializeRA(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback, + CAInitializeRA(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback, handle); #endif /* RA_ADAPTER */ +#ifdef TCP_ADAPTER + CAInitializeTCP(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback, + CAConnectionChangedCallback, CAAdapterErrorHandleCallback, handle); +#endif /* TCP_ADAPTER */ +#ifdef NFC_ADAPTER + CAInitializeNFC(CARegisterCallback, CAReceivedPacketCallback, CAAdapterChangedCallback, + CAAdapterErrorHandleCallback, handle); +#endif /* NFC_ADAPTER */ } void CASetPacketReceivedCallback(CANetworkPacketReceivedCallback callback) { - OIC_LOG(DEBUG, TAG, "IN"); + OIC_LOG(DEBUG, TAG, "Set Receiver handle callback"); g_networkPacketReceivedCallback = callback; - - OIC_LOG(DEBUG, TAG, "OUT"); } -void CASetNetworkChangeCallback(CANetworkChangeCallback callback) +void CASetNetworkMonitorCallbacks(CAAdapterStateChangedCB adapterCB, + CAConnectionStateChangedCB connCB) { - OIC_LOG(DEBUG, TAG, "IN"); + OIC_LOG(DEBUG, TAG, "Set network monitoring callback"); - g_networkChangeCallback = callback; - - OIC_LOG(DEBUG, TAG, "OUT"); + g_adapterChangeCallback = adapterCB; + g_connChangeCallback = connCB; } void CASetErrorHandleCallback(CAErrorHandleCallback errorCallback) @@ -227,19 +229,19 @@ CAResult_t CAStartAdapter(CATransportAdapter_t transportType) OIC_LOG_V(DEBUG, TAG, "Start the adapter of CAConnectivityType[%d]", transportType); int index = CAGetAdapterIndex(transportType); - - if (index == -1) + if (0 > index) { OIC_LOG(ERROR, TAG, "unknown connectivity type!"); return CA_STATUS_FAILED; } + CAResult_t res = CA_STATUS_FAILED; if (g_adapterHandler[index].startAdapter != NULL) { - g_adapterHandler[index].startAdapter(); + res = g_adapterHandler[index].startAdapter(); } - return CA_STATUS_OK; + return res; } void CAStopAdapter(CATransportAdapter_t transportType) @@ -247,8 +249,7 @@ void CAStopAdapter(CATransportAdapter_t transportType) OIC_LOG_V(DEBUG, TAG, "Stop the adapter of CATransportType[%d]", transportType); int index = CAGetAdapterIndex(transportType); - - if (index == -1) + if (0 > index) { OIC_LOG(ERROR, TAG, "unknown transport type!"); return; @@ -267,12 +268,23 @@ CAResult_t CAGetNetworkInfo(CAEndpoint_t **info, uint32_t *size) return CA_STATUS_INVALID_PARAM; } - CAEndpoint_t *tempInfo[CA_TRANSPORT_TYPE_NUM] = { 0 }; - uint32_t tempSize[CA_TRANSPORT_TYPE_NUM] = { 0 }; + CAEndpoint_t **tempInfo = (CAEndpoint_t**) OICCalloc(g_numberOfAdapters, sizeof(*tempInfo)); + if (!tempInfo) + { + OIC_LOG(ERROR, TAG, "Out of memory!"); + return CA_MEMORY_ALLOC_FAILED; + } + uint32_t *tempSize =(uint32_t*) OICCalloc(g_numberOfAdapters, sizeof(*tempSize)); + if (!tempSize) + { + OIC_LOG(ERROR, TAG, "Out of memory!"); + OICFree(tempInfo); + return CA_MEMORY_ALLOC_FAILED; + } CAResult_t res = CA_STATUS_FAILED; - uint32_t resSize = 0; - for (int index = 0; index < CA_TRANSPORT_TYPE_NUM; index++) + size_t resSize = 0; + for (uint32_t index = 0; index < g_numberOfAdapters; index++) { if (g_adapterHandler[index].GetnetInfo != NULL) { @@ -288,22 +300,27 @@ CAResult_t CAGetNetworkInfo(CAEndpoint_t **info, uint32_t *size) OIC_LOG_V(DEBUG, TAG, - "%d adapter network info size is %" PRIu32 " res:%d", + "%" PRIu32 " adapter network info size is %" PRIu32 " res:%d", index, tempSize[index], res); } } - OIC_LOG_V(DEBUG, TAG, "network info total size is %d!", resSize); + OIC_LOG_V(DEBUG, TAG, "network info total size is %zu!", resSize); if (resSize == 0) { + OICFree(tempInfo); + OICFree(tempSize); if (res == CA_ADAPTER_NOT_ENABLED || res == CA_NOT_SUPPORTED) { return res; } - return CA_STATUS_FAILED; + else + { + return CA_STATUS_FAILED; + } } // #3. add data into result @@ -315,7 +332,7 @@ CAResult_t CAGetNetworkInfo(CAEndpoint_t **info, uint32_t *size) *info = resInfo; *size = resSize; - for (int index = 0; index < CA_TRANSPORT_TYPE_NUM; index++) + for (uint32_t index = 0; index < g_numberOfAdapters; index++) { // check information if (tempSize[index] == 0) @@ -333,6 +350,8 @@ CAResult_t CAGetNetworkInfo(CAEndpoint_t **info, uint32_t *size) OICFree(tempInfo[index]); tempInfo[index] = NULL; } + OICFree(tempInfo); + OICFree(tempSize); OIC_LOG(DEBUG, TAG, "each network info save success!"); return CA_STATUS_OK; @@ -340,90 +359,117 @@ CAResult_t CAGetNetworkInfo(CAEndpoint_t **info, uint32_t *size) // memory error label. memory_error_exit: - for (int index = 0; index < CA_TRANSPORT_TYPE_NUM; index++) + for (uint32_t index = 0; index < g_numberOfAdapters; index++) { - OICFree(tempInfo[index]); tempInfo[index] = NULL; } + OICFree(tempInfo); + OICFree(tempSize); return CA_MEMORY_ALLOC_FAILED; } -CAResult_t CASendUnicastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length) +CAResult_t CASendUnicastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length, + CADataType_t dataType) { - OIC_LOG(DEBUG, TAG, "IN"); - - CAResult_t res = CA_STATUS_FAILED; - if (endpoint == NULL) { OIC_LOG(DEBUG, TAG, "Invalid endpoint"); return CA_STATUS_INVALID_PARAM; } - CATransportAdapter_t type = endpoint->adapter; - int index = CAGetAdapterIndex(type); - - if (index == -1) + u_arraylist_t *list = CAGetSelectedNetworkList(); + if (!list) { - OIC_LOG(ERROR, TAG, "unknown transport type!"); - return CA_STATUS_INVALID_PARAM; + OIC_LOG(ERROR, TAG, "No selected network"); + return CA_SEND_FAILED; } + CATransportAdapter_t requestedAdapter = endpoint->adapter ? endpoint->adapter : CA_ALL_ADAPTERS; - uint32_t sentDataLen = 0; - - if (g_adapterHandler[index].sendData != NULL) + for (uint32_t i = 0; i < u_arraylist_length(list); i++) { - sentDataLen = g_adapterHandler[index].sendData(endpoint, data, length); - } + void* ptrType = u_arraylist_get(list, i); + + if (NULL == ptrType) + { + continue; + } + + CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType; + if (0 == (connType & requestedAdapter)) + { + continue; + } + + int index = CAGetAdapterIndex(connType); + + if (-1 == index) + { + OIC_LOG(ERROR, TAG, "unknown transport type!"); + return CA_STATUS_INVALID_PARAM; + } + + int32_t sentDataLen = 0; + + if (NULL != g_adapterHandler[index].sendData) + { + OIC_LOG(DEBUG, TAG, "unicast message to adapter"); + sentDataLen = g_adapterHandler[index].sendData(endpoint, data, length, dataType); + } + + if (sentDataLen != (int32_t)length) + { + OIC_LOG(ERROR, TAG, "error in sending data. Error will be reported in adapter"); +#ifdef SINGLE_THREAD + //in case of single thread, no error handler. Report error immediately + return CA_SEND_FAILED; +#endif + } - if (sentDataLen != -1) - { - res = CA_STATUS_OK; } - OIC_LOG(DEBUG, TAG, "OUT"); - return res; + return CA_STATUS_OK; } -CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length) +CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t length, + CADataType_t dataType) { - OIC_LOG(DEBUG, TAG, "IN"); - - CAResult_t res = CA_SEND_FAILED; u_arraylist_t *list = CAGetSelectedNetworkList(); - if (!list) { OIC_LOG(DEBUG, TAG, "No selected network"); return CA_SEND_FAILED; } - int i = 0; - for (i = 0; i < u_arraylist_length(list); i++) + CATransportAdapter_t requestedAdapter = endpoint->adapter ? endpoint->adapter : CA_ALL_ADAPTERS; + size_t selectedLength = u_arraylist_length(list); + for (size_t i = 0; i < selectedLength; i++) { void* ptrType = u_arraylist_get(list, i); - if(ptrType == NULL) + if (NULL == ptrType) { continue; } CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType; + if (0 == (connType & requestedAdapter)) + { + continue; + } int index = CAGetAdapterIndex(connType); - - if (index == -1) + if (0 > index) { - OIC_LOG(DEBUG, TAG, "unknown connectivity type!"); + OIC_LOG(ERROR, TAG, "unknown connectivity type!"); continue; } uint32_t sentDataLen = 0; - if (g_adapterHandler[index].sendDataToAll != NULL) + if (NULL != g_adapterHandler[index].sendDataToAll) { void *payload = (void *) OICMalloc(length); if (!payload) @@ -432,38 +478,36 @@ CAResult_t CASendMulticastData(const CAEndpoint_t *endpoint, const void *data, u return CA_MEMORY_ALLOC_FAILED; } memcpy(payload, data, length); - sentDataLen = g_adapterHandler[index].sendDataToAll(endpoint, payload, length); + sentDataLen = g_adapterHandler[index].sendDataToAll(endpoint, payload, length, dataType); OICFree(payload); } - if (sentDataLen == length) + if (sentDataLen != length) { - res = CA_STATUS_OK; - } - else - { - OIC_LOG(ERROR, TAG, "sendDataToAll failed!"); + OIC_LOG(ERROR, TAG, "sendDataToAll failed! Error will be reported from adapter"); +#ifdef SINGLE_THREAD + //in case of single thread, no error handler. Report error immediately + return CA_SEND_FAILED; +#endif } } - OIC_LOG(DEBUG, TAG, "OUT"); - - return res; + return CA_STATUS_OK; } CAResult_t CAStartListeningServerAdapters() { - OIC_LOG(DEBUG, TAG, "IN"); + CAResult_t result = CA_STATUS_FAILED; u_arraylist_t *list = CAGetSelectedNetworkList(); if (!list) { OIC_LOG(ERROR, TAG, "No selected network"); - return CA_STATUS_FAILED; + return result; } - int i = 0; - for (i = 0; i < u_arraylist_length(list); i++) + size_t length = u_arraylist_length(list); + for (size_t i = 0; i < length; i++) { void* ptrType = u_arraylist_get(list, i); @@ -475,7 +519,7 @@ CAResult_t CAStartListeningServerAdapters() CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType; int index = CAGetAdapterIndex(connType); - if (index == -1) + if (0 > index) { OIC_LOG(ERROR, TAG, "unknown connectivity type!"); continue; @@ -483,28 +527,70 @@ CAResult_t CAStartListeningServerAdapters() if (g_adapterHandler[index].startListenServer != NULL) { - g_adapterHandler[index].startListenServer(); + const CAResult_t tmp = + g_adapterHandler[index].startListenServer(); + + // Successful listen if at least one adapter started. + if (CA_STATUS_OK == tmp) + { + result = tmp; + } + } + } + + return result; +} + +CAResult_t CAStopListeningServerAdapters() +{ + u_arraylist_t *list = CAGetSelectedNetworkList(); + if (!list) + { + OIC_LOG(ERROR, TAG, "No selected network"); + return CA_STATUS_FAILED; + } + + size_t length = u_arraylist_length(list); + for (size_t i = 0; i < length; i++) + { + void* ptrType = u_arraylist_get(list, i); + if(ptrType == NULL) + { + continue; + } + + CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType; + + int index = CAGetAdapterIndex(connType); + if (0 > index) + { + OIC_LOG(ERROR, TAG, "unknown connectivity type!"); + continue; + } + + if (g_adapterHandler[index].stopListenServer != NULL) + { + g_adapterHandler[index].stopListenServer(); } } - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } CAResult_t CAStartDiscoveryServerAdapters() { - OIC_LOG(DEBUG, TAG, "IN"); + CAResult_t result = CA_STATUS_FAILED; u_arraylist_t *list = CAGetSelectedNetworkList(); if (!list) { OIC_LOG(ERROR, TAG, "No selected network"); - return CA_STATUS_FAILED; + return result; } - int i = 0; - for (i = 0; i < u_arraylist_length(list); i++) + size_t length = u_arraylist_length(list); + for (size_t i = 0; i < length; i++) { void* ptrType = u_arraylist_get(list, i); @@ -516,8 +602,7 @@ CAResult_t CAStartDiscoveryServerAdapters() CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType; int index = CAGetAdapterIndex(connType); - - if (index == -1) + if (0 > index) { OIC_LOG(DEBUG, TAG, "unknown connectivity type!"); continue; @@ -525,20 +610,23 @@ CAResult_t CAStartDiscoveryServerAdapters() if (g_adapterHandler[index].startDiscoveryServer != NULL) { - g_adapterHandler[index].startDiscoveryServer(); + const CAResult_t tmp = + g_adapterHandler[index].startDiscoveryServer(); + + // Successful discovery if at least one adapter started. + if (CA_STATUS_OK == tmp) + { + result = tmp; + } } } - OIC_LOG(DEBUG, TAG, "OUT"); - return CA_STATUS_OK; + return result; } void CATerminateAdapters() { - OIC_LOG(DEBUG, TAG, "IN"); - - uint32_t index; - for (index = 0; index < CA_TRANSPORT_TYPE_NUM; index++) + for (uint32_t index = 0; index < g_numberOfAdapters; index++) { if (g_adapterHandler[index].terminate != NULL) { @@ -546,13 +634,14 @@ void CATerminateAdapters() } } - OIC_LOG(DEBUG, TAG, "OUT"); + OICFree(g_adapterHandler); + g_adapterHandler = NULL; + g_numberOfAdapters = 0; } #ifdef SINGLE_THREAD CAResult_t CAReadData() { - OIC_LOG(DEBUG, TAG, "IN"); u_arraylist_t *list = CAGetSelectedNetworkList(); if (!list) @@ -573,8 +662,7 @@ CAResult_t CAReadData() CATransportAdapter_t connType = *(CATransportAdapter_t *) ptrType; int index = CAGetAdapterIndex(connType); - - if (-1 == index) + if (0 > index) { OIC_LOG(DEBUG, TAG, "unknown connectivity type!"); continue; @@ -586,7 +674,6 @@ CAResult_t CAReadData() } } - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } #endif