Integrated NetworkConfigurator Multi/SighleThread in CA
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / canetworkconfigurator.c
1 /******************************************************************
2  *
3  * Copyright 2014 Samsung Electronics All Rights Reserved.
4  *
5  *
6  *
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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.
18  *
19  ******************************************************************/
20
21 #include <stdlib.h>
22
23 #include "canetworkconfigurator.h"
24 #include "cainterfacecontroller_singlethread.h"
25 #include "uarraylist.h"
26 #include "logger.h"
27
28 #define TAG "CANW"
29
30 static u_arraylist_t *g_selectedNetworkList = NULL;
31 static uint32_t NETWORK_ETHERNET = CA_ETHERNET;
32 static uint32_t NETWORK_WIFI = CA_WIFI;
33 static uint32_t NETWORK_EDR = CA_EDR;
34 static uint32_t NETWORK_LE = CA_LE;
35
36 CAResult_t CAAddNetworkType(CAConnectivityType_t connectivityType)
37 {
38     OIC_LOG(DEBUG, TAG, "IN");
39     if (NULL == g_selectedNetworkList)
40     {
41         OIC_LOG(DEBUG, TAG, "Create network list");
42
43         g_selectedNetworkList = u_arraylist_create();
44
45         if (NULL == g_selectedNetworkList)
46         {
47             return CA_MEMORY_ALLOC_FAILED;
48         }
49     }
50     CAResult_t res = CA_STATUS_OK;
51     switch (connectivityType)
52     {
53         case CA_ETHERNET:
54         {
55
56 #ifndef ETHERNET_ADAPTER
57             OIC_LOG(DEBUG, TAG, "Add network type(ETHERNET) - Not Supported");
58             return CA_NOT_SUPPORTED;
59 #endif /* ETHERNET_ADAPTER */
60
61             OIC_LOG(DEBUG, TAG, "Add network type(ETHERNET)");
62             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_ETHERNET))
63             {
64                 goto exit;
65             }
66             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_ETHERNET);
67         }
68         break;
69
70         case CA_WIFI:
71         {
72
73 #ifndef WIFI_ADAPTER
74             OIC_LOG(DEBUG, TAG, "Add network type(WIFI) - Not Supported");
75             return CA_NOT_SUPPORTED;
76 #endif /* WIFI_ADAPTER */
77
78             OIC_LOG(DEBUG, TAG, "Add network type(WIFI)");
79             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_WIFI))
80             {
81                 goto exit;
82             }
83             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_WIFI);
84         }
85         break;
86
87         case CA_EDR:
88         {
89
90 #ifndef EDR_ADAPTER
91             OIC_LOG(DEBUG, TAG, "Add network type(EDR) - Not Supported");
92             return CA_NOT_SUPPORTED;
93 #endif /* EDR_ADAPTER */
94
95             OIC_LOG(DEBUG, TAG, "Add network type(EDR)");
96             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_EDR))
97             {
98                 goto exit;
99             }
100             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_EDR);
101         }
102         break;
103
104         case CA_LE:
105         {
106
107 #ifndef LE_ADAPTER
108             OIC_LOG(DEBUG, TAG, "Add network type(LE) - Not Supported");
109             return CA_NOT_SUPPORTED;
110 #endif /* LE_ADAPTER */
111
112             OIC_LOG(DEBUG, TAG, "Add network type(LE)");
113             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_LE))
114             {
115                 goto exit;
116             }
117             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_LE);
118         }
119         break;
120
121     }
122
123     if (CA_STATUS_OK != res)
124     {
125         OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
126         return res;
127     }
128
129     // start selected interface adapter
130     res = CAStartAdapter((CAConnectivityType_t)connectivityType);
131     OIC_LOG(DEBUG, TAG, "OUT");
132     return res;
133
134 exit:
135     OIC_LOG(DEBUG, TAG, "This adapter is already enabled");
136     return CA_STATUS_OK;
137 }
138
139 CAResult_t CARemoveNetworkType(CAConnectivityType_t connectivityType)
140 {
141     OIC_LOG(DEBUG, TAG, "IN");
142
143     if (NULL == g_selectedNetworkList)
144     {
145         OIC_LOG(ERROR, TAG, "SelectedNetwork list is NULL");
146
147         return CA_STATUS_FAILED;
148     }
149
150     uint32_t selectedNetworkLength = u_arraylist_length(g_selectedNetworkList);
151     uint32_t index;
152     for (index = 0; index < selectedNetworkLength; index++)
153     {
154         void* ptrType = u_arraylist_get(g_selectedNetworkList, index);
155         if (NULL == ptrType)
156         {
157             continue;
158         }
159
160         CAConnectivityType_t connType = *(CAConnectivityType_t *) ptrType;
161
162         if (connectivityType == connType)
163         {
164             switch (connectivityType)
165             {
166                 case CA_ETHERNET:
167
168 #ifndef ETHERNET_ADAPTER
169                     OIC_LOG(DEBUG, TAG, "Remove network type(ETHERNET) - Not Supported");
170                     return CA_NOT_SUPPORTED;
171 #else
172
173                     OIC_LOG(DEBUG, TAG, "Remove network type(ETHERNET)");
174                     u_arraylist_remove(g_selectedNetworkList, index);
175 #endif /* ETHERNET_ADAPTER */
176                     break;
177
178                 case CA_WIFI:
179
180 #ifndef WIFI_ADAPTER
181                     OIC_LOG(DEBUG, TAG, "Remove network type(WIFI) - Not Supported");
182                     return CA_NOT_SUPPORTED;
183 #else
184                     OIC_LOG(DEBUG, TAG, "Remove network type(WIFI)");
185                     u_arraylist_remove(g_selectedNetworkList, index);
186 #endif /* WIFI_ADAPTER */
187
188                     break;
189
190                 case CA_EDR:
191
192 #ifndef EDR_ADAPTER
193                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR) - Not Supported");
194                     return CA_NOT_SUPPORTED;
195 #else
196                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR)");
197                     u_arraylist_remove(g_selectedNetworkList, index);
198 #endif /* EDR_ADAPTER */
199
200                     break;
201
202                 case CA_LE:
203
204 #ifndef LE_ADAPTER
205                     OIC_LOG(DEBUG, TAG, "Remove network type(LE) - Not Supported");
206                     return CA_NOT_SUPPORTED;
207 #else
208                     OIC_LOG(DEBUG, TAG, "Remove network type(LE)");
209                     u_arraylist_remove(g_selectedNetworkList, index);
210 #endif /* LE_ADAPTER */
211
212                     break;
213             }
214
215             // stop selected interface adapter
216             CAStopAdapter(connType);
217             return CA_STATUS_OK;
218         }
219     }
220
221     return CA_STATUS_FAILED;
222 }
223
224 u_arraylist_t *CAGetSelectedNetworkList()
225 {
226     return g_selectedNetworkList;
227 }
228
229 CAResult_t CAGetNetworkInformationInternal(CALocalConnectivity_t **info, uint32_t *size)
230 {
231     OIC_LOG(DEBUG, TAG, "get network information.");
232
233     if (NULL == info || NULL == size)
234     {
235         OIC_LOG(ERROR, TAG, "Input parameter is invalid value");
236
237         return CA_STATUS_INVALID_PARAM;
238     }
239
240     return CAGetNetworkInfo(info, size);
241 }
242
243 CAResult_t CATerminateNetworkType()
244 {
245     OIC_LOG(DEBUG, TAG, "CATerminateNetworkType()");
246     if (NULL != g_selectedNetworkList)
247     {
248         u_arraylist_free(&g_selectedNetworkList);
249     }
250     return CA_STATUS_OK;
251 }