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"
35 #include "caremotehandler.h"
37 #include "oic_malloc.h"
38 #include "oic_string.h"
42 * @brief Logging tag for module name
44 #define IP_ADAPTER_TAG "IP_ADAP"
48 * @brief Port to listen for incoming data
54 * @brief Secured (unicast) port number as defined in COAP Specification, RFC-7252.
56 #define CA_SECURE_PORT 5684
60 * @brief Multicast port number as defined in COAP Specification, RFC-7252.
62 #define CA_MCAST_PORT 5683
65 * @def CA_MULTICAST_IP
66 * @brief Multicast IP Address as defined in COAP Specification, RFC-7252.
68 #define CA_MULTICAST_IP "224.0.1.187"
72 * @brief Holds inter thread ip data information.
76 CAEndpoint_t *remoteEndpoint;
83 * @var g_networkPacketCallback
84 * @brief Network Packet Received Callback to CA
86 static CANetworkPacketReceivedCallback g_networkPacketCallback = NULL;
89 * @var g_networkChangeCallback
90 * @brief Network Changed Callback to CA
92 static CANetworkChangeCallback g_networkChangeCallback = NULL;
95 * @var g_errorCallback
96 * @brief error Callback to CA adapter
98 static CAErrorHandleCallback g_errorCallback = NULL;
101 * @var g_sendQueueHandle
102 * @brief Queue handle for Send Data
104 static CAQueueingThread_t *g_sendQueueHandle = NULL;
108 * @brief ThreadPool for storing ca_thread_pool_t handle passed from CA
110 static ca_thread_pool_t g_threadPool = NULL;
112 static CAResult_t CAIPInitializeQueueHandles();
114 static void CAIPDeinitializeQueueHandles();
116 static void CAIPNotifyNetworkChange(const char *address, uint16_t port,
117 CANetworkStatus_t status);
119 static void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status);
121 static void CAIPPacketReceivedCB(const CAEndpoint_t *endpoint,
122 const void *data, uint32_t dataLength);
123 static void CAIPErrorHandler(const CAEndpoint_t *endpoint, const void *data,
124 uint32_t dataLength, CAResult_t result);
126 static uint32_t CAIPPacketSendCB(const CAEndpoint_t *endpoint,
127 const void *data, uint32_t dataLength);
130 static CAResult_t CAIPStopServers();
132 static void CAIPSendDataThread(void *threadData);
134 static CAIPData *CACreateIPData(const CAEndpoint_t *remoteEndpoint,
135 const void *data, uint32_t dataLength, bool isMulticast);
136 void CAFreeIPData(CAIPData *ipData);
138 static void CADataDestroyer(void *data, uint32_t size);
140 CAResult_t CAIPInitializeQueueHandles()
142 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
144 // Check if the message queue is already initialized
145 if (g_sendQueueHandle)
147 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "send queue handle is already initialized!");
151 // Create send message queue
152 g_sendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
153 if (!g_sendQueueHandle)
155 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
156 return CA_MEMORY_ALLOC_FAILED;
159 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_threadPool,
160 CAIPSendDataThread, CADataDestroyer))
162 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize send queue thread");
163 OICFree(g_sendQueueHandle);
164 g_sendQueueHandle = NULL;
165 return CA_STATUS_FAILED;
168 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
172 void CAIPDeinitializeQueueHandles()
174 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
176 CAQueueingThreadDestroy(g_sendQueueHandle);
177 OICFree(g_sendQueueHandle);
178 g_sendQueueHandle = NULL;
180 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
183 void CAIPNotifyNetworkChange(const char *address, uint16_t port, CANetworkStatus_t status)
185 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
187 VERIFY_NON_NULL_VOID(address, IP_ADAPTER_TAG, "address is NULL");
189 CAEndpoint_t *localEndpoint = CACreateEndpointObject(CA_DEFAULT_FLAGS,
194 OIC_LOG(ERROR, IP_ADAPTER_TAG, "localEndpoint creation failed!");
198 if (g_networkChangeCallback)
200 g_networkChangeCallback(localEndpoint, status);
204 OIC_LOG(ERROR, IP_ADAPTER_TAG, "g_networkChangeCallback is NULL");
207 CAFreeEndpoint(localEndpoint);
209 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
212 void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status)
214 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
216 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
218 if (CA_INTERFACE_UP == status)
220 uint16_t port = CA_PORT;
221 CAResult_t ret = CAIPStartUnicastServer(ipAddress, &port, false);
222 if (CA_STATUS_OK == ret)
224 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port", port);
228 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Unicast server port[%d]", ret);
232 port = CA_SECURE_PORT;
233 ret = CAIPStartUnicastServer(ipAddress, &port, true);
234 if (CA_STATUS_OK == ret)
236 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Secure Unicast server started on %d", port);
240 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start secure Unicast server [%d]",
244 ret = CAIPStartMulticastServer(ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
245 if (CA_STATUS_OK == ret)
247 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Multicast server started on port[%d]",
252 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Multicast server port[%d]",
256 // Notify network change to CA
257 CAIPNotifyNetworkChange(ipAddress, port, status);
261 CAIPNotifyNetworkChange(ipAddress, 0, status);
263 // Stop Unicast, Secured unicast and Multicast servers
264 CAIPStopServer(ipAddress);
267 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
271 uint32_t CAIPPacketSendCB(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
273 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
275 VERIFY_NON_NULL_RET(endpoint, IP_ADAPTER_TAG, "endpoint is NULL", 0);
276 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data is NULL", 0);
278 uint32_t sentLength = CAIPSendData(endpoint, data, dataLength, false);
282 g_errorCallback(endpoint, data, dataLength, CA_SEND_FAILED);
285 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Successfully sent %d of encrypted data!", sentLength);
287 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
293 void CAIPPacketReceivedCB(const CAEndpoint_t *endpoint, const void *data,
296 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
298 VERIFY_NON_NULL_VOID(endpoint, IP_ADAPTER_TAG, "ipAddress is NULL");
299 VERIFY_NON_NULL_VOID(data, IP_ADAPTER_TAG, "data is NULL");
301 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Address: %s, port:%d", endpoint->addr, endpoint->port);
303 void *buf = OICCalloc(dataLength + 1, sizeof (char));
306 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory Allocation failed!");
309 memcpy(buf, data, dataLength);
311 if (g_networkPacketCallback)
313 g_networkPacketCallback(endpoint, buf, dataLength);
320 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
323 void CAIPErrorHandler (const CAEndpoint_t *endpoint, const void *data,
324 uint32_t dataLength, CAResult_t result)
326 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
328 VERIFY_NON_NULL_VOID(endpoint, IP_ADAPTER_TAG, "endpoint is NULL");
330 VERIFY_NON_NULL_VOID(data, IP_ADAPTER_TAG, "data is NULL");
332 void *buf = (void*)OICMalloc(sizeof(char) * dataLength);
335 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory Allocation failed!");
338 memcpy(buf, data, dataLength);
341 g_errorCallback(endpoint, buf, dataLength, result);
348 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
353 CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback,
354 CANetworkPacketReceivedCallback networkPacketCallback,
355 CANetworkChangeCallback netCallback,
356 CAErrorHandleCallback errorCallback, ca_thread_pool_t handle)
358 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
359 VERIFY_NON_NULL(registerCallback, IP_ADAPTER_TAG, "registerCallback");
360 VERIFY_NON_NULL(networkPacketCallback, IP_ADAPTER_TAG, "networkPacketCallback");
361 VERIFY_NON_NULL(netCallback, IP_ADAPTER_TAG, "netCallback");
362 VERIFY_NON_NULL(handle, IP_ADAPTER_TAG, "thread pool handle");
364 g_threadPool = handle;
365 g_networkChangeCallback = netCallback;
366 g_networkPacketCallback = networkPacketCallback;
367 g_errorCallback = errorCallback;
369 CAResult_t ret = CAIPInitializeNetworkMonitor(g_threadPool);
370 if (CA_STATUS_OK != ret)
372 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize n/w monitor![%d]", ret);
375 CAIPSetConnectionStateChangeCallback(CAIPConnectionStateCB);
377 ret = CAIPInitializeServer(g_threadPool);
378 if (CA_STATUS_OK != ret)
380 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize server![%d]", ret);
385 CAIPSetPacketReceiveCallback(CAIPPacketReceivedCB);
386 CAIPSetErrorHandleCallback(CAIPErrorHandler);
388 CAAdapterNetDtlsInit();
390 CADTLSSetAdapterCallbacks(CAIPPacketReceivedCB, CAIPPacketSendCB, 0);
393 CAConnectivityHandler_t ipHandler;
394 ipHandler.startAdapter = CAStartIP;
395 ipHandler.startListenServer = CAStartIPListeningServer;
396 ipHandler.startDiscoveryServer = CAStartIPDiscoveryServer;
397 ipHandler.sendData = CASendIPUnicastData;
398 ipHandler.sendDataToAll = CASendIPMulticastData;
399 ipHandler.GetnetInfo = CAGetIPInterfaceInformation;
400 ipHandler.readData = CAReadIPData;
401 ipHandler.stopAdapter = CAStopIP;
402 ipHandler.terminate = CATerminateIP;
403 registerCallback(ipHandler, CA_ADAPTER_IP);
405 if (CA_STATUS_OK != CAIPInitializeQueueHandles())
407 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize Queue Handle");
409 return CA_STATUS_FAILED;
412 OIC_LOG(INFO, IP_ADAPTER_TAG, "OUT IntializeIP is Success");
416 CAResult_t CAStartIP()
418 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
420 // Start monitoring IP network
421 CAResult_t ret = CAIPStartNetworkMonitor();
422 if (CA_STATUS_OK != ret)
424 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start n/w monitor");
428 // Start send queue thread
429 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
431 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start Send Data Thread");
432 return CA_STATUS_FAILED;
435 bool retVal = CAIPIsConnected();
438 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IP is not Connected");
442 u_arraylist_t *netInterfaceList = u_arraylist_create();
444 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
446 ret = CAIPGetInterfaceInfo(&netInterfaceList);
447 if (CA_STATUS_OK != ret)
449 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
450 CAClearNetInterfaceInfoList(netInterfaceList);
454 uint32_t listIndex = 0;
455 uint32_t listLength = u_arraylist_length(netInterfaceList);
456 for (listIndex = 0; listIndex < listLength; listIndex++)
458 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
463 uint16_t unicastPort = CA_PORT;
464 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, false);
465 if (CA_STATUS_OK == ret)
467 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port",
472 unicastPort = CA_SECURE_PORT;
473 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, true);
475 if (CA_STATUS_OK == ret)
477 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
478 "Secure Unicast server started on %d port", unicastPort);
482 CAClearNetInterfaceInfoList(netInterfaceList);
483 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
487 CAResult_t CAStartIPListeningServer()
489 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
491 bool retVal = CAIPIsConnected();
494 OIC_LOG(DEBUG, IP_ADAPTER_TAG,
495 "IP not Connected. Couldn't start multicast server");
499 u_arraylist_t *netInterfaceList = u_arraylist_create();
501 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
503 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
504 if (CA_STATUS_OK != ret)
506 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
507 CAClearNetInterfaceInfoList(netInterfaceList);
511 uint32_t listIndex = 0;
512 uint32_t listLength = u_arraylist_length(netInterfaceList);
513 for (listIndex = 0; listIndex < listLength; listIndex++)
516 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
522 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Ip address for multicast interface %s",
524 ret = CAIPStartMulticastServer(netInfo->ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
525 if (CA_STATUS_OK == ret)
527 OIC_LOG(INFO, IP_ADAPTER_TAG, "Multicast Server is Started Successfully");
531 CAClearNetInterfaceInfoList(netInterfaceList);
532 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
536 CAResult_t CAStartIPDiscoveryServer()
538 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
539 return CAStartIPListeningServer();
542 int32_t CASendIPUnicastData(const CAEndpoint_t *remoteEndpoint,
543 const void *data, uint32_t dataLength)
545 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
547 VERIFY_NON_NULL_RET(remoteEndpoint, IP_ADAPTER_TAG, "remoteEndpoint", -1);
548 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
549 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
553 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
557 // Create IPData to add to queue
558 CAIPData *ipData = CACreateIPData(remoteEndpoint, data, dataLength, false);
561 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
566 // Add message to send queue
567 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
569 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
574 int32_t CASendIPMulticastData(const CAEndpoint_t *endpoint, const void *data, uint32_t dataLength)
576 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
578 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
579 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
583 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
587 // Create IPData to add to queue
588 CAIPData *ipData = CACreateIPData(endpoint, data, dataLength, true);
591 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
596 // Add message to send queue
597 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
599 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
604 CAResult_t CAGetIPInterfaceInformation(CAEndpoint_t **info, uint32_t *size)
606 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
608 VERIFY_NON_NULL(info, IP_ADAPTER_TAG, "info is NULL");
609 VERIFY_NON_NULL(size, IP_ADAPTER_TAG, "size is NULL");
611 bool retVal = CAIPIsConnected();
614 OIC_LOG(ERROR, IP_ADAPTER_TAG,
615 "Failed to get interface address, IP not Connected");
616 return CA_ADAPTER_NOT_ENABLED;
619 u_arraylist_t *netInterfaceList = u_arraylist_create();
621 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
623 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
624 if (CA_STATUS_OK != ret)
626 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "CAIPGetInterfaceInfo failed:%d", ret);
627 CAClearNetInterfaceInfoList(netInterfaceList);
631 uint32_t listLength = u_arraylist_length(netInterfaceList);
632 uint32_t netInfoSize = listLength;
637 netInfoSize = listLength * 2;
641 CAEndpoint_t *conInfo = (CAEndpoint_t *)OICCalloc(netInfoSize, sizeof (CAEndpoint_t));
644 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Malloc Failed");
645 CAClearNetInterfaceInfoList(netInterfaceList);
646 return CA_MEMORY_ALLOC_FAILED;
649 uint32_t listIndex = 0;
651 for (listIndex = 0; listIndex < listLength; listIndex++)
653 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
659 conInfo[count].adapter = CA_ADAPTER_IP;
660 conInfo[count].flags = 0;
661 conInfo[count].port = CAGetServerPortNum(netInfo->ipAddress, false);
662 OICStrcpy(conInfo[count].addr,
663 sizeof(conInfo[count].addr),
667 // copy secure unicast server information
670 conInfo[count].adapter = CA_ADAPTER_IP;
671 conInfo[count].flags = CA_SECURE;
672 conInfo[count].port = CAGetServerPortNum(netInfo->ipAddress, true);
673 OICStrcpy(conInfo[count].addr,
674 sizeof(conInfo[count].addr),
682 CAClearNetInterfaceInfoList(netInterfaceList);
684 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
688 CAResult_t CAReadIPData()
690 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
692 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
696 CAResult_t CAIPStopServers()
698 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
700 // Stop all unicast and multicast servers.
701 if (CA_STATUS_OK == CAIPStopAllServers())
703 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAIPStopAllServers success");
706 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
710 CAResult_t CAStopIP()
712 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
715 CAAdapterNetDtlsDeInit();
718 // Stop IP network monitor
719 CAIPStopNetworkMonitor();
721 // Stop send queue thread
722 if (g_sendQueueHandle)
724 CAQueueingThreadStop(g_sendQueueHandle);
727 // Stop Unicast, Secured unicast and Multicast servers running
730 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
736 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
742 CADTLSSetAdapterCallbacks(NULL, NULL, 0);
745 CAIPSetPacketReceiveCallback(NULL);
747 // Terminate IP server
748 CAIPTerminateServer();
750 // Terminate network monitor
751 CAIPSetConnectionStateChangeCallback(NULL);
752 CAIPTerminateNetworkMonitor();
754 // Terminate message queue handler
755 CAIPDeinitializeQueueHandles();
757 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
760 void CAIPSendDataThread(void *threadData)
762 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
764 CAIPData *ipData = (CAIPData *) threadData;
765 uint32_t sentData = -1;
769 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Invalid ip data!");
773 if (ipData->isMulticast)
775 //Processing for sending multicast
776 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Multicast Data is called");
777 strncpy(ipData->remoteEndpoint->addr, CA_MULTICAST_IP, MAX_ADDR_STR_SIZE_CA);
778 ipData->remoteEndpoint->port = CA_MCAST_PORT;
779 sentData = CAIPSendData(ipData->remoteEndpoint, ipData->data, ipData->dataLen, true);
783 //Processing for sending unicast
785 if (ipData->remoteEndpoint->flags & CA_SECURE)
787 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt called!");
788 CAResult_t result = CAAdapterNetDtlsEncrypt(ipData->remoteEndpoint,
789 ipData->data, ipData->dataLen);
790 if (CA_STATUS_OK != result)
792 OIC_LOG(ERROR, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt failed!");
795 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
796 "CAAdapterNetDtlsEncrypt returned with result[%d]", result);
800 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Unicast Data is called");
801 sentData = CAIPSendData(ipData->remoteEndpoint, ipData->data, ipData->dataLen, false);
804 sentData = CAIPSendData(ipData->remoteEndpoint, ipData->data, ipData->dataLen, false);
810 g_errorCallback(ipData->remoteEndpoint, ipData->data, ipData->dataLen,
814 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
817 CAIPData *CACreateIPData(const CAEndpoint_t *remoteEndpoint, const void *data,
818 uint32_t dataLength, bool isMulticast)
820 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "IPData is NULL", NULL);
822 CAIPData *ipData = (CAIPData *) OICMalloc(sizeof(CAIPData));
825 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
829 ipData->remoteEndpoint = CACloneEndpoint(remoteEndpoint);
830 ipData->data = (void *) OICMalloc(dataLength);
833 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
834 CAFreeIPData(ipData);
838 memcpy(ipData->data, data, dataLength);
839 ipData->dataLen = dataLength;
841 ipData->isMulticast = isMulticast;
846 void CAFreeIPData(CAIPData *ipData)
848 VERIFY_NON_NULL_VOID(ipData, IP_ADAPTER_TAG, "ipData is NULL");
850 CAFreeEndpoint(ipData->remoteEndpoint);
851 OICFree(ipData->data);
855 void CADataDestroyer(void *data, uint32_t size)
857 CAIPData *etdata = (CAIPData *) data;
859 CAFreeIPData(etdata);