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));
217 return CONNECTION_ERROR_NONE;
221 EXPORT_API int connection_create_cs(int tid, connection_h *connection)
225 rv = connection_create(connection);
226 if (rv == CONNECTION_ERROR_NONE) {
228 _connection_set_cs_tid(tid, *connection);
235 EXPORT_API int connection_destroy_cs(int tid, connection_h connection)
240 _connection_unset_cs_tid(tid, connection);
243 rv = connection_destroy(connection);
249 EXPORT_API int connection_get_type(connection_h connection, connection_type_e* type)
256 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
258 if (type == NULL || !(__connection_check_handle_validity(connection))) {
259 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
261 return CONNECTION_ERROR_INVALID_PARAMETER;
264 rv = vconf_get_int(VCONFKEY_NETWORK_STATUS, &status);
265 if (rv != VCONF_OK) {
266 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_int Failed = %d", status); //LCOV_EXCL_LINE
267 CONN_UNLOCK; //LCOV_EXCL_LINE
268 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
271 CONNECTION_LOG(CONNECTION_INFO, "Connected Network = %d", status);
273 *type = __connection_convert_net_state(status);
276 return CONNECTION_ERROR_NONE;
279 EXPORT_API int connection_get_ip_address(connection_h connection,
280 connection_address_family_e address_family, char** ip_address)
284 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
286 if (ip_address == NULL || !(__connection_check_handle_validity(connection))) {
287 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
289 return CONNECTION_ERROR_INVALID_PARAMETER;
292 switch (address_family) {
293 case CONNECTION_ADDRESS_FAMILY_IPV4:
294 *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP);
296 case CONNECTION_ADDRESS_FAMILY_IPV6:
297 *ip_address = vconf_get_str(VCONFKEY_NETWORK_IP6);
300 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
302 return CONNECTION_ERROR_INVALID_PARAMETER;
305 if (*ip_address == NULL) {
306 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE
307 CONN_UNLOCK; //LCOV_EXCL_LINE
308 return CONNECTION_ERROR_OPERATION_FAILED;//LCOV_EXCL_LINE
312 return CONNECTION_ERROR_NONE;
315 EXPORT_API int connection_get_proxy(connection_h connection,
316 connection_address_family_e address_family, char** proxy)
320 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
322 if (proxy == NULL || !(__connection_check_handle_validity(connection))) {
323 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
325 return CONNECTION_ERROR_INVALID_PARAMETER;
328 switch (address_family) {
329 case CONNECTION_ADDRESS_FAMILY_IPV4:
330 case CONNECTION_ADDRESS_FAMILY_IPV6:
331 *proxy = vconf_get_str(VCONFKEY_NETWORK_PROXY);
334 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
336 return CONNECTION_ERROR_INVALID_PARAMETER;
339 if (*proxy == NULL) {
340 CONNECTION_LOG(CONNECTION_ERROR, "vconf_get_str Failed"); //LCOV_EXCL_LINE
341 CONN_UNLOCK; //LCOV_EXCL_LINE
342 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
346 return CONNECTION_ERROR_NONE;
349 EXPORT_API int connection_get_mac_address(connection_h connection, connection_type_e type, char** mac_addr)
352 char buf[CONNECTION_MAC_INFO_LENGTH + 1];
356 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE, ETHERNET_FEATURE);
358 if (type == CONNECTION_TYPE_WIFI)
359 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
360 else if (type == CONNECTION_TYPE_ETHERNET) //LCOV_EXCL_LINE
361 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE); //LCOV_EXCL_LINE
363 if (mac_addr == NULL || !(__connection_check_handle_validity(connection))) {
364 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
366 return CONNECTION_ERROR_INVALID_PARAMETER;
370 case CONNECTION_TYPE_WIFI:
371 if (access(WIFI_MAC_INFO_FILE, F_OK) == 0)
372 fp = fopen(WIFI_MAC_INFO_FILE, "r");
375 if (fgets(buf, sizeof(buf), fp) == NULL) {
376 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", WIFI_MAC_INFO_FILE);
379 return CONNECTION_ERROR_OPERATION_FAILED;
382 CONNECTION_LOG(CONNECTION_INFO, "%s : %s", WIFI_MAC_INFO_FILE, buf);
384 *mac_addr = g_strdup(buf);
387 *mac_addr = vconf_get_str(VCONFKEY_WIFI_BSSID_ADDRESS);
389 if (*mac_addr == NULL) {
390 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get vconf from %s", VCONFKEY_WIFI_BSSID_ADDRESS); //LCOV_EXCL_LINE
391 CONN_UNLOCK; //LCOV_EXCL_LINE
392 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
395 if (strlen(*mac_addr) == 0) {
396 CONNECTION_LOG(CONNECTION_ERROR, "Mac address is invalid"
397 " from %s", VCONFKEY_WIFI_BSSID_ADDRESS); //LCOV_EXCL_LINE
398 g_free(*mac_addr); //LCOV_EXCL_LINE
399 *mac_addr = NULL; //LCOV_EXCL_LINE
400 CONN_UNLOCK; //LCOV_EXCL_LINE
401 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
406 case CONNECTION_TYPE_ETHERNET:
407 fp = fopen(ETHERNET_MAC_INFO_FILE, "r");
409 CONNECTION_LOG(CONNECTION_ERROR, "Failed to open file %s", ETHERNET_MAC_INFO_FILE);
411 return CONNECTION_ERROR_OUT_OF_MEMORY;
414 if (fgets(buf, sizeof(buf), fp) == NULL) {
415 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get MAC info from %s", ETHERNET_MAC_INFO_FILE);
418 return CONNECTION_ERROR_OPERATION_FAILED;
421 CONNECTION_LOG(CONNECTION_INFO, "%s : %s", ETHERNET_MAC_INFO_FILE, buf);
423 *mac_addr = g_strdup(buf);
428 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
429 CONN_UNLOCK; //LCOV_EXCL_LINE
430 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
433 /* Checking Invalid MAC Address */
434 if ((strcmp(*mac_addr, "00:00:00:00:00:00") == 0) ||
435 (strcmp(*mac_addr, "ff:ff:ff:ff:ff:ff") == 0)) {
436 CONNECTION_LOG(CONNECTION_ERROR, "MAC Address(%s) is invalid", *mac_addr); //LCOV_EXCL_LINE
437 CONN_UNLOCK; //LCOV_EXCL_LINE
438 return CONNECTION_ERROR_INVALID_OPERATION; //LCOV_EXCL_LINE
441 CONNECTION_LOG(CONNECTION_INFO, "MAC Address %s", *mac_addr);
444 return CONNECTION_ERROR_NONE;
448 EXPORT_API int connection_is_metered_network(connection_h connection, bool* is_metered)
452 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
454 if (is_metered == NULL || !(__connection_check_handle_validity(connection))) {
455 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
457 return CONNECTION_ERROR_INVALID_PARAMETER;
460 int rv = _connection_libnet_get_metered_state(connection, is_metered);
461 if (rv != CONNECTION_ERROR_NONE) {
462 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get metered state[%d]", rv); //LCOV_EXCL_LINE
463 CONN_UNLOCK; //LCOV_EXCL_LINE
464 return rv; //LCOV_EXCL_LINE
467 CONNECTION_LOG(CONNECTION_INFO, "metered state: %s", is_metered ? "true" : "false");
469 return CONNECTION_ERROR_NONE;
473 EXPORT_API int connection_get_cellular_state(connection_h connection, connection_cellular_state_e* state)
477 int cellular_state = 0;
478 #if defined TIZEN_DUALSIM_ENABLE
484 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
486 if (state == NULL || !(__connection_check_handle_validity(connection))) {
487 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
489 return CONNECTION_ERROR_INVALID_PARAMETER;
492 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &status);
493 if (rv != VCONF_OK) {
494 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE
495 CONN_UNLOCK; //LCOV_EXCL_LINE
496 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
499 CONNECTION_LOG(CONNECTION_INFO, "Cellular: %d", status);
500 *state = __connection_convert_cellular_state(status);
502 if (*state == CONNECTION_CELLULAR_STATE_AVAILABLE) {
503 #if defined TIZEN_DUALSIM_ENABLE
504 rv = vconf_get_int(VCONF_TELEPHONY_DEFAULT_DATA_SERVICE, &sim_id);
505 if (rv != VCONF_OK) {
506 CONNECTION_LOG(CONNECTION_ERROR,
507 "Failed to get default subscriber id", sim_id);
509 return CONNECTION_ERROR_OPERATION_FAILED;
513 case CONNECTION_CELLULAR_SUBSCRIBER_1:
515 rv = vconf_get_int(VCONFKEY_DNET_STATE, &cellular_state);
516 #if defined TIZEN_DUALSIM_ENABLE
519 case CONNECTION_CELLULAR_SUBSCRIBER_2:
520 rv = vconf_get_int(VCONFKEY_DNET_STATE2, &cellular_state);
524 CONNECTION_LOG(CONNECTION_ERROR, "Invalid subscriber id:%d", sim_id);
526 return CONNECTION_ERROR_OPERATION_FAILED;
529 if (rv != VCONF_OK) {
530 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular state"); //LCOV_EXCL_LINE
531 CONN_UNLOCK; //LCOV_EXCL_LINE
532 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
536 CONNECTION_LOG(CONNECTION_INFO, "Cellular state: %d", cellular_state);
538 if (cellular_state == VCONFKEY_DNET_NORMAL_CONNECTED ||
539 cellular_state == VCONFKEY_DNET_SECURE_CONNECTED ||
540 cellular_state == VCONFKEY_DNET_TRANSFER)
541 *state = CONNECTION_CELLULAR_STATE_CONNECTED;
544 return CONNECTION_ERROR_NONE;
547 EXPORT_API int connection_get_wifi_state(connection_h connection, connection_wifi_state_e* state)
551 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
553 if (state == NULL || !(__connection_check_handle_validity(connection))) {
554 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
556 return CONNECTION_ERROR_INVALID_PARAMETER;
559 int rv = _connection_libnet_get_wifi_state(connection, state);
560 if (rv != CONNECTION_ERROR_NONE) {
561 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get Wi-Fi state[%d]", rv); //LCOV_EXCL_LINE
562 CONN_UNLOCK; //LCOV_EXCL_LINE
563 return rv; //LCOV_EXCL_LINE
566 CONNECTION_LOG(CONNECTION_INFO, "Wi-Fi state: %d", *state);
569 return CONNECTION_ERROR_NONE;
572 EXPORT_API int connection_get_ethernet_state(connection_h connection, connection_ethernet_state_e *state)
576 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
578 if (state == NULL || !(__connection_check_handle_validity(connection))) {
579 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
581 return CONNECTION_ERROR_INVALID_PARAMETER;
584 int rv = _connection_libnet_get_ethernet_state(connection, state);
585 if (rv != CONNECTION_ERROR_NONE) {
586 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get ethernet state[%d]", rv); //LCOV_EXCL_LINE
587 CONN_UNLOCK; //LCOV_EXCL_LINE
588 return rv; //LCOV_EXCL_LINE
592 return CONNECTION_ERROR_NONE;
595 EXPORT_API int connection_get_ethernet_cable_state(connection_h connection, connection_ethernet_cable_state_e *state)
599 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
601 if (state == NULL || !(__connection_check_handle_validity(connection))) {
602 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
604 return CONNECTION_ERROR_INVALID_PARAMETER;
607 int rv = _connection_libnet_get_ethernet_cable_state(connection, state);
608 if (rv != CONNECTION_ERROR_NONE) {
609 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get ethernet cable state[%d]", rv); //LCOV_EXCL_LINE
610 CONN_UNLOCK; //LCOV_EXCL_LINE
611 return rv; //LCOV_EXCL_LINE
615 return CONNECTION_ERROR_NONE;
618 EXPORT_API int connection_set_ethernet_cable_state_chaged_cb(connection_h connection,
619 connection_ethernet_cable_state_chaged_cb callback, void *user_data)
621 DEPRECATED_LOG(__FUNCTION__, "connection_set_ethernet_cable_state_changed_cb");
625 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
627 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
628 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
630 return CONNECTION_ERROR_INVALID_PARAMETER;
633 DEPRECATED_LOG("connection_ethernet_cable_state_chaged_cb",
634 "connection_ethernet_cable_state_changed_cb");
636 __connection_set_ethernet_cable_state_changed_cb(connection, callback, user_data);
639 return CONNECTION_ERROR_NONE;
642 EXPORT_API int connection_unset_ethernet_cable_state_chaged_cb(connection_h connection)
644 DEPRECATED_LOG(__FUNCTION__, "connection_unset_ethernet_cable_state_changed_cb");
648 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
650 if (!(__connection_check_handle_validity(connection))) {
651 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
653 return CONNECTION_ERROR_INVALID_PARAMETER;
656 __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
659 return CONNECTION_ERROR_NONE;
662 EXPORT_API int connection_set_ethernet_cable_state_changed_cb(connection_h connection,
663 connection_ethernet_cable_state_changed_cb callback, void *user_data)
667 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
669 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
670 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
672 return CONNECTION_ERROR_INVALID_PARAMETER;
675 __connection_set_ethernet_cable_state_changed_cb(connection, callback, user_data);
678 return CONNECTION_ERROR_NONE;
681 EXPORT_API int connection_unset_ethernet_cable_state_changed_cb(connection_h connection)
685 CHECK_FEATURE_SUPPORTED(ETHERNET_FEATURE);
687 if (!(__connection_check_handle_validity(connection))) {
688 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
690 return CONNECTION_ERROR_INVALID_PARAMETER;
693 __connection_set_ethernet_cable_state_changed_cb(connection, NULL, NULL);
696 return CONNECTION_ERROR_NONE;
699 EXPORT_API int connection_get_bt_state(connection_h connection, connection_bt_state_e *state)
703 CHECK_FEATURE_SUPPORTED(TETHERING_BLUETOOTH_FEATURE);
705 if (state == NULL || !(__connection_check_handle_validity(connection))) {
706 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
708 return CONNECTION_ERROR_INVALID_PARAMETER;
711 int rv = _connection_libnet_get_bluetooth_state(connection, state);
712 if (rv != CONNECTION_ERROR_NONE) {
713 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get bluetooth state[%d]", rv); //LCOV_EXCL_LINE
714 CONN_UNLOCK; //LCOV_EXCL_LINE
715 return rv; //LCOV_EXCL_LINE
719 return CONNECTION_ERROR_NONE;
722 EXPORT_API int connection_set_type_changed_cb(connection_h connection,
723 connection_type_changed_cb callback, void* user_data)
727 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
729 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
730 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
732 return CONNECTION_ERROR_INVALID_PARAMETER;
735 __connection_set_type_changed_callback(connection, callback, user_data);
738 return CONNECTION_ERROR_NONE;
741 EXPORT_API int connection_unset_type_changed_cb(connection_h connection)
745 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
747 if (!(__connection_check_handle_validity(connection))) {
748 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
750 return CONNECTION_ERROR_INVALID_PARAMETER;
753 __connection_set_type_changed_callback(connection, NULL, NULL);
756 return CONNECTION_ERROR_NONE;
759 EXPORT_API int connection_set_ip_address_changed_cb(connection_h connection,
760 connection_address_changed_cb callback, void* user_data)
764 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
766 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
767 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
769 return CONNECTION_ERROR_INVALID_PARAMETER;
772 __connection_set_ip_changed_callback(connection, callback, user_data);
775 return CONNECTION_ERROR_NONE;
778 EXPORT_API int connection_unset_ip_address_changed_cb(connection_h connection)
782 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
784 if (!(__connection_check_handle_validity(connection))) {
785 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
787 return CONNECTION_ERROR_INVALID_PARAMETER;
790 __connection_set_ip_changed_callback(connection, NULL, NULL);
793 return CONNECTION_ERROR_NONE;
796 EXPORT_API int connection_set_proxy_address_changed_cb(connection_h connection,
797 connection_address_changed_cb callback, void* user_data)
801 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
803 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
804 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
806 return CONNECTION_ERROR_INVALID_PARAMETER;
809 __connection_set_proxy_changed_callback(connection, callback, user_data);
812 return CONNECTION_ERROR_NONE;
815 EXPORT_API int connection_unset_proxy_address_changed_cb(connection_h connection)
819 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
821 if (!(__connection_check_handle_validity(connection))) {
822 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
824 return CONNECTION_ERROR_INVALID_PARAMETER;
827 __connection_set_proxy_changed_callback(connection, NULL, NULL);
830 return CONNECTION_ERROR_NONE;
833 EXPORT_API int connection_set_internet_state_changed_cb(connection_h connection,
834 connection_internet_state_changed_cb callback, void *user_data)
838 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
840 if (callback == NULL || !(__connection_check_handle_validity(connection))) {
841 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
843 return CONNECTION_ERROR_INVALID_PARAMETER;
846 __connection_set_internet_state_changed_callback(connection, callback, user_data);
849 return CONNECTION_ERROR_NONE;
852 EXPORT_API int connection_unset_internet_state_changed_cb(connection_h connection)
856 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
858 if (!(__connection_check_handle_validity(connection))) {
859 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
861 return CONNECTION_ERROR_INVALID_PARAMETER;
864 __connection_set_internet_state_changed_callback(connection, NULL, NULL);
867 return CONNECTION_ERROR_NONE;
870 EXPORT_API int connection_add_profile(connection_h connection, connection_profile_h profile)
873 connection_handle_s *conn_handle = (connection_handle_s *)connection;
874 net_profile_info_t *profile_info = (net_profile_info_t *)profile;
878 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
880 if (!(__connection_check_handle_validity(connection)) ||
881 !(_connection_libnet_check_profile_validity(profile))) {
882 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
884 return CONNECTION_ERROR_INVALID_PARAMETER;
887 if (profile_info->profile_type != NET_DEVICE_CELLULAR) {
888 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
889 CONN_UNLOCK; //LCOV_EXCL_LINE
890 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
893 if (profile_info->ProfileInfo.Pdp.PSModemPath[0] != '/' ||
894 strlen(profile_info->ProfileInfo.Pdp.PSModemPath) < 2) {
895 CONNECTION_LOG(CONNECTION_ERROR, "Modem object path is NULL"); //LCOV_EXCL_LINE
896 CONN_UNLOCK; //LCOV_EXCL_LINE
897 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
900 rv = net_add_profile(conn_handle->network_info_handle,
901 profile_info->ProfileInfo.Pdp.ServiceType, profile_info);
902 if (rv == NET_ERR_ACCESS_DENIED) {
903 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
904 CONN_UNLOCK; //LCOV_EXCL_LINE
905 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
906 } else if (rv != NET_ERR_NONE) {
907 CONNECTION_LOG(CONNECTION_ERROR, "Failed to add profile[%d]", rv); //LCOV_EXCL_LINE
908 CONN_UNLOCK; //LCOV_EXCL_LINE
909 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
913 return CONNECTION_ERROR_NONE;
916 EXPORT_API int connection_remove_profile(connection_h connection, connection_profile_h profile)
919 connection_handle_s *conn_handle = (connection_handle_s *)connection;
920 net_profile_info_t *profile_info = (net_profile_info_t *)profile;
924 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
926 if (!(__connection_check_handle_validity(connection)) ||
927 !(_connection_libnet_check_profile_validity(profile))) {
928 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
930 return CONNECTION_ERROR_INVALID_PARAMETER;
933 if (profile_info->profile_type != NET_DEVICE_CELLULAR &&
934 profile_info->profile_type != NET_DEVICE_MESH &&
935 profile_info->profile_type != NET_DEVICE_WIFI) {
936 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
937 CONN_UNLOCK; //LCOV_EXCL_LINE
938 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
941 rv = net_delete_profile(conn_handle->network_info_handle, profile_info->ProfileName);
942 if (rv == NET_ERR_ACCESS_DENIED) {
943 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
944 CONN_UNLOCK; //LCOV_EXCL_LINE
945 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
946 } else if (rv != NET_ERR_NONE) {
947 CONNECTION_LOG(CONNECTION_ERROR, "Failed to delete profile[%d]", rv); //LCOV_EXCL_LINE
948 CONN_UNLOCK; //LCOV_EXCL_LINE
949 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
953 return CONNECTION_ERROR_NONE;
956 EXPORT_API int connection_update_profile(connection_h connection, connection_profile_h profile)
959 connection_handle_s *conn_handle = (connection_handle_s *)connection;
960 net_profile_info_t *profile_info = (net_profile_info_t *)profile;
964 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
966 if (!(__connection_check_handle_validity(connection)) ||
967 !(_connection_libnet_check_profile_validity(profile))) {
968 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
970 return CONNECTION_ERROR_INVALID_PARAMETER;
973 rv = net_modify_profile(conn_handle->network_info_handle,
974 profile_info->ProfileName, (net_profile_info_t*)profile);
975 if (rv == NET_ERR_ACCESS_DENIED) {
976 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
977 CONN_UNLOCK; //LCOV_EXCL_LINE
978 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
979 } else if (rv != NET_ERR_NONE) {
980 CONNECTION_LOG(CONNECTION_ERROR, "Failed to modify profile[%d]", rv); //LCOV_EXCL_LINE
981 CONN_UNLOCK; //LCOV_EXCL_LINE
982 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
986 return CONNECTION_ERROR_NONE;
989 EXPORT_API int connection_get_profile_iterator(connection_h connection,
990 connection_iterator_type_e type, connection_profile_iterator_h* profile_iterator)
994 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
996 if (!(__connection_check_handle_validity(connection)) ||
997 (type != CONNECTION_ITERATOR_TYPE_REGISTERED &&
998 type != CONNECTION_ITERATOR_TYPE_CONNECTED &&
999 type != CONNECTION_ITERATOR_TYPE_DEFAULT)) {
1000 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1002 return CONNECTION_ERROR_INVALID_PARAMETER;
1005 int rv = _connection_libnet_get_profile_iterator(connection, type, profile_iterator);
1006 if (rv != CONNECTION_ERROR_NONE) {
1007 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get profile iterator [%d]", rv); //LCOV_EXCL_LINE
1008 CONN_UNLOCK; //LCOV_EXCL_LINE
1009 return rv; //LCOV_EXCL_LINE
1013 return CONNECTION_ERROR_NONE;
1016 EXPORT_API int connection_profile_iterator_next(connection_profile_iterator_h profile_iterator,
1017 connection_profile_h* profile)
1021 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1023 int rv = _connection_libnet_get_iterator_next(profile_iterator, profile);
1029 EXPORT_API bool connection_profile_iterator_has_next(connection_profile_iterator_h profile_iterator)
1033 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1035 int rv = _connection_libnet_iterator_has_next(profile_iterator);
1041 EXPORT_API int connection_destroy_profile_iterator(connection_profile_iterator_h profile_iterator)
1045 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1047 int rv = _connection_libnet_destroy_iterator(profile_iterator);
1053 EXPORT_API int connection_get_current_profile(connection_h connection, connection_profile_h* profile)
1057 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1059 if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1060 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1062 return CONNECTION_ERROR_INVALID_PARAMETER;
1065 int rv = _connection_libnet_get_current_profile(connection, profile);
1066 if (rv != CONNECTION_ERROR_NONE) {
1067 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get current profile [%d]", rv); //LCOV_EXCL_LINE
1068 CONN_UNLOCK; //LCOV_EXCL_LINE
1069 return rv; //LCOV_EXCL_LINE
1073 return CONNECTION_ERROR_NONE;
1076 EXPORT_API int connection_get_default_cellular_service_profile(
1077 connection_h connection, connection_cellular_service_type_e type,
1078 connection_profile_h *profile)
1082 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1084 if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1085 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1087 return CONNECTION_ERROR_INVALID_PARAMETER;
1090 int rv = _connection_libnet_get_cellular_service_profile(connection, type, profile);
1091 if (rv != CONNECTION_ERROR_NONE) {
1092 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get default cellular service profile [%d]", rv); //LCOV_EXCL_LINE
1093 CONN_UNLOCK; //LCOV_EXCL_LINE
1094 return rv; //LCOV_EXCL_LINE
1098 return CONNECTION_ERROR_NONE;
1101 EXPORT_API int connection_set_default_cellular_service_profile(connection_h connection,
1102 connection_cellular_service_type_e type, connection_profile_h profile)
1106 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1108 if (!(__connection_check_handle_validity(connection)) || profile == NULL) {
1109 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1111 return CONNECTION_ERROR_INVALID_PARAMETER;
1114 int rv = _connection_libnet_set_cellular_service_profile_sync(connection, type, profile);
1115 if (rv != CONNECTION_ERROR_NONE) {
1116 CONNECTION_LOG(CONNECTION_ERROR, "Fail to set default cellular service profile [%d]", rv); //LCOV_EXCL_LINE
1117 CONN_UNLOCK; //LCOV_EXCL_LINE
1118 return rv; //LCOV_EXCL_LINE
1122 return CONNECTION_ERROR_NONE;
1125 EXPORT_API int connection_set_default_cellular_service_profile_async(connection_h connection,
1126 connection_cellular_service_type_e type, connection_profile_h profile,
1127 connection_set_default_cb callback, void* user_data)
1131 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1135 if (!(__connection_check_handle_validity(connection)) ||
1136 profile == NULL || callback == NULL) {
1137 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1139 return CONNECTION_ERROR_INVALID_PARAMETER;
1142 rv = _connection_libnet_set_cellular_service_profile_async(connection, type, profile);
1143 if (rv == NET_ERR_ACCESS_DENIED) {
1144 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1145 CONN_UNLOCK; //LCOV_EXCL_LINE
1146 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1147 } else if (rv != NET_ERR_NONE) {
1148 CONNECTION_LOG(CONNECTION_ERROR, "Failed to set default cellular service profile[%d]", rv); //LCOV_EXCL_LINE
1149 CONN_UNLOCK; //LCOV_EXCL_LINE
1150 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1153 __connection_set_default_cellular_service_profile_callback(connection, callback, user_data);
1156 return CONNECTION_ERROR_NONE;
1159 EXPORT_API int connection_open_profile(connection_h connection, connection_profile_h profile,
1160 connection_opened_cb callback, void* user_data)
1164 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1168 if (!(__connection_check_handle_validity(connection)) ||
1169 profile == NULL || callback == NULL) {
1170 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1172 return CONNECTION_ERROR_INVALID_PARAMETER;
1175 rv = _connection_libnet_open_profile(connection, profile);
1176 if (rv == NET_ERR_ACCESS_DENIED) {
1177 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1178 CONN_UNLOCK; //LCOV_EXCL_LINE
1179 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1180 } else if (rv != NET_ERR_NONE) {
1181 CONNECTION_LOG(CONNECTION_ERROR, "Failed to open profile[%d]", rv); //LCOV_EXCL_LINE
1182 CONN_UNLOCK; //LCOV_EXCL_LINE
1183 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1186 __connection_open_profile_set_callback(connection, callback, user_data);
1189 return CONNECTION_ERROR_NONE;
1192 EXPORT_API int connection_close_profile(connection_h connection, connection_profile_h profile,
1193 connection_closed_cb callback, void* user_data)
1197 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1201 if (!(__connection_check_handle_validity(connection)) ||
1202 profile == NULL || callback == NULL) {
1203 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1205 return CONNECTION_ERROR_INVALID_PARAMETER;
1208 rv = _connection_libnet_close_profile(connection, profile);
1209 if (rv == NET_ERR_ACCESS_DENIED) {
1210 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1211 CONN_UNLOCK; //LCOV_EXCL_LINE
1212 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1213 } else if (rv != NET_ERR_NONE) {
1214 CONNECTION_LOG(CONNECTION_ERROR, "Failed to close profile[%d]", rv); //LCOV_EXCL_LINE
1215 CONN_UNLOCK; //LCOV_EXCL_LINE
1216 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1219 __connection_close_profile_set_callback(connection, callback, user_data);
1222 return CONNECTION_ERROR_NONE;
1225 EXPORT_API int connection_reset_profile(connection_h connection,
1226 connection_reset_option_e type, int id, connection_reset_cb callback, void *user_data)
1230 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1234 if (!(__connection_check_handle_validity(connection))) {
1235 CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed");
1237 return CONNECTION_ERROR_INVALID_PARAMETER;
1240 if (id < 0 || id > 1) {
1241 CONNECTION_LOG(CONNECTION_ERROR, "Wrong Parameter Passed"); //LCOV_EXCL_LINE
1242 CONN_UNLOCK; //LCOV_EXCL_LINE
1243 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1246 rv = _connection_libnet_reset_profile(connection, type, id);
1247 if (rv == NET_ERR_ACCESS_DENIED) {
1248 CONNECTION_LOG(CONNECTION_ERROR, "Access denied"); //LCOV_EXCL_LINE
1249 CONN_UNLOCK; //LCOV_EXCL_LINE
1250 return CONNECTION_ERROR_PERMISSION_DENIED; //LCOV_EXCL_LINE
1251 } else if (rv != NET_ERR_NONE) {
1252 CONNECTION_LOG(CONNECTION_ERROR, "Failed to reset profile[%d]", rv); //LCOV_EXCL_LINE
1253 CONN_UNLOCK; //LCOV_EXCL_LINE
1254 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1257 __connection_reset_profile_set_callback(connection, callback, user_data);
1260 return CONNECTION_ERROR_NONE;
1263 EXPORT_API int connection_add_route(connection_h connection, const char* interface_name, const char* host_address)
1267 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1269 if (!(__connection_check_handle_validity(connection)) ||
1270 interface_name == NULL || host_address == NULL) {
1271 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1273 return CONNECTION_ERROR_INVALID_PARAMETER;
1276 int rv = _connection_libnet_add_route(connection, interface_name, host_address);
1277 if (rv != CONNECTION_ERROR_NONE) {
1278 CONNECTION_LOG(CONNECTION_ERROR, "Fail to add route [%d]", rv); //LCOV_EXCL_LINE
1279 CONN_UNLOCK; //LCOV_EXCL_LINE
1280 return rv; //LCOV_EXCL_LINE
1284 return CONNECTION_ERROR_NONE;
1287 EXPORT_API int connection_remove_route(connection_h connection, const char* interface_name, const char* host_address)
1291 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1293 if (!(__connection_check_handle_validity(connection)) ||
1294 interface_name == NULL || host_address == NULL) {
1295 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1297 return CONNECTION_ERROR_INVALID_PARAMETER;
1300 int rv = _connection_libnet_remove_route(connection, interface_name, host_address);
1301 if (rv != CONNECTION_ERROR_NONE) {
1302 CONNECTION_LOG(CONNECTION_ERROR, "Fail to remove route [%d]", rv); //LCOV_EXCL_LINE
1303 CONN_UNLOCK; //LCOV_EXCL_LINE
1304 return rv; //LCOV_EXCL_LINE
1308 return CONNECTION_ERROR_NONE;
1311 EXPORT_API int connection_add_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
1315 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1317 if (!(__connection_check_handle_validity(connection)) ||
1318 interface_name == NULL || host_address == NULL) {
1319 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1321 return CONNECTION_ERROR_INVALID_PARAMETER;
1324 int rv = _connection_libnet_add_route_ipv6(connection, interface_name, host_address, gateway);
1325 if (rv != CONNECTION_ERROR_NONE) {
1326 CONNECTION_LOG(CONNECTION_ERROR, "Fail to add route ipv6 [%d]", rv); //LCOV_EXCL_LINE
1327 CONN_UNLOCK; //LCOV_EXCL_LINE
1328 return rv; //LCOV_EXCL_LINE
1332 return CONNECTION_ERROR_NONE;
1335 EXPORT_API int connection_remove_route_ipv6(connection_h connection, const char *interface_name, const char *host_address, const char * gateway)
1339 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1341 if (!(__connection_check_handle_validity(connection)) ||
1342 interface_name == NULL || host_address == NULL) {
1343 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1345 return CONNECTION_ERROR_INVALID_PARAMETER;
1348 int rv = _connection_libnet_remove_route_ipv6(connection, interface_name, host_address, gateway);
1349 if (rv != CONNECTION_ERROR_NONE) {
1350 CONNECTION_LOG(CONNECTION_ERROR, "Fail to remove route ipv6 [%d]", rv); //LCOV_EXCL_LINE
1351 CONN_UNLOCK; //LCOV_EXCL_LINE
1352 return rv; //LCOV_EXCL_LINE
1356 return CONNECTION_ERROR_NONE;
1359 EXPORT_API int connection_add_route_entry(connection_h connection,
1360 connection_address_family_e address_family, const char *interface_name,
1361 const char *host_address, const char *gateway)
1365 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1367 if (!(__connection_check_handle_validity(connection)) ||
1368 (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
1369 address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
1370 interface_name == NULL || host_address == NULL) {
1371 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1373 return CONNECTION_ERROR_INVALID_PARAMETER;
1376 if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
1377 int rv = _connection_libnet_add_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV4,
1378 interface_name, host_address, gateway);
1382 int rv = _connection_libnet_add_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV6,
1383 interface_name, host_address, gateway);
1389 EXPORT_API int connection_remove_route_entry(connection_h connection,
1390 connection_address_family_e address_family, const char *interface_name,
1391 const char *host_address, const char *gateway)
1395 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, ETHERNET_FEATURE);
1397 if (!(__connection_check_handle_validity(connection)) ||
1398 (address_family != CONNECTION_ADDRESS_FAMILY_IPV4 &&
1399 address_family != CONNECTION_ADDRESS_FAMILY_IPV6) ||
1400 interface_name == NULL || host_address == NULL) {
1401 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1403 return CONNECTION_ERROR_INVALID_PARAMETER;
1406 if (address_family == CONNECTION_ADDRESS_FAMILY_IPV4) {
1407 int rv = _connection_libnet_remove_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV4,
1408 interface_name, host_address, gateway);
1412 int rv = _connection_libnet_remove_route_entry(connection, CONNECTION_ADDRESS_FAMILY_IPV6,
1413 interface_name, host_address, gateway);
1419 static int __get_cellular_statistic(connection_statistics_type_e statistics_type, long long *llsize)
1421 int rv = VCONF_OK, rv1 = VCONF_OK;
1422 int last_size = 0, size = 0;
1423 #if defined TIZEN_DUALSIM_ENABLE
1427 if (llsize == NULL) {
1428 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
1429 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1432 switch (statistics_type) {
1433 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1434 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1435 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1436 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1439 return CONNECTION_ERROR_INVALID_PARAMETER;
1442 #if defined TIZEN_DUALSIM_ENABLE
1443 rv = vconf_get_int(VCONF_TELEPHONY_DEFAULT_DATA_SERVICE, &sim_id);
1444 if (rv != VCONF_OK) {
1445 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get default subscriber id");
1447 return CONNECTION_ERROR_OPERATION_FAILED;
1453 switch (statistics_type) {
1454 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1455 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT, &last_size);
1457 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1458 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV, &last_size);
1460 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1461 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT, &last_size);
1462 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_SNT, &size);
1464 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1465 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV, &last_size);
1466 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_RCV, &size);
1469 #if defined TIZEN_DUALSIM_ENABLE
1472 switch (statistics_type) {
1473 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1474 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT2, &last_size);
1476 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1477 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV2, &last_size);
1479 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1480 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_SNT2, &last_size);
1481 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_SNT2, &size);
1483 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1484 rv = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_LAST_RCV2, &last_size);
1485 rv1 = vconf_get_int(VCONFKEY_NETWORK_CELLULAR_PKT_TOTAL_RCV2, &size);
1491 CONNECTION_LOG(CONNECTION_ERROR, "Invalid subscriber id:%d", sim_id);
1492 return CONNECTION_ERROR_OPERATION_FAILED;
1496 if (rv != VCONF_OK || rv1 != VCONF_OK) {
1497 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get cellular statistics"); //LCOV_EXCL_LINE
1498 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1501 *llsize = (long long)(last_size * 1000) + (long long)(size * 1000);
1502 CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", *llsize);
1504 return CONNECTION_ERROR_NONE;
1507 static int __get_statistic(connection_handle_s *conn_handle, connection_type_e connection_type,
1508 connection_statistics_type_e statistics_type, long long *llsize)
1511 unsigned long long ull_size;
1513 if (llsize == NULL) {
1514 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter"); //LCOV_EXCL_LINE
1515 return CONNECTION_ERROR_INVALID_PARAMETER; //LCOV_EXCL_LINE
1518 rv = _connection_libnet_check_get_privilege();
1519 if (rv == CONNECTION_ERROR_PERMISSION_DENIED)
1521 else if (rv != CONNECTION_ERROR_NONE) {
1522 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get statistics"); //LCOV_EXCL_LINE
1523 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1526 if (connection_type == CONNECTION_TYPE_CELLULAR)
1527 return __get_cellular_statistic(statistics_type, llsize);
1528 else if (connection_type == CONNECTION_TYPE_WIFI) {
1529 switch (statistics_type) {
1530 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1531 stat_type = NET_STATISTICS_TYPE_LAST_SENT_DATA;
1533 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1534 stat_type = NET_STATISTICS_TYPE_LAST_RECEIVED_DATA;
1536 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1537 stat_type = NET_STATISTICS_TYPE_TOTAL_SENT_DATA;
1539 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1540 stat_type = NET_STATISTICS_TYPE_TOTAL_RECEIVED_DATA;
1543 return CONNECTION_ERROR_INVALID_PARAMETER;
1546 rv = _connection_libnet_get_statistics(conn_handle, stat_type, &ull_size);
1547 if (rv == CONNECTION_ERROR_PERMISSION_DENIED)
1549 else if (rv != CONNECTION_ERROR_NONE) {
1550 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get Wi-Fi statistics"); //LCOV_EXCL_LINE
1551 *llsize = 0; //LCOV_EXCL_LINE
1552 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1555 CONNECTION_LOG(CONNECTION_INFO, "%lld bytes", ull_size);
1556 *llsize = (long long)ull_size;
1558 return CONNECTION_ERROR_INVALID_PARAMETER;
1560 return CONNECTION_ERROR_NONE;
1563 static int __reset_statistic(connection_handle_s *conn_handle,
1564 connection_type_e connection_type, connection_statistics_type_e statistics_type)
1570 if (connection_type == CONNECTION_TYPE_CELLULAR)
1571 conn_type = NET_DEVICE_CELLULAR;
1572 else if (connection_type == CONNECTION_TYPE_WIFI)
1573 conn_type = NET_DEVICE_WIFI;
1575 return CONNECTION_ERROR_INVALID_PARAMETER;
1577 switch (statistics_type) {
1578 case CONNECTION_STATISTICS_TYPE_LAST_SENT_DATA:
1579 stat_type = NET_STATISTICS_TYPE_LAST_SENT_DATA;
1581 case CONNECTION_STATISTICS_TYPE_LAST_RECEIVED_DATA:
1582 stat_type = NET_STATISTICS_TYPE_LAST_RECEIVED_DATA;
1584 case CONNECTION_STATISTICS_TYPE_TOTAL_SENT_DATA:
1585 stat_type = NET_STATISTICS_TYPE_TOTAL_SENT_DATA;
1587 case CONNECTION_STATISTICS_TYPE_TOTAL_RECEIVED_DATA:
1588 stat_type = NET_STATISTICS_TYPE_TOTAL_RECEIVED_DATA;
1591 return CONNECTION_ERROR_INVALID_PARAMETER;
1594 rv = _connection_libnet_set_statistics(conn_handle, conn_type, stat_type);
1595 if (rv != CONNECTION_ERROR_NONE)
1598 CONNECTION_LOG(CONNECTION_INFO, "connection_reset_statistics success");
1600 return CONNECTION_ERROR_NONE;
1603 EXPORT_API int connection_get_statistics(connection_h connection,
1604 connection_type_e connection_type,
1605 connection_statistics_type_e statistics_type, long long* size)
1609 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
1611 if (connection_type == CONNECTION_TYPE_CELLULAR)
1612 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1613 else if (connection_type == CONNECTION_TYPE_WIFI)
1614 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1616 if (!(__connection_check_handle_validity(connection)) || size == NULL) {
1617 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1619 return CONNECTION_ERROR_INVALID_PARAMETER;
1622 int rv = __get_statistic(connection, connection_type, statistics_type, size);
1623 if (rv != CONNECTION_ERROR_NONE) {
1624 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get statistics [%d]", rv); //LCOV_EXCL_LINE
1626 return rv; //LCOV_EXCL_LINE
1630 return CONNECTION_ERROR_NONE;
1633 EXPORT_API int connection_reset_statistics(connection_h connection,
1634 connection_type_e connection_type,
1635 connection_statistics_type_e statistics_type)
1639 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE);
1641 if (connection_type == CONNECTION_TYPE_CELLULAR)
1642 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE);
1643 else if (connection_type == CONNECTION_TYPE_WIFI)
1644 CHECK_FEATURE_SUPPORTED(WIFI_FEATURE);
1646 if (!__connection_check_handle_validity(connection)) {
1647 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1649 return CONNECTION_ERROR_INVALID_PARAMETER;
1652 int rv = __reset_statistic(connection, connection_type, statistics_type);
1653 if (rv != CONNECTION_ERROR_NONE) {
1654 CONNECTION_LOG(CONNECTION_ERROR, "Fail to get statistics [%d]", rv); //LCOV_EXCL_LINE
1656 return rv; //LCOV_EXCL_LINE
1660 return CONNECTION_ERROR_NONE;
1663 EXPORT_API int connection_foreach_ipv6_address(connection_h connection,
1664 connection_type_e connection_type, connection_ipv6_address_cb callback,
1669 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE,
1670 TETHERING_BLUETOOTH_FEATURE, ETHERNET_FEATURE);
1672 GSList *ipv6_address_list = NULL;
1674 if (!(__connection_check_handle_validity(connection))) {
1675 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1677 return CONNECTION_ERROR_INVALID_PARAMETER;
1680 int rv = CONNECTION_ERROR_NONE;
1682 switch (connection_type) {
1683 case CONNECTION_TYPE_WIFI:
1684 rv = net_foreach_ipv6_address(NET_DEVICE_WIFI,
1685 &ipv6_address_list);
1687 case CONNECTION_TYPE_CELLULAR:
1688 rv = net_foreach_ipv6_address(NET_DEVICE_CELLULAR,
1689 &ipv6_address_list);
1691 case CONNECTION_TYPE_ETHERNET:
1692 rv = net_foreach_ipv6_address(NET_DEVICE_ETHERNET,
1693 &ipv6_address_list);
1695 case CONNECTION_TYPE_BT:
1696 rv = net_foreach_ipv6_address(NET_DEVICE_BLUETOOTH,
1697 &ipv6_address_list);
1700 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1702 return CONNECTION_ERROR_INVALID_PARAMETER;
1705 if (rv != NET_ERR_NONE) {
1706 CONNECTION_LOG(CONNECTION_ERROR, "net_get_multiple_id_address" //LCOV_EXCL_LINE
1707 " Failed = %d\n", rv);
1708 CONN_UNLOCK; //LCOV_EXCL_LINE
1709 return CONNECTION_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
1713 for (list = ipv6_address_list; list; list = list->next) {
1714 rv = callback((char *)list->data, user_data);
1719 g_slist_free_full(ipv6_address_list, g_free);
1720 ipv6_address_list = NULL;
1723 return CONNECTION_ERROR_NONE;
1726 EXPORT_API int connection_profile_start_tcpdump(connection_h connection)
1732 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1734 if (!(__connection_check_handle_validity(connection))) {
1735 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1737 return CONNECTION_ERROR_INVALID_PARAMETER;
1740 ret = _connection_libnet_start_tcpdump(connection);
1741 if (ret != CONNECTION_ERROR_NONE) {
1742 CONNECTION_LOG(CONNECTION_ERROR, "Failed to start tcpdump (%d)", ret); //LCOV_EXCL_LINE
1743 CONN_UNLOCK; //LCOV_EXCL_LINE
1744 return ret; //LCOV_EXCL_LINE
1748 return CONNECTION_ERROR_NONE;
1751 EXPORT_API int connection_profile_stop_tcpdump(connection_h connection)
1757 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1759 if (!(__connection_check_handle_validity(connection))) {
1760 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1762 return CONNECTION_ERROR_INVALID_PARAMETER;
1765 ret = _connection_libnet_stop_tcpdump(connection);
1766 if (ret != CONNECTION_ERROR_NONE) {
1767 CONNECTION_LOG(CONNECTION_ERROR, "Failed to stop tcpdump (%d)", ret); //LCOV_EXCL_LINE
1768 CONN_UNLOCK; //LCOV_EXCL_LINE
1769 return ret; //LCOV_EXCL_LINE
1773 return CONNECTION_ERROR_NONE;
1776 EXPORT_API int connection_profile_get_tcpdump_state(connection_h connection, gboolean *tcpdump_state)
1782 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1784 if (!(__connection_check_handle_validity(connection)) || !tcpdump_state) {
1785 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1787 return CONNECTION_ERROR_INVALID_PARAMETER;
1790 ret = _connection_libnet_get_tcpdump_state(connection, tcpdump_state);
1791 if (ret != CONNECTION_ERROR_NONE) {
1792 CONNECTION_LOG(CONNECTION_ERROR, "Failed to get the tcpdump state (%d)", ret); //LCOV_EXCL_LINE
1793 CONN_UNLOCK; //LCOV_EXCL_LINE
1794 return ret; //LCOV_EXCL_LINE
1798 return CONNECTION_ERROR_NONE;
1801 EXPORT_API int connection_profile_save_ethernet_eap_config(connection_h connection,
1802 connection_profile_h profile)
1806 CHECK_FEATURE_SUPPORTED(TELEPHONY_FEATURE, WIFI_FEATURE, TETHERING_BLUETOOTH_FEATURE);
1810 if (!__connection_check_handle_validity(connection) ||
1811 !_connection_libnet_check_profile_validity(profile)) {
1812 CONNECTION_LOG(CONNECTION_ERROR, "Invalid parameter");
1814 return CONNECTION_ERROR_INVALID_PARAMETER;
1817 rv = _connection_libnet_profile_save_ethernet_eap_config(connection, profile);
1818 if (rv != CONNECTION_ERROR_NONE) {
1819 CONNECTION_LOG(CONNECTION_ERROR, "Failed to save ethernet eap config."); //LCOV_EXCL_LINE
1820 CONN_UNLOCK; //LCOV_EXCL_LINE
1821 return rv; //LCOV_EXCL_LINE
1825 return CONNECTION_ERROR_NONE;