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_sendQueueHandle
93 * @brief Queue handle for Send Data
95 static CAQueueingThread_t *g_sendQueueHandle = NULL;
99 * @brief ThreadPool for storing ca_thread_pool_t handle passed from CA
101 static ca_thread_pool_t g_threadPool = NULL;
103 static CAResult_t CAIPInitializeQueueHandles();
105 static void CAIPDeinitializeQueueHandles();
107 static void CAIPNotifyNetworkChange(const char *address, uint16_t port,
108 CANetworkStatus_t status);
110 static void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status);
112 static void CAIPPacketReceivedCB(const char *ipAddress, uint16_t port, const void *data,
113 uint32_t dataLength, bool isSecured,
114 const CARemoteId_t *identity);
116 static uint32_t CAIPPacketSendCB(const char *ipAddress, uint16_t port,
117 const void *data, uint32_t dataLength);
120 static CAResult_t CAIPStopServers();
122 static void CAIPSendDataThread(void *threadData);
124 static CAIPData *CACreateIPData(const CARemoteEndpoint_t *remoteEndpoint,
125 const void *data, uint32_t dataLength);
126 void CAFreeIPData(CAIPData *ipData);
128 static void CADataDestroyer(void *data, uint32_t size);
130 CAResult_t CAIPInitializeQueueHandles()
132 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
134 // Check if the message queue is already initialized
135 if (g_sendQueueHandle)
137 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "send queue handle is already initialized!");
141 // Create send message queue
142 g_sendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
143 if (!g_sendQueueHandle)
145 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
146 return CA_MEMORY_ALLOC_FAILED;
149 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_threadPool,
150 CAIPSendDataThread, CADataDestroyer))
152 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize send queue thread");
153 OICFree(g_sendQueueHandle);
154 g_sendQueueHandle = NULL;
155 return CA_STATUS_FAILED;
158 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
162 void CAIPDeinitializeQueueHandles()
164 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
166 CAQueueingThreadDestroy(g_sendQueueHandle);
167 OICFree(g_sendQueueHandle);
168 g_sendQueueHandle = NULL;
170 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
173 void CAIPNotifyNetworkChange(const char *address, uint16_t port, CANetworkStatus_t status)
175 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
177 VERIFY_NON_NULL_VOID(address, IP_ADAPTER_TAG, "address is NULL");
179 CALocalConnectivity_t *localEndpoint = CAAdapterCreateLocalEndpoint(CA_IPV4, address);
182 OIC_LOG(ERROR, IP_ADAPTER_TAG, "localEndpoint creation failed!");
186 localEndpoint->addressInfo.IP.port = port;
188 if (g_networkChangeCallback)
190 g_networkChangeCallback(localEndpoint, status);
194 OIC_LOG(ERROR, IP_ADAPTER_TAG, "g_networkChangeCallback is NULL");
197 CAAdapterFreeLocalEndpoint(localEndpoint);
199 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
202 void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status)
204 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
206 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
208 if (CA_INTERFACE_UP == status)
210 uint16_t port = CA_PORT;
211 CAResult_t ret = CAIPStartUnicastServer(ipAddress, &port, false, false);
212 if (CA_STATUS_OK == ret)
214 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port", port);
218 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Unicast server port[%d]", ret);
222 port = CA_SECURE_PORT;
223 ret = CAIPStartUnicastServer(ipAddress, &port, false, true);
224 if (CA_STATUS_OK == ret)
226 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Secure Unicast server started on %d", port);
230 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start secure Unicast server [%d]",
234 ret = CAIPStartMulticastServer(ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
235 if (CA_STATUS_OK == ret)
237 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Multicast server started on port[%d]",
242 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Multicast server port[%d]",
246 // Notify network change to CA
247 CAIPNotifyNetworkChange(ipAddress, port, status);
251 CAIPNotifyNetworkChange(ipAddress, 0, status);
253 // Stop Unicast, Secured unicast and Multicast servers
254 CAIPStopServer(ipAddress);
257 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
261 uint32_t CAIPPacketSendCB(const char *ipAddress, uint16_t port,
262 const void *data, uint32_t dataLength)
264 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
266 VERIFY_NON_NULL_RET(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL", 0);
268 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data is NULL", 0);
270 uint32_t sentLength = CAIPSendData(ipAddress, port, data, dataLength, false, true);
272 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Successfully sent %d of encrypted data!", sentLength);
274 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
280 void CAIPPacketReceivedCB(const char *ipAddress, uint16_t port, const void *data,
281 uint32_t dataLength, bool isSecured,
282 const CARemoteId_t *identity)
284 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
286 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
288 VERIFY_NON_NULL_VOID(data, IP_ADAPTER_TAG, "data is NULL");
290 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Address: %s, port:%d", ipAddress, port);
292 // CA is freeing this memory
293 CARemoteEndpoint_t *endPoint = CAAdapterCreateRemoteEndpoint(CA_IPV4, ipAddress, NULL );
296 OIC_LOG(ERROR, IP_ADAPTER_TAG, "EndPoint creation failed!");
299 endPoint->addressInfo.IP.port = port;
300 endPoint->isSecured = isSecured;
303 endPoint->identity = *identity;
307 void *buf = OICCalloc(dataLength + 1, sizeof(char));
310 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory Allocation failed!");
311 CAAdapterFreeRemoteEndpoint(endPoint);
314 memcpy(buf, data, dataLength);
315 if (g_networkPacketCallback)
317 g_networkPacketCallback(endPoint, buf, dataLength);
322 CAAdapterFreeRemoteEndpoint(endPoint);
325 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
328 CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback,
329 CANetworkPacketReceivedCallback networkPacketCallback,
330 CANetworkChangeCallback netCallback, ca_thread_pool_t handle)
332 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
333 VERIFY_NON_NULL(registerCallback, IP_ADAPTER_TAG, "registerCallback");
334 VERIFY_NON_NULL(networkPacketCallback, IP_ADAPTER_TAG, "networkPacketCallback");
335 VERIFY_NON_NULL(netCallback, IP_ADAPTER_TAG, "netCallback");
336 VERIFY_NON_NULL(handle, IP_ADAPTER_TAG, "thread pool handle");
338 g_threadPool = handle;
339 g_networkChangeCallback = netCallback;
340 g_networkPacketCallback = networkPacketCallback;
342 CAResult_t ret = CAIPInitializeNetworkMonitor(g_threadPool);
343 if (CA_STATUS_OK != ret)
345 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize n/w monitor![%d]", ret);
348 CAIPSetConnectionStateChangeCallback(CAIPConnectionStateCB);
350 ret = CAIPInitializeServer(g_threadPool);
351 if (CA_STATUS_OK != ret)
353 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize server![%d]", ret);
358 CAIPSetPacketReceiveCallback(CAIPPacketReceivedCB);
360 CAAdapterNetDtlsInit();
362 CADTLSSetAdapterCallbacks(CAIPPacketReceivedCB, CAIPPacketSendCB, CA_IPV4);
365 CAConnectivityHandler_t ipHandler;
366 ipHandler.startAdapter = CAStartIP;
367 ipHandler.startListenServer = CAStartIPListeningServer;
368 ipHandler.startDiscoveryServer = CAStartIPDiscoveryServer;
369 ipHandler.sendData = CASendIPUnicastData;
370 ipHandler.sendDataToAll = CASendIPMulticastData;
371 ipHandler.GetnetInfo = CAGetIPInterfaceInformation;
372 ipHandler.readData = CAReadIPData;
373 ipHandler.stopAdapter = CAStopIP;
374 ipHandler.terminate = CATerminateIP;
375 registerCallback(ipHandler, CA_IPV4);
377 if (CA_STATUS_OK != CAIPInitializeQueueHandles())
379 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize Queue Handle");
381 return CA_STATUS_FAILED;
384 OIC_LOG(INFO, IP_ADAPTER_TAG, "OUT IntializeIP is Success");
388 CAResult_t CAStartIP()
390 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
392 // Start monitoring IP network
393 CAResult_t ret = CAIPStartNetworkMonitor();
394 if (CA_STATUS_OK != ret)
396 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start n/w monitor");
400 // Start send queue thread
401 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
403 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start Send Data Thread");
404 return CA_STATUS_FAILED;
407 bool retVal = CAIPIsConnected();
410 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IP is not Connected");
414 u_arraylist_t *netInterfaceList = u_arraylist_create();
416 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
418 ret = CAIPGetInterfaceInfo(&netInterfaceList);
419 if (CA_STATUS_OK != ret)
421 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
422 CAClearNetInterfaceInfoList(netInterfaceList);
426 uint32_t listIndex = 0;
427 uint32_t listLength = u_arraylist_length(netInterfaceList);
428 for (listIndex = 0; listIndex < listLength; listIndex++)
430 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
435 uint16_t unicastPort = CA_PORT;
436 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, false, false);
437 if (CA_STATUS_OK == ret)
439 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port",
444 unicastPort = CA_SECURE_PORT;
445 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, false, true);
447 if (CA_STATUS_OK == ret)
449 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
450 "Secure Unicast server started on %d port", unicastPort);
454 CAClearNetInterfaceInfoList(netInterfaceList);
455 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
459 CAResult_t CAStartIPListeningServer()
461 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
463 bool retVal = CAIPIsConnected();
466 OIC_LOG(DEBUG, IP_ADAPTER_TAG,
467 "IP not Connected. Couldn't start multicast server");
471 u_arraylist_t *netInterfaceList = u_arraylist_create();
473 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
475 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
476 if (CA_STATUS_OK != ret)
478 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
479 CAClearNetInterfaceInfoList(netInterfaceList);
483 uint32_t listIndex = 0;
484 uint32_t listLength = u_arraylist_length(netInterfaceList);
485 for (listIndex = 0; listIndex < listLength; listIndex++)
488 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
494 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Ip address for multicast interface %s",
496 ret = CAIPStartMulticastServer(netInfo->ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
497 if (CA_STATUS_OK == ret)
499 OIC_LOG(INFO, IP_ADAPTER_TAG, "Multicast Server is Started Successfully");
503 CAClearNetInterfaceInfoList(netInterfaceList);
504 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
508 CAResult_t CAStartIPDiscoveryServer()
510 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
511 return CAStartIPListeningServer();
514 int32_t CASendIPUnicastData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
517 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
519 VERIFY_NON_NULL_RET(remoteEndpoint, IP_ADAPTER_TAG, "remoteEndpoint", -1);
520 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
521 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
525 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
529 // Create IPData to add to queue
530 CAIPData *ipData = CACreateIPData(remoteEndpoint, data, dataLength);
533 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
538 // Add message to send queue
539 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
541 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
546 int32_t CASendIPMulticastData(const void *data, uint32_t dataLength)
548 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
550 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
551 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
555 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
559 // Create IPData to add to queue
560 CAIPData *ipData = CACreateIPData(NULL, data, dataLength);
563 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
568 // Add message to send queue
569 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
571 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
576 CAResult_t CAGetIPInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
578 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
580 VERIFY_NON_NULL(info, IP_ADAPTER_TAG, "info is NULL");
581 VERIFY_NON_NULL(size, IP_ADAPTER_TAG, "size is NULL");
583 bool retVal = CAIPIsConnected();
586 OIC_LOG(ERROR, IP_ADAPTER_TAG,
587 "Failed to get interface address, IP not Connected");
588 return CA_ADAPTER_NOT_ENABLED;
591 u_arraylist_t *netInterfaceList = u_arraylist_create();
593 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
595 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
596 if (CA_STATUS_OK != ret)
598 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "CAIPGetInterfaceInfo failed:%d", ret);
599 CAClearNetInterfaceInfoList(netInterfaceList);
603 uint32_t listLength = u_arraylist_length(netInterfaceList);
604 uint32_t netInfoSize = listLength;
609 netInfoSize = listLength * 2;
613 CALocalConnectivity_t *conInfo = (CALocalConnectivity_t *) OICCalloc(
614 netInfoSize, sizeof(CALocalConnectivity_t));
617 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Malloc Failed");
618 CAClearNetInterfaceInfoList(netInterfaceList);
619 return CA_MEMORY_ALLOC_FAILED;
622 uint32_t listIndex = 0;
624 for (listIndex = 0; listIndex < listLength; listIndex++)
626 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
632 conInfo[count].type = CA_IPV4;
633 conInfo[count].isSecured = false;
634 conInfo[count].addressInfo.IP.port = CAGetServerPortNum(netInfo->ipAddress, false);
635 strncpy(conInfo[count].addressInfo.IP.ipAddress, netInfo->ipAddress,
636 strlen(netInfo->ipAddress));
639 // copy secure unicast server information
642 conInfo[count].type = CA_IPV4;
643 conInfo[count].isSecured = true;
644 conInfo[count].addressInfo.IP.port = CAGetServerPortNum(netInfo->ipAddress, true);
645 strncpy(conInfo[count].addressInfo.IP.ipAddress, netInfo->ipAddress,
646 strlen(netInfo->ipAddress));
653 CAClearNetInterfaceInfoList(netInterfaceList);
655 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
659 CAResult_t CAReadIPData()
661 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
663 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
667 CAResult_t CAIPStopServers()
669 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
671 // Stop all unicast and multicast servers.
672 if (CA_STATUS_OK == CAIPStopAllServers())
674 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAIPStopAllServers success");
677 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
681 CAResult_t CAStopIP()
683 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
686 CAAdapterNetDtlsDeInit();
689 // Stop IP network monitor
690 CAIPStopNetworkMonitor();
692 // Stop send queue thread
693 if (g_sendQueueHandle)
695 CAQueueingThreadStop(g_sendQueueHandle);
698 // Stop Unicast, Secured unicast and Multicast servers running
701 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
707 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
713 CADTLSSetAdapterCallbacks(NULL, NULL, CA_IPV4);
716 CAIPSetPacketReceiveCallback(NULL);
718 // Terminate IP server
719 CAIPTerminateServer();
721 // Terminate network monitor
722 CAIPSetConnectionStateChangeCallback(NULL);
723 CAIPTerminateNetworkMonitor();
725 // Terminate message queue handler
726 CAIPDeinitializeQueueHandles();
728 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
731 void CAIPSendDataThread(void *threadData)
733 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
735 CAIPData *ipData = (CAIPData *) threadData;
738 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Invalid ip data!");
742 //If remoteEndpoint is NULL, its Multicast, else its Unicast.
743 if (ipData->remoteEndpoint)
745 //Processing for sending unicast
746 char *address = ipData->remoteEndpoint->addressInfo.IP.ipAddress;
747 uint16_t port = ipData->remoteEndpoint->addressInfo.IP.port;
750 if (!ipData->remoteEndpoint->isSecured)
752 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Unicast Data is called");
753 CAIPSendData(address, port, ipData->data, ipData->dataLen, false,
754 ipData->remoteEndpoint->isSecured);
758 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt called!");
759 CAResult_t result = CAAdapterNetDtlsEncrypt(address, port, ipData->data,
760 ipData->dataLen, CA_IPV4);
762 if (CA_STATUS_OK != result)
764 OIC_LOG(ERROR, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt failed!");
766 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
767 "CAAdapterNetDtlsEncrypt returned with result[%d]", result);
770 CAIPSendData(address, port, ipData->data, ipData->dataLen, false,
771 ipData->remoteEndpoint->isSecured);
776 //Processing for sending multicast
777 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Multicast Data is called");
778 CAIPSendData(CA_MULTICAST_IP, CA_MCAST_PORT, ipData->data,
779 ipData->dataLen, true, false);
782 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
785 CAIPData *CACreateIPData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
788 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "IPData is NULL", NULL);
790 CAIPData *ipData = (CAIPData *) OICMalloc(sizeof(CAIPData));
793 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
797 ipData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
798 ipData->data = (void *) OICMalloc(dataLength);
801 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
802 CAFreeIPData(ipData);
806 memcpy(ipData->data, data, dataLength);
807 ipData->dataLen = dataLength;
812 void CAFreeIPData(CAIPData *ipData)
814 VERIFY_NON_NULL_VOID(ipData, IP_ADAPTER_TAG, "ipData is NULL");
816 CAAdapterFreeRemoteEndpoint(ipData->remoteEndpoint);
817 OICFree(ipData->data);
821 void CADataDestroyer(void *data, uint32_t size)
823 CAIPData *etdata = (CAIPData *) data;
825 CAFreeIPData(etdata);