Remove dead code
[platform/core/api/connection.git] / src / connection.c
1 /*
2  * Copyright (c) 2011-2013 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <glib.h>
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <vconf/vconf.h>
22 #include <system_info.h>
23
24 #include "net_connection_private.h"
25
26 static GSList *conn_handle_list = NULL;
27 static int tv_profile = -1; // Unknown
28
29 //LCOV_EXCL_START
30 static int __connection_convert_net_state(int status)
31 {
32         switch (status) {
33         case VCONFKEY_NETWORK_CELLULAR:
34                 return CONNECTION_TYPE_CELLULAR;
35         case VCONFKEY_NETWORK_WIFI:
36                 return CONNECTION_TYPE_WIFI;
37         case VCONFKEY_NETWORK_ETHERNET:
38                 return CONNECTION_TYPE_ETHERNET;
39         case VCONFKEY_NETWORK_BLUETOOTH:
40                 return CONNECTION_TYPE_BT;
41         case VCONFKEY_NETWORK_DEFAULT_PROXY:
42                 return CONNECTION_TYPE_NET_PROXY;
43         default:
44                 return CONNECTION_TYPE_DISCONNECTED;
45         }
46 }
47
48 static int __connection_convert_cellular_state(int status)
49 {
50         switch (status) {
51         case VCONFKEY_NETWORK_CELLULAR_ON:
52                 return CONNECTION_CELLULAR_STATE_AVAILABLE;
53         case VCONFKEY_NETWORK_CELLULAR_3G_OPTION_OFF:
54                 return CONNECTION_CELLULAR_STATE_CALL_ONLY_AVAILABLE;
55         case VCONFKEY_NETWORK_CELLULAR_ROAMING_OFF:
56                 return CONNECTION_CELLULAR_STATE_ROAMING_OFF;
57         case VCONFKEY_NETWORK_CELLULAR_FLIGHT_MODE:
58                 return CONNECTION_CELLULAR_STATE_FLIGHT_MODE;
59         default:
60                 return CONNECTION_CELLULAR_STATE_OUT_OF_SERVICE;
61         }
62 }
63
64 static bool __connection_check_handle_validity(connection_h connection)
65 {
66         bool ret = false;
67
68         if (connection == NULL)
69                 return false;
70
71         if (g_slist_find(conn_handle_list, connection) != NULL)
72                 ret = true;
73
74         return ret;
75 }
76
77 bool _connection_check_handle_validity(connection_h connection)
78 {
79         return __connection_check_handle_validity(connection);
80 }
81
82 static void __connection_set_type_changed_callback(connection_handle_s *conn_handle,
83                         void *callback, void *user_data)
84 {
85         conn_handle->type_changed_user_data = user_data;
86         conn_handle->type_changed_callback = callback;
87 }
88
89 static void __connection_set_ip_changed_callback(connection_handle_s *conn_handle,
90                         void *callback, void *user_data)
91 {
92         conn_handle->ip_changed_user_data = user_data;
93         conn_handle->ip_changed_callback = callback;
94 }
95
96 static void __connection_set_proxy_changed_callback(connection_handle_s *conn_handle,
97                         void *callback, void *user_data)
98 {
99         conn_handle->proxy_changed_user_data = user_data;
100         conn_handle->proxy_changed_callback = callback;
101 }
102
103 static void __connection_set_internet_state_changed_callback(connection_handle_s *conn_handle,
104                         void *callback, void *user_data)
105 {
106         conn_handle->internet_state_changed_user_data = user_data;
107         conn_handle->internet_state_changed_callback = callback;
108 }
109
110 static void __connection_set_ethernet_cable_state_changed_cb(connection_handle_s *conn_handle,
111                         void *callback, void *user_data)
112 {
113         conn_handle->ethernet_cable_state_changed_callback = callback;
114         conn_handle->ethernet_cable_state_changed_user_data = user_data;
115 }
116
117 static void __connection_set_default_cellular_service_profile_callback(connection_handle_s *conn_handle,
118                         void *callback, void *user_data)
119 {
120         conn_handle->set_default_callback = callback;
121         conn_handle->set_default_user_data = user_data;
122 }
123
124 static void __connection_open_profile_set_callback(connection_handle_s *conn_handle,
125                         void *callback, void *user_data)
126 {
127         conn_handle->opened_callback = callback;
128         conn_handle->opened_user_data = user_data;
129 }
130
131 static void __connection_close_profile_set_callback(connection_handle_s *conn_handle,
132                         void *callback, void *user_data)
133 {
134         conn_handle->closed_callback = callback;
135         conn_handle->closed_user_data = user_data;
136 }
137
138 static void __connection_reset_profile_set_callback(connection_handle_s *conn_handle,
139                         void *callback, void *user_data)
140 {
141         conn_handle->reset_callback = callback;
142         conn_handle->reset_user_data = user_data;
143 }
144 //LCOV_EXCL_STOP
145
146 /* Connection Manager ********************************************************/
147 EXPORT_API int connection_create(connection_h *connection)
148 {
149         CONN_LOCK;
150
151         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
152
153         int rv;
154
155         if (connection == NULL || __connection_check_handle_validity(*connection)) {
156                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
157                 CONN_UNLOCK; //LCOV_EXCL_LINE
158                 return CONNECTION_ERROR_INVALID_PARAMETER;
159         }
160
161         *connection = g_try_malloc0(sizeof(connection_handle_s));
162         if (*connection != NULL) {
163                 CONNECTION_LOG(CONNECTION_INFO, "New handle created[%p]", *connection);
164         } else {
165                 CONN_UNLOCK; //LCOV_EXCL_LINE
166                 return CONNECTION_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
167         }
168
169         rv = _connection_libnet_init(*connection);
170         if (rv == NET_ERR_ACCESS_DENIED) {
171                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
172                 CONN_UNLOCK; //LCOV_EXCL_LINE
173                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
174         } else if (rv != NET_ERR_NONE) {
175                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to create connection[%d]", rv); //LCOV_EXCL_LINE
176                 CONN_UNLOCK; //LCOV_EXCL_LINE
177                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
178         }
179
180         conn_handle_list = g_slist_prepend(conn_handle_list, *connection);
181
182         CONN_UNLOCK;
183         return CONNECTION_ERROR_NONE;
184 }
185
186 EXPORT_API int connection_destroy(connection_h connection)
187 {
188         CONN_LOCK;
189
190         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
191
192         if (!(__connection_check_handle_validity(connection))) {
193                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
194                 CONN_UNLOCK;
195                 return CONNECTION_ERROR_INVALID_PARAMETER;
196         }
197
198         CONNECTION_LOG(CONNECTION_INFO, "Destroy handle: %p", connection);
199
200         __connection_set_type_changed_callback(connection, NULL, NULL);
201         __connection_set_ip_changed_callback(connection, NULL, NULL);
202         __connection_set_proxy_changed_callback(connection, NULL, NULL);
203         __connection_set_internet_state_changed_callback(connection, NULL, NULL);
204         __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
205
206         conn_handle_list = g_slist_remove(conn_handle_list, connection);
207         _connection_libnet_deinit(connection, (conn_handle_list == NULL));
208
209         g_free(connection);
210         connection = NULL;
211
212         CONN_UNLOCK;
213         return CONNECTION_ERROR_NONE;
214 }
215
216 //LCOV_EXCL_START
217 EXPORT_API int connection_create_cs(int tid, connection_h *connection)
218 {
219         int rv;
220
221         rv = connection_create(connection);
222         if (rv == CONNECTION_ERROR_NONE) {
223                 CONN_LOCK;
224                 _connection_set_cs_tid(tid, *connection);
225                 CONN_UNLOCK;
226         }
227
228         return rv;
229 }
230
231 EXPORT_API int connection_destroy_cs(int tid, connection_h connection)
232 {
233         int rv;
234
235         CONN_LOCK;
236         _connection_unset_cs_tid(tid, connection);
237         CONN_UNLOCK;
238
239         rv = connection_destroy(connection);
240
241         return rv;
242 }
243 //LCOV_EXCL_STOP
244
245 EXPORT_API int connection_get_type(connection_h connection, connection_type_e* type)
246 {
247         int rv = 0;
248         int status = 0;
249
250         CONN_LOCK;
251
252         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
253
254         if (type == NULL || !(__connection_check_handle_validity(connection))) {
255                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
256                 CONN_UNLOCK;
257                 return CONNECTION_ERROR_INVALID_PARAMETER;
258         }
259
260         rv = vconf_get_int(VCONFKEY_NETWORK_STATUS, &status);
261         if (rv != VCONF_OK) {
262                 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_int Failed = %d", status); //LCOV_EXCL_LINE
263                 CONN_UNLOCK; //LCOV_EXCL_LINE
264                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
265         }
266
267         CONNECTION_LOG(CONNECTION_INFO, "Connected Network = %d", status);
268
269         *type = __connection_convert_net_state(status);
270
271         CONN_UNLOCK;
272         return CONNECTION_ERROR_NONE;
273 }
274
275 EXPORT_API int connection_get_ip_address(connection_h connection,
276                                 connection_address_family_e address_family, char** ip_address)
277 {
278         CONN_LOCK;
279
280         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
281
282         if (ip_address == NULL || !(__connection_check_handle_validity(connection))) {
283                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
284                 CONN_UNLOCK;
285                 return CONNECTION_ERROR_INVALID_PARAMETER;
286         }
287
288         switch (address_family) {
289         case CONNECTION_ADDRESS_FAMILY_IPV4:
290                 *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP);
291                 break;
292         case CONNECTION_ADDRESS_FAMILY_IPV6:
293                 *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP6);
294                 break;
295         default:
296                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
297                 CONN_UNLOCK;
298                 return CONNECTION_ERROR_INVALID_PARAMETER;
299         }
300
301         if (*ip_address == NULL) {
302                 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE
303                 CONN_UNLOCK; //LCOV_EXCL_LINE
304                 return CONNECTION_ERROR_OPERATION_FAILED;//LCOV_EXCL_LINE
305         }
306
307         CONN_UNLOCK;
308         return CONNECTION_ERROR_NONE;
309 }
310
311 EXPORT_API int connection_get_proxy(connection_h connection,
312                                 connection_address_family_e address_family, char** proxy)
313 {
314         CONN_LOCK;
315
316         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
317
318         if (proxy == NULL || !(__connection_check_handle_validity(connection))) {
319                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
320                 CONN_UNLOCK;
321                 return CONNECTION_ERROR_INVALID_PARAMETER;
322         }
323
324         switch (address_family) {
325         case CONNECTION_ADDRESS_FAMILY_IPV4:
326         case CONNECTION_ADDRESS_FAMILY_IPV6:
327                 *proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY);
328                 break;
329         default:
330                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
331                 CONN_UNLOCK;
332                 return CONNECTION_ERROR_INVALID_PARAMETER;
333         }
334
335         if (*proxy == NULL) {
336                 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE
337                 CONN_UNLOCK; //LCOV_EXCL_LINE
338                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
339         }
340
341         CONN_UNLOCK;
342         return CONNECTION_ERROR_NONE;
343 }
344
345 EXPORT_API int connection_get_mac_address(connection_h connection, connection_type_e type, char** mac_addr)
346 {
347         FILE *fp;
348         char buf[CONNECTION_MAC_INFO_LENGTH + 1];
349
350         CONN_LOCK;
351
352         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE, ETHERNET_FEATURE);
353
354         if (type == CONNECTION_TYPE_WIFI)
355                 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
356         else if (type == CONNECTION_TYPE_ETHERNET) //LCOV_EXCL_LINE
357                 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); //LCOV_EXCL_LINE
358
359         if (mac_addr == NULL || !(__connection_check_handle_validity(connection))) {
360                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
361                 CONN_UNLOCK;
362                 return CONNECTION_ERROR_INVALID_PARAMETER;
363         }
364
365         switch (type) {
366         case CONNECTION_TYPE_WIFI:
367                 if (__builtin_expect(tv_profile == -1, 0)) {
368                         char *profileName;
369                         system_info_get_platform_string("http://tizen.org/feature/profile", &profileName);
370                         if (*profileName == 't' || *profileName == 'T')
371                                 tv_profile = 1; //LCOV_EXCL_LINE
372                         else
373                                 tv_profile = 0;
374                         free(profileName);
375                 }
376                 if (tv_profile == 1) {
377                         //LCOV_EXCL_START
378                         fp = fopen(WIFI_MAC_INFO_FILE, "r");
379                         if (fp == NULL) {
380                                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", WIFI_MAC_INFO_FILE);
381                                 CONN_UNLOCK;
382                                 return CONNECTION_ERROR_OUT_OF_MEMORY;
383                         }
384
385                         if (fgets(buf, sizeof(buf), fp) == NULL) {
386                                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", WIFI_MAC_INFO_FILE);
387                                 fclose(fp);
388                                 CONN_UNLOCK;
389                                 return CONNECTION_ERROR_OPERATION_FAILED;
390                         }
391
392                         CONNECTION_LOG(CONNECTION_INFO, "%s : %s", WIFI_MAC_INFO_FILE, buf);
393
394                         *mac_addr = (char *)malloc(CONNECTION_MAC_INFO_LENGTH + 1);
395                         if (*mac_addr == NULL) {
396                                 CONNECTION_LOG(CONNECTION_ERROR, "malloc() failed");
397                                 fclose(fp);
398                                 CONN_UNLOCK;
399                                 return CONNECTION_ERROR_OUT_OF_MEMORY;
400                         }
401                         g_strlcpy(*mac_addr, buf, CONNECTION_MAC_INFO_LENGTH + 1);
402                         fclose(fp);
403                         //LCOV_EXCL_STOP
404                 } else {
405                         *mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
406
407                         if (*mac_addr == NULL) {
408                                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get vconf from %s", VCONFKEY_WIFI_BSSID_ADDRESS); //LCOV_EXCL_LINE
409                                 CONN_UNLOCK; //LCOV_EXCL_LINE
410                                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
411                         }
412                 }
413                 break;
414         //LCOV_EXCL_START
415         case CONNECTION_TYPE_ETHERNET:
416                 fp = fopen(ETHERNET_MAC_INFO_FILE, "r");
417                 if (fp == NULL) {
418                         CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", ETHERNET_MAC_INFO_FILE);
419                         CONN_UNLOCK;
420                         return CONNECTION_ERROR_OUT_OF_MEMORY;
421                 }
422
423                 if (fgets(buf, sizeof(buf), fp) == NULL) {
424                         CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", ETHERNET_MAC_INFO_FILE);
425                         fclose(fp);
426                         CONN_UNLOCK;
427                         return CONNECTION_ERROR_OPERATION_FAILED;
428                 }
429
430                 CONNECTION_LOG(CONNECTION_INFO, "%s : %s", ETHERNET_MAC_INFO_FILE, buf);
431
432                 *mac_addr = (char *)malloc(CONNECTION_MAC_INFO_LENGTH + 1);
433                 if (*mac_addr == NULL) {
434                         CONNECTION_LOG(CONNECTION_ERROR, "malloc() failed");
435                         fclose(fp);
436                         CONN_UNLOCK;
437                         return CONNECTION_ERROR_OUT_OF_MEMORY;
438                 }
439
440                 g_strlcpy(*mac_addr, buf, CONNECTION_MAC_INFO_LENGTH + 1);
441                 fclose(fp);
442
443                 break;
444         //LCOV_EXCL_STOP
445         default:
446                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
447                 CONN_UNLOCK; //LCOV_EXCL_LINE
448                 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
449         }
450
451         /* Checking Invalid MAC Address */
452         if ((strcmp(*mac_addr, "00:00:00:00:00:00") == 0) ||
453                         (strcmp(*mac_addr, "ff:ff:ff:ff:ff:ff") == 0)) {
454                 CONNECTION_LOG(CONNECTION_ERROR, "MAC Address(%s) is invalid", *mac_addr); //LCOV_EXCL_LINE
455                 CONN_UNLOCK; //LCOV_EXCL_LINE
456                 return CONNECTION_ERROR_INVALID_OPERATION; //LCOV_EXCL_LINE
457         }
458
459         CONNECTION_LOG(CONNECTION_INFO, "MAC Address %s", *mac_addr);
460
461         CONN_UNLOCK;
462         return CONNECTION_ERROR_NONE;
463 }
464
465
466 EXPORT_API int connection_is_metered_network(connection_h connection, bool* is_metered)
467 {
468         CONN_LOCK;
469
470         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
471
472         if (is_metered == NULL || !(__connection_check_handle_validity(connection))) {
473                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
474                 CONN_UNLOCK;
475                 return CONNECTION_ERROR_INVALID_PARAMETER;
476         }
477
478         int rv = _connection_libnet_get_metered_state(connection, is_metered);
479         if (rv != CONNECTION_ERROR_NONE) {
480                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get metered state[%d]", rv); //LCOV_EXCL_LINE
481                 CONN_UNLOCK; //LCOV_EXCL_LINE
482                 return rv; //LCOV_EXCL_LINE
483         }
484
485         CONNECTION_LOG(CONNECTION_INFO, "metered state: %s", is_metered ? "true" : "false");
486         CONN_UNLOCK;
487         return CONNECTION_ERROR_NONE;
488 }
489
490
491 EXPORT_API int connection_get_cellular_state(connection_h connection, connection_cellular_state_e* state)
492 {
493         int rv = 0;
494         int status = 0;
495         int cellular_state = 0;
496 #if defined TIZEN_DUALSIM_ENABLE
497         int sim_id = 0;
498 #endif
499
500         CONN_LOCK;
501
502         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
503
504         if (state == NULL || !(__connection_check_handle_validity(connection))) {
505                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
506                 CONN_UNLOCK;
507                 return CONNECTION_ERROR_INVALID_PARAMETER;
508         }
509
510         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status);
511         if (rv != VCONF_OK) {
512                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE
513                 CONN_UNLOCK; //LCOV_EXCL_LINE
514                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
515         }
516
517         CONNECTION_LOG(CONNECTION_INFO, "Cellular: %d", status);
518         *state = __connection_convert_cellular_state(status);
519
520         if (*state == CONNECTION_CELLULAR_STATE_AVAILABLE) {
521 #if defined TIZEN_DUALSIM_ENABLE
522                 rv = vconf_get_int(VCONF_TELEPHONY_DEFAULT_DATA_SERVICE, &sim_id);
523                 if (rv != VCONF_OK) {
524                         CONNECTION_LOG(CONNECTION_ERROR,
525                                         "Failed to get default subscriber id", sim_id);
526                         CONN_UNLOCK;
527                         return CONNECTION_ERROR_OPERATION_FAILED;
528                 }
529
530                 switch (sim_id) {
531                 case CONNECTION_CELLULAR_SUBSCRIBER_1:
532 #endif
533                         rv = vconf_get_int(VCONFKEY_DNET_STATE, &cellular_state);
534 #if defined TIZEN_DUALSIM_ENABLE
535                         break;
536
537                 case CONNECTION_CELLULAR_SUBSCRIBER_2:
538                         rv = vconf_get_int(VCONFKEY_DNET_STATE2, &cellular_state);
539                         break;
540
541                 default:
542                         CONNECTION_LOG(CONNECTION_ERROR, "Invalid subscriber id:%d", sim_id);
543                         CONN_UNLOCK;
544                         return CONNECTION_ERROR_OPERATION_FAILED;
545                 }
546 #endif
547                 if (rv != VCONF_OK) {
548                         CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE
549                         CONN_UNLOCK; //LCOV_EXCL_LINE
550                         return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
551                 }
552         }
553
554         CONNECTION_LOG(CONNECTION_INFO, "Cellular state: %d", cellular_state);
555
556         if (cellular_state == VCONFKEY_DNET_NORMAL_CONNECTED ||
557                         cellular_state == VCONFKEY_DNET_SECURE_CONNECTED ||
558                         cellular_state == VCONFKEY_DNET_TRANSFER)
559                 *state = CONNECTION_CELLULAR_STATE_CONNECTED;
560
561         CONN_UNLOCK;
562         return CONNECTION_ERROR_NONE;
563 }
564
565 EXPORT_API int connection_get_wifi_state(connection_h connection, connection_wifi_state_e* state)
566 {
567         CONN_LOCK;
568
569         CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
570
571         if (state == NULL || !(__connection_check_handle_validity(connection))) {
572                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
573                 CONN_UNLOCK;
574                 return CONNECTION_ERROR_INVALID_PARAMETER;
575         }
576
577         int rv = _connection_libnet_get_wifi_state(connection, state);
578         if (rv != CONNECTION_ERROR_NONE) {
579                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get Wi-Fi state[%d]", rv); //LCOV_EXCL_LINE
580                 CONN_UNLOCK; //LCOV_EXCL_LINE
581                 return rv; //LCOV_EXCL_LINE
582         }
583
584         CONNECTION_LOG(CONNECTION_INFO, "Wi-Fi state: %d", *state);
585
586         CONN_UNLOCK;
587         return CONNECTION_ERROR_NONE;
588 }
589
590 //LCOV_EXCL_START
591 EXPORT_API int connection_get_ethernet_state(connection_h connection, connection_ethernet_state_e *state)
592 {
593         CONN_LOCK;
594
595         CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
596
597         if (state == NULL || !(__connection_check_handle_validity(connection))) {
598                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
599                 CONN_UNLOCK;
600                 return CONNECTION_ERROR_INVALID_PARAMETER;
601         }
602
603         int rv = _connection_libnet_get_ethernet_state(connection, state);
604         if (rv != CONNECTION_ERROR_NONE) {
605                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get ethernet state[%d]", rv); //LCOV_EXCL_LINE
606                 CONN_UNLOCK;
607                 return rv; //LCOV_EXCL_LINE
608         }
609
610         CONN_UNLOCK;
611         return CONNECTION_ERROR_NONE;
612 }
613
614 EXPORT_API int connection_get_ethernet_cable_state(connection_h connection, connection_ethernet_cable_state_e *state)
615 {
616         CONN_LOCK;
617
618         CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
619
620         if (state == NULL || !(__connection_check_handle_validity(connection))) {
621                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
622                 CONN_UNLOCK;
623                 return CONNECTION_ERROR_INVALID_PARAMETER;
624         }
625
626         int rv = _connection_libnet_get_ethernet_cable_state(connection, state);
627         if (rv != CONNECTION_ERROR_NONE) {
628                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get ethernet cable state[%d]", rv); //LCOV_EXCL_LINE
629                 CONN_UNLOCK;
630                 return rv; //LCOV_EXCL_LINE
631         }
632
633         CONN_UNLOCK;
634         return CONNECTION_ERROR_NONE;
635 }
636
637 EXPORT_API int connection_set_ethernet_cable_state_chaged_cb(connection_h connection,
638                           connection_ethernet_cable_state_chaged_cb callback, void *user_data)
639 {
640         DEPRECATED_LOG(__FUNCTION__, "connection_set_ethernet_cable_state_changed_cb");
641
642         CONN_LOCK;
643
644         CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
645
646         if (callback == NULL || !(__connection_check_handle_validity(connection))) {
647                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
648                 CONN_UNLOCK;
649                 return CONNECTION_ERROR_INVALID_PARAMETER;
650         }
651
652         DEPRECATED_LOG("connection_ethernet_cable_state_chaged_cb",
653                         "connection_ethernet_cable_state_changed_cb");
654
655         __connection_set_ethernet_cable_state_changed_cb(connection, callback, user_data);
656
657         CONN_UNLOCK;
658         return CONNECTION_ERROR_NONE;
659 }
660
661 EXPORT_API int connection_unset_ethernet_cable_state_chaged_cb(connection_h connection)
662 {
663         DEPRECATED_LOG(__FUNCTION__, "connection_unset_ethernet_cable_state_changed_cb");
664
665         CONN_LOCK;
666
667         CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
668
669         if (!(__connection_check_handle_validity(connection))) {
670                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
671                 CONN_UNLOCK;
672                 return CONNECTION_ERROR_INVALID_PARAMETER;
673         }
674
675         __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
676
677         CONN_UNLOCK;
678         return CONNECTION_ERROR_NONE;
679 }
680
681 EXPORT_API int connection_set_ethernet_cable_state_changed_cb(connection_h connection,
682                           connection_ethernet_cable_state_changed_cb callback, void *user_data)
683 {
684         CONN_LOCK;
685
686         CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
687
688         if (callback == NULL || !(__connection_check_handle_validity(connection))) {
689                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
690                 CONN_UNLOCK;
691                 return CONNECTION_ERROR_INVALID_PARAMETER;
692         }
693
694         __connection_set_ethernet_cable_state_changed_cb(connection, callback, user_data);
695
696         CONN_UNLOCK;
697         return CONNECTION_ERROR_NONE;
698 }
699
700 EXPORT_API int connection_unset_ethernet_cable_state_changed_cb(connection_h connection)
701 {
702         CONN_LOCK;
703
704         CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
705
706         if (!(__connection_check_handle_validity(connection))) {
707                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
708                 CONN_UNLOCK;
709                 return CONNECTION_ERROR_INVALID_PARAMETER;
710         }
711
712         __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
713
714         CONN_UNLOCK;
715         return CONNECTION_ERROR_NONE;
716 }
717 //LCOV_EXCL_STOP
718
719 EXPORT_API int connection_get_bt_state(connection_h connection, connection_bt_state_e *state)
720 {
721         CONN_LOCK;
722
723         CHECK_FEATURE_SUPPORTED(TETHERING_BLUETOOTH_FEATURE);
724
725         if (state == NULL || !(__connection_check_handle_validity(connection))) {
726                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
727                 CONN_UNLOCK;
728                 return CONNECTION_ERROR_INVALID_PARAMETER;
729         }
730
731         int rv = _connection_libnet_get_bluetooth_state(connection, state);
732         if (rv != CONNECTION_ERROR_NONE) {
733                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get bluetooth state[%d]", rv); //LCOV_EXCL_LINE
734                 CONN_UNLOCK; //LCOV_EXCL_LINE
735                 return rv; //LCOV_EXCL_LINE
736         }
737
738         CONN_UNLOCK;
739         return CONNECTION_ERROR_NONE;
740 }
741
742 EXPORT_API int connection_set_type_changed_cb(connection_h connection,
743                                         connection_type_changed_cb callback, void* user_data)
744 {
745         CONN_LOCK;
746
747         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
748
749         if (callback == NULL || !(__connection_check_handle_validity(connection))) {
750                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
751                 CONN_UNLOCK;
752                 return CONNECTION_ERROR_INVALID_PARAMETER;
753         }
754
755         __connection_set_type_changed_callback(connection, callback, user_data);
756
757         CONN_UNLOCK;
758         return CONNECTION_ERROR_NONE;
759 }
760
761 EXPORT_API int connection_unset_type_changed_cb(connection_h connection)
762 {
763         CONN_LOCK;
764
765         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
766
767         if (!(__connection_check_handle_validity(connection))) {
768                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
769                 CONN_UNLOCK;
770                 return CONNECTION_ERROR_INVALID_PARAMETER;
771         }
772
773         __connection_set_type_changed_callback(connection, NULL, NULL);
774
775         CONN_UNLOCK;
776         return CONNECTION_ERROR_NONE;
777 }
778
779 EXPORT_API int connection_set_ip_address_changed_cb(connection_h connection,
780                                 connection_address_changed_cb callback, void* user_data)
781 {
782         CONN_LOCK;
783
784         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
785
786         if (callback == NULL || !(__connection_check_handle_validity(connection))) {
787                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
788                 CONN_UNLOCK;
789                 return CONNECTION_ERROR_INVALID_PARAMETER;
790         }
791
792         __connection_set_ip_changed_callback(connection, callback, user_data);
793
794         CONN_UNLOCK;
795         return CONNECTION_ERROR_NONE;
796 }
797
798 EXPORT_API int connection_unset_ip_address_changed_cb(connection_h connection)
799 {
800         CONN_LOCK;
801
802         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
803
804         if (!(__connection_check_handle_validity(connection))) {
805                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
806                 CONN_UNLOCK;
807                 return CONNECTION_ERROR_INVALID_PARAMETER;
808         }
809
810         __connection_set_ip_changed_callback(connection, NULL, NULL);
811
812         CONN_UNLOCK;
813         return CONNECTION_ERROR_NONE;
814 }
815
816 EXPORT_API int connection_set_proxy_address_changed_cb(connection_h connection,
817                                 connection_address_changed_cb callback, void* user_data)
818 {
819         CONN_LOCK;
820
821         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
822
823         if (callback == NULL || !(__connection_check_handle_validity(connection))) {
824                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
825                 CONN_UNLOCK;
826                 return CONNECTION_ERROR_INVALID_PARAMETER;
827         }
828
829         __connection_set_proxy_changed_callback(connection, callback, user_data);
830
831         CONN_UNLOCK;
832         return CONNECTION_ERROR_NONE;
833 }
834
835 EXPORT_API int connection_unset_proxy_address_changed_cb(connection_h connection)
836 {
837         CONN_LOCK;
838
839         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
840
841         if (!(__connection_check_handle_validity(connection))) {
842                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
843                 CONN_UNLOCK;
844                 return CONNECTION_ERROR_INVALID_PARAMETER;
845         }
846
847         __connection_set_proxy_changed_callback(connection, NULL, NULL);
848
849         CONN_UNLOCK;
850         return CONNECTION_ERROR_NONE;
851 }
852
853 EXPORT_API int connection_set_internet_state_changed_cb(connection_h connection,
854                 connection_internet_state_changed_cb callback, void *user_data)
855 {
856         CONN_LOCK;
857
858         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
859
860         if (callback == NULL || !(__connection_check_handle_validity(connection))) {
861                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
862                 CONN_UNLOCK;
863                 return CONNECTION_ERROR_INVALID_PARAMETER;
864         }
865
866         __connection_set_internet_state_changed_callback(connection, callback, user_data);
867
868         CONN_UNLOCK;
869         return CONNECTION_ERROR_NONE;
870 }
871
872 EXPORT_API int connection_unset_internet_state_changed_cb(connection_h connection)
873 {
874         CONN_LOCK;
875
876         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
877
878         if (!(__connection_check_handle_validity(connection))) {
879                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
880                 CONN_UNLOCK;
881                 return CONNECTION_ERROR_INVALID_PARAMETER;
882         }
883
884         __connection_set_internet_state_changed_callback(connection, NULL, NULL);
885
886         CONN_UNLOCK;
887         return CONNECTION_ERROR_NONE;
888 }
889
890 EXPORT_API int connection_add_profile(connection_h connection, connection_profile_h profile)
891 {
892         int rv = 0;
893         connection_handle_s *conn_handle = (connection_handle_s *)connection;
894         net_profile_info_t *profile_info = (net_profile_info_t *)profile;
895
896         CONN_LOCK;
897
898         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
899
900         if (!(__connection_check_handle_validity(connection)) ||
901             !(_connection_libnet_check_profile_validity(profile))) {
902                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
903                 CONN_UNLOCK;
904                 return CONNECTION_ERROR_INVALID_PARAMETER;
905         }
906
907         if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
908                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
909                 CONN_UNLOCK; //LCOV_EXCL_LINE
910                 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
911         }
912
913         if (profile_info->ProfileInfo.Pdp.PSModemPath[0] != '/' ||
914                         strlen(profile_info->ProfileInfo.Pdp.PSModemPath) < 2) {
915                 CONNECTION_LOG(CONNECTION_ERROR, "Modem object path is NULL"); //LCOV_EXCL_LINE
916                 CONN_UNLOCK; //LCOV_EXCL_LINE
917                 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
918         }
919
920         rv = net_add_profile(conn_handle->network_info_handle,
921                                 profile_info->ProfileInfo.Pdp.ServiceType, profile_info);
922         if (rv == NET_ERR_ACCESS_DENIED) {
923                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
924                 CONN_UNLOCK; //LCOV_EXCL_LINE
925                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
926         } else if (rv != NET_ERR_NONE) {
927                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to add profile[%d]", rv); //LCOV_EXCL_LINE
928                 CONN_UNLOCK; //LCOV_EXCL_LINE
929                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
930         }
931
932         CONN_UNLOCK;
933         return CONNECTION_ERROR_NONE;
934 }
935
936 EXPORT_API int connection_remove_profile(connection_h connection, connection_profile_h profile)
937 {
938         int rv = 0;
939         connection_handle_s *conn_handle = (connection_handle_s *)connection;
940         net_profile_info_t *profile_info = (net_profile_info_t *)profile;
941
942         CONN_LOCK;
943
944         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
945
946         if (!(__connection_check_handle_validity(connection)) ||
947                 !(_connection_libnet_check_profile_validity(profile))) {
948                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
949                 CONN_UNLOCK;
950                 return CONNECTION_ERROR_INVALID_PARAMETER;
951         }
952
953         if (profile_info->profile_type != NET_DEVICE_CELLULAR &&
954                 profile_info->profile_type != NET_DEVICE_MESH &&
955             profile_info->profile_type != NET_DEVICE_WIFI) {
956                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
957                 CONN_UNLOCK; //LCOV_EXCL_LINE
958                 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
959         }
960
961         rv = net_delete_profile(conn_handle->network_info_handle, profile_info->ProfileName);
962         if (rv == NET_ERR_ACCESS_DENIED) {
963                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
964                 CONN_UNLOCK; //LCOV_EXCL_LINE
965                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
966         } else if (rv != NET_ERR_NONE) {
967                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to delete profile[%d]", rv); //LCOV_EXCL_LINE
968                 CONN_UNLOCK; //LCOV_EXCL_LINE
969                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
970         }
971
972         CONN_UNLOCK;
973         return CONNECTION_ERROR_NONE;
974 }
975
976 EXPORT_API int connection_update_profile(connection_h connection, connection_profile_h profile)
977 {
978         int rv = 0;
979         connection_handle_s *conn_handle = (connection_handle_s *)connection;
980         net_profile_info_t *profile_info = (net_profile_info_t *)profile;
981
982         CONN_LOCK;
983
984         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
985
986         if (!(__connection_check_handle_validity(connection)) ||
987             !(_connection_libnet_check_profile_validity(profile))) {
988                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
989                 CONN_UNLOCK;
990                 return CONNECTION_ERROR_INVALID_PARAMETER;
991         }
992
993         rv = net_modify_profile(conn_handle->network_info_handle,
994                         profile_info->ProfileName, (net_profile_info_t*)profile);
995         if (rv == NET_ERR_ACCESS_DENIED) {
996                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
997                 CONN_UNLOCK; //LCOV_EXCL_LINE
998                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
999         } else if (rv != NET_ERR_NONE) {
1000                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to modify profile[%d]", rv); //LCOV_EXCL_LINE
1001                 CONN_UNLOCK; //LCOV_EXCL_LINE
1002                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1003         }
1004
1005         CONN_UNLOCK;
1006         return CONNECTION_ERROR_NONE;
1007 }
1008
1009 EXPORT_API int connection_get_profile_iterator(connection_h connection,
1010                 connection_iterator_type_e type, connection_profile_iterator_h* profile_iterator)
1011 {
1012         CONN_LOCK;
1013
1014         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1015
1016         if (!(__connection_check_handle_validity(connection)) ||
1017             (type != CONNECTION_ITERATOR_TYPE_REGISTERED &&
1018              type != CONNECTION_ITERATOR_TYPE_CONNECTED &&
1019              type != CONNECTION_ITERATOR_TYPE_DEFAULT)) {
1020                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1021                 CONN_UNLOCK;
1022                 return CONNECTION_ERROR_INVALID_PARAMETER;
1023         }
1024
1025         int rv = _connection_libnet_get_profile_iterator(connection, type, profile_iterator);
1026         if (rv != CONNECTION_ERROR_NONE) {
1027                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get profile iterator [%d]", rv); //LCOV_EXCL_LINE
1028                 CONN_UNLOCK; //LCOV_EXCL_LINE
1029                 return rv; //LCOV_EXCL_LINE
1030         }
1031
1032         CONN_UNLOCK;
1033         return CONNECTION_ERROR_NONE;
1034 }
1035
1036 EXPORT_API int connection_profile_iterator_next(connection_profile_iterator_h profile_iterator,
1037                                                         connection_profile_h* profile)
1038 {
1039         CONN_LOCK;
1040
1041         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1042
1043         int rv = _connection_libnet_get_iterator_next(profile_iterator, profile);
1044
1045         CONN_UNLOCK;
1046         return rv;
1047 }
1048
1049 EXPORT_API bool connection_profile_iterator_has_next(connection_profile_iterator_h profile_iterator)
1050 {
1051         CONN_LOCK;
1052
1053         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1054
1055         int rv = _connection_libnet_iterator_has_next(profile_iterator);
1056
1057         CONN_UNLOCK;
1058         return rv;
1059 }
1060
1061 EXPORT_API int connection_destroy_profile_iterator(connection_profile_iterator_h profile_iterator)
1062 {
1063         CONN_LOCK;
1064
1065         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1066
1067         int rv = _connection_libnet_destroy_iterator(profile_iterator);
1068
1069         CONN_UNLOCK;
1070         return rv;
1071 }
1072
1073 EXPORT_API int connection_get_current_profile(connection_h connection, connection_profile_h* profile)
1074 {
1075         CONN_LOCK;
1076
1077         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1078
1079         if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1080                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1081                 CONN_UNLOCK;
1082                 return CONNECTION_ERROR_INVALID_PARAMETER;
1083         }
1084
1085         int rv = _connection_libnet_get_current_profile(connection, profile);
1086         if (rv != CONNECTION_ERROR_NONE) {
1087                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get current profile [%d]", rv); //LCOV_EXCL_LINE
1088                 CONN_UNLOCK; //LCOV_EXCL_LINE
1089                 return rv; //LCOV_EXCL_LINE
1090         }
1091
1092         CONN_UNLOCK;
1093         return CONNECTION_ERROR_NONE;
1094 }
1095
1096 EXPORT_API int connection_get_default_cellular_service_profile(
1097                 connection_h connection, connection_cellular_service_type_e type,
1098                 connection_profile_h *profile)
1099 {
1100         CONN_LOCK;
1101
1102         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1103
1104         if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1105                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1106                 CONN_UNLOCK;
1107                 return CONNECTION_ERROR_INVALID_PARAMETER;
1108         }
1109
1110         int rv = _connection_libnet_get_cellular_service_profile(connection, type, profile);
1111         if (rv != CONNECTION_ERROR_NONE) {
1112                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get default cellular service profile [%d]", rv); //LCOV_EXCL_LINE
1113                 CONN_UNLOCK; //LCOV_EXCL_LINE
1114                 return rv; //LCOV_EXCL_LINE
1115         }
1116
1117         CONN_UNLOCK;
1118         return CONNECTION_ERROR_NONE;
1119 }
1120
1121 EXPORT_API int connection_set_default_cellular_service_profile(connection_h connection,
1122                 connection_cellular_service_type_e type, connection_profile_h profile)
1123 {
1124         CONN_LOCK;
1125
1126         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1127
1128         if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1129                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1130                 CONN_UNLOCK;
1131                 return CONNECTION_ERROR_INVALID_PARAMETER;
1132         }
1133
1134         int rv = _connection_libnet_set_cellular_service_profile_sync(connection, type, profile);
1135         if (rv != CONNECTION_ERROR_NONE) {
1136                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to set default cellular service profile [%d]", rv); //LCOV_EXCL_LINE
1137                 CONN_UNLOCK; //LCOV_EXCL_LINE
1138                 return rv; //LCOV_EXCL_LINE
1139         }
1140
1141         CONN_UNLOCK;
1142         return CONNECTION_ERROR_NONE;
1143 }
1144
1145 EXPORT_API int connection_set_default_cellular_service_profile_async(connection_h connection,
1146                 connection_cellular_service_type_e type, connection_profile_h profile,
1147                 connection_set_default_cb callback, void* user_data)
1148 {
1149         CONN_LOCK;
1150
1151         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1152
1153         int rv;
1154
1155         if (!(__connection_check_handle_validity(connection)) ||
1156             profile == NULL || callback == NULL) {
1157                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1158                 CONN_UNLOCK;
1159                 return CONNECTION_ERROR_INVALID_PARAMETER;
1160         }
1161
1162         rv = _connection_libnet_set_cellular_service_profile_async(connection, type, profile);
1163         if (rv == NET_ERR_ACCESS_DENIED) {
1164                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1165                 CONN_UNLOCK; //LCOV_EXCL_LINE
1166                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1167         } else if (rv != NET_ERR_NONE) {
1168                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to set default cellular service profile[%d]", rv); //LCOV_EXCL_LINE
1169                 CONN_UNLOCK; //LCOV_EXCL_LINE
1170                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1171         }
1172
1173         __connection_set_default_cellular_service_profile_callback(connection, callback, user_data);
1174
1175         CONN_UNLOCK;
1176         return CONNECTION_ERROR_NONE;
1177 }
1178
1179 EXPORT_API int connection_open_profile(connection_h connection, connection_profile_h profile,
1180                                         connection_opened_cb callback, void* user_data)
1181 {
1182         CONN_LOCK;
1183
1184         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1185
1186         int rv;
1187
1188         if (!(__connection_check_handle_validity(connection)) ||
1189             profile == NULL || callback == NULL) {
1190                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1191                 CONN_UNLOCK;
1192                 return CONNECTION_ERROR_INVALID_PARAMETER;
1193         }
1194
1195         rv = _connection_libnet_open_profile(connection, profile);
1196         if (rv == NET_ERR_ACCESS_DENIED) {
1197                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1198                 CONN_UNLOCK; //LCOV_EXCL_LINE
1199                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1200         } else if (rv != NET_ERR_NONE) {
1201                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to open profile[%d]", rv); //LCOV_EXCL_LINE
1202                 CONN_UNLOCK; //LCOV_EXCL_LINE
1203                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1204         }
1205
1206         __connection_open_profile_set_callback(connection, callback, user_data);
1207
1208         CONN_UNLOCK;
1209         return CONNECTION_ERROR_NONE;
1210 }
1211
1212 EXPORT_API int connection_close_profile(connection_h connection, connection_profile_h profile,
1213                                         connection_closed_cb callback, void* user_data)
1214 {
1215         CONN_LOCK;
1216
1217         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1218
1219         int rv;
1220
1221         if (!(__connection_check_handle_validity(connection)) ||
1222             profile == NULL || callback == NULL) {
1223                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1224                 CONN_UNLOCK;
1225                 return CONNECTION_ERROR_INVALID_PARAMETER;
1226         }
1227
1228         rv = _connection_libnet_close_profile(connection, profile);
1229         if (rv == NET_ERR_ACCESS_DENIED) {
1230                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1231                 CONN_UNLOCK; //LCOV_EXCL_LINE
1232                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1233         } else if (rv != NET_ERR_NONE) {
1234                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to close profile[%d]", rv); //LCOV_EXCL_LINE
1235                 CONN_UNLOCK; //LCOV_EXCL_LINE
1236                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1237         }
1238
1239         __connection_close_profile_set_callback(connection, callback, user_data);
1240
1241         CONN_UNLOCK;
1242         return CONNECTION_ERROR_NONE;
1243 }
1244
1245 EXPORT_API int connection_reset_profile(connection_h connection,
1246                                 connection_reset_option_e type, int id, connection_reset_cb callback, void *user_data)
1247 {
1248         CONN_LOCK;
1249
1250         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1251
1252         int rv;
1253
1254         if (!(__connection_check_handle_validity(connection))) {
1255                 CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed");
1256                 CONN_UNLOCK;
1257                 return CONNECTION_ERROR_INVALID_PARAMETER;
1258         }
1259
1260         if (id < 0 || id > 1) {
1261                 CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed"); //LCOV_EXCL_LINE
1262                 CONN_UNLOCK; //LCOV_EXCL_LINE
1263                 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1264         }
1265
1266         rv = _connection_libnet_reset_profile(connection, type, id);
1267         if (rv == NET_ERR_ACCESS_DENIED) {
1268                 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1269                 CONN_UNLOCK; //LCOV_EXCL_LINE
1270                 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1271         } else if (rv != NET_ERR_NONE) {
1272                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to reset profile[%d]", rv); //LCOV_EXCL_LINE
1273                 CONN_UNLOCK; //LCOV_EXCL_LINE
1274                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1275         }
1276
1277         __connection_reset_profile_set_callback(connection, callback, user_data);
1278
1279         CONN_UNLOCK;
1280         return CONNECTION_ERROR_NONE;
1281 }
1282
1283 EXPORT_API int connection_add_route(connection_h connection, const char* interface_name, const char* host_address)
1284 {
1285         CONN_LOCK;
1286
1287         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1288
1289         if (!(__connection_check_handle_validity(connection)) ||
1290             interface_name == NULL || host_address == NULL) {
1291                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1292                 CONN_UNLOCK;
1293                 return CONNECTION_ERROR_INVALID_PARAMETER;
1294         }
1295
1296         int rv = _connection_libnet_add_route(connection, interface_name, host_address);
1297         if (rv != CONNECTION_ERROR_NONE) {
1298                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to add route [%d]", rv); //LCOV_EXCL_LINE
1299                 CONN_UNLOCK; //LCOV_EXCL_LINE
1300                 return rv; //LCOV_EXCL_LINE
1301         }
1302
1303         CONN_UNLOCK;
1304         return CONNECTION_ERROR_NONE;
1305 }
1306
1307 EXPORT_API int connection_remove_route(connection_h connection, const char* interface_name, const char* host_address)
1308 {
1309         CONN_LOCK;
1310
1311         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1312
1313         if (!(__connection_check_handle_validity(connection)) ||
1314             interface_name == NULL || host_address == NULL) {
1315                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1316                 CONN_UNLOCK;
1317                 return CONNECTION_ERROR_INVALID_PARAMETER;
1318         }
1319
1320         int rv = _connection_libnet_remove_route(connection, interface_name, host_address);
1321         if (rv != CONNECTION_ERROR_NONE) {
1322                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to remove route [%d]", rv); //LCOV_EXCL_LINE
1323                 CONN_UNLOCK; //LCOV_EXCL_LINE
1324                 return rv; //LCOV_EXCL_LINE
1325         }
1326
1327         CONN_UNLOCK;
1328         return CONNECTION_ERROR_NONE;
1329 }
1330
1331 EXPORT_API int connection_add_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
1332 {
1333         CONN_LOCK;
1334
1335         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1336
1337         if (!(__connection_check_handle_validity(connection)) ||
1338             interface_name == NULL || host_address == NULL) {
1339                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1340                 CONN_UNLOCK;
1341                 return CONNECTION_ERROR_INVALID_PARAMETER;
1342         }
1343
1344         int rv = _connection_libnet_add_route_ipv6(connection, interface_name, host_address, gateway);
1345         if (rv != CONNECTION_ERROR_NONE) {
1346                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to add route ipv6 [%d]", rv); //LCOV_EXCL_LINE
1347                 CONN_UNLOCK; //LCOV_EXCL_LINE
1348                 return rv; //LCOV_EXCL_LINE
1349         }
1350
1351         CONN_UNLOCK;
1352         return CONNECTION_ERROR_NONE;
1353 }
1354
1355 EXPORT_API int connection_remove_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
1356 {
1357         CONN_LOCK;
1358
1359         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1360
1361         if (!(__connection_check_handle_validity(connection)) ||
1362             interface_name == NULL || host_address == NULL) {
1363                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1364                 CONN_UNLOCK;
1365                 return CONNECTION_ERROR_INVALID_PARAMETER;
1366         }
1367
1368         int rv = _connection_libnet_remove_route_ipv6(connection, interface_name, host_address, gateway);
1369         if (rv != CONNECTION_ERROR_NONE) {
1370                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to remove route ipv6 [%d]", rv); //LCOV_EXCL_LINE
1371                 CONN_UNLOCK; //LCOV_EXCL_LINE
1372                 return rv; //LCOV_EXCL_LINE
1373         }
1374
1375         CONN_UNLOCK;
1376         return CONNECTION_ERROR_NONE;
1377 }
1378
1379 EXPORT_API int connection_add_route_entry(connection_h connection,
1380                 connection_address_family_e address_family,     const char *interface_name,
1381                 const char *host_address, const char *gateway)
1382 {
1383         CONN_LOCK;
1384
1385         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1386
1387         if (!(__connection_check_handle_validity(connection)) ||
1388                 (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
1389              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
1390             interface_name == NULL || host_address == NULL) {
1391                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1392                 CONN_UNLOCK;
1393                 return CONNECTION_ERROR_INVALID_PARAMETER;
1394         }
1395
1396         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
1397                 int rv = _connection_libnet_add_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV4,
1398                                                                 interface_name, host_address, gateway);
1399                 CONN_UNLOCK;
1400                 return rv;
1401         } else {
1402                 int rv = _connection_libnet_add_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV6,
1403                                                                 interface_name, host_address, gateway);
1404                 CONN_UNLOCK;
1405                 return rv;
1406         }
1407 }
1408
1409 EXPORT_API int connection_remove_route_entry(connection_h connection,
1410                 connection_address_family_e address_family,     const char *interface_name,
1411                 const char *host_address, const char *gateway)
1412 {
1413         CONN_LOCK;
1414
1415         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1416
1417         if (!(__connection_check_handle_validity(connection)) ||
1418                 (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
1419              address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
1420             interface_name == NULL || host_address == NULL) {
1421                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1422                 CONN_UNLOCK;
1423                 return CONNECTION_ERROR_INVALID_PARAMETER;
1424         }
1425
1426         if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
1427                 int rv = _connection_libnet_remove_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV4,
1428                                                                 interface_name, host_address, gateway);
1429                 CONN_UNLOCK;
1430                 return rv;
1431         } else {
1432                 int rv = _connection_libnet_remove_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV6,
1433                                                                 interface_name, host_address, gateway);
1434                 CONN_UNLOCK;
1435                 return rv;
1436         }
1437 }
1438
1439 static int __get_cellular_statistic(connection_statistics_type_e statistics_type, long long *llsize)
1440 {
1441         int rv = VCONF_OK, rv1 = VCONF_OK;
1442         int last_size = 0, size = 0;
1443 #if defined TIZEN_DUALSIM_ENABLE
1444         int sim_id = 0;
1445 #endif
1446
1447         if (llsize == NULL) {
1448                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
1449                 return CONNECTION_ERROR_INVALID_PARAMETER;
1450         }
1451
1452         switch (statistics_type) {
1453         case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1454         case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1455         case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1456         case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1457                 break;
1458         default:
1459                 return CONNECTION_ERROR_INVALID_PARAMETER;
1460         }
1461
1462 #if defined TIZEN_DUALSIM_ENABLE
1463         rv = vconf_get_int(VCONF_TELEPHONY_DEFAULT_DATA_SERVICE, &sim_id);
1464         if (rv != VCONF_OK) {
1465                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get default subscriber id");
1466                 *llsize = 0;
1467                 return CONNECTION_ERROR_OPERATION_FAILED;
1468         }
1469
1470         switch (sim_id) {
1471         case 0:
1472 #endif
1473                 switch (statistics_type) {
1474                 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1475                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT, &last_size);
1476                         break;
1477                 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1478                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV, &last_size);
1479                         break;
1480                 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1481                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT, &last_size);
1482                         rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_SNT, &size);
1483                         break;
1484                 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1485                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV, &last_size);
1486                         rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_RCV, &size);
1487                         break;
1488                 }
1489 #if defined TIZEN_DUALSIM_ENABLE
1490                 break;
1491         case 1:
1492                 switch (statistics_type) {
1493                 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1494                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT2, &last_size);
1495                         break;
1496                 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1497                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV2, &last_size);
1498                         break;
1499                 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1500                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT2, &last_size);
1501                         rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_SNT2, &size);
1502                         break;
1503                 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1504                         rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV2, &last_size);
1505                         rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_RCV2, &size);
1506                         break;
1507                 }
1508                 break;
1509         default:
1510                 *llsize = 0;
1511                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid subscriber id:%d", sim_id);
1512                 return CONNECTION_ERROR_OPERATION_FAILED;
1513         }
1514 #endif
1515
1516         if (rv != VCONF_OK || rv1 != VCONF_OK) {
1517                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular statistics"); //LCOV_EXCL_LINE
1518                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1519         }
1520
1521         *llsize = (long long)(last_size * 1000) + (long long)(size * 1000);
1522         CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", *llsize);
1523
1524         return CONNECTION_ERROR_NONE;
1525 }
1526
1527 static int __get_statistic(connection_handle_s *conn_handle, connection_type_e connection_type,
1528                 connection_statistics_type_e statistics_type, long long *llsize)
1529 {
1530         int rv, stat_type;
1531         unsigned long long ull_size;
1532
1533         if (llsize == NULL) {
1534                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
1535                 return CONNECTION_ERROR_INVALID_PARAMETER;
1536         }
1537
1538         rv  = _connection_libnet_check_get_privilege();
1539         if (rv == CONNECTION_ERROR_PERMISSION_DENIED)
1540                 return rv;
1541         else if (rv != CONNECTION_ERROR_NONE) {
1542                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get statistics"); //LCOV_EXCL_LINE
1543                 return CONNECTION_ERROR_OPERATION_FAILED;
1544         }
1545
1546         if (connection_type == CONNECTION_TYPE_CELLULAR)
1547                 return __get_cellular_statistic(statistics_type, llsize);
1548         else if (connection_type == CONNECTION_TYPE_WIFI) {
1549                 switch (statistics_type) {
1550                 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1551                         stat_type = NET_STATISTICS_TYPE_LAST_SENT_DATA;
1552                         break;
1553                 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1554                         stat_type = NET_STATISTICS_TYPE_LAST_RECEIVED_DATA;
1555                         break;
1556                 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1557                         stat_type = NET_STATISTICS_TYPE_TOTAL_SENT_DATA;
1558                         break;
1559                 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1560                         stat_type = NET_STATISTICS_TYPE_TOTAL_RECEIVED_DATA;
1561                         break;
1562                 default:
1563                         return CONNECTION_ERROR_INVALID_PARAMETER;
1564                 }
1565
1566                 rv  = _connection_libnet_get_statistics(conn_handle, stat_type, &ull_size);
1567                 if (rv == CONNECTION_ERROR_PERMISSION_DENIED)
1568                         return rv;
1569                 else if (rv != CONNECTION_ERROR_NONE) {
1570                         CONNECTION_LOG(CONNECTION_ERROR, "Failed to get Wi-Fi statistics"); //LCOV_EXCL_LINE
1571                         *llsize = 0; //LCOV_EXCL_LINE
1572                         return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1573                 }
1574
1575                 CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", ull_size);
1576                 *llsize = (long long)ull_size;
1577         } else
1578                 return CONNECTION_ERROR_INVALID_PARAMETER;
1579
1580         return CONNECTION_ERROR_NONE;
1581 }
1582
1583 static int __reset_statistic(connection_handle_s *conn_handle,
1584                         connection_type_e connection_type, connection_statistics_type_e statistics_type)
1585 {
1586         int conn_type;
1587         int stat_type;
1588         int rv;
1589
1590         if (connection_type == CONNECTION_TYPE_CELLULAR)
1591                 conn_type = NET_DEVICE_CELLULAR;
1592         else if (connection_type == CONNECTION_TYPE_WIFI)
1593                 conn_type = NET_DEVICE_WIFI;
1594         else
1595                 return CONNECTION_ERROR_INVALID_PARAMETER;
1596
1597         switch (statistics_type) {
1598         case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1599                 stat_type = NET_STATISTICS_TYPE_LAST_SENT_DATA;
1600                 break;
1601         case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1602                 stat_type = NET_STATISTICS_TYPE_LAST_RECEIVED_DATA;
1603                 break;
1604         case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1605                 stat_type = NET_STATISTICS_TYPE_TOTAL_SENT_DATA;
1606                 break;
1607         case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1608                 stat_type = NET_STATISTICS_TYPE_TOTAL_RECEIVED_DATA;
1609                 break;
1610         default:
1611                 return CONNECTION_ERROR_INVALID_PARAMETER;
1612         }
1613
1614         rv = _connection_libnet_set_statistics(conn_handle, conn_type, stat_type);
1615         if (rv != CONNECTION_ERROR_NONE)
1616                 return rv;
1617
1618         CONNECTION_LOG(CONNECTION_INFO, "connection_reset_statistics success");
1619
1620         return CONNECTION_ERROR_NONE;
1621 }
1622
1623 EXPORT_API int connection_get_statistics(connection_h connection,
1624                                 connection_type_e connection_type,
1625                                 connection_statistics_type_e statistics_type, long long* size)
1626 {
1627         CONN_LOCK;
1628
1629         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
1630
1631         if (connection_type == CONNECTION_TYPE_CELLULAR)
1632                 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1633         else if (connection_type == CONNECTION_TYPE_WIFI)
1634                 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1635
1636         if (!(__connection_check_handle_validity(connection)) || size == NULL) {
1637                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1638                 CONN_UNLOCK;
1639                 return CONNECTION_ERROR_INVALID_PARAMETER;
1640         }
1641
1642         int rv = __get_statistic(connection, connection_type, statistics_type, size);
1643         if (rv != CONNECTION_ERROR_NONE) {
1644                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get statistics [%d]", rv); //LCOV_EXCL_LINE
1645                 CONN_UNLOCK;
1646                 return rv; //LCOV_EXCL_LINE
1647         }
1648
1649         CONN_UNLOCK;
1650         return CONNECTION_ERROR_NONE;
1651 }
1652
1653 EXPORT_API int connection_reset_statistics(connection_h connection,
1654                                 connection_type_e connection_type,
1655                                 connection_statistics_type_e statistics_type)
1656 {
1657         CONN_LOCK;
1658
1659         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
1660
1661         if (connection_type == CONNECTION_TYPE_CELLULAR)
1662                 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1663         else if (connection_type == CONNECTION_TYPE_WIFI)
1664                 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1665
1666         if (!__connection_check_handle_validity(connection)) {
1667                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1668                 CONN_UNLOCK;
1669                 return CONNECTION_ERROR_INVALID_PARAMETER;
1670         }
1671
1672         int rv = __reset_statistic(connection, connection_type, statistics_type);
1673         if (rv != CONNECTION_ERROR_NONE) {
1674                 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get statistics [%d]", rv); //LCOV_EXCL_LINE
1675                 CONN_UNLOCK;
1676                 return rv; //LCOV_EXCL_LINE
1677         }
1678
1679         CONN_UNLOCK;
1680         return CONNECTION_ERROR_NONE;
1681 }
1682
1683 EXPORT_API int connection_foreach_ipv6_address(connection_h connection,
1684                 connection_type_e connection_type, connection_ipv6_address_cb callback,
1685                 void *user_data)
1686 {
1687         CONN_LOCK;
1688
1689         CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE,
1690                         TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1691
1692         GSList *ipv6_address_list = NULL;
1693
1694         if (!(__connection_check_handle_validity(connection))) {
1695                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1696                 CONN_UNLOCK;
1697                 return CONNECTION_ERROR_INVALID_PARAMETER;
1698         }
1699
1700         int rv = CONNECTION_ERROR_NONE;
1701
1702         switch (connection_type) {
1703         case CONNECTION_TYPE_WIFI:
1704                 rv = net_foreach_ipv6_address(NET_DEVICE_WIFI,
1705                                 &ipv6_address_list);
1706                 break;
1707         case CONNECTION_TYPE_CELLULAR:
1708                 rv = net_foreach_ipv6_address(NET_DEVICE_CELLULAR,
1709                                 &ipv6_address_list);
1710                 break;
1711         case CONNECTION_TYPE_ETHERNET:
1712                 rv = net_foreach_ipv6_address(NET_DEVICE_ETHERNET,
1713                                 &ipv6_address_list);
1714                 break;
1715         case CONNECTION_TYPE_BT:
1716                 rv = net_foreach_ipv6_address(NET_DEVICE_BLUETOOTH,
1717                                 &ipv6_address_list);
1718                 break;
1719         default:
1720                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1721                 CONN_UNLOCK;
1722                 return CONNECTION_ERROR_INVALID_PARAMETER;
1723         }
1724
1725         if (rv != NET_ERR_NONE) {
1726                 CONNECTION_LOG(CONNECTION_ERROR, "net_get_multiple_id_address" //LCOV_EXCL_LINE
1727                                 " Failed = %d\n", rv);
1728                 CONN_UNLOCK; //LCOV_EXCL_LINE
1729                 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1730         }
1731
1732         GSList *list;
1733         for (list = ipv6_address_list; list; list = list->next) {
1734                 rv = callback((char *)list->data, user_data);
1735                 if (rv == false)
1736                         break;
1737         }
1738
1739         g_slist_free_full(ipv6_address_list, g_free);
1740         ipv6_address_list = NULL;
1741
1742         CONN_UNLOCK;
1743         return CONNECTION_ERROR_NONE;
1744 }
1745
1746 EXPORT_API int connection_profile_start_tcpdump(connection_h connection)
1747 {
1748         int ret = 0;
1749
1750         CONN_LOCK;
1751
1752         if (!(__connection_check_handle_validity(connection))) {
1753                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1754                 CONN_UNLOCK;
1755                 return CONNECTION_ERROR_INVALID_PARAMETER;
1756         }
1757
1758         ret = _connection_libnet_start_tcpdump(connection);
1759         if (ret != CONNECTION_ERROR_NONE) {
1760                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to start tcpdump (%d)", ret);
1761                 CONN_UNLOCK;
1762                 return ret;
1763         }
1764
1765         CONN_UNLOCK;
1766         return CONNECTION_ERROR_NONE;
1767 }
1768
1769 EXPORT_API int connection_profile_stop_tcpdump(connection_h connection)
1770 {
1771         int ret = 0;
1772
1773         CONN_LOCK;
1774
1775         if (!(__connection_check_handle_validity(connection))) {
1776                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1777                 CONN_UNLOCK;
1778                 return CONNECTION_ERROR_INVALID_PARAMETER;
1779         }
1780
1781         ret = _connection_libnet_stop_tcpdump(connection);
1782         if (ret != CONNECTION_ERROR_NONE) {
1783                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to stop tcpdump (%d)", ret);
1784                 CONN_UNLOCK;
1785                 return ret;
1786         }
1787
1788         CONN_UNLOCK;
1789         return CONNECTION_ERROR_NONE;
1790 }
1791
1792 EXPORT_API int connection_profile_get_tcpdump_state(connection_h connection, gboolean *tcpdump_state)
1793 {
1794         int ret = 0;
1795
1796         CONN_LOCK;
1797
1798         if (!(__connection_check_handle_validity(connection)) || !tcpdump_state) {
1799                 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1800                 CONN_UNLOCK;
1801                 return CONNECTION_ERROR_INVALID_PARAMETER;
1802         }
1803
1804         ret = _connection_libnet_get_tcpdump_state(connection, tcpdump_state);
1805         if (ret != CONNECTION_ERROR_NONE) {
1806                 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get the tcpdump state (%d)", ret);
1807                 CONN_UNLOCK;
1808                 return ret;
1809         }
1810
1811         CONN_UNLOCK;
1812         return CONNECTION_ERROR_NONE;
1813 }