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