c5a89bca0969e4a4d8287ac041642b863a87535b
[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_IP = CA_IPV4;
32 static uint32_t NETWORK_EDR = CA_EDR;
33 static uint32_t NETWORK_LE = CA_LE;
34
35
36 CAResult_t CAAddNetworkType(CATransportType_t transportType)
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 (transportType)
52     {
53         case CA_IPV4:
54         {
55
56 #ifndef IP_ADAPTER
57             OIC_LOG(DEBUG, TAG, "Add network type(IP) - Not Supported");
58             return CA_NOT_SUPPORTED;
59 #endif /* IP_ADAPTER */
60
61             OIC_LOG(DEBUG, TAG, "Add network type(IP)");
62             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_IP))
63             {
64                 goto exit;
65             }
66             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_IP);
67         }
68         break;
69         case CA_IPV6:
70         {
71             OIC_LOG(ERROR, TAG, "Currently IPV6 is not supported");
72             return CA_NOT_SUPPORTED;
73         }
74
75         case CA_EDR:
76         {
77
78 #ifndef EDR_ADAPTER
79             OIC_LOG(DEBUG, TAG, "Add network type(EDR) - Not Supported");
80             return CA_NOT_SUPPORTED;
81 #endif /* EDR_ADAPTER */
82
83             OIC_LOG(DEBUG, TAG, "Add network type(EDR)");
84             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_EDR))
85             {
86                 goto exit;
87             }
88             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_EDR);
89         }
90         break;
91
92         case CA_LE:
93         {
94
95 #ifndef LE_ADAPTER
96             OIC_LOG(DEBUG, TAG, "Add network type(LE) - Not Supported");
97             return CA_NOT_SUPPORTED;
98 #endif /* LE_ADAPTER */
99
100             OIC_LOG(DEBUG, TAG, "Add network type(LE)");
101             if (u_arraylist_contains(g_selectedNetworkList, &NETWORK_LE))
102             {
103                 goto exit;
104             }
105             res = u_arraylist_add(g_selectedNetworkList, &NETWORK_LE);
106         }
107         break;
108
109     }
110
111     if (CA_STATUS_OK != res)
112     {
113         OIC_LOG_V(ERROR, TAG, "Add arraylist failed[Err code: %d]", res);
114         return res;
115     }
116     // start selected interface adapter
117     res = CAStartAdapter((CATransportType_t)transportType);
118     OIC_LOG(DEBUG, TAG, "OUT");
119     return res;
120
121 exit:
122     OIC_LOG(DEBUG, TAG, "This adapter is already enabled");
123     return CA_STATUS_OK;
124 }
125
126 CAResult_t CARemoveNetworkType(CATransportType_t transportType)
127 {
128     OIC_LOG(DEBUG, TAG, "IN");
129
130     if (NULL == g_selectedNetworkList)
131     {
132         OIC_LOG(ERROR, TAG, "SelectedNetwork list is NULL");
133
134         return CA_STATUS_FAILED;
135     }
136
137     uint32_t selectedNetworkLength = u_arraylist_length(g_selectedNetworkList);
138     for (uint32_t index = 0; index < selectedNetworkLength; index++)
139     {
140         void* ptrType = u_arraylist_get(g_selectedNetworkList, index);
141         if (NULL == ptrType)
142         {
143             continue;
144         }
145
146         CATransportType_t connType = *(CATransportType_t *) ptrType;
147
148         if (transportType == connType)
149         {
150             switch (transportType)
151             {
152                 case CA_IPV4:
153
154 #ifndef IP_ADAPTER
155                     OIC_LOG(DEBUG, TAG, "Remove network type(IP) - Not Supported");
156                     return CA_NOT_SUPPORTED;
157 #else
158
159                     OIC_LOG(DEBUG, TAG, "Remove network type(IP)");
160                     u_arraylist_remove(g_selectedNetworkList, index);
161 #endif /* IP_ADAPTER */
162                     break;
163
164                 case CA_IPV6:
165                 {
166                     OIC_LOG(ERROR, TAG, "Currently IPV6 is not supported");
167                     return CA_NOT_SUPPORTED;
168                 }
169
170                 case CA_EDR:
171
172 #ifndef EDR_ADAPTER
173                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR) - Not Supported");
174                     return CA_NOT_SUPPORTED;
175 #else
176                     OIC_LOG(DEBUG, TAG, "Remove network type(EDR)");
177                     u_arraylist_remove(g_selectedNetworkList, index);
178 #endif /* EDR_ADAPTER */
179
180                     break;
181
182                 case CA_LE:
183
184 #ifndef LE_ADAPTER
185                     OIC_LOG(DEBUG, TAG, "Remove network type(LE) - Not Supported");
186                     return CA_NOT_SUPPORTED;
187 #else
188                     OIC_LOG(DEBUG, TAG, "Remove network type(LE)");
189                     u_arraylist_remove(g_selectedNetworkList, index);
190 #endif /* LE_ADAPTER */
191
192                     break;
193             }
194
195             // stop selected interface adapter
196             CAStopAdapter(connType);
197             return CA_STATUS_OK;
198         }
199     }
200
201     return CA_STATUS_FAILED;
202 }
203
204 u_arraylist_t *CAGetSelectedNetworkList()
205 {
206     return g_selectedNetworkList;
207 }
208
209 CAResult_t CAGetNetworkInformationInternal(CALocalConnectivity_t **info, uint32_t *size)
210 {
211     OIC_LOG(DEBUG, TAG, "get network information.");
212
213     if (NULL == info || NULL == size)
214     {
215         OIC_LOG(ERROR, TAG, "Input parameter is invalid value");
216
217         return CA_STATUS_INVALID_PARAM;
218     }
219
220     return CAGetNetworkInfo(info, size);
221 }
222
223 CAResult_t CATerminateNetworkType()
224 {
225     OIC_LOG(DEBUG, TAG, "CATerminateNetworkType()");
226     if (NULL != g_selectedNetworkList)
227     {
228         u_arraylist_free(&g_selectedNetworkList);
229     }
230     return CA_STATUS_OK;
231 }