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