1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
20 #include "caipadapter.h"
27 #include "caipinterface.h"
28 #include "caqueueingthread.h"
29 #include "caadapterutils.h"
31 #include "caadapternetdtls.h"
34 #include "uarraylist.h"
36 #include "oic_malloc.h"
40 * @brief Logging tag for module name
42 #define IP_ADAPTER_TAG "IP_ADAP"
46 * @brief Port to listen for incoming data
52 * @brief Secured (unicast) port number as defined in COAP Specification, RFC-7252.
54 #define CA_SECURE_PORT 5684
58 * @brief Multicast port number as defined in COAP Specification, RFC-7252.
60 #define CA_MCAST_PORT 5683
63 * @def CA_MULTICAST_IP
64 * @brief Multicast IP Address as defined in COAP Specification, RFC-7252.
66 #define CA_MULTICAST_IP "224.0.1.187"
70 * @brief Holds inter thread ip data information.
74 CARemoteEndpoint_t *remoteEndpoint;
80 * @var g_networkPacketCallback
81 * @brief Network Packet Received Callback to CA
83 static CANetworkPacketReceivedCallback g_networkPacketCallback = NULL;
86 * @var g_networkChangeCallback
87 * @brief Network Changed Callback to CA
89 static CANetworkChangeCallback g_networkChangeCallback = NULL;
92 * @var g_errorCallback
93 * @brief error Callback to CA adapter
95 static CAErrorHandleCallback g_errorCallback = NULL;
98 * @var g_sendQueueHandle
99 * @brief Queue handle for Send Data
101 static CAQueueingThread_t *g_sendQueueHandle = NULL;
105 * @brief ThreadPool for storing ca_thread_pool_t handle passed from CA
107 static ca_thread_pool_t g_threadPool = NULL;
109 static CAResult_t CAIPInitializeQueueHandles();
111 static void CAIPDeinitializeQueueHandles();
113 static void CAIPNotifyNetworkChange(const char *address, uint16_t port,
114 CANetworkStatus_t status);
116 static void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status);
118 static void CAIPPacketReceivedCB(const char *ipAddress, uint16_t port, const void *data,
119 uint32_t dataLength, bool isSecured);
120 static void CAIPErrorHandler(const char *ipAddress, uint16_t port, const void *data,
121 uint32_t dataLength, bool isSecured, CAResult_t result);
124 static uint32_t CAIPPacketSendCB(const char *ipAddress, uint16_t port,
125 const void *data, uint32_t dataLength);
128 static CAResult_t CAIPStopServers();
130 static void CAIPSendDataThread(void *threadData);
132 static CAIPData *CACreateIPData(const CARemoteEndpoint_t *remoteEndpoint,
133 const void *data, uint32_t dataLength);
134 void CAFreeIPData(CAIPData *ipData);
136 static void CADataDestroyer(void *data, uint32_t size);
138 CAResult_t CAIPInitializeQueueHandles()
140 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
142 // Check if the message queue is already initialized
143 if (g_sendQueueHandle)
145 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "send queue handle is already initialized!");
149 // Create send message queue
150 g_sendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
151 if (!g_sendQueueHandle)
153 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
154 return CA_MEMORY_ALLOC_FAILED;
157 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_threadPool,
158 CAIPSendDataThread, CADataDestroyer))
160 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize send queue thread");
161 OICFree(g_sendQueueHandle);
162 g_sendQueueHandle = NULL;
163 return CA_STATUS_FAILED;
166 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
170 void CAIPDeinitializeQueueHandles()
172 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
174 CAQueueingThreadDestroy(g_sendQueueHandle);
175 OICFree(g_sendQueueHandle);
176 g_sendQueueHandle = NULL;
178 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
181 void CAIPNotifyNetworkChange(const char *address, uint16_t port, CANetworkStatus_t status)
183 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
185 VERIFY_NON_NULL_VOID(address, IP_ADAPTER_TAG, "address is NULL");
187 CALocalConnectivity_t *localEndpoint = CAAdapterCreateLocalEndpoint(CA_IPV4, address);
190 OIC_LOG(ERROR, IP_ADAPTER_TAG, "localEndpoint creation failed!");
194 localEndpoint->addressInfo.IP.port = port;
196 if (g_networkChangeCallback)
198 g_networkChangeCallback(localEndpoint, status);
202 OIC_LOG(ERROR, IP_ADAPTER_TAG, "g_networkChangeCallback is NULL");
205 CAAdapterFreeLocalEndpoint(localEndpoint);
207 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
210 void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status)
212 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
214 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
216 if (CA_INTERFACE_UP == status)
218 uint16_t port = CA_PORT;
219 CAResult_t ret = CAIPStartUnicastServer(ipAddress, &port, false, false);
220 if (CA_STATUS_OK == ret)
222 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port", port);
226 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Unicast server port[%d]", ret);
230 port = CA_SECURE_PORT;
231 ret = CAIPStartUnicastServer(ipAddress, &port, false, true);
232 if (CA_STATUS_OK == ret)
234 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Secure Unicast server started on %d", port);
238 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start secure Unicast server [%d]",
242 ret = CAIPStartMulticastServer(ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
243 if (CA_STATUS_OK == ret)
245 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Multicast server started on port[%d]",
250 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Multicast server port[%d]",
254 // Notify network change to CA
255 CAIPNotifyNetworkChange(ipAddress, port, status);
259 CAIPNotifyNetworkChange(ipAddress, 0, status);
261 // Stop Unicast, Secured unicast and Multicast servers
262 CAIPStopServer(ipAddress);
265 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
269 uint32_t CAIPPacketSendCB(const char *ipAddress, uint16_t port,
270 const void *data, uint32_t dataLength)
272 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
274 VERIFY_NON_NULL_RET(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL", 0);
276 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data is NULL", 0);
278 uint32_t sentLength = CAIPSendData(ipAddress, port, data, dataLength, false, true);
282 CARemoteEndpoint_t *endPoint = CAAdapterCreateRemoteEndpoint(CA_IPV4, ipAddress, NULL);
285 OIC_LOG(ERROR, IP_ADAPTER_TAG, "EndPoint creation failed!");
289 g_errorCallback(endPoint, data, dataLength, CA_SEND_FAILED);
291 CAAdapterFreeRemoteEndpoint(endPoint);
294 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Successfully sent %d of encrypted data!", sentLength);
296 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
302 void CAIPPacketReceivedCB(const char *ipAddress, uint16_t port, const void *data,
303 uint32_t dataLength, bool isSecured)
305 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
307 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
309 VERIFY_NON_NULL_VOID(data, IP_ADAPTER_TAG, "data is NULL");
311 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Address: %s, port:%d", ipAddress, port);
313 // CA is freeing this memory
314 CARemoteEndpoint_t *endPoint = CAAdapterCreateRemoteEndpoint(CA_IPV4, ipAddress, NULL);
317 OIC_LOG(ERROR, IP_ADAPTER_TAG, "EndPoint creation failed!");
320 endPoint->addressInfo.IP.port = port;
321 endPoint->isSecured = isSecured;
323 void *buf = (void*)OICMalloc(sizeof(char) * dataLength);
326 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory Allocation failed!");
327 CAAdapterFreeRemoteEndpoint(endPoint);
330 memcpy(buf, data, dataLength);
331 if (g_networkPacketCallback)
333 g_networkPacketCallback(endPoint, buf, dataLength);
338 CAAdapterFreeRemoteEndpoint(endPoint);
341 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
344 void CAIPErrorHandler (const char *ipAddress, uint16_t port, const void *data,
345 uint32_t dataLength, bool isSecured, CAResult_t result)
347 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
349 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
351 VERIFY_NON_NULL_VOID(data, IP_ADAPTER_TAG, "data is NULL");
353 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Address: %s, port:%d", ipAddress, port);
355 // CA is freeing this memory
356 CARemoteEndpoint_t *endPoint = CAAdapterCreateRemoteEndpoint(CA_IPV4, ipAddress, NULL );
359 OIC_LOG(ERROR, IP_ADAPTER_TAG, "EndPoint creation failed!");
362 endPoint->addressInfo.IP.port = port;
363 endPoint->isSecured = isSecured;
365 void *buf = (void*)OICMalloc(sizeof(char) * dataLength);
368 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory Allocation failed!");
369 CAAdapterFreeRemoteEndpoint(endPoint);
372 memcpy(buf, data, dataLength);
375 g_errorCallback(endPoint, buf, dataLength, result);
380 CAAdapterFreeRemoteEndpoint(endPoint);
383 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
388 CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback,
389 CANetworkPacketReceivedCallback networkPacketCallback,
390 CANetworkChangeCallback netCallback,
391 CAErrorHandleCallback errorCallback, ca_thread_pool_t handle)
393 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
394 VERIFY_NON_NULL(registerCallback, IP_ADAPTER_TAG, "registerCallback");
395 VERIFY_NON_NULL(networkPacketCallback, IP_ADAPTER_TAG, "networkPacketCallback");
396 VERIFY_NON_NULL(netCallback, IP_ADAPTER_TAG, "netCallback");
397 VERIFY_NON_NULL(handle, IP_ADAPTER_TAG, "thread pool handle");
399 g_threadPool = handle;
400 g_networkChangeCallback = netCallback;
401 g_networkPacketCallback = networkPacketCallback;
402 g_errorCallback = errorCallback;
404 CAResult_t ret = CAIPInitializeNetworkMonitor(g_threadPool);
405 if (CA_STATUS_OK != ret)
407 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize n/w monitor![%d]", ret);
410 CAIPSetConnectionStateChangeCallback(CAIPConnectionStateCB);
412 ret = CAIPInitializeServer(g_threadPool);
413 if (CA_STATUS_OK != ret)
415 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize server![%d]", ret);
420 CAIPSetPacketReceiveCallback(CAIPPacketReceivedCB);
421 CAIPSetErrorHandleCallback(CAIPErrorHandler);
423 CAAdapterNetDtlsInit();
425 CADTLSSetAdapterCallbacks(CAIPPacketReceivedCB, CAIPPacketSendCB, DTLS_IP);
428 CAConnectivityHandler_t ipHandler;
429 ipHandler.startAdapter = CAStartIP;
430 ipHandler.startListenServer = CAStartIPListeningServer;
431 ipHandler.startDiscoveryServer = CAStartIPDiscoveryServer;
432 ipHandler.sendData = CASendIPUnicastData;
433 ipHandler.sendDataToAll = CASendIPMulticastData;
434 ipHandler.GetnetInfo = CAGetIPInterfaceInformation;
435 ipHandler.readData = CAReadIPData;
436 ipHandler.stopAdapter = CAStopIP;
437 ipHandler.terminate = CATerminateIP;
438 registerCallback(ipHandler, CA_IPV4);
440 if (CA_STATUS_OK != CAIPInitializeQueueHandles())
442 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize Queue Handle");
444 return CA_STATUS_FAILED;
447 OIC_LOG(INFO, IP_ADAPTER_TAG, "OUT IntializeIP is Success");
451 CAResult_t CAStartIP()
453 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
455 // Start monitoring IP network
456 CAResult_t ret = CAIPStartNetworkMonitor();
457 if (CA_STATUS_OK != ret)
459 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start n/w monitor");
463 // Start send queue thread
464 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
466 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start Send Data Thread");
467 return CA_STATUS_FAILED;
470 bool retVal = CAIPIsConnected();
473 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IP is not Connected");
477 u_arraylist_t *netInterfaceList = u_arraylist_create();
479 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
481 ret = CAIPGetInterfaceInfo(&netInterfaceList);
482 if (CA_STATUS_OK != ret)
484 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
485 CAClearNetInterfaceInfoList(netInterfaceList);
489 uint32_t listIndex = 0;
490 uint32_t listLength = u_arraylist_length(netInterfaceList);
491 for (listIndex = 0; listIndex < listLength; listIndex++)
493 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
498 uint16_t unicastPort = CA_PORT;
499 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, false, false);
500 if (CA_STATUS_OK == ret)
502 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port",
507 unicastPort = CA_SECURE_PORT;
508 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, false, true);
510 if (CA_STATUS_OK == ret)
512 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
513 "Secure Unicast server started on %d port", unicastPort);
517 CAClearNetInterfaceInfoList(netInterfaceList);
518 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
522 CAResult_t CAStartIPListeningServer()
524 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
526 bool retVal = CAIPIsConnected();
529 OIC_LOG(DEBUG, IP_ADAPTER_TAG,
530 "IP not Connected. Couldn't start multicast server");
534 u_arraylist_t *netInterfaceList = u_arraylist_create();
536 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
538 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
539 if (CA_STATUS_OK != ret)
541 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
542 CAClearNetInterfaceInfoList(netInterfaceList);
546 uint32_t listIndex = 0;
547 uint32_t listLength = u_arraylist_length(netInterfaceList);
548 for (listIndex = 0; listIndex < listLength; listIndex++)
551 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
557 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Ip address for multicast interface %s",
559 ret = CAIPStartMulticastServer(netInfo->ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
560 if (CA_STATUS_OK == ret)
562 OIC_LOG(INFO, IP_ADAPTER_TAG, "Multicast Server is Started Successfully");
566 CAClearNetInterfaceInfoList(netInterfaceList);
567 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
571 CAResult_t CAStartIPDiscoveryServer()
573 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
574 return CAStartIPListeningServer();
577 int32_t CASendIPUnicastData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
580 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
582 VERIFY_NON_NULL_RET(remoteEndpoint, IP_ADAPTER_TAG, "remoteEndpoint", -1);
583 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
584 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
588 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
592 // Create IPData to add to queue
593 CAIPData *ipData = CACreateIPData(remoteEndpoint, data, dataLength);
596 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
601 // Add message to send queue
602 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
604 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
609 int32_t CASendIPMulticastData(const void *data, uint32_t dataLength)
611 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
613 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
614 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
618 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
622 // Create IPData to add to queue
623 CAIPData *ipData = CACreateIPData(NULL, data, dataLength);
626 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
631 // Add message to send queue
632 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
634 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
639 CAResult_t CAGetIPInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
641 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
643 VERIFY_NON_NULL(info, IP_ADAPTER_TAG, "info is NULL");
644 VERIFY_NON_NULL(size, IP_ADAPTER_TAG, "size is NULL");
646 bool retVal = CAIPIsConnected();
649 OIC_LOG(ERROR, IP_ADAPTER_TAG,
650 "Failed to get interface address, IP not Connected");
651 return CA_ADAPTER_NOT_ENABLED;
654 u_arraylist_t *netInterfaceList = u_arraylist_create();
656 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
658 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
659 if (CA_STATUS_OK != ret)
661 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "CAIPGetInterfaceInfo failed:%d", ret);
662 CAClearNetInterfaceInfoList(netInterfaceList);
666 uint32_t listLength = u_arraylist_length(netInterfaceList);
667 uint32_t netInfoSize = listLength;
672 netInfoSize = listLength * 2;
676 CALocalConnectivity_t *conInfo = (CALocalConnectivity_t *) OICCalloc(
677 netInfoSize, sizeof(CALocalConnectivity_t));
680 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Malloc Failed");
681 CAClearNetInterfaceInfoList(netInterfaceList);
682 return CA_MEMORY_ALLOC_FAILED;
685 uint32_t listIndex = 0;
687 for (listIndex = 0; listIndex < listLength; listIndex++)
689 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
695 conInfo[count].type = CA_IPV4;
696 conInfo[count].isSecured = false;
697 conInfo[count].addressInfo.IP.port = CAGetServerPortNum(netInfo->ipAddress, false);
698 strncpy(conInfo[count].addressInfo.IP.ipAddress, netInfo->ipAddress,
699 strlen(netInfo->ipAddress));
702 // copy secure unicast server information
705 conInfo[count].type = CA_IPV4;
706 conInfo[count].isSecured = true;
707 conInfo[count].addressInfo.IP.port = CAGetServerPortNum(netInfo->ipAddress, true);
708 strncpy(conInfo[count].addressInfo.IP.ipAddress, netInfo->ipAddress,
709 strlen(netInfo->ipAddress));
716 CAClearNetInterfaceInfoList(netInterfaceList);
718 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
722 CAResult_t CAReadIPData()
724 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
726 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
730 CAResult_t CAIPStopServers()
732 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
734 // Stop all unicast and multicast servers.
735 if (CA_STATUS_OK == CAIPStopAllServers())
737 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAIPStopAllServers success");
740 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
744 CAResult_t CAStopIP()
746 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
749 CAAdapterNetDtlsDeInit();
752 // Stop IP network monitor
753 CAIPStopNetworkMonitor();
755 // Stop send queue thread
756 if (g_sendQueueHandle)
758 CAQueueingThreadStop(g_sendQueueHandle);
761 // Stop Unicast, Secured unicast and Multicast servers running
764 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
770 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
776 CADTLSSetAdapterCallbacks(NULL, NULL, DTLS_IP);
779 CAIPSetPacketReceiveCallback(NULL);
781 // Terminate IP server
782 CAIPTerminateServer();
784 // Terminate network monitor
785 CAIPSetConnectionStateChangeCallback(NULL);
786 CAIPTerminateNetworkMonitor();
788 // Terminate message queue handler
789 CAIPDeinitializeQueueHandles();
791 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
794 void CAIPSendDataThread(void *threadData)
796 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
798 CAIPData *ipData = (CAIPData *) threadData;
801 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Invalid ip data!");
805 //If remoteEndpoint is NULL, its Multicast, else its Unicast.
806 if (ipData->remoteEndpoint)
808 //Processing for sending unicast
809 char *address = ipData->remoteEndpoint->addressInfo.IP.ipAddress;
810 uint16_t port = ipData->remoteEndpoint->addressInfo.IP.port;
813 if (!ipData->remoteEndpoint->isSecured)
815 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Unicast Data is called");
816 uint32_t res = CAIPSendData(address, port, ipData->data, ipData->dataLen, false,
817 ipData->remoteEndpoint->isSecured);
820 g_errorCallback(ipData->remoteEndpoint, ipData->data, ipData->dataLen,
826 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt called!");
827 uint8_t cacheFlag = 0;
828 CAResult_t result = CAAdapterNetDtlsEncrypt(address, port, ipData->data,
829 ipData->dataLen, &cacheFlag,
832 if (CA_STATUS_OK != result)
834 OIC_LOG(ERROR, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt failed!");
836 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
837 "CAAdapterNetDtlsEncrypt returned with cache[%d]", cacheFlag);
840 uint32_t res = CAIPSendData(address, port, ipData->data, ipData->dataLen, false,
841 ipData->remoteEndpoint->isSecured);
844 g_errorCallback(ipData->remoteEndpoint, ipData->data, ipData->dataLen, CA_SEND_FAILED);
851 //Processing for sending multicast
852 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Multicast Data is called");
853 uint32_t res = CAIPSendData(CA_MULTICAST_IP, CA_MCAST_PORT, ipData->data,
854 ipData->dataLen, true, false);
857 g_errorCallback(ipData->remoteEndpoint, ipData->data, ipData->dataLen, CA_SEND_FAILED);
861 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
864 CAIPData *CACreateIPData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
867 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "IPData is NULL", NULL);
869 CAIPData *ipData = (CAIPData *) OICMalloc(sizeof(CAIPData));
872 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
876 ipData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
877 ipData->data = (void *) OICMalloc(dataLength);
880 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
881 CAFreeIPData(ipData);
885 memcpy(ipData->data, data, dataLength);
886 ipData->dataLen = dataLength;
891 void CAFreeIPData(CAIPData *ipData)
893 VERIFY_NON_NULL_VOID(ipData, IP_ADAPTER_TAG, "ipData is NULL");
895 CAAdapterFreeRemoteEndpoint(ipData->remoteEndpoint);
896 OICFree(ipData->data);
900 void CADataDestroyer(void *data, uint32_t size)
902 CAIPData *etdata = (CAIPData *) data;
904 CAFreeIPData(etdata);