X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fip_adapter%2Fcaipadapter.c;h=59d4449b9b39b9e5c6425c0111090beb1f935f22;hb=e536bc9edf0ad1fea100e07755462dc0914304eb;hp=ccefc9aa1b64b4ca6ce3ee11bb1e26be6102b7af;hpb=dca59e1689fbcb2f4d3d30275cf27f4956a407a0;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/connectivity/src/ip_adapter/caipadapter.c b/resource/csdk/connectivity/src/ip_adapter/caipadapter.c index ccefc9a..59d4449 100644 --- a/resource/csdk/connectivity/src/ip_adapter/caipadapter.c +++ b/resource/csdk/connectivity/src/ip_adapter/caipadapter.c @@ -24,13 +24,18 @@ #include #include +#include "caipnwmonitor.h" #include "caipinterface.h" #include "caqueueingthread.h" #include "caadapterutils.h" #ifdef __WITH_DTLS__ -#include "caadapternetdtls.h" +#include "ca_adapter_net_ssl.h" +#ifdef WITH_TCP +#include "catcpinterface.h" #endif -#include "camutex.h" +#endif + +#include "octhread.h" #include "uarraylist.h" #include "caremotehandler.h" #include "logger.h" @@ -40,7 +45,7 @@ /** * Logging tag for module name. */ -#define TAG "IP_ADAP" +#define TAG "OIC_CA_IP_ADAP" #ifndef SINGLE_THREAD /** @@ -68,18 +73,18 @@ static CANetworkPacketReceivedCallback g_networkPacketCallback = NULL; /** * Network Changed Callback to CA. */ -static CANetworkChangeCallback g_networkChangeCallback = NULL; +static CAAdapterChangeCallback g_networkChangeCallback = NULL; /** * error Callback to CA adapter. */ static CAErrorHandleCallback g_errorCallback = NULL; -static void CAIPPacketReceivedCB(const CASecureEndpoint_t *endpoint, - const void *data, uint32_t dataLength); +static CAResult_t CAIPPacketReceivedCB(const CASecureEndpoint_t *endpoint, + const void *data, size_t dataLength); #ifdef __WITH_DTLS__ -static void CAIPPacketSendCB(CAEndpoint_t *endpoint, - const void *data, uint32_t dataLength); +static ssize_t CAIPPacketSendCB(CAEndpoint_t *endpoint, + const void *data, size_t dataLength); #endif #ifndef SINGLE_THREAD @@ -100,8 +105,6 @@ static void CADataDestroyer(void *data, uint32_t size); CAResult_t CAIPInitializeQueueHandles() { - OIC_LOG(DEBUG, TAG, "IN"); - // Check if the message queue is already initialized if (g_sendQueueHandle) { @@ -127,88 +130,91 @@ CAResult_t CAIPInitializeQueueHandles() return CA_STATUS_FAILED; } - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } void CAIPDeinitializeQueueHandles() { - OIC_LOG(DEBUG, TAG, "IN"); - CAQueueingThreadDestroy(g_sendQueueHandle); OICFree(g_sendQueueHandle); g_sendQueueHandle = NULL; - - OIC_LOG(DEBUG, TAG, "OUT"); } #endif // SINGLE_THREAD -void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status) +void CAIPAdapterHandler(CATransportAdapter_t adapter, CANetworkStatus_t status) { - (void)ipAddress; - (void)status; - OIC_LOG(DEBUG, TAG, "IN"); + if (g_networkChangeCallback) + { + g_networkChangeCallback(adapter, status); + } + else + { + OIC_LOG(ERROR, TAG, "g_networkChangeCallback is NULL"); + } + + if (CA_INTERFACE_DOWN == status) + { + OIC_LOG(DEBUG, TAG, "Network status for IP is down"); + + CAResult_t res = CAQueueingThreadClearData(g_sendQueueHandle); + if (res != CA_STATUS_OK) + { + OIC_LOG_V(ERROR, TAG, "CAQueueingThreadClearData failed[%d]", res); + } + +#ifdef __WITH_DTLS__ +#ifdef WITH_TCP + CATCPCloseInProgressConnections(); +#endif + OIC_LOG(DEBUG, TAG, "close all ssl session"); + CAcloseSslConnectionAll(CA_ADAPTER_IP); +#endif + } } #ifdef __WITH_DTLS__ -static void CAIPPacketSendCB(CAEndpoint_t *endpoint, const void *data, uint32_t dataLength) +static ssize_t CAIPPacketSendCB(CAEndpoint_t *endpoint, const void *data, size_t dataLength) { - OIC_LOG(DEBUG, TAG, "IN"); - - VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL"); - VERIFY_NON_NULL_VOID(data, TAG, "data is NULL"); + VERIFY_NON_NULL_RET(endpoint, TAG, "endpoint is NULL", -1); + VERIFY_NON_NULL_RET(data, TAG, "data is NULL", -1); CAIPSendData(endpoint, data, dataLength, false); - - OIC_LOG(DEBUG, TAG, "OUT"); + return dataLength; } #endif -void CAIPPacketReceivedCB(const CASecureEndpoint_t *sep, const void *data, - uint32_t dataLength) +CAResult_t CAIPPacketReceivedCB(const CASecureEndpoint_t *sep, const void *data, + size_t dataLength) { - OIC_LOG(DEBUG, TAG, "IN"); - - VERIFY_NON_NULL_VOID(sep, TAG, "sep is NULL"); - VERIFY_NON_NULL_VOID(data, TAG, "data is NULL"); + VERIFY_NON_NULL(sep, TAG, "sep is NULL"); + VERIFY_NON_NULL(data, TAG, "data is NULL"); OIC_LOG_V(DEBUG, TAG, "Address: %s, port:%d", sep->endpoint.addr, sep->endpoint.port); + CAResult_t res = CA_STATUS_OK; if (g_networkPacketCallback) { - g_networkPacketCallback(sep, data, dataLength); + res = g_networkPacketCallback(sep, data, dataLength); + if (CA_STATUS_OK != res) + { + OIC_LOG(ERROR, TAG, "Error parsing CoAP data"); + } } - OIC_LOG(DEBUG, TAG, "OUT"); + return res; } -void CAIPErrorHandler (const CAEndpoint_t *endpoint, const void *data, - uint32_t dataLength, CAResult_t result) +void CAIPErrorHandler(const CAEndpoint_t *endpoint, const void *data, + uint32_t dataLength, CAResult_t result) { - OIC_LOG(DEBUG, TAG, "IN"); - VERIFY_NON_NULL_VOID(endpoint, TAG, "endpoint is NULL"); - VERIFY_NON_NULL_VOID(data, TAG, "data is NULL"); - void *buf = (void*)OICMalloc(sizeof(char) * dataLength); - if (!buf) - { - OIC_LOG(ERROR, TAG, "Memory Allocation failed!"); - return; - } - memcpy(buf, data, dataLength); if (g_errorCallback) { - g_errorCallback(endpoint, buf, dataLength, result); - } - else - { - OICFree(buf); + g_errorCallback(endpoint, data, dataLength, result); } - - OIC_LOG(DEBUG, TAG, "OUT"); } static void CAInitializeIPGlobals() @@ -239,14 +245,17 @@ static void CAInitializeIPGlobals() { flags |= caglobals.serverFlags; } +//TODO Enable once TizenRT supports IPv6 +#ifndef __TIZENRT__ caglobals.ip.ipv6enabled = flags & CA_IPV6; +#endif caglobals.ip.ipv4enabled = flags & CA_IPV4; caglobals.ip.dualstack = caglobals.ip.ipv6enabled && caglobals.ip.ipv4enabled; } CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback, CANetworkPacketReceivedCallback networkPacketCallback, - CANetworkChangeCallback netCallback, + CAAdapterChangeCallback netCallback, CAErrorHandleCallback errorCallback, ca_thread_pool_t handle) { OIC_LOG(DEBUG, TAG, "IN"); @@ -264,25 +273,28 @@ CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback, CAInitializeIPGlobals(); caglobals.ip.threadpool = handle; - CAIPSetPacketReceiveCallback(CAIPPacketReceivedCB); -#ifdef __WITH_DTLS__ - CAAdapterNetDtlsInit(); + CAIPSetErrorHandler(CAIPErrorHandler); + CAIPSetPacketReceiveCallback((CAIPPacketReceivedCallback)CAIPPacketReceivedCB); - CADTLSSetAdapterCallbacks(CAIPPacketReceivedCB, CAIPPacketSendCB, 0); +#ifdef __WITH_DTLS__ + CAsetSslAdapterCallbacks(CAIPPacketReceivedCB, CAIPPacketSendCB, CA_ADAPTER_IP); #endif - CAConnectivityHandler_t ipHandler; - ipHandler.startAdapter = CAStartIP; - ipHandler.startListenServer = CAStartIPListeningServer; - ipHandler.stopListenServer = CAStopIPListeningServer; - ipHandler.startDiscoveryServer = CAStartIPDiscoveryServer; - ipHandler.sendData = CASendIPUnicastData; - ipHandler.sendDataToAll = CASendIPMulticastData; - ipHandler.GetnetInfo = CAGetIPInterfaceInformation; - ipHandler.readData = CAReadIPData; - ipHandler.stopAdapter = CAStopIP; - ipHandler.terminate = CATerminateIP; - registerCallback(ipHandler, CA_ADAPTER_IP); + static const CAConnectivityHandler_t ipHandler = + { + .startAdapter = CAStartIP, + .stopAdapter = CAStopIP, + .startListenServer = CAStartIPListeningServer, + .stopListenServer = CAStopIPListeningServer, + .startDiscoveryServer = CAStartIPDiscoveryServer, + .sendData = CASendIPUnicastData, + .sendDataToAll = CASendIPMulticastData, + .GetnetInfo = CAGetIPInterfaceInformation, + .readData = CAReadIPData, + .terminate = CATerminateIP, + .cType = CA_ADAPTER_IP + }; + registerCallback(ipHandler); OIC_LOG(INFO, TAG, "OUT IntializeIP is Success"); return CA_STATUS_OK; @@ -290,9 +302,13 @@ CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback, CAResult_t CAStartIP() { - OIC_LOG(DEBUG, TAG, "IN"); + // Specific the port number received from application. + caglobals.ip.u6.port = caglobals.ports.udp.u6; + caglobals.ip.u6s.port = caglobals.ports.udp.u6s; + caglobals.ip.u4.port = caglobals.ports.udp.u4; + caglobals.ip.u4s.port = caglobals.ports.udp.u4s; - CAIPStartNetworkMonitor(); + CAIPStartNetworkMonitor(CAIPAdapterHandler, CA_ADAPTER_IP); #ifdef SINGLE_THREAD uint16_t unicastPort = 55555; // Address is hardcoded as we are using Single Interface @@ -311,7 +327,11 @@ CAResult_t CAStartIP() } // Start send queue thread +#ifndef __TIZENRT__ if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle)) +#else + if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle, "IoT_IPSendQueue")) +#endif { OIC_LOG(ERROR, TAG, "Failed to Start Send Data Thread"); return CA_STATUS_FAILED; @@ -326,32 +346,29 @@ CAResult_t CAStartIP() #endif - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } CAResult_t CAStartIPListeningServer() { - OIC_LOG(DEBUG, TAG, "IN"); CAResult_t ret = CAIPStartListenServer(); if (CA_STATUS_OK != ret) { OIC_LOG_V(ERROR, TAG, "Failed to start listening server![%d]", ret); return ret; } - OIC_LOG(DEBUG, TAG, "OUT"); + return CA_STATUS_OK; } CAResult_t CAStopIPListeningServer() { - OIC_LOG(DEBUG, TAG, "IN"); CAResult_t ret = CAIPStopListenServer(); if (CA_STATUS_OK != ret) { OIC_LOG_V(ERROR, TAG, "Failed to stop listening server![%d]", ret); } - OIC_LOG(DEBUG, TAG, "OUT"); + return ret; } @@ -363,8 +380,6 @@ CAResult_t CAStartIPDiscoveryServer() static int32_t CAQueueIPData(bool isMulticast, const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength) { - OIC_LOG(DEBUG, TAG, "IN"); - VERIFY_NON_NULL_RET(endpoint, TAG, "remoteEndpoint", -1); VERIFY_NON_NULL_RET(data, TAG, "data", -1); @@ -394,63 +409,51 @@ static int32_t CAQueueIPData(bool isMulticast, const CAEndpoint_t *endpoint, #endif // SINGLE_THREAD - OIC_LOG(DEBUG, TAG, "OUT"); return dataLength; } int32_t CASendIPUnicastData(const CAEndpoint_t *endpoint, - const void *data, uint32_t dataLength) + const void *data, uint32_t dataLength, + CADataType_t dataType) { - OIC_LOG(DEBUG, TAG, "IN"); + (void)dataType; return CAQueueIPData(false, endpoint, data, dataLength); } -int32_t CASendIPMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength) +int32_t CASendIPMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength, + CADataType_t dataType) { - OIC_LOG(DEBUG, TAG, "IN"); + (void)dataType; return CAQueueIPData(true, endpoint, data, dataLength); } CAResult_t CAReadIPData() { - OIC_LOG(DEBUG, TAG, "IN"); CAIPPullData(); - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } CAResult_t CAStopIP() { - OIC_LOG(DEBUG, TAG, "IN"); - -#ifdef __WITH_DTLS__ - CAAdapterNetDtlsDeInit(); -#endif - #ifndef SINGLE_THREAD if (g_sendQueueHandle && g_sendQueueHandle->threadMutex) { CAQueueingThreadStop(g_sendQueueHandle); } - - CAIPDeinitializeQueueHandles(); #endif - CAIPStopNetworkMonitor(); + CAIPStopNetworkMonitor(CA_ADAPTER_IP); CAIPStopServer(); //Re-initializing the Globals to start them again CAInitializeIPGlobals(); - OIC_LOG(DEBUG, TAG, "OUT"); return CA_STATUS_OK; } void CATerminateIP() { - OIC_LOG(DEBUG, TAG, "IN"); - #ifdef __WITH_DTLS__ - CADTLSSetAdapterCallbacks(NULL, NULL, 0); + CAsetSslAdapterCallbacks(NULL, NULL, CA_ADAPTER_IP); #endif CAIPSetPacketReceiveCallback(NULL); @@ -458,16 +461,12 @@ void CATerminateIP() #ifndef SINGLE_THREAD CAIPDeinitializeQueueHandles(); #endif - - OIC_LOG(DEBUG, TAG, "OUT"); } #ifndef SINGLE_THREAD void CAIPSendDataThread(void *threadData) { - OIC_LOG(DEBUG, TAG, "IN"); - CAIPData_t *ipData = (CAIPData_t *) threadData; if (!ipData) { @@ -487,15 +486,13 @@ void CAIPSendDataThread(void *threadData) #ifdef __WITH_DTLS__ if (ipData->remoteEndpoint && ipData->remoteEndpoint->flags & CA_SECURE) { - OIC_LOG(DEBUG, TAG, "CAAdapterNetDtlsEncrypt called!"); - CAResult_t result = CAAdapterNetDtlsEncrypt(ipData->remoteEndpoint, - ipData->data, ipData->dataLen); + OIC_LOG(INFO, TAG, "DTLS encrypt called"); + CAResult_t result = CAencryptSsl(ipData->remoteEndpoint, ipData->data, ipData->dataLen); if (CA_STATUS_OK != result) { - OIC_LOG(ERROR, TAG, "CAAdapterNetDtlsEncrypt failed!"); + OIC_LOG(ERROR, TAG, "CAencryptSsl failed!"); } - OIC_LOG_V(DEBUG, TAG, - "CAAdapterNetDtlsEncrypt returned with result[%d]", result); + OIC_LOG_V(INFO, TAG, "CAencryptSsl returned with result[%d]", result); } else { @@ -506,17 +503,15 @@ void CAIPSendDataThread(void *threadData) CAIPSendData(ipData->remoteEndpoint, ipData->data, ipData->dataLen, false); #endif } - - OIC_LOG(DEBUG, TAG, "OUT"); } #endif #ifndef SINGLE_THREAD - CAIPData_t *CACreateIPData(const CAEndpoint_t *remoteEndpoint, const void *data, uint32_t dataLength, bool isMulticast) { + VERIFY_NON_NULL_RET(remoteEndpoint, TAG, "remoteEndpoint is NULL", NULL); VERIFY_NON_NULL_RET(data, TAG, "IPData is NULL", NULL); CAIPData_t *ipData = (CAIPData_t *) OICMalloc(sizeof(*ipData));