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 ******************************************************************/
26 #include "cainterfacecontroller.h"
27 #include "caethernetadapter.h"
28 #include "caedradapter.h"
29 #include "caleadapter.h"
30 #include "cawifiadapter.h"
31 #include "canetworkconfigurator.h"
32 #include "caremotehandler.h"
33 #include "oic_malloc.h"
35 #include "uthreadpool.h"
39 #define CA_MEMORY_ALLOC_CHECK(arg) {if (arg == NULL) \
40 {OIC_LOG_V(DEBUG, TAG, "memory error");goto memory_error_exit;} }
42 #define CA_CONNECTIVITY_TYPE_NUM 4
44 static CAConnectivityHandler_t gAdapterHandler[CA_CONNECTIVITY_TYPE_NUM];
46 static CANetworkPacketReceivedCallback gNetworkPacketReceivedCallback = NULL;
48 static CANetworkChangeCallback gNetworkChangeCallback = NULL;
50 static int8_t CAGetAdapterIndex(CAConnectivityType_t cType)
66 static void CARegisterCallback(CAConnectivityHandler_t handler, CAConnectivityType_t cType)
68 OIC_LOG(DEBUG, TAG, "CARegisterCallback - Entry");
71 index = CAGetAdapterIndex(cType);
75 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
79 memcpy(&gAdapterHandler[index], &handler, sizeof(CAConnectivityHandler_t));
81 OIC_LOG_V(DEBUG, TAG, "%d type adapter, register complete!", cType);
84 static void CAReceivedPacketCallback(CARemoteEndpoint_t *endpoint, void *data,
87 OIC_LOG(DEBUG, TAG, "receivedPacketCallback in interface controller");
90 if (gNetworkPacketReceivedCallback != NULL)
92 gNetworkPacketReceivedCallback(endpoint, data, dataLen);
96 static void CANetworkChangedCallback(CALocalConnectivity_t *info,
97 CANetworkStatus_t status)
99 OIC_LOG(DEBUG, TAG, "Network Changed callback");
101 // Call the callback.
102 if (gNetworkChangeCallback != NULL)
104 gNetworkChangeCallback(info, status);
108 void CAInitializeAdapters(u_thread_pool_t handle)
110 OIC_LOG(DEBUG, TAG, "initialize adapters..");
112 memset(gAdapterHandler, 0, sizeof(CAConnectivityHandler_t) * CA_CONNECTIVITY_TYPE_NUM);
114 // Initialize adapters and register callback.
115 #ifdef ETHERNET_ADAPTER
116 CAInitializeEthernet(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
118 #endif /* ETHERNET_ADAPTER */
121 CAInitializeWifi(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
123 #endif /* WIFI_ADAPTER */
126 CAInitializeEDR(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
128 #endif /* EDR_ADAPTER */
131 CAInitializeLE(CARegisterCallback, CAReceivedPacketCallback, CANetworkChangedCallback,
133 #endif /* LE_ADAPTER */
137 void CASetPacketReceivedCallback(CANetworkPacketReceivedCallback callback)
139 OIC_LOG(DEBUG, TAG, "Set packet received callback");
141 gNetworkPacketReceivedCallback = callback;
144 void CASetNetworkChangeCallback(CANetworkChangeCallback callback)
146 OIC_LOG(DEBUG, TAG, "Set network change callback");
148 gNetworkChangeCallback = callback;
151 void CAStartAdapter(CAConnectivityType_t cType)
153 OIC_LOG_V(DEBUG, TAG, "Start the adapter of CAConnectivityType[%d]", cType);
157 index = CAGetAdapterIndex(cType);
161 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
165 if (gAdapterHandler[index].startAdapter != NULL)
167 gAdapterHandler[index].startAdapter();
171 void CAStopAdapter(CAConnectivityType_t cType)
173 OIC_LOG_V(DEBUG, TAG, "Stop the adapter of CAConnectivityType[%d]", cType);
177 index = CAGetAdapterIndex(cType);
181 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
185 if (gAdapterHandler[index].stopAdapter != NULL)
187 gAdapterHandler[index].stopAdapter();
191 CAResult_t CAGetNetworkInfo(CALocalConnectivity_t **info, uint32_t *size)
193 CAResult_t res = CA_STATUS_FAILED;
197 CALocalConnectivity_t *resInfo = NULL;
198 uint32_t resSize = 0;
200 CALocalConnectivity_t *tempInfo[CA_CONNECTIVITY_TYPE_NUM];
201 uint32_t tempSize[CA_CONNECTIVITY_TYPE_NUM];
203 memset(tempInfo, 0, sizeof(CALocalConnectivity_t *) * CA_CONNECTIVITY_TYPE_NUM);
204 memset(tempSize, 0, sizeof(uint32_t) * CA_CONNECTIVITY_TYPE_NUM);
206 // #1. get information each adapter
207 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
209 if (gAdapterHandler[index].GetnetInfo != NULL)
211 res = gAdapterHandler[index].GetnetInfo(&tempInfo[index], &tempSize[index]);
213 OIC_LOG_V(DEBUG, TAG, "%d adapter network info size is %d res:%d", index,
214 tempSize[index], res);
219 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
222 if (tempInfo[index] == NULL || tempSize[index] <= 0)
228 resSize += tempSize[index];
231 OIC_LOG_V(DEBUG, TAG, "network info total size is %d!", resSize);
235 res = CA_STATUS_FAILED;
239 // #3. add data into result
241 resInfo = (CALocalConnectivity_t *) OICMalloc(sizeof(CALocalConnectivity_t) * resSize);
242 CA_MEMORY_ALLOC_CHECK(resInfo);
243 memset(resInfo, 0, sizeof(CALocalConnectivity_t) * resSize);
246 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
249 if (tempInfo[index] == NULL || tempSize[index] <= 0)
254 memcpy(resInfo + i, tempInfo[index], sizeof(CALocalConnectivity_t) * tempSize[index]);
256 i += tempSize[index];
259 OICFree(tempInfo[index]);
267 OIC_LOG_V(DEBUG, TAG, "each network info save success!");
271 // memory error label.
274 return CA_MEMORY_ALLOC_FAILED;
277 CAResult_t CASendUnicastData(const CARemoteEndpoint_t *endpoint, void *data, uint32_t length)
279 OIC_LOG(DEBUG, TAG, "Send unicast data to enabled interface..");
282 CAResult_t res = CA_STATUS_FAILED;
284 if (endpoint == NULL)
286 OIC_LOG_V(DEBUG, TAG, "Invalid endpoint");
287 return CA_STATUS_INVALID_PARAM;
290 CAConnectivityType_t type = endpoint->connectivityType;
292 index = CAGetAdapterIndex(type);
296 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
297 return CA_STATUS_INVALID_PARAM;
300 if (gAdapterHandler[index].sendData != NULL)
302 res = gAdapterHandler[index].sendData(endpoint, data, length);
308 CAResult_t CASendMulticastData(void *data, uint32_t length)
310 OIC_LOG(DEBUG, TAG, "Send multicast data to enabled interface..");
314 CAResult_t res = CA_STATUS_FAILED;
315 u_arraylist_t *list = CAGetSelectedNetworkList();
319 OIC_LOG(DEBUG, TAG, "No selected network");
320 return CA_STATUS_FAILED;
323 for (i = 0; i < u_arraylist_length(list); i++)
325 void* cType = u_arraylist_get(list, i);
332 type = *(uint8_t *) cType;
334 index = CAGetAdapterIndex(type);
338 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
342 if (gAdapterHandler[index].sendDataToAll != NULL)
344 void *payload = (void *) OICMalloc(length);
347 OIC_LOG_V(ERROR, TAG, "Out of memory!");
348 return CA_MEMORY_ALLOC_FAILED;
350 memcpy(payload, data, length);
351 res = gAdapterHandler[index].sendDataToAll(payload, length);
357 CAResult_t CAStartListeningServerAdapters()
359 OIC_LOG(DEBUG, TAG, "Start listening server from adapters..");
363 u_arraylist_t *list = CAGetSelectedNetworkList();
367 OIC_LOG(DEBUG, TAG, "No selected network");
368 return CA_STATUS_FAILED;
371 for (i = 0; i < u_arraylist_length(list); i++)
373 void* cType = u_arraylist_get(list, i);
380 type = *(uint8_t *) cType;
382 index = CAGetAdapterIndex(type);
386 OIC_LOG(DEBUG, TAG, "unknown connectivity type!");
390 if (gAdapterHandler[index].startListenServer != NULL)
392 gAdapterHandler[index].startListenServer();
399 CAResult_t CAStartDiscoveryServerAdapters()
401 OIC_LOG(DEBUG, TAG, "Start discovery server from adapters..");
405 u_arraylist_t *list = CAGetSelectedNetworkList();
409 OIC_LOG(DEBUG, TAG, "No selected network");
410 return CA_STATUS_FAILED;
413 for (i = 0; i < u_arraylist_length(list); i++)
415 void* cType = u_arraylist_get(list, i);
422 type = *(uint8_t *) cType;
424 index = CAGetAdapterIndex(type);
428 OIC_LOG_V(DEBUG, TAG, "unknown connectivity type!");
432 if (gAdapterHandler[index].startDiscoverServer != NULL)
434 gAdapterHandler[index].startDiscoverServer();
441 void CATerminateAdapters()
443 OIC_LOG(DEBUG, TAG, "terminate all adapters..");
447 for (index = 0; index < CA_CONNECTIVITY_TYPE_NUM; index++)
449 if (gAdapterHandler[index].terminate != NULL)
451 gAdapterHandler[index].stopAdapter();
452 gAdapterHandler[index].terminate();