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"
37 #include "oic_string.h"
41 * @brief Logging tag for module name
43 #define IP_ADAPTER_TAG "IP_ADAP"
47 * @brief Port to listen for incoming data
53 * @brief Secured (unicast) port number as defined in COAP Specification, RFC-7252.
55 #define CA_SECURE_PORT 5684
59 * @brief Multicast port number as defined in COAP Specification, RFC-7252.
61 #define CA_MCAST_PORT 5683
64 * @def CA_MULTICAST_IP
65 * @brief Multicast IP Address as defined in COAP Specification, RFC-7252.
67 #define CA_MULTICAST_IP "224.0.1.187"
71 * @brief Holds inter thread ip data information.
75 CARemoteEndpoint_t *remoteEndpoint;
81 * @var g_networkPacketCallback
82 * @brief Network Packet Received Callback to CA
84 static CANetworkPacketReceivedCallback g_networkPacketCallback = NULL;
87 * @var g_networkChangeCallback
88 * @brief Network Changed Callback to CA
90 static CANetworkChangeCallback g_networkChangeCallback = NULL;
93 * @var g_sendQueueHandle
94 * @brief Queue handle for Send Data
96 static CAQueueingThread_t *g_sendQueueHandle = NULL;
100 * @brief ThreadPool for storing ca_thread_pool_t handle passed from CA
102 static ca_thread_pool_t g_threadPool = NULL;
104 static CAResult_t CAIPInitializeQueueHandles();
106 static void CAIPDeinitializeQueueHandles();
108 static void CAIPNotifyNetworkChange(const char *address, uint16_t port,
109 CANetworkStatus_t status);
111 static void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status);
113 static void CAIPPacketReceivedCB(const char *ipAddress, uint16_t port, const void *data,
114 uint32_t dataLength, bool isSecured,
115 const CARemoteId_t *identity);
117 static uint32_t CAIPPacketSendCB(const char *ipAddress, uint16_t port,
118 const void *data, uint32_t dataLength);
121 static CAResult_t CAIPStopServers();
123 static void CAIPSendDataThread(void *threadData);
125 static CAIPData *CACreateIPData(const CARemoteEndpoint_t *remoteEndpoint,
126 const void *data, uint32_t dataLength);
127 void CAFreeIPData(CAIPData *ipData);
129 static void CADataDestroyer(void *data, uint32_t size);
131 CAResult_t CAIPInitializeQueueHandles()
133 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
135 // Check if the message queue is already initialized
136 if (g_sendQueueHandle)
138 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "send queue handle is already initialized!");
142 // Create send message queue
143 g_sendQueueHandle = OICMalloc(sizeof(CAQueueingThread_t));
144 if (!g_sendQueueHandle)
146 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
147 return CA_MEMORY_ALLOC_FAILED;
150 if (CA_STATUS_OK != CAQueueingThreadInitialize(g_sendQueueHandle, g_threadPool,
151 CAIPSendDataThread, CADataDestroyer))
153 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize send queue thread");
154 OICFree(g_sendQueueHandle);
155 g_sendQueueHandle = NULL;
156 return CA_STATUS_FAILED;
159 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
163 void CAIPDeinitializeQueueHandles()
165 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
167 CAQueueingThreadDestroy(g_sendQueueHandle);
168 OICFree(g_sendQueueHandle);
169 g_sendQueueHandle = NULL;
171 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
174 void CAIPNotifyNetworkChange(const char *address, uint16_t port, CANetworkStatus_t status)
176 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
178 VERIFY_NON_NULL_VOID(address, IP_ADAPTER_TAG, "address is NULL");
180 CALocalConnectivity_t *localEndpoint = CAAdapterCreateLocalEndpoint(CA_IPV4, address);
183 OIC_LOG(ERROR, IP_ADAPTER_TAG, "localEndpoint creation failed!");
187 localEndpoint->addressInfo.IP.port = port;
189 if (g_networkChangeCallback)
191 g_networkChangeCallback(localEndpoint, status);
195 OIC_LOG(ERROR, IP_ADAPTER_TAG, "g_networkChangeCallback is NULL");
198 CAAdapterFreeLocalEndpoint(localEndpoint);
200 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
203 void CAIPConnectionStateCB(const char *ipAddress, CANetworkStatus_t status)
205 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
207 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
209 if (CA_INTERFACE_UP == status)
211 uint16_t port = CA_PORT;
212 CAResult_t ret = CAIPStartUnicastServer(ipAddress, &port, false, false);
213 if (CA_STATUS_OK == ret)
215 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port", port);
219 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Unicast server port[%d]", ret);
223 port = CA_SECURE_PORT;
224 ret = CAIPStartUnicastServer(ipAddress, &port, false, true);
225 if (CA_STATUS_OK == ret)
227 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Secure Unicast server started on %d", port);
231 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start secure Unicast server [%d]",
235 ret = CAIPStartMulticastServer(ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
236 if (CA_STATUS_OK == ret)
238 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Multicast server started on port[%d]",
243 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to start Multicast server port[%d]",
247 // Notify network change to CA
248 CAIPNotifyNetworkChange(ipAddress, port, status);
252 CAIPNotifyNetworkChange(ipAddress, 0, status);
254 // Stop Unicast, Secured unicast and Multicast servers
255 CAIPStopServer(ipAddress);
258 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
262 uint32_t CAIPPacketSendCB(const char *ipAddress, uint16_t port,
263 const void *data, uint32_t dataLength)
265 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
267 VERIFY_NON_NULL_RET(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL", 0);
269 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data is NULL", 0);
271 uint32_t sentLength = CAIPSendData(ipAddress, port, data, dataLength, false, true);
273 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Successfully sent %d of encrypted data!", sentLength);
275 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
281 void CAIPPacketReceivedCB(const char *ipAddress, uint16_t port, const void *data,
282 uint32_t dataLength, bool isSecured,
283 const CARemoteId_t *identity)
285 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
287 VERIFY_NON_NULL_VOID(ipAddress, IP_ADAPTER_TAG, "ipAddress is NULL");
289 VERIFY_NON_NULL_VOID(data, IP_ADAPTER_TAG, "data is NULL");
291 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Address: %s, port:%d", ipAddress, port);
293 // CA is freeing this memory
294 CARemoteEndpoint_t *endPoint = CAAdapterCreateRemoteEndpoint(CA_IPV4, ipAddress, NULL );
297 OIC_LOG(ERROR, IP_ADAPTER_TAG, "EndPoint creation failed!");
300 endPoint->addressInfo.IP.port = port;
301 endPoint->isSecured = isSecured;
304 endPoint->identity = *identity;
308 void *buf = OICCalloc(dataLength + 1, sizeof(char));
311 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory Allocation failed!");
312 CAAdapterFreeRemoteEndpoint(endPoint);
315 memcpy(buf, data, dataLength);
316 if (g_networkPacketCallback)
318 g_networkPacketCallback(endPoint, buf, dataLength);
323 CAAdapterFreeRemoteEndpoint(endPoint);
326 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
329 CAResult_t CAInitializeIP(CARegisterConnectivityCallback registerCallback,
330 CANetworkPacketReceivedCallback networkPacketCallback,
331 CANetworkChangeCallback netCallback, ca_thread_pool_t handle)
333 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
334 VERIFY_NON_NULL(registerCallback, IP_ADAPTER_TAG, "registerCallback");
335 VERIFY_NON_NULL(networkPacketCallback, IP_ADAPTER_TAG, "networkPacketCallback");
336 VERIFY_NON_NULL(netCallback, IP_ADAPTER_TAG, "netCallback");
337 VERIFY_NON_NULL(handle, IP_ADAPTER_TAG, "thread pool handle");
339 g_threadPool = handle;
340 g_networkChangeCallback = netCallback;
341 g_networkPacketCallback = networkPacketCallback;
343 CAResult_t ret = CAIPInitializeNetworkMonitor(g_threadPool);
344 if (CA_STATUS_OK != ret)
346 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize n/w monitor![%d]", ret);
349 CAIPSetConnectionStateChangeCallback(CAIPConnectionStateCB);
351 ret = CAIPInitializeServer(g_threadPool);
352 if (CA_STATUS_OK != ret)
354 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to initialize server![%d]", ret);
359 CAIPSetPacketReceiveCallback(CAIPPacketReceivedCB);
361 CAAdapterNetDtlsInit();
363 CADTLSSetAdapterCallbacks(CAIPPacketReceivedCB, CAIPPacketSendCB, CA_IPV4);
366 CAConnectivityHandler_t ipHandler;
367 ipHandler.startAdapter = CAStartIP;
368 ipHandler.startListenServer = CAStartIPListeningServer;
369 ipHandler.startDiscoveryServer = CAStartIPDiscoveryServer;
370 ipHandler.sendData = CASendIPUnicastData;
371 ipHandler.sendDataToAll = CASendIPMulticastData;
372 ipHandler.GetnetInfo = CAGetIPInterfaceInformation;
373 ipHandler.readData = CAReadIPData;
374 ipHandler.stopAdapter = CAStopIP;
375 ipHandler.terminate = CATerminateIP;
376 registerCallback(ipHandler, CA_IPV4);
378 if (CA_STATUS_OK != CAIPInitializeQueueHandles())
380 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Initialize Queue Handle");
382 return CA_STATUS_FAILED;
385 OIC_LOG(INFO, IP_ADAPTER_TAG, "OUT IntializeIP is Success");
389 CAResult_t CAStartIP()
391 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
393 // Start monitoring IP network
394 CAResult_t ret = CAIPStartNetworkMonitor();
395 if (CA_STATUS_OK != ret)
397 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start n/w monitor");
401 // Start send queue thread
402 if (CA_STATUS_OK != CAQueueingThreadStart(g_sendQueueHandle))
404 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to Start Send Data Thread");
405 return CA_STATUS_FAILED;
408 bool retVal = CAIPIsConnected();
411 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IP is not Connected");
415 u_arraylist_t *netInterfaceList = u_arraylist_create();
417 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
419 ret = CAIPGetInterfaceInfo(&netInterfaceList);
420 if (CA_STATUS_OK != ret)
422 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
423 CAClearNetInterfaceInfoList(netInterfaceList);
427 uint32_t listIndex = 0;
428 uint32_t listLength = u_arraylist_length(netInterfaceList);
429 for (listIndex = 0; listIndex < listLength; listIndex++)
431 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
436 uint16_t unicastPort = CA_PORT;
437 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, false, false);
438 if (CA_STATUS_OK == ret)
440 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Unicast server started on %d port",
445 unicastPort = CA_SECURE_PORT;
446 ret = CAIPStartUnicastServer(netInfo->ipAddress, &unicastPort, false, true);
448 if (CA_STATUS_OK == ret)
450 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
451 "Secure Unicast server started on %d port", unicastPort);
455 CAClearNetInterfaceInfoList(netInterfaceList);
456 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
460 CAResult_t CAStartIPListeningServer()
462 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
464 bool retVal = CAIPIsConnected();
467 OIC_LOG(DEBUG, IP_ADAPTER_TAG,
468 "IP not Connected. Couldn't start multicast server");
472 u_arraylist_t *netInterfaceList = u_arraylist_create();
474 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
476 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
477 if (CA_STATUS_OK != ret)
479 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "Failed to get IP interface info [%d]", ret);
480 CAClearNetInterfaceInfoList(netInterfaceList);
484 uint32_t listIndex = 0;
485 uint32_t listLength = u_arraylist_length(netInterfaceList);
486 for (listIndex = 0; listIndex < listLength; listIndex++)
489 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
495 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG, "Ip address for multicast interface %s",
497 ret = CAIPStartMulticastServer(netInfo->ipAddress, CA_MULTICAST_IP, CA_MCAST_PORT);
498 if (CA_STATUS_OK == ret)
500 OIC_LOG(INFO, IP_ADAPTER_TAG, "Multicast Server is Started Successfully");
504 CAClearNetInterfaceInfoList(netInterfaceList);
505 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
509 CAResult_t CAStartIPDiscoveryServer()
511 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
512 return CAStartIPListeningServer();
515 int32_t CASendIPUnicastData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
518 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
520 VERIFY_NON_NULL_RET(remoteEndpoint, IP_ADAPTER_TAG, "remoteEndpoint", -1);
521 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
522 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
526 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
530 // Create IPData to add to queue
531 CAIPData *ipData = CACreateIPData(remoteEndpoint, data, dataLength);
534 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
539 // Add message to send queue
540 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
542 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
547 int32_t CASendIPMulticastData(const void *data, uint32_t dataLength)
549 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
551 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "data", -1);
552 VERIFY_NON_NULL_RET(g_sendQueueHandle, IP_ADAPTER_TAG, "sendQueueHandle", -1);
556 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Invalid Data Length");
560 // Create IPData to add to queue
561 CAIPData *ipData = CACreateIPData(NULL, data, dataLength);
564 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Failed to create ipData!");
569 // Add message to send queue
570 CAQueueingThreadAddData(g_sendQueueHandle, ipData, sizeof(CAIPData));
572 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
577 CAResult_t CAGetIPInterfaceInformation(CALocalConnectivity_t **info, uint32_t *size)
579 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
581 VERIFY_NON_NULL(info, IP_ADAPTER_TAG, "info is NULL");
582 VERIFY_NON_NULL(size, IP_ADAPTER_TAG, "size is NULL");
584 bool retVal = CAIPIsConnected();
587 OIC_LOG(ERROR, IP_ADAPTER_TAG,
588 "Failed to get interface address, IP not Connected");
589 return CA_ADAPTER_NOT_ENABLED;
592 u_arraylist_t *netInterfaceList = u_arraylist_create();
594 VERIFY_NON_NULL(netInterfaceList, IP_ADAPTER_TAG, "netInterfaceList is NULL");
596 CAResult_t ret = CAIPGetInterfaceInfo(&netInterfaceList);
597 if (CA_STATUS_OK != ret)
599 OIC_LOG_V(ERROR, IP_ADAPTER_TAG, "CAIPGetInterfaceInfo failed:%d", ret);
600 CAClearNetInterfaceInfoList(netInterfaceList);
604 uint32_t listLength = u_arraylist_length(netInterfaceList);
605 uint32_t netInfoSize = listLength;
610 netInfoSize = listLength * 2;
614 CALocalConnectivity_t *conInfo = (CALocalConnectivity_t *) OICCalloc(
615 netInfoSize, sizeof(CALocalConnectivity_t));
618 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Malloc Failed");
619 CAClearNetInterfaceInfoList(netInterfaceList);
620 return CA_MEMORY_ALLOC_FAILED;
623 uint32_t listIndex = 0;
625 for (listIndex = 0; listIndex < listLength; listIndex++)
627 CANetInfo_t *netInfo = (CANetInfo_t *) u_arraylist_get(netInterfaceList, listIndex);
633 conInfo[count].type = CA_IPV4;
634 conInfo[count].isSecured = false;
635 conInfo[count].addressInfo.IP.port = CAGetServerPortNum(netInfo->ipAddress, false);
636 OICStrcpy(conInfo[count].addressInfo.IP.ipAddress,
637 sizeof(conInfo[count].addressInfo.IP.ipAddress),
641 // copy secure unicast server information
644 conInfo[count].type = CA_IPV4;
645 conInfo[count].isSecured = true;
646 conInfo[count].addressInfo.IP.port = CAGetServerPortNum(netInfo->ipAddress, true);
647 OICStrcpy(conInfo[count].addressInfo.IP.ipAddress,
648 sizeof(conInfo[count].addressInfo.IP.ipAddress),
656 CAClearNetInterfaceInfoList(netInterfaceList);
658 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
662 CAResult_t CAReadIPData()
664 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
666 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
670 CAResult_t CAIPStopServers()
672 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
674 // Stop all unicast and multicast servers.
675 if (CA_STATUS_OK == CAIPStopAllServers())
677 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAIPStopAllServers success");
680 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
684 CAResult_t CAStopIP()
686 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
689 CAAdapterNetDtlsDeInit();
692 // Stop IP network monitor
693 CAIPStopNetworkMonitor();
695 // Stop send queue thread
696 if (g_sendQueueHandle)
698 CAQueueingThreadStop(g_sendQueueHandle);
701 // Stop Unicast, Secured unicast and Multicast servers running
704 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
710 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
716 CADTLSSetAdapterCallbacks(NULL, NULL, CA_IPV4);
719 CAIPSetPacketReceiveCallback(NULL);
721 // Terminate IP server
722 CAIPTerminateServer();
724 // Terminate network monitor
725 CAIPSetConnectionStateChangeCallback(NULL);
726 CAIPTerminateNetworkMonitor();
728 // Terminate message queue handler
729 CAIPDeinitializeQueueHandles();
731 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
734 void CAIPSendDataThread(void *threadData)
736 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "IN");
738 CAIPData *ipData = (CAIPData *) threadData;
741 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Invalid ip data!");
745 //If remoteEndpoint is NULL, its Multicast, else its Unicast.
746 if (ipData->remoteEndpoint)
748 //Processing for sending unicast
749 char *address = ipData->remoteEndpoint->addressInfo.IP.ipAddress;
750 uint16_t port = ipData->remoteEndpoint->addressInfo.IP.port;
753 if (!ipData->remoteEndpoint->isSecured)
755 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Unicast Data is called");
756 CAIPSendData(address, port, ipData->data, ipData->dataLen, false,
757 ipData->remoteEndpoint->isSecured);
761 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt called!");
762 CAResult_t result = CAAdapterNetDtlsEncrypt(address, port, ipData->data,
763 ipData->dataLen, CA_IPV4);
765 if (CA_STATUS_OK != result)
767 OIC_LOG(ERROR, IP_ADAPTER_TAG, "CAAdapterNetDtlsEncrypt failed!");
769 OIC_LOG_V(DEBUG, IP_ADAPTER_TAG,
770 "CAAdapterNetDtlsEncrypt returned with result[%d]", result);
773 CAIPSendData(address, port, ipData->data, ipData->dataLen, false,
774 ipData->remoteEndpoint->isSecured);
779 //Processing for sending multicast
780 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "Send Multicast Data is called");
781 CAIPSendData(CA_MULTICAST_IP, CA_MCAST_PORT, ipData->data,
782 ipData->dataLen, true, false);
785 OIC_LOG(DEBUG, IP_ADAPTER_TAG, "OUT");
788 CAIPData *CACreateIPData(const CARemoteEndpoint_t *remoteEndpoint, const void *data,
791 VERIFY_NON_NULL_RET(data, IP_ADAPTER_TAG, "IPData is NULL", NULL);
793 CAIPData *ipData = (CAIPData *) OICMalloc(sizeof(CAIPData));
796 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
800 ipData->remoteEndpoint = CAAdapterCopyRemoteEndpoint(remoteEndpoint);
801 ipData->data = (void *) OICMalloc(dataLength);
804 OIC_LOG(ERROR, IP_ADAPTER_TAG, "Memory allocation failed!");
805 CAFreeIPData(ipData);
809 memcpy(ipData->data, data, dataLength);
810 ipData->dataLen = dataLength;
815 void CAFreeIPData(CAIPData *ipData)
817 VERIFY_NON_NULL_VOID(ipData, IP_ADAPTER_TAG, "ipData is NULL");
819 CAAdapterFreeRemoteEndpoint(ipData->remoteEndpoint);
820 OICFree(ipData->data);
824 void CADataDestroyer(void *data, uint32_t size)
826 CAIPData *etdata = (CAIPData *) data;
828 CAFreeIPData(etdata);