848d2be8d11e91838562f59e900b15d9ef44d03d
[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.h"
25 #include "cainterface.h"
26 #include "uarraylist.h"
27 #include "logger.h"
28
29 #define TAG "OIC_CA_NW_CONFIG"
30
31 static u_arraylist_t *g_selectedNetworkList = NULL;
32 static CATransportAdapter_t CASelectedNetwork = CA_DEFAULT_ADAPTER;
33
34 #ifdef EDR_ADAPTER
35 static uint32_t NETWORK_RFCOMM = CA_ADAPTER_RFCOMM_BTEDR;
36 #endif
37
38 #ifdef LE_ADAPTER
39 static uint32_t NETWORK_GATT = CA_ADAPTER_GATT_BTLE;
40 #endif
41
42 #ifdef IP_ADAPTER
43 static uint32_t NETWORK_IP = CA_ADAPTER_IP;
44 #endif
45
46 #ifdef NFC_ADAPTER
47 static uint32_t NETWORK_NFC = CA_ADAPTER_NFC;
48 #endif
49
50 #ifdef RA_ADAPTER
51 static uint32_t NETWORK_RA = CA_ADAPTER_REMOTE_ACCESS;
52 #endif
53
54 #ifdef TCP_ADAPTER
55 static uint32_t NETWORK_TCP = CA_ADAPTER_TCP;
56 #endif
57
58 CAResult_t CAAddNetworkType(CATransportAdapter_t transportType)
59 {
60     if (NULL == g_selectedNetworkList)
61     {
62         OIC_LOG(DEBUG, TAG, "Create network list");
63
64         g_selectedNetworkList = u_arraylist_create();
65
66         if (NULL == g_selectedNetworkList)
67         {
68             return CA_MEMORY_ALLOC_FAILED;
69         }
70     }
71     bool res = true;
72     switch (transportType)
73     {
74         case CA_ADAPTER_IP:
75 #ifndef IP_ADAPTER
76             OIC_LOG(DEBUG, TAG, "Add network type(IP) - Not Supported");
77             return CA_NOT_SUPPORTED;
78 #else
79
80             OIC_LOG(DEBUG, TAG, "Add network type(IP)");
81             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_IP))
82             {
83                 goto exit;
84             }
85             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_IP);
86             CASelectedNetwork |= CA_ADAPTER_IP;
87
88             break;
89 #endif // IP_ADAPTER
90
91         case CA_ADAPTER_RFCOMM_BTEDR:
92 #ifndef EDR_ADAPTER
93             OIC_LOG(DEBUG, TAG, "Add network type(EDR) - Not Supported");
94             return CA_NOT_SUPPORTED;
95 #else
96
97             OIC_LOG(DEBUG, TAG, "Add network type(EDR)");
98             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_RFCOMM))
99             {
100                 goto exit;
101             }
102             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_RFCOMM);
103             CASelectedNetwork |= CA_ADAPTER_RFCOMM_BTEDR;
104
105             break;
106 #endif // EDR_ADAPTER
107
108         case CA_ADAPTER_GATT_BTLE:
109 #ifndef LE_ADAPTER
110             OIC_LOG(DEBUG, TAG, "Add network type(LE) - Not Supported");
111             return CA_NOT_SUPPORTED;
112 #else
113
114             OIC_LOG(DEBUG, TAG, "Add network type(LE)");
115             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_GATT))
116             {
117                 goto exit;
118             }
119             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_GATT);
120             CASelectedNetwork |= CA_ADAPTER_GATT_BTLE;
121
122             break;
123 #endif // LE_ADAPTER
124
125 #ifdef RA_ADAPTER
126         case CA_ADAPTER_REMOTE_ACCESS:
127
128            OIC_LOG(DEBUG, TAG, "Add network type(RA)");
129            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_RA))
130            {
131                goto exit;
132            }
133            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_RA);
134            CASelectedNetwork |= CA_ADAPTER_REMOTE_ACCESS;
135            break;
136 #endif // RA_ADAPTER
137
138 #ifdef TCP_ADAPTER
139         case CA_ADAPTER_TCP:
140
141            OIC_LOG(DEBUG, TAG, "Add network type(TCP)");
142            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_TCP))
143            {
144                goto exit;
145            }
146            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_TCP);
147            CASelectedNetwork |= CA_ADAPTER_TCP;
148            break;
149 #endif // TCP_ADAPTER
150
151
152         case CA_ADAPTER_NFC:
153  #ifndef NFC_ADAPTER
154             OIC_LOG(DEBUG, TAG, "Add network type(NFC) - Not Supported");
155             return CA_NOT_SUPPORTED;
156
157 #else
158            OIC_LOG(DEBUG, TAG, "Add network type(NFC)");
159            if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_NFC))
160            {
161                goto exit;
162            }
163            res = u_arraylist_add(g_selectedNetworkList, &NETWORK_NFC);
164            CASelectedNetwork |= CA_ADAPTER_NFC;
165
166            break;
167 #endif // CA_ADAPTER_NFC
168
169         default:
170             break;
171     }
172
173     if (!res)
174     {
175         OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
176         return CA_STATUS_FAILED;
177     }
178     // start selected interface adapter
179     CAResult_t result = CAStartAdapter(transportType);
180     return result;
181
182 exit:
183     OIC_LOG(DEBUG, TAG, "This adapter is already enabled");
184     return CA_STATUS_OK;
185 }
186
187 CAResult_t CARemoveNetworkType(CATransportAdapter_t transportType)
188 {
189     if (NULL == g_selectedNetworkList)
190     {
191         OIC_LOG(ERROR, TAG, "SelectedNetwork list is NULL");
192
193         return CA_STATUS_FAILED;
194     }
195
196     uint32_t selectedNetworkLength = u_arraylist_length(g_selectedNetworkList);
197     for (uint32_t index = 0; index < selectedNetworkLength; index++)
198     {
199         void* ptrType = u_arraylist_get(g_selectedNetworkList, index);
200         if (NULL == ptrType)
201         {
202             continue;
203         }
204
205         CATransportAdapter_t connType = *(CATransportAdapter_t *)ptrType;
206
207         if (transportType == connType)
208         {
209             switch (transportType)
210             {
211                 case CA_ADAPTER_IP:
212 #ifndef IP_ADAPTER
213                     OIC_LOG(DEBUG, TAG, "Remove network type(IP) - Not Supported");
214                     return CA_NOT_SUPPORTED;
215 #else
216
217                     OIC_LOG(DEBUG, TAG, "Remove network type(IP)");
218                     u_arraylist_remove(g_selectedNetworkList, index);
219                     CASelectedNetwork = CASelectedNetwork & (~CA_ADAPTER_IP);
220
221                     break;
222 #endif //IP_ADAPTER
223
224                 case CA_ADAPTER_RFCOMM_BTEDR:
225 #ifndef EDR_ADAPTER
226                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR) - Not Supported");
227                     return CA_NOT_SUPPORTED;
228 #else
229                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR)");
230                     u_arraylist_remove(g_selectedNetworkList, index);
231                     CASelectedNetwork = CASelectedNetwork & (~CA_ADAPTER_RFCOMM_BTEDR);
232
233                     break;
234 #endif // EDR_ADAPTER
235
236                 case CA_ADAPTER_GATT_BTLE:
237 #ifndef LE_ADAPTER
238                     OIC_LOG(DEBUG, TAG, "Remove network type(LE) - Not Supported");
239                     return CA_NOT_SUPPORTED;
240 #else
241                     OIC_LOG(DEBUG, TAG, "Remove network type(LE)");
242                     u_arraylist_remove(g_selectedNetworkList, index);
243                     CASelectedNetwork = CASelectedNetwork & (~CA_ADAPTER_GATT_BTLE);
244                     break;
245 #endif // LE_ADAPTER
246
247 #ifdef RA_ADAPTER
248                 case CA_ADAPTER_REMOTE_ACCESS:
249                     OIC_LOG(DEBUG, TAG, "Remove network type(RA)");
250                     u_arraylist_remove(g_selectedNetworkList, index);
251                     CASelectedNetwork = CASelectedNetwork & (~CA_ADAPTER_REMOTE_ACCESS);
252                     break;
253 #endif // RA_ADAPTER
254
255 #ifdef TCP_ADAPTER
256                 case CA_ADAPTER_TCP:
257                     OIC_LOG(DEBUG, TAG, "Remove network type(TCP)");
258                     u_arraylist_remove(g_selectedNetworkList, index);
259                     CASelectedNetwork = CASelectedNetwork & (~CA_ADAPTER_TCP);
260                     break;
261 #endif // TCP_ADAPTER
262
263 #ifndef NFC_ADAPTER
264                 case CA_ADAPTER_NFC:
265                     OIC_LOG(DEBUG, TAG, "Add network type(NFC) - Not Supported");
266                     return CA_NOT_SUPPORTED;
267 #else
268                    OIC_LOG(DEBUG, TAG, "Add network type(NFC)");
269                    u_arraylist_remove(g_selectedNetworkList, index);
270                    CASelectedNetwork = CASelectedNetwork & (~CA_ADAPTER_NFC);
271                    break;
272 #endif // CA_ADAPTER_NFC
273                 default:
274                     break;
275             }
276
277             // stop selected interface adapter
278             CAStopAdapter(connType);
279             return CA_STATUS_OK;
280         }
281     }
282
283     return CA_STATUS_FAILED;
284 }
285
286 u_arraylist_t *CAGetSelectedNetworkList()
287 {
288     return g_selectedNetworkList;
289 }
290
291 CATransportAdapter_t CAGetSelectedNetwork()
292 {
293     return CASelectedNetwork;
294 }
295
296 CAResult_t CAGetNetworkInformationInternal(CAEndpoint_t **info, uint32_t *size)
297 {
298     OIC_LOG(DEBUG, TAG, "get network information.");
299
300     if (NULL == info || NULL == size)
301     {
302         OIC_LOG(ERROR, TAG, "Input parameter is invalid value");
303
304         return CA_STATUS_INVALID_PARAM;
305     }
306
307     return CAGetNetworkInfo(info, size);
308 }
309
310 CAResult_t CATerminateNetworkType()
311 {
312     OIC_LOG(DEBUG, TAG, "CATerminateNetworkType()");
313     if (NULL != g_selectedNetworkList)
314     {
315         u_arraylist_free(&g_selectedNetworkList);
316     }
317     return CA_STATUS_OK;
318 }