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 ******************************************************************/
21 #include "cainterfacecontroller_singlethread.h"
28 #include "cawifiadapter_singlethread.h"
29 #include "caethernetadapter_singlethread.h"
30 #include "caedradapter_singlethread.h"
31 #include "caleadapter_singlethread.h"
32 #include "caadapterutils.h"
34 #include "canetworkconfigurator.h"
35 #include "oic_malloc.h"
38 #define TAG "CAIFCNT_ST"
40 #define MEMORY_ALLOC_CHECK(arg) { if (arg == NULL) {OIC_LOG(DEBUG, TAG, "Out of memory");\
41 goto memory_error_exit;} }
43 #define CA_CONNECTIVITY_TYPE_NUM 4
45 static CAConnectivityHandler_t gAdapterHandler[CA_CONNECTIVITY_TYPE_NUM];
47 static CANetworkPacketReceivedCallback gNetworkPacketReceivedCallback = NULL;
49 static CANetworkChangeCallback gNetworkChangeCallback = NULL;
51 static int8_t CAGetAdapterIndex(CAConnectivityType_t cType)
67 static void CARegisterCallback(CAConnectivityHandler_t handler, CAConnectivityType_t cType)
69 OIC_LOG(DEBUG, TAG, "IN");
72 index = CAGetAdapterIndex(cType);
76 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
80 memcpy(&gAdapterHandler[index], &handler, sizeof(CAConnectivityHandler_t));
82 OIC_LOG_V(DEBUG, TAG, "%d type adapter", cType);
83 OIC_LOG(DEBUG, TAG, "OUT");
86 static void CAReceivedPacketCallback(CARemoteEndpoint_t *endpoint, void *data,
89 OIC_LOG(DEBUG, TAG, "IN");
92 if (gNetworkPacketReceivedCallback != NULL)
94 gNetworkPacketReceivedCallback(endpoint, data, dataLen);
96 OIC_LOG(DEBUG, TAG, "OUT");
99 static void CANetworkChangedCallback(CALocalConnectivity_t *info, CANetworkStatus_t status)
101 OIC_LOG(DEBUG, TAG, "IN");
103 // Call the callback.
104 if (gNetworkChangeCallback != NULL)
106 gNetworkChangeCallback(info, status);
108 OIC_LOG(DEBUG, TAG, "OUT");
111 void CAInitializeAdapters()
113 OIC_LOG(DEBUG, TAG, "IN");
115 memset(gAdapterHandler, 0, sizeof(CAConnectivityHandler_t) * CA_CONNECTIVITY_TYPE_NUM);
118 // Initialize adapters and register callback.
119 #ifdef ETHERNET_ADAPTER
120 CAInitializeEthernet(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback);
121 #endif /* ETHERNET_ADAPTER */
124 CAInitializeWifi(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback);
125 #endif /* WIFI_ADAPTER */
128 CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback);
129 #endif /* EDR_ADAPTER */
132 CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback);
133 #endif /* LE_ADAPTER */
134 OIC_LOG(DEBUG, TAG, "OUT");
138 void CASetPacketReceivedCallback(CANetworkPacketReceivedCallback callback)
140 OIC_LOG(DEBUG, TAG, "IN");
142 gNetworkPacketReceivedCallback = callback;
143 OIC_LOG(DEBUG, TAG, "OUT");
146 void CASetNetworkChangeCallback(CANetworkChangeCallback callback)
148 OIC_LOG(DEBUG, TAG, "IN");
150 gNetworkChangeCallback = callback;
151 OIC_LOG(DEBUG, TAG, "OUT");
154 void CAStartAdapter(CAConnectivityType_t cType)
156 OIC_LOG_V(DEBUG, TAG, "cType[%d]", cType);
160 index = CAGetAdapterIndex(cType);
164 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
168 if (gAdapterHandler[index].startAdapter != NULL)
170 gAdapterHandler[index].startAdapter();
172 OIC_LOG(DEBUG, TAG, "OUT");
175 void CAStopAdapter(CAConnectivityType_t cType)
177 OIC_LOG_V(DEBUG, TAG, "cType[%d]", cType);
181 index = CAGetAdapterIndex(cType);
185 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
189 if (gAdapterHandler[index].stopAdapter != NULL)
191 gAdapterHandler[index].stopAdapter();
193 OIC_LOG(DEBUG, TAG, "OUT");
196 CAResult_t CAGetNetworkInfo(CALocalConnectivity_t **info, uint32_t *size)
198 OIC_LOG(DEBUG, TAG, "IN");
199 CAResult_t res = CA_STATUS_FAILED;
203 CALocalConnectivity_t *resInfo = NULL;
204 uint32_t resSize = 0;
206 CALocalConnectivity_t *tempInfo[CA_CONNECTIVITY_TYPE_NUM];
207 uint32_t tempSize[CA_CONNECTIVITY_TYPE_NUM];
209 memset(tempInfo, 0, sizeof(CALocalConnectivity_t *) * CA_CONNECTIVITY_TYPE_NUM);
210 memset(tempSize, 0, sizeof(int8_t) * CA_CONNECTIVITY_TYPE_NUM);
212 // #1. get information each adapter
213 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
215 if (gAdapterHandler[index].GetnetInfo != NULL)
217 res = gAdapterHandler[index].GetnetInfo(&tempInfo[index], &tempSize[index]);
219 OIC_LOG_V (DEBUG, TAG, "%d adapter network info size is %d", index, tempSize[index]);
224 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
227 if (tempInfo[index] == NULL || tempSize[index] <= 0)
233 resSize += tempSize[index];
236 OIC_LOG_V(DEBUG, TAG, "network info total size is %d!", resSize);
243 // #3. add data into result
245 resInfo = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t) * resSize);
246 MEMORY_ALLOC_CHECK(resInfo);
247 memset(resInfo, 0, sizeof(CALocalConnectivity_t) * resSize);
250 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
253 if (tempInfo[index] == NULL || tempSize[index] <= 0)
258 memcpy(resInfo + i, tempInfo[index], sizeof(CALocalConnectivity_t) * tempSize[index]);
260 i += tempSize[index];
263 OICFree(tempInfo[index]);
270 OIC_LOG(DEBUG, TAG, "OUT");
274 // memory error label.
277 return CA_MEMORY_ALLOC_FAILED;
280 CAResult_t CASendUnicastData(const CARemoteEndpoint_t *endpoint, void *data, uint32_t length)
282 OIC_LOG(DEBUG, TAG, "IN");
285 uint32_t sentDataLen = 0;
286 CAResult_t res = CA_STATUS_FAILED;
288 if (endpoint == NULL)
290 OIC_LOG(DEBUG, TAG, "RemoteEndpoint is NULL");
291 return CA_STATUS_INVALID_PARAM;
294 CAConnectivityType_t type = endpoint->connectivityType;
296 index = CAGetAdapterIndex(type);
300 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
301 return CA_STATUS_INVALID_PARAM;
304 if (gAdapterHandler[index].sendData != NULL)
306 sentDataLen = gAdapterHandler[index].sendData(endpoint, data, length);
309 if (sentDataLen == length)
314 OIC_LOG(DEBUG, TAG, "OUT");
318 CAResult_t CASendMulticastData(void *data, uint32_t length)
320 OIC_LOG(DEBUG, TAG, "IN");
323 CAConnectivityType_t connType;
325 uint32_t sentDataLen = 0;
326 CAResult_t res = CA_STATUS_FAILED;
327 u_arraylist_t *list = CAGetSelectedNetworkList();
331 OIC_LOG(DEBUG, TAG, "No selected network");
332 return CA_STATUS_FAILED;
335 void *ptrType = NULL;
336 for (i = 0; i < u_arraylist_length(list); i++)
338 ptrType = u_arraylist_get(list, i);
341 OIC_LOG(ERROR, TAG, "error");
342 return CA_STATUS_FAILED;
344 connType = *(CAConnectivityType_t *) ptrType;
346 index = CAGetAdapterIndex(connType);
350 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
354 if (gAdapterHandler[index].sendDataToAll != NULL)
356 sentDataLen = gAdapterHandler[index].sendDataToAll(data, length);
359 if (sentDataLen == length)
364 OIC_LOG(DEBUG, TAG, "OUT");
368 CAResult_t CAStartListeningServerAdapters()
370 OIC_LOG(DEBUG, TAG, "IN");
373 CAConnectivityType_t connType;
375 u_arraylist_t *list = CAGetSelectedNetworkList();
379 OIC_LOG(DEBUG, TAG, "No selected network");
380 return CA_STATUS_FAILED;
383 void *ptrType = NULL;
384 for (i = 0; i < u_arraylist_length(list); i++)
386 ptrType = u_arraylist_get(list, i);
389 OIC_LOG(ERROR, TAG, "error");
390 return CA_STATUS_FAILED;
392 connType = *(CAConnectivityType_t *) ptrType;
394 index = CAGetAdapterIndex(connType);
398 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
402 if (gAdapterHandler[index].startListenServer != NULL)
404 gAdapterHandler[index].startListenServer();
407 OIC_LOG(DEBUG, TAG, "OUT");
411 CAResult_t CAStartDiscoveryServerAdapters()
413 OIC_LOG(DEBUG, TAG, "IN");
416 CAConnectivityType_t connType;
418 u_arraylist_t *list = CAGetSelectedNetworkList();
422 OIC_LOG(DEBUG, TAG, "No selected network");
423 return CA_STATUS_FAILED;
426 void *ptrType = NULL;
427 for (i = 0; i < u_arraylist_length(list); i++)
429 ptrType = u_arraylist_get(list, i);
432 OIC_LOG(ERROR, TAG, "error");
433 return CA_STATUS_FAILED;
435 connType = *(CAConnectivityType_t *) ptrType;
437 index = CAGetAdapterIndex(connType);
441 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
445 if (gAdapterHandler[index].startDiscoverServer != NULL)
447 gAdapterHandler[index].startDiscoverServer();
450 OIC_LOG(DEBUG, TAG, "OUT");
454 void CATerminateAdapters()
456 OIC_LOG(DEBUG, TAG, "IN");
460 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
462 if (gAdapterHandler[index].terminate != NULL)
464 gAdapterHandler[index].terminate();
467 OIC_LOG(DEBUG, TAG, "OUT");
470 CAResult_t CAReadData()
474 CAConnectivityType_t connType;
477 u_arraylist_t *list = CAGetSelectedNetworkList();
481 return CA_STATUS_FAILED;
483 void *ptrType = NULL;
484 for (i = 0; i < u_arraylist_length(list); i++)
486 ptrType = u_arraylist_get(list, i);
489 OIC_LOG(ERROR, TAG, "error");
490 return CA_STATUS_FAILED;
492 connType = *(CAConnectivityType_t *) ptrType;
494 index = CAGetAdapterIndex(connType);
498 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
502 if (gAdapterHandler[index].readData != NULL)
504 gAdapterHandler[index].readData();