X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fconnectivity%2Fsrc%2Fip_adapter%2Fcaipadapter.c;h=308ec6dd13831a7c8e85a46b222973bf9946b490;hb=390866079e285d2c74918432c0d597d5da52f8a0;hp=3a320bdc46be6087757904e19f1ec7bee48df5b9;hpb=8c01dff2c5bc5496f7dc1632c498943ec6ecb015;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 3a320bd..308ec6d 100644 --- a/resource/csdk/connectivity/src/ip_adapter/caipadapter.c +++ b/resource/csdk/connectivity/src/ip_adapter/caipadapter.c @@ -1,4 +1,4 @@ -/****************************************************************** +/* **************************************************************** * * Copyright 2014 Samsung Electronics All Rights Reserved. * @@ -38,15 +38,13 @@ #include "oic_string.h" /** - * @def TAG - * @brief Logging tag for module name + * Logging tag for module name. */ -#define TAG "IP_ADAP" +#define TAG "OIC_CA_IP_ADAP" #ifndef SINGLE_THREAD /** - * @var CAIPData - * @brief Holds inter thread ip data information. + * Holds inter thread ip data information. */ typedef struct { @@ -54,34 +52,30 @@ typedef struct void *data; uint32_t dataLen; bool isMulticast; -} CAIPData; +} CAIPData_t; /** - * @var g_sendQueueHandle - * @brief Queue handle for Send Data + * Queue handle for Send Data. */ static CAQueueingThread_t *g_sendQueueHandle = NULL; #endif /** - * @var g_networkPacketCallback - * @brief Network Packet Received Callback to CA + * Network Packet Received Callback to CA. */ static CANetworkPacketReceivedCallback g_networkPacketCallback = NULL; /** - * @var g_networkChangeCallback - * @brief Network Changed Callback to CA + * Network Changed Callback to CA. */ static CANetworkChangeCallback g_networkChangeCallback = NULL; /** - * @var g_errorCallback - * @brief error Callback to CA adapter + * error Callback to CA adapter. */ static CAErrorHandleCallback g_errorCallback = NULL; -static void CAIPPacketReceivedCB(const CAEndpoint_t *endpoint, +static void CAIPPacketReceivedCB(const CASecureEndpoint_t *endpoint, const void *data, uint32_t dataLength); #ifdef __WITH_DTLS__ static void CAIPPacketSendCB(CAEndpoint_t *endpoint, @@ -96,17 +90,16 @@ static void CAIPDeinitializeQueueHandles(); static void CAIPSendDataThread(void *threadData); -static CAIPData *CACreateIPData(const CAEndpoint_t *remoteEndpoint, - const void *data, uint32_t dataLength, - bool isMulticast); -void CAFreeIPData(CAIPData *ipData); +static CAIPData_t *CACreateIPData(const CAEndpoint_t *remoteEndpoint, + const void *data, uint32_t dataLength, + bool isMulticast); + +void CAFreeIPData(CAIPData_t *ipData); 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) { @@ -132,97 +125,59 @@ 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) { - OIC_LOG(DEBUG, TAG, "IN"); + (void)ipAddress; + (void)status; } #ifdef __WITH_DTLS__ static void CAIPPacketSendCB(CAEndpoint_t *endpoint, const void *data, uint32_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"); CAIPSendData(endpoint, data, dataLength, false); - - OIC_LOG(DEBUG, TAG, "OUT"); } #endif -void CAIPPacketReceivedCB(const CAEndpoint_t *endpoint, const void *data, + +void CAIPPacketReceivedCB(const CASecureEndpoint_t *sep, const void *data, uint32_t dataLength) { - OIC_LOG(DEBUG, TAG, "IN"); - - VERIFY_NON_NULL_VOID(endpoint, TAG, "ipAddress is NULL"); + VERIFY_NON_NULL_VOID(sep, TAG, "sep is NULL"); VERIFY_NON_NULL_VOID(data, TAG, "data is NULL"); - OIC_LOG_V(DEBUG, TAG, "Address: %s, port:%d", endpoint->addr, endpoint->port); - - void *buf = OICCalloc(dataLength + 1, sizeof (char)); - if (!buf) - { - OIC_LOG(ERROR, TAG, "Memory Allocation failed!"); - return; - } - memcpy(buf, data, dataLength); + OIC_LOG_V(DEBUG, TAG, "Address: %s, port:%d", sep->endpoint.addr, sep->endpoint.port); if (g_networkPacketCallback) { - g_networkPacketCallback(endpoint, buf, dataLength); - } - else - { - OICFree(buf); + g_networkPacketCallback(sep, data, dataLength); } - OIC_LOG(DEBUG, TAG, "OUT"); } -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() @@ -255,6 +210,7 @@ static void CAInitializeIPGlobals() } caglobals.ip.ipv6enabled = flags & CA_IPV6; caglobals.ip.ipv4enabled = flags & CA_IPV4; + caglobals.ip.dualstack = caglobals.ip.ipv6enabled && caglobals.ip.ipv4enabled; } CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback, @@ -284,17 +240,21 @@ CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback, CADTLSSetAdapterCallbacks(CAIPPacketReceivedCB, CAIPPacketSendCB, 0); #endif - CAConnectivityHandler_t ipHandler; - ipHandler.startAdapter = CAStartIP; - ipHandler.startListenServer = CAStartIPListeningServer; - 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; @@ -302,8 +262,7 @@ CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback, CAResult_t CAStartIP() { - OIC_LOG(DEBUG, TAG, "IN"); - + CAIPStartNetworkMonitor(); #ifdef SINGLE_THREAD uint16_t unicastPort = 55555; // Address is hardcoded as we are using Single Interface @@ -337,29 +296,40 @@ 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() +{ + CAResult_t ret = CAIPStopListenServer(); + if (CA_STATUS_OK != ret) + { + OIC_LOG_V(ERROR, TAG, "Failed to stop listening server![%d]", ret); + } + + return ret; +} + CAResult_t CAStartIPDiscoveryServer() { - OIC_LOG(DEBUG, TAG, "IN"); return CAStartIPListeningServer(); } static int32_t CAQueueIPData(bool isMulticast, const CAEndpoint_t *endpoint, - const void *data, uint32_t dataLength) + 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); @@ -372,51 +342,45 @@ static int32_t CAQueueIPData(bool isMulticast, const CAEndpoint_t *endpoint, #ifdef SINGLE_THREAD CAIPSendData(endpoint, data, dataLength, isMulticast); + return dataLength; #else VERIFY_NON_NULL_RET(g_sendQueueHandle, TAG, "sendQueueHandle", -1); // Create IPData to add to queue - CAIPData *ipData = CACreateIPData(endpoint, data, dataLength, isMulticast); + CAIPData_t *ipData = CACreateIPData(endpoint, data, dataLength, isMulticast); if (!ipData) { OIC_LOG(ERROR, TAG, "Failed to create ipData!"); return -1; } // Add message to send queue - CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData)); - - OIC_LOG(DEBUG, TAG, "OUT"); - return dataLength; + CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData_t)); #endif // SINGLE_THREAD + + return dataLength; } int32_t CASendIPUnicastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength) { - OIC_LOG(DEBUG, TAG, "IN"); return CAQueueIPData(false, endpoint, data, dataLength); } int32_t CASendIPMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength) { - OIC_LOG(DEBUG, TAG, "IN"); 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 @@ -426,20 +390,18 @@ CAResult_t CAStopIP() { CAQueueingThreadStop(g_sendQueueHandle); } - - CAIPDeinitializeQueueHandles(); #endif + CAIPStopNetworkMonitor(); 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); #endif @@ -447,19 +409,16 @@ void CATerminateIP() CAIPSetPacketReceiveCallback(NULL); #ifndef SINGLE_THREAD + CADeInitializeIPGlobals(); CAIPDeinitializeQueueHandles(); #endif - - OIC_LOG(DEBUG, TAG, "OUT"); } #ifndef SINGLE_THREAD void CAIPSendDataThread(void *threadData) { - OIC_LOG(DEBUG, TAG, "IN"); - - CAIPData *ipData = (CAIPData *) threadData; + CAIPData_t *ipData = (CAIPData_t *) threadData; if (!ipData) { OIC_LOG(DEBUG, TAG, "Invalid ip data!"); @@ -476,7 +435,7 @@ void CAIPSendDataThread(void *threadData) { //Processing for sending unicast #ifdef __WITH_DTLS__ - if (ipData->remoteEndpoint->flags & CA_SECURE) + if (ipData->remoteEndpoint && ipData->remoteEndpoint->flags & CA_SECURE) { OIC_LOG(DEBUG, TAG, "CAAdapterNetDtlsEncrypt called!"); CAResult_t result = CAAdapterNetDtlsEncrypt(ipData->remoteEndpoint, @@ -497,20 +456,18 @@ void CAIPSendDataThread(void *threadData) CAIPSendData(ipData->remoteEndpoint, ipData->data, ipData->dataLen, false); #endif } - - OIC_LOG(DEBUG, TAG, "OUT"); } #endif #ifndef SINGLE_THREAD - -CAIPData *CACreateIPData(const CAEndpoint_t *remoteEndpoint, const void *data, - uint32_t dataLength, bool isMulticast) +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 *ipData = (CAIPData *) OICMalloc(sizeof(CAIPData)); + CAIPData_t *ipData = (CAIPData_t *) OICMalloc(sizeof(*ipData)); if (!ipData) { OIC_LOG(ERROR, TAG, "Memory allocation failed!"); @@ -534,7 +491,7 @@ CAIPData *CACreateIPData(const CAEndpoint_t *remoteEndpoint, const void *data, return ipData; } -void CAFreeIPData(CAIPData *ipData) +void CAFreeIPData(CAIPData_t *ipData) { VERIFY_NON_NULL_VOID(ipData, TAG, "ipData is NULL"); @@ -545,10 +502,13 @@ void CAFreeIPData(CAIPData *ipData) void CADataDestroyer(void *data, uint32_t size) { - CAIPData *etdata = (CAIPData *) data; + if (size < sizeof(CAIPData_t)) + { + OIC_LOG_V(ERROR, TAG, "Destroy data too small %p %d", data, size); + } + CAIPData_t *etdata = (CAIPData_t *) data; CAFreeIPData(etdata); } #endif // SINGLE_THREAD -