2 * Copyright (c) 2011-2013 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
22 #include <vconf/vconf.h>
23 #include <system_info.h>
25 #include "net_connection_private.h"
27 static GSList *conn_handle_list = NULL;
30 static int __connection_convert_net_state(int 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;
44 return CONNECTION_TYPE_DISCONNECTED;
48 static int __connection_convert_cellular_state(int 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;
60 return CONNECTION_CELLULAR_STATE_OUT_OF_SERVICE;
64 static bool __connection_check_handle_validity(connection_h connection)
68 if (connection == NULL)
71 if (g_slist_find(conn_handle_list, connection) != NULL)
77 bool _connection_check_handle_validity(connection_h connection)
79 return __connection_check_handle_validity(connection);
82 static void __connection_set_type_changed_callback(connection_handle_s *conn_handle,
83 void *callback, void *user_data)
85 conn_handle->type_changed_user_data = user_data;
86 conn_handle->type_changed_callback = callback;
89 static void __connection_set_ip_changed_callback(connection_handle_s *conn_handle,
90 void *callback, void *user_data)
92 conn_handle->ip_changed_user_data = user_data;
93 conn_handle->ip_changed_callback = callback;
96 static void __connection_set_proxy_changed_callback(connection_handle_s *conn_handle,
97 void *callback, void *user_data)
99 conn_handle->proxy_changed_user_data = user_data;
100 conn_handle->proxy_changed_callback = callback;
103 static void __connection_set_internet_state_changed_callback(connection_handle_s *conn_handle,
104 void *callback, void *user_data)
106 conn_handle->internet_state_changed_user_data = user_data;
107 conn_handle->internet_state_changed_callback = callback;
110 static void __connection_set_ethernet_cable_state_changed_cb(connection_handle_s *conn_handle,
111 void *callback, void *user_data)
113 conn_handle->ethernet_cable_state_changed_callback = callback;
114 conn_handle->ethernet_cable_state_changed_user_data = user_data;
117 static void __connection_set_default_cellular_service_profile_callback(connection_handle_s *conn_handle,
118 void *callback, void *user_data)
120 conn_handle->set_default_callback = callback;
121 conn_handle->set_default_user_data = user_data;
124 static void __connection_open_profile_set_callback(connection_handle_s *conn_handle,
125 void *callback, void *user_data)
127 conn_handle->opened_callback = callback;
128 conn_handle->opened_user_data = user_data;
131 static void __connection_close_profile_set_callback(connection_handle_s *conn_handle,
132 void *callback, void *user_data)
134 conn_handle->closed_callback = callback;
135 conn_handle->closed_user_data = user_data;
138 static void __connection_reset_profile_set_callback(connection_handle_s *conn_handle,
139 void *callback, void *user_data)
141 conn_handle->reset_callback = callback;
142 conn_handle->reset_user_data = user_data;
146 /* Connection Manager ********************************************************/
147 EXPORT_API int connection_create(connection_h *connection)
151 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
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;
161 *connection = g_try_malloc0(sizeof(connection_handle_s));
162 if (*connection != NULL) {
163 CONNECTION_LOG(CONNECTION_INFO, "New handle created[%p]", *connection);
165 CONN_UNLOCK; //LCOV_EXCL_LINE
166 return CONNECTION_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
169 rv = _connection_libnet_init(*connection);
170 if (rv == NET_ERR_ACCESS_DENIED) {
171 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
172 g_free(*connection); //LCOV_EXCL_LINE
173 *connection = NULL; //LCOV_EXCL_LINE
174 CONN_UNLOCK; //LCOV_EXCL_LINE
175 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
176 } else if (rv != NET_ERR_NONE) {
177 CONNECTION_LOG(CONNECTION_ERROR, "Failed to create connection[%d]", rv); //LCOV_EXCL_LINE
178 g_free(*connection); //LCOV_EXCL_LINE
179 *connection = NULL; //LCOV_EXCL_LINE
180 CONN_UNLOCK; //LCOV_EXCL_LINE
181 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
184 conn_handle_list = g_slist_prepend(conn_handle_list, *connection);
187 return CONNECTION_ERROR_NONE;
190 EXPORT_API int connection_destroy(connection_h connection)
194 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
196 if (!(__connection_check_handle_validity(connection))) {
197 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
199 return CONNECTION_ERROR_INVALID_PARAMETER;
202 CONNECTION_LOG(CONNECTION_INFO, "Destroy handle: %p", connection);
204 __connection_set_type_changed_callback(connection, NULL, NULL);
205 __connection_set_ip_changed_callback(connection, NULL, NULL);
206 __connection_set_proxy_changed_callback(connection, NULL, NULL);
207 __connection_set_internet_state_changed_callback(connection, NULL, NULL);
208 __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
210 conn_handle_list = g_slist_remove(conn_handle_list, connection);
211 _connection_libnet_deinit(connection, (conn_handle_list == NULL));
216 return CONNECTION_ERROR_NONE;
220 EXPORT_API int connection_create_cs(int tid, connection_h *connection)
224 rv = connection_create(connection);
225 if (rv == CONNECTION_ERROR_NONE) {
227 _connection_set_cs_tid(tid, *connection);
234 EXPORT_API int connection_destroy_cs(int tid, connection_h connection)
240 if (!(__connection_check_handle_validity(connection))) {
241 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
243 return CONNECTION_ERROR_INVALID_PARAMETER;
246 CONNECTION_LOG(CONNECTION_INFO, "Destroy connection handle: %p", connection);
247 _connection_unset_cs_tid(tid, connection);
250 rv = connection_destroy(connection);
256 EXPORT_API int connection_get_type(connection_h connection, connection_type_e* type)
263 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
265 if (type == NULL || !(__connection_check_handle_validity(connection))) {
266 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
268 return CONNECTION_ERROR_INVALID_PARAMETER;
271 rv = vconf_get_int(VCONFKEY_NETWORK_STATUS, &status);
272 if (rv != VCONF_OK) {
273 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_int Failed = %d", status); //LCOV_EXCL_LINE
274 CONN_UNLOCK; //LCOV_EXCL_LINE
275 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
278 CONNECTION_LOG(CONNECTION_INFO, "Connected Network = %d", status);
280 *type = __connection_convert_net_state(status);
283 return CONNECTION_ERROR_NONE;
286 EXPORT_API int connection_get_ip_address(connection_h connection,
287 connection_address_family_e address_family, char** ip_address)
291 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
293 if (ip_address == NULL || !(__connection_check_handle_validity(connection))) {
294 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
296 return CONNECTION_ERROR_INVALID_PARAMETER;
299 switch (address_family) {
300 case CONNECTION_ADDRESS_FAMILY_IPV4:
301 *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP);
303 case CONNECTION_ADDRESS_FAMILY_IPV6:
304 *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP6);
307 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
309 return CONNECTION_ERROR_INVALID_PARAMETER;
312 if (*ip_address == NULL) {
313 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE
314 CONN_UNLOCK; //LCOV_EXCL_LINE
315 return CONNECTION_ERROR_OPERATION_FAILED;//LCOV_EXCL_LINE
319 return CONNECTION_ERROR_NONE;
322 EXPORT_API int connection_get_proxy(connection_h connection,
323 connection_address_family_e address_family, char** proxy)
327 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
329 if (proxy == NULL || !(__connection_check_handle_validity(connection))) {
330 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
332 return CONNECTION_ERROR_INVALID_PARAMETER;
335 switch (address_family) {
336 case CONNECTION_ADDRESS_FAMILY_IPV4:
337 case CONNECTION_ADDRESS_FAMILY_IPV6:
338 *proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY);
341 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
343 return CONNECTION_ERROR_INVALID_PARAMETER;
346 if (*proxy == NULL) {
347 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE
348 CONN_UNLOCK; //LCOV_EXCL_LINE
349 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
353 return CONNECTION_ERROR_NONE;
356 EXPORT_API int connection_get_mac_address(connection_h connection, connection_type_e type, char** mac_addr)
359 char buf[CONNECTION_MAC_INFO_LENGTH + 1];
363 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE, ETHERNET_FEATURE);
365 if (type == CONNECTION_TYPE_WIFI)
366 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
367 else if (type == CONNECTION_TYPE_ETHERNET) //LCOV_EXCL_LINE
368 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); //LCOV_EXCL_LINE
370 if (mac_addr == NULL || !(__connection_check_handle_validity(connection))) {
371 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
373 return CONNECTION_ERROR_INVALID_PARAMETER;
377 case CONNECTION_TYPE_WIFI:
378 if (access(WIFI_MAC_INFO_FILE, F_OK) == 0)
379 fp = fopen(WIFI_MAC_INFO_FILE, "r");
382 if (fgets(buf, sizeof(buf), fp) == NULL) {
383 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", WIFI_MAC_INFO_FILE);
386 return CONNECTION_ERROR_OPERATION_FAILED;
389 CONNECTION_LOG(CONNECTION_INFO, "%s : %s", WIFI_MAC_INFO_FILE, buf);
391 *mac_addr = g_strdup(buf);
394 *mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
396 if (*mac_addr == NULL) {
397 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get vconf from %s", VCONFKEY_WIFI_BSSID_ADDRESS); //LCOV_EXCL_LINE
398 CONN_UNLOCK; //LCOV_EXCL_LINE
399 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
402 if (strlen(*mac_addr) == 0) {
403 CONNECTION_LOG(CONNECTION_ERROR, "Mac address is invalid"
404 " from %s", VCONFKEY_WIFI_BSSID_ADDRESS); //LCOV_EXCL_LINE
405 g_free(*mac_addr); //LCOV_EXCL_LINE
406 *mac_addr = NULL; //LCOV_EXCL_LINE
407 CONN_UNLOCK; //LCOV_EXCL_LINE
408 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
413 case CONNECTION_TYPE_ETHERNET:
414 fp = fopen(ETHERNET_MAC_INFO_FILE, "r");
416 CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", ETHERNET_MAC_INFO_FILE);
418 return CONNECTION_ERROR_OUT_OF_MEMORY;
421 if (fgets(buf, sizeof(buf), fp) == NULL) {
422 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", ETHERNET_MAC_INFO_FILE);
425 return CONNECTION_ERROR_OPERATION_FAILED;
428 CONNECTION_LOG(CONNECTION_INFO, "%s : %s", ETHERNET_MAC_INFO_FILE, buf);
430 *mac_addr = g_strdup(buf);
435 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
436 CONN_UNLOCK; //LCOV_EXCL_LINE
437 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
440 /* Checking Invalid MAC Address */
441 if ((strcmp(*mac_addr, "00:00:00:00:00:00") == 0) ||
442 (strcmp(*mac_addr, "ff:ff:ff:ff:ff:ff") == 0)) {
443 CONNECTION_LOG(CONNECTION_ERROR, "MAC Address(%s) is invalid", *mac_addr); //LCOV_EXCL_LINE
444 CONN_UNLOCK; //LCOV_EXCL_LINE
445 return CONNECTION_ERROR_INVALID_OPERATION; //LCOV_EXCL_LINE
448 CONNECTION_LOG(CONNECTION_INFO, "MAC Address %s", *mac_addr);
451 return CONNECTION_ERROR_NONE;
455 EXPORT_API int connection_is_metered_network(connection_h connection, bool* is_metered)
459 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
461 if (is_metered == NULL || !(__connection_check_handle_validity(connection))) {
462 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
464 return CONNECTION_ERROR_INVALID_PARAMETER;
467 int rv = _connection_libnet_get_metered_state(connection, is_metered);
468 if (rv != CONNECTION_ERROR_NONE) {
469 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get metered state[%d]", rv); //LCOV_EXCL_LINE
470 CONN_UNLOCK; //LCOV_EXCL_LINE
471 return rv; //LCOV_EXCL_LINE
474 CONNECTION_LOG(CONNECTION_INFO, "metered state: %s", is_metered ? "true" : "false");
476 return CONNECTION_ERROR_NONE;
480 EXPORT_API int connection_get_cellular_state(connection_h connection, connection_cellular_state_e* state)
484 int cellular_state = 0;
485 #if defined TIZEN_DUALSIM_ENABLE
491 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
493 if (state == NULL || !(__connection_check_handle_validity(connection))) {
494 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
496 return CONNECTION_ERROR_INVALID_PARAMETER;
499 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status);
500 if (rv != VCONF_OK) {
501 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE
502 CONN_UNLOCK; //LCOV_EXCL_LINE
503 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
506 CONNECTION_LOG(CONNECTION_INFO, "Cellular: %d", status);
507 *state = __connection_convert_cellular_state(status);
509 if (*state == CONNECTION_CELLULAR_STATE_AVAILABLE) {
510 #if defined TIZEN_DUALSIM_ENABLE
511 rv = vconf_get_int(VCONF_TELEPHONY_DEFAULT_DATA_SERVICE, &sim_id);
512 if (rv != VCONF_OK) {
513 CONNECTION_LOG(CONNECTION_ERROR,
514 "Failed to get default subscriber id", sim_id);
516 return CONNECTION_ERROR_OPERATION_FAILED;
520 case CONNECTION_CELLULAR_SUBSCRIBER_1:
522 rv = vconf_get_int(VCONFKEY_DNET_STATE, &cellular_state);
523 #if defined TIZEN_DUALSIM_ENABLE
526 case CONNECTION_CELLULAR_SUBSCRIBER_2:
527 rv = vconf_get_int(VCONFKEY_DNET_STATE2, &cellular_state);
531 CONNECTION_LOG(CONNECTION_ERROR, "Invalid subscriber id:%d", sim_id);
533 return CONNECTION_ERROR_OPERATION_FAILED;
536 if (rv != VCONF_OK) {
537 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE
538 CONN_UNLOCK; //LCOV_EXCL_LINE
539 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
543 CONNECTION_LOG(CONNECTION_INFO, "Cellular state: %d", cellular_state);
545 if (cellular_state == VCONFKEY_DNET_NORMAL_CONNECTED ||
546 cellular_state == VCONFKEY_DNET_SECURE_CONNECTED ||
547 cellular_state == VCONFKEY_DNET_TRANSFER)
548 *state = CONNECTION_CELLULAR_STATE_CONNECTED;
551 return CONNECTION_ERROR_NONE;
554 EXPORT_API int connection_get_wifi_state(connection_h connection, connection_wifi_state_e* state)
558 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
560 if (state == NULL || !(__connection_check_handle_validity(connection))) {
561 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
563 return CONNECTION_ERROR_INVALID_PARAMETER;
566 int rv = _connection_libnet_get_wifi_state(connection, state);
567 if (rv != CONNECTION_ERROR_NONE) {
568 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get Wi-Fi state[%d]", rv); //LCOV_EXCL_LINE
569 CONN_UNLOCK; //LCOV_EXCL_LINE
570 return rv; //LCOV_EXCL_LINE
573 CONNECTION_LOG(CONNECTION_INFO, "Wi-Fi state: %d", *state);
576 return CONNECTION_ERROR_NONE;
579 EXPORT_API int connection_get_ethernet_state(connection_h connection, connection_ethernet_state_e *state)
583 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
585 if (state == NULL || !(__connection_check_handle_validity(connection))) {
586 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
588 return CONNECTION_ERROR_INVALID_PARAMETER;
591 int rv = _connection_libnet_get_ethernet_state(connection, state);
592 if (rv != CONNECTION_ERROR_NONE) {
593 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get ethernet state[%d]", rv); //LCOV_EXCL_LINE
594 CONN_UNLOCK; //LCOV_EXCL_LINE
595 return rv; //LCOV_EXCL_LINE
599 return CONNECTION_ERROR_NONE;
602 EXPORT_API int connection_get_ethernet_cable_state(connection_h connection, connection_ethernet_cable_state_e *state)
606 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
608 if (state == NULL || !(__connection_check_handle_validity(connection))) {
609 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
611 return CONNECTION_ERROR_INVALID_PARAMETER;
614 int rv = _connection_libnet_get_ethernet_cable_state(connection, state);
615 if (rv != CONNECTION_ERROR_NONE) {
616 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get ethernet cable state[%d]", rv); //LCOV_EXCL_LINE
617 CONN_UNLOCK; //LCOV_EXCL_LINE
618 return rv; //LCOV_EXCL_LINE
622 return CONNECTION_ERROR_NONE;
625 EXPORT_API int connection_set_ethernet_cable_state_chaged_cb(connection_h connection,
626 connection_ethernet_cable_state_chaged_cb callback, void *user_data)
628 DEPRECATED_LOG(__FUNCTION__, "connection_set_ethernet_cable_state_changed_cb");
632 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
634 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
635 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
637 return CONNECTION_ERROR_INVALID_PARAMETER;
640 DEPRECATED_LOG("connection_ethernet_cable_state_chaged_cb",
641 "connection_ethernet_cable_state_changed_cb");
643 __connection_set_ethernet_cable_state_changed_cb(connection, callback, user_data);
646 return CONNECTION_ERROR_NONE;
649 EXPORT_API int connection_unset_ethernet_cable_state_chaged_cb(connection_h connection)
651 DEPRECATED_LOG(__FUNCTION__, "connection_unset_ethernet_cable_state_changed_cb");
655 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
657 if (!(__connection_check_handle_validity(connection))) {
658 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
660 return CONNECTION_ERROR_INVALID_PARAMETER;
663 __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
666 return CONNECTION_ERROR_NONE;
669 EXPORT_API int connection_set_ethernet_cable_state_changed_cb(connection_h connection,
670 connection_ethernet_cable_state_changed_cb callback, void *user_data)
674 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
676 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
677 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
679 return CONNECTION_ERROR_INVALID_PARAMETER;
682 __connection_set_ethernet_cable_state_changed_cb(connection, callback, user_data);
685 return CONNECTION_ERROR_NONE;
688 EXPORT_API int connection_unset_ethernet_cable_state_changed_cb(connection_h connection)
692 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
694 if (!(__connection_check_handle_validity(connection))) {
695 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
697 return CONNECTION_ERROR_INVALID_PARAMETER;
700 __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
703 return CONNECTION_ERROR_NONE;
706 EXPORT_API int connection_get_bt_state(connection_h connection, connection_bt_state_e *state)
710 CHECK_FEATURE_SUPPORTED(TETHERING_BLUETOOTH_FEATURE);
712 if (state == NULL || !(__connection_check_handle_validity(connection))) {
713 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
715 return CONNECTION_ERROR_INVALID_PARAMETER;
718 int rv = _connection_libnet_get_bluetooth_state(connection, state);
719 if (rv != CONNECTION_ERROR_NONE) {
720 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get bluetooth state[%d]", rv); //LCOV_EXCL_LINE
721 CONN_UNLOCK; //LCOV_EXCL_LINE
722 return rv; //LCOV_EXCL_LINE
726 return CONNECTION_ERROR_NONE;
729 EXPORT_API int connection_set_type_changed_cb(connection_h connection,
730 connection_type_changed_cb callback, void* user_data)
734 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
736 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
737 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
739 return CONNECTION_ERROR_INVALID_PARAMETER;
742 __connection_set_type_changed_callback(connection, callback, user_data);
745 return CONNECTION_ERROR_NONE;
748 EXPORT_API int connection_unset_type_changed_cb(connection_h connection)
752 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
754 if (!(__connection_check_handle_validity(connection))) {
755 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
757 return CONNECTION_ERROR_INVALID_PARAMETER;
760 __connection_set_type_changed_callback(connection, NULL, NULL);
763 return CONNECTION_ERROR_NONE;
766 EXPORT_API int connection_set_ip_address_changed_cb(connection_h connection,
767 connection_address_changed_cb callback, void* user_data)
771 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
773 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
774 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
776 return CONNECTION_ERROR_INVALID_PARAMETER;
779 __connection_set_ip_changed_callback(connection, callback, user_data);
782 return CONNECTION_ERROR_NONE;
785 EXPORT_API int connection_unset_ip_address_changed_cb(connection_h connection)
789 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
791 if (!(__connection_check_handle_validity(connection))) {
792 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
794 return CONNECTION_ERROR_INVALID_PARAMETER;
797 __connection_set_ip_changed_callback(connection, NULL, NULL);
800 return CONNECTION_ERROR_NONE;
803 EXPORT_API int connection_set_proxy_address_changed_cb(connection_h connection,
804 connection_address_changed_cb callback, void* user_data)
808 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
810 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
811 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
813 return CONNECTION_ERROR_INVALID_PARAMETER;
816 __connection_set_proxy_changed_callback(connection, callback, user_data);
819 return CONNECTION_ERROR_NONE;
822 EXPORT_API int connection_unset_proxy_address_changed_cb(connection_h connection)
826 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
828 if (!(__connection_check_handle_validity(connection))) {
829 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
831 return CONNECTION_ERROR_INVALID_PARAMETER;
834 __connection_set_proxy_changed_callback(connection, NULL, NULL);
837 return CONNECTION_ERROR_NONE;
840 EXPORT_API int connection_set_internet_state_changed_cb(connection_h connection,
841 connection_internet_state_changed_cb callback, void *user_data)
845 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
847 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
848 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
850 return CONNECTION_ERROR_INVALID_PARAMETER;
853 __connection_set_internet_state_changed_callback(connection, callback, user_data);
856 return CONNECTION_ERROR_NONE;
859 EXPORT_API int connection_unset_internet_state_changed_cb(connection_h connection)
863 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
865 if (!(__connection_check_handle_validity(connection))) {
866 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
868 return CONNECTION_ERROR_INVALID_PARAMETER;
871 __connection_set_internet_state_changed_callback(connection, NULL, NULL);
874 return CONNECTION_ERROR_NONE;
877 EXPORT_API int connection_add_profile(connection_h connection, connection_profile_h profile)
880 connection_handle_s *conn_handle = (connection_handle_s *)connection;
881 net_profile_info_t *profile_info = (net_profile_info_t *)profile;
885 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
887 if (!(__connection_check_handle_validity(connection)) ||
888 !(_connection_libnet_check_profile_validity(profile))) {
889 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
891 return CONNECTION_ERROR_INVALID_PARAMETER;
894 if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
895 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
896 CONN_UNLOCK; //LCOV_EXCL_LINE
897 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
900 if (profile_info->ProfileInfo.Pdp.PSModemPath[0] != '/' ||
901 strlen(profile_info->ProfileInfo.Pdp.PSModemPath) < 2) {
902 CONNECTION_LOG(CONNECTION_ERROR, "Modem object path is NULL"); //LCOV_EXCL_LINE
903 CONN_UNLOCK; //LCOV_EXCL_LINE
904 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
907 rv = net_add_profile(conn_handle->network_info_handle,
908 profile_info->ProfileInfo.Pdp.ServiceType, profile_info);
909 if (rv == NET_ERR_ACCESS_DENIED) {
910 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
911 CONN_UNLOCK; //LCOV_EXCL_LINE
912 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
913 } else if (rv != NET_ERR_NONE) {
914 CONNECTION_LOG(CONNECTION_ERROR, "Failed to add profile[%d]", rv); //LCOV_EXCL_LINE
915 CONN_UNLOCK; //LCOV_EXCL_LINE
916 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
920 return CONNECTION_ERROR_NONE;
923 EXPORT_API int connection_remove_profile(connection_h connection, connection_profile_h profile)
926 connection_handle_s *conn_handle = (connection_handle_s *)connection;
927 net_profile_info_t *profile_info = (net_profile_info_t *)profile;
931 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
933 if (!(__connection_check_handle_validity(connection)) ||
934 !(_connection_libnet_check_profile_validity(profile))) {
935 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
937 return CONNECTION_ERROR_INVALID_PARAMETER;
940 if (profile_info->profile_type != NET_DEVICE_CELLULAR &&
941 profile_info->profile_type != NET_DEVICE_MESH &&
942 profile_info->profile_type != NET_DEVICE_WIFI) {
943 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
944 CONN_UNLOCK; //LCOV_EXCL_LINE
945 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
948 rv = net_delete_profile(conn_handle->network_info_handle, profile_info->ProfileName);
949 if (rv == NET_ERR_ACCESS_DENIED) {
950 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
951 CONN_UNLOCK; //LCOV_EXCL_LINE
952 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
953 } else if (rv != NET_ERR_NONE) {
954 CONNECTION_LOG(CONNECTION_ERROR, "Failed to delete profile[%d]", rv); //LCOV_EXCL_LINE
955 CONN_UNLOCK; //LCOV_EXCL_LINE
956 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
960 return CONNECTION_ERROR_NONE;
963 EXPORT_API int connection_update_profile(connection_h connection, connection_profile_h profile)
966 connection_handle_s *conn_handle = (connection_handle_s *)connection;
967 net_profile_info_t *profile_info = (net_profile_info_t *)profile;
971 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
973 if (!(__connection_check_handle_validity(connection)) ||
974 !(_connection_libnet_check_profile_validity(profile))) {
975 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
977 return CONNECTION_ERROR_INVALID_PARAMETER;
980 rv = net_modify_profile(conn_handle->network_info_handle,
981 profile_info->ProfileName, (net_profile_info_t*)profile);
982 if (rv == NET_ERR_ACCESS_DENIED) {
983 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
984 CONN_UNLOCK; //LCOV_EXCL_LINE
985 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
986 } else if (rv != NET_ERR_NONE) {
987 CONNECTION_LOG(CONNECTION_ERROR, "Failed to modify profile[%d]", rv); //LCOV_EXCL_LINE
988 CONN_UNLOCK; //LCOV_EXCL_LINE
989 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
993 return CONNECTION_ERROR_NONE;
996 EXPORT_API int connection_get_profile_iterator(connection_h connection,
997 connection_iterator_type_e type, connection_profile_iterator_h* profile_iterator)
1001 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1003 if (!(__connection_check_handle_validity(connection)) ||
1004 (type != CONNECTION_ITERATOR_TYPE_REGISTERED &&
1005 type != CONNECTION_ITERATOR_TYPE_CONNECTED &&
1006 type != CONNECTION_ITERATOR_TYPE_DEFAULT)) {
1007 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1009 return CONNECTION_ERROR_INVALID_PARAMETER;
1012 int rv = _connection_libnet_get_profile_iterator(connection, type, profile_iterator);
1013 if (rv != CONNECTION_ERROR_NONE) {
1014 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get profile iterator [%d]", rv); //LCOV_EXCL_LINE
1015 CONN_UNLOCK; //LCOV_EXCL_LINE
1016 return rv; //LCOV_EXCL_LINE
1020 return CONNECTION_ERROR_NONE;
1023 EXPORT_API int connection_profile_iterator_next(connection_profile_iterator_h profile_iterator,
1024 connection_profile_h* profile)
1028 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1030 int rv = _connection_libnet_get_iterator_next(profile_iterator, profile);
1036 EXPORT_API bool connection_profile_iterator_has_next(connection_profile_iterator_h profile_iterator)
1040 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1042 int rv = _connection_libnet_iterator_has_next(profile_iterator);
1048 EXPORT_API int connection_destroy_profile_iterator(connection_profile_iterator_h profile_iterator)
1052 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1054 int rv = _connection_libnet_destroy_iterator(profile_iterator);
1060 EXPORT_API int connection_get_current_profile(connection_h connection, connection_profile_h* profile)
1064 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1066 if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1067 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1069 return CONNECTION_ERROR_INVALID_PARAMETER;
1072 int rv = _connection_libnet_get_current_profile(connection, profile);
1073 if (rv != CONNECTION_ERROR_NONE) {
1074 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get current profile [%d]", rv); //LCOV_EXCL_LINE
1075 CONN_UNLOCK; //LCOV_EXCL_LINE
1076 return rv; //LCOV_EXCL_LINE
1080 return CONNECTION_ERROR_NONE;
1083 EXPORT_API int connection_get_default_cellular_service_profile(
1084 connection_h connection, connection_cellular_service_type_e type,
1085 connection_profile_h *profile)
1089 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1091 if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1092 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1094 return CONNECTION_ERROR_INVALID_PARAMETER;
1097 int rv = _connection_libnet_get_cellular_service_profile(connection, type, profile);
1098 if (rv != CONNECTION_ERROR_NONE) {
1099 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get default cellular service profile [%d]", rv); //LCOV_EXCL_LINE
1100 CONN_UNLOCK; //LCOV_EXCL_LINE
1101 return rv; //LCOV_EXCL_LINE
1105 return CONNECTION_ERROR_NONE;
1108 EXPORT_API int connection_set_default_cellular_service_profile(connection_h connection,
1109 connection_cellular_service_type_e type, connection_profile_h profile)
1113 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1115 if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1116 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1118 return CONNECTION_ERROR_INVALID_PARAMETER;
1121 int rv = _connection_libnet_set_cellular_service_profile_sync(connection, type, profile);
1122 if (rv != CONNECTION_ERROR_NONE) {
1123 CONNECTION_LOG(CONNECTION_ERROR, "Fail to set default cellular service profile [%d]", rv); //LCOV_EXCL_LINE
1124 CONN_UNLOCK; //LCOV_EXCL_LINE
1125 return rv; //LCOV_EXCL_LINE
1129 return CONNECTION_ERROR_NONE;
1132 EXPORT_API int connection_set_default_cellular_service_profile_async(connection_h connection,
1133 connection_cellular_service_type_e type, connection_profile_h profile,
1134 connection_set_default_cb callback, void* user_data)
1138 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1142 if (!(__connection_check_handle_validity(connection)) ||
1143 profile == NULL || callback == NULL) {
1144 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1146 return CONNECTION_ERROR_INVALID_PARAMETER;
1149 rv = _connection_libnet_set_cellular_service_profile_async(connection, type, profile);
1150 if (rv == NET_ERR_ACCESS_DENIED) {
1151 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1152 CONN_UNLOCK; //LCOV_EXCL_LINE
1153 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1154 } else if (rv != NET_ERR_NONE) {
1155 CONNECTION_LOG(CONNECTION_ERROR, "Failed to set default cellular service profile[%d]", rv); //LCOV_EXCL_LINE
1156 CONN_UNLOCK; //LCOV_EXCL_LINE
1157 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1160 __connection_set_default_cellular_service_profile_callback(connection, callback, user_data);
1163 return CONNECTION_ERROR_NONE;
1166 EXPORT_API int connection_open_profile(connection_h connection, connection_profile_h profile,
1167 connection_opened_cb callback, void* user_data)
1171 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1175 if (!(__connection_check_handle_validity(connection)) ||
1176 profile == NULL || callback == NULL) {
1177 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1179 return CONNECTION_ERROR_INVALID_PARAMETER;
1182 rv = _connection_libnet_open_profile(connection, profile);
1183 if (rv == NET_ERR_ACCESS_DENIED) {
1184 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1185 CONN_UNLOCK; //LCOV_EXCL_LINE
1186 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1187 } else if (rv != NET_ERR_NONE) {
1188 CONNECTION_LOG(CONNECTION_ERROR, "Failed to open profile[%d]", rv); //LCOV_EXCL_LINE
1189 CONN_UNLOCK; //LCOV_EXCL_LINE
1190 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1193 __connection_open_profile_set_callback(connection, callback, user_data);
1196 return CONNECTION_ERROR_NONE;
1199 EXPORT_API int connection_close_profile(connection_h connection, connection_profile_h profile,
1200 connection_closed_cb callback, void* user_data)
1204 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1208 if (!(__connection_check_handle_validity(connection)) ||
1209 profile == NULL || callback == NULL) {
1210 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1212 return CONNECTION_ERROR_INVALID_PARAMETER;
1215 rv = _connection_libnet_close_profile(connection, profile);
1216 if (rv == NET_ERR_ACCESS_DENIED) {
1217 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1218 CONN_UNLOCK; //LCOV_EXCL_LINE
1219 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1220 } else if (rv != NET_ERR_NONE) {
1221 CONNECTION_LOG(CONNECTION_ERROR, "Failed to close profile[%d]", rv); //LCOV_EXCL_LINE
1222 CONN_UNLOCK; //LCOV_EXCL_LINE
1223 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1226 __connection_close_profile_set_callback(connection, callback, user_data);
1229 return CONNECTION_ERROR_NONE;
1232 EXPORT_API int connection_reset_profile(connection_h connection,
1233 connection_reset_option_e type, int id, connection_reset_cb callback, void *user_data)
1237 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1241 if (!(__connection_check_handle_validity(connection))) {
1242 CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed");
1244 return CONNECTION_ERROR_INVALID_PARAMETER;
1247 if (id < 0 || id > 1) {
1248 CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed"); //LCOV_EXCL_LINE
1249 CONN_UNLOCK; //LCOV_EXCL_LINE
1250 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1253 rv = _connection_libnet_reset_profile(connection, type, id);
1254 if (rv == NET_ERR_ACCESS_DENIED) {
1255 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1256 CONN_UNLOCK; //LCOV_EXCL_LINE
1257 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1258 } else if (rv != NET_ERR_NONE) {
1259 CONNECTION_LOG(CONNECTION_ERROR, "Failed to reset profile[%d]", rv); //LCOV_EXCL_LINE
1260 CONN_UNLOCK; //LCOV_EXCL_LINE
1261 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1264 __connection_reset_profile_set_callback(connection, callback, user_data);
1267 return CONNECTION_ERROR_NONE;
1270 EXPORT_API int connection_add_route(connection_h connection, const char* interface_name, const char* host_address)
1274 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1276 if (!(__connection_check_handle_validity(connection)) ||
1277 interface_name == NULL || host_address == NULL) {
1278 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1280 return CONNECTION_ERROR_INVALID_PARAMETER;
1283 int rv = _connection_libnet_add_route(connection, interface_name, host_address);
1284 if (rv != CONNECTION_ERROR_NONE) {
1285 CONNECTION_LOG(CONNECTION_ERROR, "Fail to add route [%d]", rv); //LCOV_EXCL_LINE
1286 CONN_UNLOCK; //LCOV_EXCL_LINE
1287 return rv; //LCOV_EXCL_LINE
1291 return CONNECTION_ERROR_NONE;
1294 EXPORT_API int connection_remove_route(connection_h connection, const char* interface_name, const char* host_address)
1298 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1300 if (!(__connection_check_handle_validity(connection)) ||
1301 interface_name == NULL || host_address == NULL) {
1302 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1304 return CONNECTION_ERROR_INVALID_PARAMETER;
1307 int rv = _connection_libnet_remove_route(connection, interface_name, host_address);
1308 if (rv != CONNECTION_ERROR_NONE) {
1309 CONNECTION_LOG(CONNECTION_ERROR, "Fail to remove route [%d]", rv); //LCOV_EXCL_LINE
1310 CONN_UNLOCK; //LCOV_EXCL_LINE
1311 return rv; //LCOV_EXCL_LINE
1315 return CONNECTION_ERROR_NONE;
1318 EXPORT_API int connection_add_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
1322 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1324 if (!(__connection_check_handle_validity(connection)) ||
1325 interface_name == NULL || host_address == NULL) {
1326 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1328 return CONNECTION_ERROR_INVALID_PARAMETER;
1331 int rv = _connection_libnet_add_route_ipv6(connection, interface_name, host_address, gateway);
1332 if (rv != CONNECTION_ERROR_NONE) {
1333 CONNECTION_LOG(CONNECTION_ERROR, "Fail to add route ipv6 [%d]", rv); //LCOV_EXCL_LINE
1334 CONN_UNLOCK; //LCOV_EXCL_LINE
1335 return rv; //LCOV_EXCL_LINE
1339 return CONNECTION_ERROR_NONE;
1342 EXPORT_API int connection_remove_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
1346 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1348 if (!(__connection_check_handle_validity(connection)) ||
1349 interface_name == NULL || host_address == NULL) {
1350 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1352 return CONNECTION_ERROR_INVALID_PARAMETER;
1355 int rv = _connection_libnet_remove_route_ipv6(connection, interface_name, host_address, gateway);
1356 if (rv != CONNECTION_ERROR_NONE) {
1357 CONNECTION_LOG(CONNECTION_ERROR, "Fail to remove route ipv6 [%d]", rv); //LCOV_EXCL_LINE
1358 CONN_UNLOCK; //LCOV_EXCL_LINE
1359 return rv; //LCOV_EXCL_LINE
1363 return CONNECTION_ERROR_NONE;
1366 EXPORT_API int connection_add_route_entry(connection_h connection,
1367 connection_address_family_e address_family, const char *interface_name,
1368 const char *host_address, const char *gateway)
1372 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1374 if (!(__connection_check_handle_validity(connection)) ||
1375 (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
1376 address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
1377 interface_name == NULL || host_address == NULL) {
1378 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1380 return CONNECTION_ERROR_INVALID_PARAMETER;
1383 if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
1384 int rv = _connection_libnet_add_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV4,
1385 interface_name, host_address, gateway);
1389 int rv = _connection_libnet_add_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV6,
1390 interface_name, host_address, gateway);
1396 EXPORT_API int connection_remove_route_entry(connection_h connection,
1397 connection_address_family_e address_family, const char *interface_name,
1398 const char *host_address, const char *gateway)
1402 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1404 if (!(__connection_check_handle_validity(connection)) ||
1405 (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
1406 address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
1407 interface_name == NULL || host_address == NULL) {
1408 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1410 return CONNECTION_ERROR_INVALID_PARAMETER;
1413 if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
1414 int rv = _connection_libnet_remove_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV4,
1415 interface_name, host_address, gateway);
1419 int rv = _connection_libnet_remove_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV6,
1420 interface_name, host_address, gateway);
1426 static int __get_cellular_statistic(connection_statistics_type_e statistics_type, long long *llsize)
1428 int rv = VCONF_OK, rv1 = VCONF_OK;
1429 int last_size = 0, size = 0;
1430 #if defined TIZEN_DUALSIM_ENABLE
1434 if (llsize == NULL) {
1435 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
1436 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1439 switch (statistics_type) {
1440 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1441 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1442 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1443 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1446 return CONNECTION_ERROR_INVALID_PARAMETER;
1449 #if defined TIZEN_DUALSIM_ENABLE
1450 rv = vconf_get_int(VCONF_TELEPHONY_DEFAULT_DATA_SERVICE, &sim_id);
1451 if (rv != VCONF_OK) {
1452 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get default subscriber id");
1454 return CONNECTION_ERROR_OPERATION_FAILED;
1460 switch (statistics_type) {
1461 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1462 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT, &last_size);
1464 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1465 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV, &last_size);
1467 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1468 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT, &last_size);
1469 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_SNT, &size);
1471 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1472 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV, &last_size);
1473 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_RCV, &size);
1476 #if defined TIZEN_DUALSIM_ENABLE
1479 switch (statistics_type) {
1480 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1481 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT2, &last_size);
1483 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1484 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV2, &last_size);
1486 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1487 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT2, &last_size);
1488 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_SNT2, &size);
1490 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1491 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV2, &last_size);
1492 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_RCV2, &size);
1498 CONNECTION_LOG(CONNECTION_ERROR, "Invalid subscriber id:%d", sim_id);
1499 return CONNECTION_ERROR_OPERATION_FAILED;
1503 if (rv != VCONF_OK || rv1 != VCONF_OK) {
1504 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular statistics"); //LCOV_EXCL_LINE
1505 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1508 *llsize = (long long)(last_size * 1000) + (long long)(size * 1000);
1509 CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", *llsize);
1511 return CONNECTION_ERROR_NONE;
1514 static int __get_statistic(connection_handle_s *conn_handle, connection_type_e connection_type,
1515 connection_statistics_type_e statistics_type, long long *llsize)
1518 unsigned long long ull_size;
1520 if (llsize == NULL) {
1521 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
1522 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1525 rv = _connection_libnet_check_get_privilege();
1526 if (rv == CONNECTION_ERROR_PERMISSION_DENIED)
1528 else if (rv != CONNECTION_ERROR_NONE) {
1529 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get statistics"); //LCOV_EXCL_LINE
1530 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1533 if (connection_type == CONNECTION_TYPE_CELLULAR)
1534 return __get_cellular_statistic(statistics_type, llsize);
1535 else if (connection_type == CONNECTION_TYPE_WIFI) {
1536 switch (statistics_type) {
1537 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1538 stat_type = NET_STATISTICS_TYPE_LAST_SENT_DATA;
1540 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1541 stat_type = NET_STATISTICS_TYPE_LAST_RECEIVED_DATA;
1543 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1544 stat_type = NET_STATISTICS_TYPE_TOTAL_SENT_DATA;
1546 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1547 stat_type = NET_STATISTICS_TYPE_TOTAL_RECEIVED_DATA;
1550 return CONNECTION_ERROR_INVALID_PARAMETER;
1553 CONNECTION_LOG(CONNECTION_INFO, "connection type[%d] statistics type[%d]",
1554 connection_type, statistics_type);
1556 rv = _connection_libnet_get_statistics(conn_handle, stat_type, &ull_size);
1557 if (rv == CONNECTION_ERROR_PERMISSION_DENIED)
1559 else if (rv != CONNECTION_ERROR_NONE) {
1560 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get Wi-Fi statistics"); //LCOV_EXCL_LINE
1561 *llsize = 0; //LCOV_EXCL_LINE
1562 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1565 CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", ull_size);
1566 *llsize = (long long)ull_size;
1568 return CONNECTION_ERROR_INVALID_PARAMETER;
1570 return CONNECTION_ERROR_NONE;
1573 static int __reset_statistic(connection_handle_s *conn_handle,
1574 connection_type_e connection_type, connection_statistics_type_e statistics_type)
1580 if (connection_type == CONNECTION_TYPE_CELLULAR)
1581 conn_type = NET_DEVICE_CELLULAR;
1582 else if (connection_type == CONNECTION_TYPE_WIFI)
1583 conn_type = NET_DEVICE_WIFI;
1585 return CONNECTION_ERROR_INVALID_PARAMETER;
1587 switch (statistics_type) {
1588 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1589 stat_type = NET_STATISTICS_TYPE_LAST_SENT_DATA;
1591 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1592 stat_type = NET_STATISTICS_TYPE_LAST_RECEIVED_DATA;
1594 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1595 stat_type = NET_STATISTICS_TYPE_TOTAL_SENT_DATA;
1597 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1598 stat_type = NET_STATISTICS_TYPE_TOTAL_RECEIVED_DATA;
1601 return CONNECTION_ERROR_INVALID_PARAMETER;
1604 rv = _connection_libnet_set_statistics(conn_handle, conn_type, stat_type);
1605 if (rv != CONNECTION_ERROR_NONE)
1608 CONNECTION_LOG(CONNECTION_INFO, "connection_reset_statistics success");
1610 return CONNECTION_ERROR_NONE;
1613 EXPORT_API int connection_get_statistics(connection_h connection,
1614 connection_type_e connection_type,
1615 connection_statistics_type_e statistics_type, long long* size)
1619 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
1621 if (connection_type == CONNECTION_TYPE_CELLULAR)
1622 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1623 else if (connection_type == CONNECTION_TYPE_WIFI)
1624 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1626 if (!(__connection_check_handle_validity(connection)) || size == NULL) {
1627 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1629 return CONNECTION_ERROR_INVALID_PARAMETER;
1632 int rv = __get_statistic(connection, connection_type, statistics_type, size);
1633 if (rv != CONNECTION_ERROR_NONE) {
1634 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get statistics [%d]", rv); //LCOV_EXCL_LINE
1636 return rv; //LCOV_EXCL_LINE
1640 return CONNECTION_ERROR_NONE;
1643 EXPORT_API int connection_reset_statistics(connection_h connection,
1644 connection_type_e connection_type,
1645 connection_statistics_type_e statistics_type)
1649 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
1651 if (connection_type == CONNECTION_TYPE_CELLULAR)
1652 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1653 else if (connection_type == CONNECTION_TYPE_WIFI)
1654 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1656 if (!__connection_check_handle_validity(connection)) {
1657 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1659 return CONNECTION_ERROR_INVALID_PARAMETER;
1662 int rv = __reset_statistic(connection, connection_type, statistics_type);
1663 if (rv != CONNECTION_ERROR_NONE) {
1664 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get statistics [%d]", rv); //LCOV_EXCL_LINE
1666 return rv; //LCOV_EXCL_LINE
1670 return CONNECTION_ERROR_NONE;
1673 EXPORT_API int connection_foreach_ipv6_address(connection_h connection,
1674 connection_type_e connection_type, connection_ipv6_address_cb callback,
1679 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE,
1680 TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1682 GSList *ipv6_address_list = NULL;
1684 if (!(__connection_check_handle_validity(connection))) {
1685 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1687 return CONNECTION_ERROR_INVALID_PARAMETER;
1690 int rv = CONNECTION_ERROR_NONE;
1692 switch (connection_type) {
1693 case CONNECTION_TYPE_WIFI:
1694 rv = net_foreach_ipv6_address(NET_DEVICE_WIFI,
1695 &ipv6_address_list);
1697 case CONNECTION_TYPE_CELLULAR:
1698 rv = net_foreach_ipv6_address(NET_DEVICE_CELLULAR,
1699 &ipv6_address_list);
1701 case CONNECTION_TYPE_ETHERNET:
1702 rv = net_foreach_ipv6_address(NET_DEVICE_ETHERNET,
1703 &ipv6_address_list);
1705 case CONNECTION_TYPE_BT:
1706 rv = net_foreach_ipv6_address(NET_DEVICE_BLUETOOTH,
1707 &ipv6_address_list);
1710 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1712 return CONNECTION_ERROR_INVALID_PARAMETER;
1715 if (rv != NET_ERR_NONE) {
1716 CONNECTION_LOG(CONNECTION_ERROR, "net_get_multiple_id_address" //LCOV_EXCL_LINE
1717 " Failed = %d\n", rv);
1718 CONN_UNLOCK; //LCOV_EXCL_LINE
1719 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1723 for (list = ipv6_address_list; list; list = list->next) {
1724 rv = callback((char *)list->data, user_data);
1729 g_slist_free_full(ipv6_address_list, g_free);
1730 ipv6_address_list = NULL;
1733 return CONNECTION_ERROR_NONE;
1736 EXPORT_API int connection_profile_start_tcpdump(connection_h connection)
1742 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1744 if (!(__connection_check_handle_validity(connection))) {
1745 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1747 return CONNECTION_ERROR_INVALID_PARAMETER;
1750 ret = _connection_libnet_start_tcpdump(connection);
1751 if (ret != CONNECTION_ERROR_NONE) {
1752 CONNECTION_LOG(CONNECTION_ERROR, "Failed to start tcpdump (%d)", ret); //LCOV_EXCL_LINE
1753 CONN_UNLOCK; //LCOV_EXCL_LINE
1754 return ret; //LCOV_EXCL_LINE
1758 return CONNECTION_ERROR_NONE;
1761 EXPORT_API int connection_profile_stop_tcpdump(connection_h connection)
1767 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1769 if (!(__connection_check_handle_validity(connection))) {
1770 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1772 return CONNECTION_ERROR_INVALID_PARAMETER;
1775 ret = _connection_libnet_stop_tcpdump(connection);
1776 if (ret != CONNECTION_ERROR_NONE) {
1777 CONNECTION_LOG(CONNECTION_ERROR, "Failed to stop tcpdump (%d)", ret); //LCOV_EXCL_LINE
1778 CONN_UNLOCK; //LCOV_EXCL_LINE
1779 return ret; //LCOV_EXCL_LINE
1783 return CONNECTION_ERROR_NONE;
1786 EXPORT_API int connection_profile_get_tcpdump_state(connection_h connection, gboolean *tcpdump_state)
1792 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1794 if (!(__connection_check_handle_validity(connection)) || !tcpdump_state) {
1795 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1797 return CONNECTION_ERROR_INVALID_PARAMETER;
1800 ret = _connection_libnet_get_tcpdump_state(connection, tcpdump_state);
1801 if (ret != CONNECTION_ERROR_NONE) {
1802 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get the tcpdump state (%d)", ret); //LCOV_EXCL_LINE
1803 CONN_UNLOCK; //LCOV_EXCL_LINE
1804 return ret; //LCOV_EXCL_LINE
1808 return CONNECTION_ERROR_NONE;
1811 EXPORT_API int connection_profile_save_ethernet_eap_config(connection_h connection,
1812 connection_profile_h profile)
1816 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1820 if (!__connection_check_handle_validity(connection) ||
1821 !_connection_libnet_check_profile_validity(profile)) {
1822 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1824 return CONNECTION_ERROR_INVALID_PARAMETER;
1827 rv = _connection_libnet_profile_save_ethernet_eap_config(connection, profile);
1828 if (rv != CONNECTION_ERROR_NONE) {
1829 CONNECTION_LOG(CONNECTION_ERROR, "Failed to save ethernet eap config."); //LCOV_EXCL_LINE
1830 CONN_UNLOCK; //LCOV_EXCL_LINE
1831 return rv; //LCOV_EXCL_LINE
1835 return CONNECTION_ERROR_NONE;