2 * Copyright (c) 2011 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.
20 #include <sys/ioctl.h>
21 #include <sys/socket.h>
22 #include <netinet/in.h>
24 #include <arpa/inet.h>
26 #include <dbus/dbus.h>
29 #include <openssl/evp.h>
30 #include <openssl/sha.h>
31 #include <ckmc/ckmc-manager.h>
32 #include <tzplatform_config.h>
33 #include "tethering_private.h"
35 #define ALLOWED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.accept")
36 #define BLOCKED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.deny")
37 #define TEMP_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/.hostapd_tmp")
38 #define MAC_ADDR_LEN 18
39 #define MAX_BUF_SIZE 80
41 #define IPTABLES "/usr/sbin/iptables"
42 #define TABLE_NAT "nat"
43 #define TETH_NAT_PRE "teth_nat_pre"
44 #define TABLE_FILTER "filter"
45 #define TETH_FILTER_FW "teth_filter_fw"
46 #define ACTION_DROP "DROP"
47 #define ACTION_ACCEPT "ACCEPT"
48 #define PORT_FORWARD_RULE_STR "-t %s -A %s -i %s -p %s -d %s --dport %d -j DNAT --to %s:%d"
49 #define FILTERING_MULTIPORT_RULE_STR "-t %s -A %s -p %s -m multiport --dport %d,%d -j %s"
50 #define FILTERING_RULE_STR "-t %s -A %s -p %s --dport %d -j %s"
52 static GSList *allowed_list = NULL;
53 static GSList *blocked_list = NULL;
54 static GSList *port_forwarding = NULL;
55 static GSList *port_filtering = NULL;
56 static GSList *custom_port_filtering = NULL;
58 static void __handle_wifi_tether_on(GDBusConnection *connection, const gchar *sender_name,
59 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
60 GVariant *parameters, gpointer user_data);
62 static void __handle_wifi_tether_off(GDBusConnection *connection, const gchar *sender_name,
63 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
64 GVariant *parameters, gpointer user_data);
66 static void __handle_usb_tether_on(GDBusConnection *connection, const gchar *sender_name,
67 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
68 GVariant *parameters, gpointer user_data);
70 static void __handle_usb_tether_off(GDBusConnection *connection, const gchar *sender_name,
71 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
72 GVariant *parameters, gpointer user_data);
74 static void __handle_bt_tether_on(GDBusConnection *connection, const gchar *sender_name,
75 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
76 GVariant *parameters, gpointer user_data);
78 static void __handle_bt_tether_off(GDBusConnection *connection, const gchar *sender_name,
79 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
80 GVariant *parameters, gpointer user_data);
82 static void __handle_net_closed(GDBusConnection *connection, const gchar *sender_name,
83 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
84 GVariant *parameters, gpointer user_data);
86 static void __handle_no_data_timeout(GDBusConnection *connection, const gchar *sender_name,
87 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
88 GVariant *parameters, gpointer user_data);
90 static void __handle_low_battery_mode(GDBusConnection *connection, const gchar *sender_name,
91 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
92 GVariant *parameters, gpointer user_data);
94 static void __handle_flight_mode(GDBusConnection *connection, const gchar *sender_name,
95 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
96 GVariant *parameters, gpointer user_data);
98 static void __handle_security_type_changed(GDBusConnection *connection, const gchar *sender_name,
99 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
100 GVariant *parameters, gpointer user_data);
102 static void __handle_ssid_visibility_changed(GDBusConnection *connection, const gchar *sender_name,
103 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
104 GVariant *parameters, gpointer user_data);
106 static void __handle_passphrase_changed(GDBusConnection *connection, const gchar *sender_name,
107 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
108 GVariant *parameters, gpointer user_data);
110 static void __handle_dhcp(GDBusConnection *connection, const gchar *sender_name,
111 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
112 GVariant *parameters, gpointer user_data);
114 static __tethering_sig_t sigs[] = {
115 {0, SIGNAL_NAME_NET_CLOSED, __handle_net_closed},
116 {0, SIGNAL_NAME_WIFI_TETHER_ON, __handle_wifi_tether_on},
117 {0, SIGNAL_NAME_WIFI_TETHER_OFF, __handle_wifi_tether_off},
118 {0, SIGNAL_NAME_USB_TETHER_ON, __handle_usb_tether_on},
119 {0, SIGNAL_NAME_USB_TETHER_OFF, __handle_usb_tether_off},
120 {0, SIGNAL_NAME_BT_TETHER_ON, __handle_bt_tether_on},
121 {0, SIGNAL_NAME_BT_TETHER_OFF, __handle_bt_tether_off},
122 {0, SIGNAL_NAME_NO_DATA_TIMEOUT, __handle_no_data_timeout},
123 {0, SIGNAL_NAME_LOW_BATTERY_MODE, __handle_low_battery_mode},
124 {0, SIGNAL_NAME_FLIGHT_MODE, __handle_flight_mode},
125 {0, SIGNAL_NAME_SECURITY_TYPE_CHANGED, __handle_security_type_changed},
126 {0, SIGNAL_NAME_SSID_VISIBILITY_CHANGED, __handle_ssid_visibility_changed},
127 {0, SIGNAL_NAME_PASSPHRASE_CHANGED, __handle_passphrase_changed},
128 {0, SIGNAL_NAME_DHCP_STATUS, __handle_dhcp} };
130 static int retry = 0;
132 static void __send_dbus_signal(GDBusConnection *conn, const char *signal_name, const char *arg)
134 if (conn == NULL || signal_name == NULL)
135 return; //LCOV_EXCL_LINE
137 GVariant *message = NULL;
138 GError *error = NULL;
141 message = g_variant_new("(s)", arg);
143 g_dbus_connection_emit_signal(conn, NULL, TETHERING_SERVICE_OBJECT_PATH,
144 TETHERING_SERVICE_INTERFACE, signal_name, message, &error);
146 ERR("g_dbus_connection_emit_signal is failed because %s\n", error->message); //LCOV_EXCL_LINE
147 g_error_free(error); //LCOV_EXCL_LINE
149 g_variant_unref(message);
152 static bool __any_tethering_is_enabled(tethering_h tethering)
154 if (tethering_is_enabled(tethering, TETHERING_TYPE_USB) ||
155 tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) ||
156 tethering_is_enabled(tethering, TETHERING_TYPE_BT))
162 static tethering_error_e __set_security_type(const tethering_wifi_security_type_e security_type)
164 if (security_type != TETHERING_WIFI_SECURITY_TYPE_NONE &&
165 security_type != TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK &&
166 security_type != TETHERING_WIFI_SECURITY_TYPE_WPS) {
167 ERR("Invalid param\n");
168 return TETHERING_ERROR_INVALID_PARAMETER;
171 if (vconf_set_int(VCONFKEY_MOBILE_HOTSPOT_SECURITY, security_type) < 0) {
172 ERR("vconf_set_int is failed\n");
173 return TETHERING_ERROR_OPERATION_FAILED;
176 return TETHERING_ERROR_NONE;
179 static tethering_error_e __get_security_type(tethering_wifi_security_type_e *security_type)
181 if (security_type == NULL) {
182 ERR("Invalid param\n");
183 return TETHERING_ERROR_INVALID_PARAMETER;
186 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_SECURITY,
187 (int *)security_type) < 0) {
188 ERR("vconf_get_int is failed\n");
189 return TETHERING_ERROR_OPERATION_FAILED;
192 return TETHERING_ERROR_NONE;
195 static bool __get_ssid_from_vconf(const char *path, char *ssid, unsigned int size)
197 if (path == NULL || ssid == NULL || size == 0)
201 char *ptr_tmp = NULL;
203 ptr = vconf_get_str(path);
207 if (!g_utf8_validate(ptr, -1, (const char **)&ptr_tmp))
210 g_strlcpy(ssid, ptr, size);
216 static tethering_error_e __set_visible(const bool visible)
218 if (vconf_set_int(VCONFKEY_MOBILE_HOTSPOT_HIDE, visible ? 0 : 1) < 0) {
219 ERR("vconf_set_int is failed\n");
220 return TETHERING_ERROR_OPERATION_FAILED;
223 return TETHERING_ERROR_NONE;
226 static tethering_error_e __get_visible(bool *visible)
228 if (visible == NULL) {
229 ERR("Invalid param\n");
230 return TETHERING_ERROR_INVALID_PARAMETER;
235 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_HIDE, &hide) < 0) {
236 ERR("vconf_get_int is failed\n");
237 return TETHERING_ERROR_OPERATION_FAILED;
244 return TETHERING_ERROR_NONE;
247 static unsigned int __generate_initial_passphrase(char *passphrase, unsigned int size)
249 if (passphrase == NULL ||
250 size == 0 || size < TETHERING_WIFI_KEY_MIN_LEN + 1)
253 guint32 rand_int = 0;
256 for (index = 0; index < TETHERING_WIFI_KEY_MIN_LEN; index++) {
257 rand_int = g_random_int_range('a', 'z');
258 passphrase[index] = rand_int;
260 passphrase[index] = '\0';
265 static tethering_error_e __get_error(int agent_error)
267 tethering_error_e err = TETHERING_ERROR_NONE;
269 switch (agent_error) {
270 case MOBILE_AP_ERROR_NONE:
271 err = TETHERING_ERROR_NONE;
275 case MOBILE_AP_ERROR_RESOURCE:
276 err = TETHERING_ERROR_OUT_OF_MEMORY;
280 case MOBILE_AP_ERROR_INTERNAL:
281 err = TETHERING_ERROR_OPERATION_FAILED;
284 case MOBILE_AP_ERROR_INVALID_PARAM:
285 err = TETHERING_ERROR_INVALID_PARAMETER;
288 case MOBILE_AP_ERROR_ALREADY_ENABLED:
289 err = TETHERING_ERROR_OPERATION_FAILED;
292 case MOBILE_AP_ERROR_NOT_ENABLED:
293 err = TETHERING_ERROR_NOT_ENABLED;
296 case MOBILE_AP_ERROR_NET_OPEN:
297 err = TETHERING_ERROR_OPERATION_FAILED;
300 case MOBILE_AP_ERROR_NET_CLOSE:
301 err = TETHERING_ERROR_OPERATION_FAILED;
304 case MOBILE_AP_ERROR_DHCP:
305 err = TETHERING_ERROR_OPERATION_FAILED;
308 case MOBILE_AP_ERROR_IN_PROGRESS:
309 err = TETHERING_ERROR_OPERATION_FAILED;
313 case MOBILE_AP_ERROR_NOT_PERMITTED:
314 err = TETHERING_ERROR_NOT_PERMITTED;
317 case MOBILE_AP_ERROR_PERMISSION_DENIED:
318 err = TETHERING_ERROR_PERMISSION_DENIED;
322 ERR("Not defined error : %d\n", agent_error);
323 err = TETHERING_ERROR_OPERATION_FAILED;
331 static void __handle_dhcp(GDBusConnection *connection, const gchar *sender_name,
332 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
333 GVariant *parameters, gpointer user_data)
337 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
339 __tethering_h *th = (__tethering_h *)user_data;
341 tethering_type_e type = 0;
342 mobile_ap_type_e ap_type = 0;
343 tethering_connection_state_changed_cb ccb = NULL;
344 __tethering_client_h client;
352 memset(&client, 0, sizeof(__tethering_client_h));
353 g_variant_get(parameters, "(susssu)", &buf, &ap_type, &ip, &mac, &name, ×tamp);
355 if (!g_strcmp0(buf, "DhcpConnected")) {
357 } else if (!g_strcmp0(buf, "DhcpLeaseDeleted")) {
360 ERR("Unknown event [%s]\n", buf);
364 if (ap_type == MOBILE_AP_TYPE_USB)
365 type = TETHERING_TYPE_USB;
366 else if (ap_type == MOBILE_AP_TYPE_WIFI)
367 type = TETHERING_TYPE_WIFI;
368 else if (ap_type == MOBILE_AP_TYPE_BT)
369 type = TETHERING_TYPE_BT;
371 ERR("Not supported tethering type [%d]\n", ap_type);
375 ccb = th->changed_cb[type];
378 data = th->changed_user_data[type];
380 client.interface = type;
381 g_strlcpy(client.ip, ip, sizeof(client.ip));
382 g_strlcpy(client.mac, mac, sizeof(client.mac));
384 client.hostname = g_strdup(name);
385 client.tm = (time_t)timestamp;
387 ccb((tethering_client_h)&client, opened, data);
388 g_free(client.hostname);
399 static void __handle_net_closed(GDBusConnection *connection, const gchar *sender_name,
400 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
401 GVariant *parameters, gpointer user_data)
405 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
407 __tethering_h *th = (__tethering_h *)user_data;
408 tethering_type_e type = 0;
409 tethering_disabled_cb dcb = NULL;
411 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_NETWORK_CLOSE;
413 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
414 dcb = th->disabled_cb[type];
417 data = th->disabled_user_data[type];
419 dcb(TETHERING_ERROR_NONE, type, code, data);
426 static void __handle_wifi_tether_on(GDBusConnection *connection, const gchar *sender_name,
427 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
428 GVariant *parameters, gpointer user_data)
432 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
434 __tethering_h *th = (__tethering_h *)user_data;
435 tethering_type_e type = TETHERING_TYPE_WIFI;
436 bool is_requested = false;
437 tethering_enabled_cb ecb = NULL;
440 ecb = th->enabled_cb[type];
443 data = th->enabled_user_data[type];
445 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
449 static void __handle_wifi_tether_off(GDBusConnection *connection, const gchar *sender_name,
450 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
451 GVariant *parameters, gpointer user_data)
455 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
457 __tethering_h *th = (__tethering_h *)user_data;
458 tethering_type_e type = TETHERING_TYPE_WIFI;
459 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
460 tethering_disabled_cb dcb = NULL;
464 dcb = th->disabled_cb[type];
467 data = th->disabled_user_data[type];
468 g_variant_get(parameters, "(s)", &buf);
469 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
470 code = TETHERING_DISABLED_BY_WIFI_ON;
471 else if (!g_strcmp0(buf, SIGNAL_MSG_TIMEOUT))
472 code = TETHERING_DISABLED_BY_TIMEOUT;
475 dcb(TETHERING_ERROR_NONE, type, code, data);
481 static void __handle_usb_tether_on(GDBusConnection *connection, const gchar *sender_name,
482 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
483 GVariant *parameters, gpointer user_data)
487 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
489 __tethering_h *th = (__tethering_h *)user_data;
490 tethering_type_e type = TETHERING_TYPE_USB;
491 bool is_requested = false;
492 tethering_enabled_cb ecb = NULL;
495 ecb = th->enabled_cb[type];
498 data = th->enabled_user_data[type];
500 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
504 static void __handle_usb_tether_off(GDBusConnection *connection, const gchar *sender_name,
505 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
506 GVariant *parameters, gpointer user_data)
510 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
512 __tethering_h *th = (__tethering_h *)user_data;
513 tethering_type_e type = TETHERING_TYPE_USB;
514 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
515 tethering_disabled_cb dcb = NULL;
519 dcb = th->disabled_cb[type];
522 data = th->disabled_user_data[type];
524 g_variant_get(parameters, "(s)", &buf);
525 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
526 code = TETHERING_DISABLED_BY_USB_DISCONNECTION;
528 dcb(TETHERING_ERROR_NONE, type, code, data);
534 static void __handle_bt_tether_on(GDBusConnection *connection, const gchar *sender_name,
535 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
536 GVariant *parameters, gpointer user_data)
540 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
542 __tethering_h *th = (__tethering_h *)user_data;
543 tethering_type_e type = TETHERING_TYPE_BT;
544 bool is_requested = false;
545 tethering_enabled_cb ecb = NULL;
548 ecb = th->enabled_cb[type];
551 data = th->enabled_user_data[type];
553 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
557 static void __handle_bt_tether_off(GDBusConnection *connection, const gchar *sender_name,
558 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
559 GVariant *parameters, gpointer user_data)
563 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
565 __tethering_h *th = (__tethering_h *)user_data;
566 tethering_type_e type = TETHERING_TYPE_BT;
567 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
568 tethering_disabled_cb dcb = NULL;
572 dcb = th->disabled_cb[type];
575 data = th->disabled_user_data[type];
576 g_variant_get(parameters, "(s)", &buf);
577 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
578 code = TETHERING_DISABLED_BY_BT_OFF;
579 else if (!g_strcmp0(buf, SIGNAL_MSG_TIMEOUT))
580 code = TETHERING_DISABLED_BY_TIMEOUT;
582 dcb(TETHERING_ERROR_NONE, type, code, data);
589 static void __handle_no_data_timeout(GDBusConnection *connection, const gchar *sender_name,
590 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
591 GVariant *parameters, gpointer user_data)
595 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
597 __tethering_h *th = (__tethering_h *)user_data;
598 tethering_type_e type = 0;
599 tethering_disabled_cb dcb = NULL;
601 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_TIMEOUT;
603 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
604 dcb = th->disabled_cb[type];
607 data = th->disabled_user_data[type];
609 dcb(TETHERING_ERROR_NONE, type, code, data);
614 static void __handle_low_battery_mode(GDBusConnection *connection, const gchar *sender_name,
615 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
616 GVariant *parameters, gpointer user_data)
620 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
622 __tethering_h *th = (__tethering_h *)user_data;
623 tethering_type_e type = 0;
624 tethering_disabled_cb dcb = NULL;
626 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_LOW_BATTERY;
628 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
629 dcb = th->disabled_cb[type];
632 data = th->disabled_user_data[type];
634 dcb(TETHERING_ERROR_NONE, type, code, data);
639 static void __handle_flight_mode(GDBusConnection *connection, const gchar *sender_name,
640 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
641 GVariant *parameters, gpointer user_data)
645 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
647 __tethering_h *th = (__tethering_h *)user_data;
648 tethering_type_e type = 0;
649 tethering_disabled_cb dcb = NULL;
651 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_FLIGHT_MODE;
653 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
654 dcb = th->disabled_cb[type];
657 data = th->disabled_user_data[type];
659 dcb(TETHERING_ERROR_NONE, type, code, data);
665 static void __handle_security_type_changed(GDBusConnection *connection, const gchar *sender_name,
666 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
667 GVariant *parameters, gpointer user_data)
672 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
673 __tethering_h *th = (__tethering_h *)user_data;
675 tethering_wifi_security_type_changed_cb scb = NULL;
677 tethering_wifi_security_type_e security_type;
680 scb = th->security_type_changed_cb;
684 g_variant_get(parameters, "(s)", &buf);
685 data = th->security_type_user_data;
686 if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_OPEN_STR) == 0)
687 security_type = TETHERING_WIFI_SECURITY_TYPE_NONE;
688 else if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR) == 0)
689 security_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
690 else if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_WPS_STR) == 0)
691 security_type = TETHERING_WIFI_SECURITY_TYPE_WPS;
693 SERR("Unknown type : %s\n", buf);
698 scb(security_type, data);
703 static void __handle_ssid_visibility_changed(GDBusConnection *connection, const gchar *sender_name,
704 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
705 GVariant *parameters, gpointer user_data)
709 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
710 __tethering_h *th = (__tethering_h *)user_data;
712 tethering_wifi_ssid_visibility_changed_cb scb = NULL;
714 bool visible = false;
717 scb = th->ssid_visibility_changed_cb;
722 g_variant_get(parameters, "(s)", &buf);
723 data = th->ssid_visibility_user_data;
724 if (g_strcmp0(buf, SIGNAL_MSG_SSID_VISIBLE) == 0)
732 static void __handle_passphrase_changed(GDBusConnection *connection, const gchar *sender_name,
733 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
734 GVariant *parameters, gpointer user_data)
738 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
739 __tethering_h *th = (__tethering_h *)user_data;
741 tethering_wifi_passphrase_changed_cb pcb = NULL;
744 pcb = th->passphrase_changed_cb;
748 data = th->passphrase_user_data;
754 static void __wifi_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
759 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
760 GError *g_error = NULL;
763 tethering_error_e error;
764 __tethering_h *th = (__tethering_h *)user_data;
765 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_WIFI];
766 void *data = th->enabled_user_data[TETHERING_TYPE_WIFI];
768 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
771 ERR("DBus error [%s]\n", g_error->message);
772 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
773 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
774 g_error_free(g_error);
775 tethering_enable((tethering_h)th, TETHERING_TYPE_WIFI);
777 } else if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
778 error = TETHERING_ERROR_PERMISSION_DENIED;
780 error = TETHERING_ERROR_OPERATION_FAILED;
781 g_error_free(g_error);
784 g_variant_get(g_var, "(u)", &info);
785 error = __get_error(info);
789 INFO("cfm event : wifi tethering enable info : %d\n", error);
791 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
792 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_ON].name,
793 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
794 sigs[E_SIGNAL_WIFI_TETHER_ON].cb, (gpointer)th, NULL);
800 ecb(error, TETHERING_TYPE_WIFI, true, data);
801 g_variant_unref(g_var);
805 static void __bt_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
809 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
810 GError *g_error = NULL;
813 tethering_error_e error;
815 __tethering_h *th = (__tethering_h *)user_data;
816 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_BT];
817 void *data = th->enabled_user_data[TETHERING_TYPE_BT];
819 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
822 ERR("DBus error [%s]\n", g_error->message);
823 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
824 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
825 g_error_free(g_error);
826 tethering_enable((tethering_h)th, TETHERING_TYPE_BT);
830 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
831 error = TETHERING_ERROR_PERMISSION_DENIED;
833 error = TETHERING_ERROR_OPERATION_FAILED;
834 g_error_free(g_error);
837 g_variant_get(g_var, "(u)", &info);
838 g_variant_unref(g_var);
839 error = __get_error(info);
843 sigs[E_SIGNAL_BT_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
844 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_ON].name,
845 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
846 sigs[E_SIGNAL_BT_TETHER_ON].cb, (gpointer)th, NULL);
853 ecb(error, TETHERING_TYPE_BT, true, data);
858 static void __usb_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
863 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
864 __tethering_h *th = (__tethering_h *)user_data;
865 GError *g_error = NULL;
868 tethering_error_e error;
869 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_USB];
870 void *data = th->enabled_user_data[TETHERING_TYPE_USB];
872 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
874 ERR("DBus error [%s]\n", g_error->message);
875 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
876 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
877 g_error_free(g_error);
878 tethering_enable((tethering_h)th, TETHERING_TYPE_USB);
882 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
883 error = TETHERING_ERROR_PERMISSION_DENIED;
885 error = TETHERING_ERROR_OPERATION_FAILED;
886 g_error_free(g_error);
888 g_variant_get(g_var, "(u)", &info);
889 g_variant_unref(g_var);
890 error = __get_error(info);
894 sigs[E_SIGNAL_USB_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
895 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_ON].name,
896 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
897 sigs[E_SIGNAL_USB_TETHER_ON].cb, (gpointer)th, NULL);
904 ecb(error, TETHERING_TYPE_USB, true, data);
909 static void __p2p_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
914 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
915 __tethering_h *th = (__tethering_h *)user_data;
916 GError *g_error = NULL;
919 tethering_error_e error;
920 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_P2P];
921 void *data = th->enabled_user_data[TETHERING_TYPE_P2P];
923 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
925 ERR("DBus error [%s]\n", g_error->message);
926 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
927 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
928 g_error_free(g_error);
929 tethering_enable((tethering_h)th, TETHERING_TYPE_P2P);
933 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
934 error = TETHERING_ERROR_PERMISSION_DENIED;
936 error = TETHERING_ERROR_OPERATION_FAILED;
937 g_error_free(g_error);
939 g_variant_get(g_var, "(u)", &info);
940 g_variant_unref(g_var);
941 error = __get_error(info);
950 ecb(error, TETHERING_TYPE_P2P, true, data);
954 static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
959 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
960 GError *g_error = NULL;
962 guint info, event_type;
963 tethering_error_e error;
964 tethering_type_e type;
965 tethering_h tethering = (tethering_h)user_data;
966 __tethering_h *th = (__tethering_h *)tethering;
967 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_REQUEST;
968 tethering_disabled_cb dcb = NULL;
971 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
974 ERR("DBus error [%s]\n", g_error->message);
975 g_error_free(g_error);
979 g_variant_get(g_var, "(uu)", &event_type, &info);
980 INFO("cfm event : %d info : %d\n", event_type, info);
981 g_variant_unref(g_var);
982 error = __get_error(info);
983 INFO("cfm event : %d info : %d\n", event_type, error);
984 switch (event_type) {
985 case MOBILE_AP_DISABLE_WIFI_TETHERING_CFM:
986 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
987 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
988 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
989 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
991 type = TETHERING_TYPE_WIFI;
992 dcb = th->disabled_cb[type];
993 data = th->disabled_user_data[type];
995 dcb(error, type, code, data);
998 case MOBILE_AP_DISABLE_BT_TETHERING_CFM:
999 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1000 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1001 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1002 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1004 type = TETHERING_TYPE_BT;
1005 dcb = th->disabled_cb[type];
1006 data = th->disabled_user_data[type];
1008 dcb(error, type, code, data);
1012 case MOBILE_AP_DISABLE_USB_TETHERING_CFM:
1013 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1014 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1015 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1016 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1018 type = TETHERING_TYPE_USB;
1019 dcb = th->disabled_cb[type];
1020 data = th->disabled_user_data[type];
1022 dcb(error, type, code, data);
1026 case MOBILE_AP_DISABLE_P2P_TETHERING_CFM:
1027 type = TETHERING_TYPE_P2P;
1028 dcb = th->disabled_cb[type];
1029 data = th->disabled_user_data[type];
1031 dcb(error, type, code, data);
1034 case MOBILE_AP_DISABLE_CFM:
1036 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1037 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
1038 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1039 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
1040 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1041 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1042 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1043 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1044 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1045 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1046 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1047 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1049 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
1050 dcb = th->disabled_cb[type];
1053 data = th->disabled_user_data[type];
1055 dcb(error, type, code, data);
1060 ERR("Invalid event\n");
1066 static void __get_data_usage_cb(GObject *source_object, GAsyncResult *res,
1071 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1073 GError *g_error = NULL;
1076 guint64 tx_bytes, rx_bytes;
1077 __tethering_h *th = (__tethering_h *)user_data;
1078 tethering_error_e tethering_error = TETHERING_ERROR_NONE;
1081 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1084 ERR("DBus fail [%s]\n", g_error->message);
1085 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1086 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1088 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1093 if (th->data_usage_cb == NULL) {
1094 ERR("There is no data_usage_cb\n");
1098 th->data_usage_cb(tethering_error, 0LL, 0LL, th->data_usage_user_data);
1100 g_variant_get(g_var, "(utt)", &event_type, &tx_bytes, &rx_bytes);
1101 th->data_usage_cb(TETHERING_ERROR_NONE,
1102 rx_bytes, tx_bytes, th->data_usage_user_data);
1103 g_variant_unref(g_var);
1105 th->data_usage_cb = NULL;
1106 th->data_usage_user_data = NULL;
1111 static void __settings_reloaded_cb(GObject *source_object, GAsyncResult *res,
1116 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1117 GError *g_error = NULL;
1120 __tethering_h *th = (__tethering_h *)user_data;
1121 tethering_error_e tethering_error;
1123 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1125 ERR("DBus fail [%s]\n", g_error->message);
1126 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1127 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1129 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1130 g_error_free(g_error);
1132 if (th->settings_reloaded_cb == NULL) {
1133 DBG("There is no settings_reloaded_cb\n-\n");
1136 g_variant_get(g_var, "(u)", &info);
1137 tethering_error = __get_error(info);
1138 g_variant_unref(g_var);
1140 th->settings_reloaded_cb(tethering_error,
1141 th->settings_reloaded_user_data);
1143 th->settings_reloaded_cb = NULL;
1144 th->settings_reloaded_user_data = NULL;
1148 static void __connect_signals(tethering_h tethering)
1151 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1153 __tethering_h *th = (__tethering_h *)tethering;
1154 GDBusConnection *connection = th->client_bus;
1157 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++) {
1158 sigs[i].sig_id = g_dbus_connection_signal_subscribe(connection,
1159 NULL, TETHERING_SERVICE_INTERFACE, sigs[i].name,
1160 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1161 sigs[i].cb, tethering, NULL);
1166 static void __disconnect_signals(tethering_h tethering)
1170 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1172 __tethering_h *th = (__tethering_h *)tethering;
1173 GDBusConnection *connection = th->client_bus;
1177 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++)
1178 g_dbus_connection_signal_unsubscribe(connection, sigs[i].sig_id);
1184 static bool __get_intf_name(tethering_type_e type, char *buf, unsigned int len)
1186 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1190 case TETHERING_TYPE_USB:
1191 g_strlcpy(buf, TETHERING_USB_IF, len);
1194 case TETHERING_TYPE_WIFI:
1195 g_strlcpy(buf, TETHERING_WIFI_IF, len);
1198 case TETHERING_TYPE_BT:
1199 g_strlcpy(buf, TETHERING_BT_IF, len);
1203 ERR("Not supported type : %d\n", type);
1209 static bool __get_gateway_addr(tethering_type_e type, char *buf, unsigned int len)
1211 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1214 case TETHERING_TYPE_USB:
1215 g_strlcpy(buf, TETHERING_USB_GATEWAY, len);
1218 case TETHERING_TYPE_WIFI:
1219 g_strlcpy(buf, TETHERING_WIFI_GATEWAY, len);
1222 case TETHERING_TYPE_BT:
1223 g_strlcpy(buf, TETHERING_BT_GATEWAY, len);
1227 ERR("Not supported type : %d\n", type);
1233 static int __get_common_ssid(char *ssid, unsigned int size)
1236 ERR("ssid is null\n"); //LCOV_EXCL_LINE
1237 return TETHERING_ERROR_INVALID_PARAMETER;
1241 char *ptr_tmp = NULL;
1243 ptr = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1245 ERR("vconf_get_str is failed and set default ssid");
1246 g_strlcpy(ssid, TETHERING_DEFAULT_SSID, size);
1248 g_strlcpy(ssid, ptr, size);
1252 if (!g_utf8_validate(ssid, -1, (const char **)&ptr_tmp))
1255 return TETHERING_ERROR_NONE;
1258 static bool __get_wifi_mode_type(tethering_wifi_mode_type_e type, char **buf)
1260 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1263 case TETHERING_WIFI_MODE_TYPE_B:
1264 *buf = g_strdup("b");
1266 case TETHERING_WIFI_MODE_TYPE_G:
1267 *buf = g_strdup("g");
1269 case TETHERING_WIFI_MODE_TYPE_A:
1270 *buf = g_strdup("a");
1272 case TETHERING_WIFI_MODE_TYPE_AD:
1273 *buf = g_strdup("ad");
1276 ERR("Not supported type : %d\n", type);
1282 static int __prepare_wifi_settings(tethering_h tethering, _softap_settings_t *set)
1286 __tethering_h *th = (__tethering_h *)tethering;
1287 tethering_error_e ret = TETHERING_ERROR_NONE;
1290 if (th == NULL || set == NULL) {
1291 ERR("null parameter\n-\n");
1292 return TETHERING_ERROR_INVALID_PARAMETER;
1295 if (th->ssid == NULL)
1296 __get_common_ssid(set->ssid, sizeof(set->ssid));
1298 g_strlcpy(set->ssid, th->ssid, sizeof(set->ssid));
1300 ret = __get_security_type(&set->sec_type);
1301 if (ret != TETHERING_ERROR_NONE)
1302 set->sec_type = th->sec_type;
1304 ret = __get_visible(&set->visibility);
1305 if (ret != TETHERING_ERROR_NONE)
1306 set->visibility = th->visibility;
1308 set->mac_filter = th->mac_filter;
1309 set->max_connected = th->wifi_max_connected;
1310 set->channel = th->channel;
1312 __get_wifi_mode_type(th->mode_type, &ptr);
1314 g_strlcpy(set->mode, "", sizeof(set->mode));
1316 g_strlcpy(set->mode, ptr, sizeof(set->mode));
1320 if (set->sec_type == TETHERING_WIFI_SECURITY_TYPE_NONE) {
1321 g_strlcpy(set->key, "", sizeof(set->key));
1323 GDBusProxy *proxy = th->client_bus_proxy;
1324 GVariant *parameters;
1325 GError *error = NULL;
1326 char *passphrase = NULL;
1327 unsigned int len = 0;
1329 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
1330 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1334 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
1336 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
1337 ret = TETHERING_ERROR_PERMISSION_DENIED;
1339 ret = TETHERING_ERROR_OPERATION_FAILED;
1341 g_error_free(error);
1346 if (parameters != NULL) {
1347 g_variant_get(parameters, "(siu)", &passphrase, &len, &ret);
1348 g_variant_unref(parameters);
1351 g_strlcpy(set->key, passphrase, sizeof(set->key));
1354 INFO("ssid: %s security: %d mode: %s channel: %d visibility: %s\n",
1355 set->ssid, set->sec_type, set->mode, set->channel,
1356 (set->visibility) ? "true" : "false");
1358 return TETHERING_ERROR_NONE;
1361 static bool __check_precondition(tethering_type_e type)
1364 int cellular_state = 0;
1367 /* data network through cellular */
1368 vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &cellular_state);
1369 if (cellular_state == VCONFKEY_NETWORK_CELLULAR_ON) {
1370 INFO("Data Network can be connected later");
1375 /* data network through ethernet */
1376 vconf_get_int(VCONFKEY_NETWORK_STATUS, &dnet_state);
1377 if (dnet_state == VCONFKEY_NETWORK_ETHERNET) {
1378 INFO("Data Network is connected");
1382 vconf_get_int(VCONFKEY_DNET_STATE, &dnet_state);
1383 if (dnet_state > VCONFKEY_DNET_OFF) {
1384 INFO("Data Network is connected");
1387 #endif/*TIZEN_TV_EXT*/
1389 /* data network through wifi */
1390 if (type != TETHERING_TYPE_WIFI) {
1391 vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
1392 if (wifi_state > VCONFKEY_WIFI_UNCONNECTED) {
1393 INFO("Wi-Fi is connected!");
1398 ERR("Network is not available!");
1404 * @brief Creates the handle of tethering.
1406 * @privlevel platform
1407 * @privilege http://tizen.org/privilege/tethering.admin
1408 * @remarks The @a tethering must be released tethering_destroy() by you.
1409 * @param[out] tethering A handle of a new mobile ap handle on success
1410 * @return 0 on success, otherwise a negative error value.
1411 * @retval #TETHERING_ERROR_NONE Successful
1412 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1413 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1414 * @retval #TETHERING_ERROR_NOT_SUPPORT_API API is not supported
1415 * @see tethering_destroy()
1417 API int tethering_create(tethering_h *tethering)
1419 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1420 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1421 "parameter(tethering) is NULL\n");
1424 __tethering_h *th = NULL;
1425 GError *error = NULL;
1426 char ssid[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
1428 th = (__tethering_h *)malloc(sizeof(__tethering_h));
1430 _retvm_if(th == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
1431 "malloc is failed\n");
1432 memset(th, 0x00, sizeof(__tethering_h));
1433 th->sec_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
1434 th->visibility = true;
1435 th->mac_filter = false;
1437 th->mode_type = TETHERING_WIFI_MODE_TYPE_G;
1438 th->wifi_max_connected = TETHERING_WIFI_MAX_STA;
1440 if (__generate_initial_passphrase(th->passphrase,
1441 sizeof(th->passphrase)) == 0) {
1442 ERR("random passphrase generation failed\n"); //LCOV_EXCL_LINE
1444 return TETHERING_ERROR_OPERATION_FAILED;
1447 if (__get_common_ssid(ssid, sizeof(ssid)) != TETHERING_ERROR_NONE) {
1448 ERR("common ssid get failed\n"); //LCOV_EXCL_LINE
1450 return TETHERING_ERROR_OPERATION_FAILED;
1453 #if !GLIB_CHECK_VERSION(2, 36, 0)
1456 GCancellable *cancellable = g_cancellable_new();
1457 th->client_bus = g_bus_get_sync(DBUS_BUS_SYSTEM, cancellable, &error);
1460 ERR("Couldn't connect to the System bus[%s]", error->message);
1461 g_error_free(error);
1462 g_cancellable_cancel(cancellable);
1463 g_object_unref(cancellable);
1465 return TETHERING_ERROR_OPERATION_FAILED;
1468 th->cancellable = cancellable;
1470 th->client_bus_proxy = g_dbus_proxy_new_sync(th->client_bus, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION,
1471 NULL, TETHERING_SERVICE_NAME, TETHERING_SERVICE_OBJECT_PATH,
1472 TETHERING_SERVICE_INTERFACE, th->cancellable, &error);
1473 if (!th->client_bus_proxy) {
1476 ERR("Couldn't create the proxy object because of %s\n", error->message);
1477 g_cancellable_cancel(th->cancellable);
1478 g_object_unref(th->cancellable);
1479 g_object_unref(th->client_bus);
1481 return TETHERING_ERROR_OPERATION_FAILED;
1485 __connect_signals((tethering_h)th);
1487 *tethering = (tethering_h)th;
1488 INFO("Tethering Handle : 0x%X\n", th);
1490 return TETHERING_ERROR_NONE;
1495 * @brief Destroys the handle of tethering.
1497 * @privlevel platform
1498 * @privilege http://tizen.org/privilege/tethering.admin
1499 * @param[in] tethering The handle of tethering
1500 * @return 0 on success, otherwise a negative error value.
1501 * @retval #TETHERING_ERROR_NONE Successful
1502 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1503 * @see tethering_create()
1505 API int tethering_destroy(tethering_h tethering)
1508 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1509 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1510 "parameter(tethering) is NULL\n");
1512 __tethering_h *th = (__tethering_h *)tethering;
1514 INFO("Tethering Handle : 0x%X\n", th);
1516 __disconnect_signals(tethering);
1521 g_object_unref(th->cancellable);
1522 g_object_unref(th->client_bus_proxy);
1523 g_object_unref(th->client_bus);
1524 memset(th, 0x00, sizeof(__tethering_h));
1528 return TETHERING_ERROR_NONE;
1533 * @brief Enables the tethering, asynchronously.
1535 * @privlevel platform
1536 * @privilege http://tizen.org/privilege/tethering.admin
1537 * @param[in] tethering The handle of tethering
1538 * @param[in] type The type of tethering
1539 * @return 0 on success, otherwise negative error value.
1540 * @retval #TETHERING_ERROR_NONE Successful
1541 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1542 * @post tethering_enabled_cb() will be invoked.
1543 * @see tethering_is_enabled()
1544 * @see tethering_disable()
1546 API int tethering_enable(tethering_h tethering, tethering_type_e type)
1548 INFO("+ type : %d\n", type);
1549 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1550 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1551 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1552 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1554 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1555 "parameter(tethering) is NULL\n");
1557 tethering_error_e ret = TETHERING_ERROR_NONE;
1558 __tethering_h *th = (__tethering_h *)tethering;
1559 GDBusProxy *proxy = th->client_bus_proxy;
1560 GDBusConnection *connection = th->client_bus;
1562 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1564 if (__check_precondition(type) == FALSE) {
1567 return TETHERING_ERROR_OPERATION_FAILED;
1573 case TETHERING_TYPE_USB:
1574 g_dbus_connection_signal_unsubscribe(connection,
1575 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1577 g_dbus_proxy_call(proxy, "enable_usb_tethering", NULL,
1578 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1579 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1583 case TETHERING_TYPE_WIFI: {
1584 _softap_settings_t set = {"", "", "", 0, false};
1586 ret = __prepare_wifi_settings(tethering, &set);
1587 if (ret != TETHERING_ERROR_NONE) {
1588 ERR("softap settings initialization failed\n");
1590 return TETHERING_ERROR_OPERATION_FAILED;
1592 g_dbus_connection_signal_unsubscribe(connection,
1593 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1595 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1596 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type, TETHERING_ADDRESS_FAMILY_IPV4),
1597 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1598 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1602 case TETHERING_TYPE_BT:
1603 g_dbus_connection_signal_unsubscribe(connection,
1604 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1606 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1607 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1608 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1609 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1613 case TETHERING_TYPE_P2P: {
1614 _softap_settings_t p2p_set = {"", "", "", 0, false};
1615 ret = __prepare_wifi_settings(tethering, &p2p_set);
1616 if (ret != TETHERING_ERROR_NONE) {
1617 ERR("p2p settings initialization failed\n");
1619 return TETHERING_ERROR_OPERATION_FAILED;
1622 g_dbus_proxy_call(proxy, "enable_p2p_tethering",
1623 g_variant_new("(ssi)", p2p_set.ssid, p2p_set.key, p2p_set.channel),
1624 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1625 (GAsyncReadyCallback) __p2p_enabled_cfm_cb, (gpointer)tethering);
1629 case TETHERING_TYPE_ALL: {
1630 _softap_settings_t set = {"", "", "", 0, false};
1632 ret = __prepare_wifi_settings(tethering, &set);
1633 if (ret != TETHERING_ERROR_NONE) {
1634 ERR("softap settings initialization failed\n");
1635 return TETHERING_ERROR_OPERATION_FAILED;
1638 /* TETHERING_TYPE_USB */
1639 g_dbus_connection_signal_unsubscribe(connection,
1640 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1642 g_dbus_proxy_call(proxy, "enable_usb_tethering", NULL,
1643 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1644 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1646 /* TETHERING_TYPE_WIFI */
1647 g_dbus_connection_signal_unsubscribe(connection,
1648 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1650 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1651 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode,
1652 set.channel, set.visibility, set.mac_filter, set.max_connected,
1653 set.sec_type, TETHERING_ADDRESS_FAMILY_IPV4),
1654 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1655 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1657 /* TETHERING_TYPE_BT */
1658 g_dbus_connection_signal_unsubscribe(connection,
1659 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1661 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1662 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1663 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1664 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1669 ERR("Unknown type : %d\n", type);
1671 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1674 return TETHERING_ERROR_INVALID_PARAMETER;
1677 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1679 return TETHERING_ERROR_NONE;
1682 API int tethering_ipv6_enable(tethering_h tethering, tethering_type_e type)
1684 DBG("+ type : %d\n", type);
1685 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1686 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1687 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1688 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1690 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1691 "parameter(tethering) is NULL\n");
1693 __tethering_h *th = (__tethering_h *)tethering;
1694 GDBusProxy *proxy = th->client_bus_proxy;
1695 GDBusConnection *connection = th->client_bus;
1698 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1700 if (__check_precondition(type) == FALSE) {
1703 return TETHERING_ERROR_OPERATION_FAILED;
1709 case TETHERING_TYPE_WIFI: {
1710 _softap_settings_t set = {"", "", "", 0, false, false, 0, 0};
1712 ret = __prepare_wifi_settings(tethering, &set);
1713 if (ret != TETHERING_ERROR_NONE) {
1714 ERR("softap settings initialization failed\n");
1716 return TETHERING_ERROR_OPERATION_FAILED;
1718 g_dbus_connection_signal_unsubscribe(connection,
1719 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1720 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1721 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type, TETHERING_ADDRESS_FAMILY_IPV6),
1722 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1723 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1726 case TETHERING_TYPE_BT: {
1727 g_dbus_connection_signal_unsubscribe(connection,
1728 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1731 g_dbus_proxy_call(proxy, "enable_bt_tethering", g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1732 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1733 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1739 ERR("Unknown type : %d\n", type);
1741 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1744 return TETHERING_ERROR_INVALID_PARAMETER;
1748 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1750 return TETHERING_ERROR_NONE;
1753 API int tethering_ipv6_disable(tethering_h tethering, tethering_type_e type)
1755 DBG("+ type : %d\n", type);
1756 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1757 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1758 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1759 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1761 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1762 "parameter(tethering) is NULL\n");
1764 __tethering_h *th = (__tethering_h *)tethering;
1765 GDBusProxy *proxy = th->client_bus_proxy;
1766 GDBusConnection *connection = th->client_bus;
1769 case TETHERING_TYPE_WIFI:
1770 DBG("Disable wifi tethering..");
1771 g_dbus_connection_signal_unsubscribe(connection,
1772 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1774 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1775 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1776 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1777 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1779 case TETHERING_TYPE_BT:
1780 g_dbus_connection_signal_unsubscribe(connection,
1781 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1783 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1784 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1785 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1786 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1790 ERR("Not supported tethering type [%d]\n", type);
1792 return TETHERING_ERROR_INVALID_PARAMETER;
1795 return TETHERING_ERROR_NONE;
1799 * @brief Disables the tethering, asynchronously.
1801 * @privlevel platform
1802 * @privilege http://tizen.org/privilege/tethering.admin
1803 * @param[in] tethering The handle of tethering
1804 * @param[in] type The type of tethering
1805 * @return 0 on success, otherwise negative error value.
1806 * @retval #TETHERING_ERROR_NONE Successful
1807 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1808 * @post tethering_disabled_cb() will be invoked.
1809 * @see tethering_is_enabled()
1810 * @see tethering_enable()
1812 API int tethering_disable(tethering_h tethering, tethering_type_e type)
1814 INFO("+ type : %d\n", type);
1815 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1816 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1817 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1818 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1820 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1821 "parameter(tethering) is NULL\n");
1823 __tethering_h *th = (__tethering_h *)tethering;
1824 GDBusProxy *proxy = th->client_bus_proxy;
1825 GDBusConnection *connection = th->client_bus;
1828 case TETHERING_TYPE_USB:
1829 g_dbus_connection_signal_unsubscribe(connection,
1830 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1832 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1833 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1834 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1838 case TETHERING_TYPE_WIFI:
1840 g_dbus_connection_signal_unsubscribe(connection,
1841 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1843 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1844 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1845 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1846 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1849 case TETHERING_TYPE_BT:
1851 g_dbus_connection_signal_unsubscribe(connection,
1852 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1854 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1855 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1856 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1857 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1860 case TETHERING_TYPE_P2P:
1861 g_dbus_proxy_call(proxy, "disable_p2p_tethering",
1862 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1863 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1866 case TETHERING_TYPE_ALL:
1867 g_dbus_connection_signal_unsubscribe(connection,
1868 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1870 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1871 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1872 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1874 g_dbus_connection_signal_unsubscribe(connection,
1875 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1877 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1878 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1879 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1880 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1882 g_dbus_connection_signal_unsubscribe(connection,
1883 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1885 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1886 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1887 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1888 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1892 ERR("Not supported tethering type [%d]\n", type);
1894 return TETHERING_ERROR_INVALID_PARAMETER;
1897 return TETHERING_ERROR_NONE;
1902 * @brief Checks whetehr the tethering is enabled or not.
1904 * @privlevel platform
1905 * @privilege http://tizen.org/privilege/tethering.admin
1906 * @param[in] tethering The handle of tethering
1907 * @param[in] type The type of tethering
1908 * @return @c true if tethering is enabled, \n @c false if tethering is disabled.
1910 API bool tethering_is_enabled(tethering_h tethering, tethering_type_e type)
1912 INFO("+ type : %d\n", type);
1914 int vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_NONE;
1916 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1918 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &is_on) != 0)
1922 case TETHERING_TYPE_USB:
1923 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_USB;
1926 case TETHERING_TYPE_WIFI:
1927 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI;
1930 case TETHERING_TYPE_BT:
1931 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_BT;
1934 case TETHERING_TYPE_P2P:
1935 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_P2P;
1939 ERR("Not supported type : %d\n", type);
1942 INFO("- enabled: %s\n", (is_on & vconf_type) ? "true" : "false");
1943 return is_on & vconf_type ? true : false;
1948 * @brief Gets the MAC address of local device as "FC:A1:3E:D6:B1:B1".
1950 * @privlevel platform
1951 * @privilege http://tizen.org/privilege/tethering.admin
1952 * @remarks @a mac_address must be released with free() by you.
1953 * @param[in] tethering The handle of tethering
1954 * @param[in] type The type of tethering
1955 * @param[out] mac_address The MAC address
1956 * @return 0 on success, otherwise a negative error value.
1957 * @retval #TETHERING_ERROR_NONE Successful
1958 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1959 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1960 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
1961 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
1962 * @pre tethering must be enabled.
1963 * @see tethering_is_enabled()
1964 * @see tethering_enable()
1966 API int tethering_get_mac_address(tethering_h tethering, tethering_type_e type, char **mac_address)
1968 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1969 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1970 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1971 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1973 _retvm_if(tethering_is_enabled(tethering, type) == false,
1974 TETHERING_ERROR_NOT_ENABLED,
1975 "tethering type[%d] is not enabled\n", type);
1976 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1977 "parameter(tethering) is NULL\n");
1978 _retvm_if(mac_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1979 "parameter(mac_address) is NULL\n");
1983 char *macbuf = NULL;
1985 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
1986 TETHERING_ERROR_OPERATION_FAILED,
1987 "getting interface name is failed\n");
1989 s = socket(AF_INET, SOCK_DGRAM, 0);
1990 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
1991 "getting socket is failed\n");
1992 if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
1993 ERR("getting mac is failed\n");
1995 return TETHERING_ERROR_OPERATION_FAILED;
1999 macbuf = (char *)malloc(TETHERING_STR_INFO_LEN);
2000 _retvm_if(macbuf == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2001 "Not enough memory\n");
2002 snprintf(macbuf, TETHERING_STR_INFO_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
2003 (unsigned char)ifr.ifr_hwaddr.sa_data[0],
2004 (unsigned char)ifr.ifr_hwaddr.sa_data[1],
2005 (unsigned char)ifr.ifr_hwaddr.sa_data[2],
2006 (unsigned char)ifr.ifr_hwaddr.sa_data[3],
2007 (unsigned char)ifr.ifr_hwaddr.sa_data[4],
2008 (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
2010 *mac_address = macbuf;
2012 return TETHERING_ERROR_NONE;
2017 * @brief Gets the name of network interface. For example, usb0.
2019 * @privlevel platform
2020 * @privilege http://tizen.org/privilege/tethering.admin
2021 * @remarks @a interface_name must be released with free() by you.
2022 * @param[in] tethering The handle of tethering
2023 * @param[in] type The type of tethering
2024 * @param[out] interface_name The name of network interface
2025 * @return 0 on success, otherwise negative error value.
2026 * @retval #TETHERING_ERROR_NONE Successful
2027 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2028 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2029 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2030 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2031 * @pre tethering must be enabled.
2032 * @see tethering_is_enabled()
2033 * @see tethering_enable()
2035 API int tethering_get_network_interface_name(tethering_h tethering, tethering_type_e type, char **interface_name)
2037 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2038 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2039 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2040 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2042 _retvm_if(tethering_is_enabled(tethering, type) == false,
2043 TETHERING_ERROR_NOT_ENABLED,
2044 "tethering type[%d] is not enabled\n", type);
2045 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2046 "parameter(tethering) is NULL\n");
2047 _retvm_if(interface_name == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2048 "parameter(interface_name) is NULL\n");
2050 char intf[TETHERING_STR_INFO_LEN] = {0, };
2052 _retvm_if(!__get_intf_name(type, intf, sizeof(intf)),
2053 TETHERING_ERROR_OPERATION_FAILED,
2054 "getting interface name is failed\n");
2055 *interface_name = strdup(intf);
2056 _retvm_if(*interface_name == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2057 "Not enough memory\n");
2059 return TETHERING_ERROR_NONE;
2064 * @brief Gets the local IP address.
2066 * @privlevel platform
2067 * @privilege http://tizen.org/privilege/tethering.admin
2068 * @remarks @a ip_address must be released with free() by you.
2069 * @param[in] tethering The handle of tethering
2070 * @param[in] type The type of tethering
2071 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2072 * @param[out] ip_address The local IP address
2073 * @return 0 on success, otherwise negative error value.
2074 * @retval #TETHERING_ERROR_NONE Successful
2075 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2076 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2077 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2078 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2079 * @pre tethering must be enabled.
2080 * @see tethering_is_enabled()
2081 * @see tethering_enable()
2083 API int tethering_get_ip_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **ip_address)
2085 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2086 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2087 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2088 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2090 _retvm_if(tethering_is_enabled(tethering, type) == false,
2091 TETHERING_ERROR_NOT_ENABLED,
2092 "tethering type[%d] is not enabled\n", type);
2093 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2094 "parameter(tethering) is NULL\n");
2095 _retvm_if(ip_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2096 "parameter(ip_address) is NULL\n");
2102 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2103 TETHERING_ERROR_OPERATION_FAILED,
2104 "getting interface name is failed\n");
2106 s = socket(AF_INET, SOCK_DGRAM, 0);
2107 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2108 "getting socket is failed\n");
2109 if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
2110 ERR("ioctl is failed\n");
2112 return TETHERING_ERROR_OPERATION_FAILED;
2116 ipbuf = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
2117 *ip_address = strdup(ipbuf);
2118 _retvm_if(*ip_address == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2119 "Not enough memory\n");
2121 return TETHERING_ERROR_NONE;
2126 * @brief Gets the Gateway address.
2128 * @privlevel platform
2129 * @privilege http://tizen.org/privilege/tethering.admin
2130 * @remarks @a gateway_address must be released with free() by you.
2131 * @param[in] tethering The handle of tethering
2132 * @param[in] type The type of tethering
2133 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2134 * @param[out] gateway_address The local IP address
2135 * @return 0 on success, otherwise negative error value.
2136 * @retval #TETHERING_ERROR_NONE Successful
2137 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2138 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2139 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2140 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2141 * @pre tethering must be enabled.
2142 * @see tethering_is_enabled()
2143 * @see tethering_enable()
2145 API int tethering_get_gateway_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **gateway_address)
2147 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2148 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2149 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2150 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2152 _retvm_if(tethering_is_enabled(tethering, type) == false,
2153 TETHERING_ERROR_NOT_ENABLED,
2154 "tethering type[%d] is not enabled\n", type);
2155 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2156 "parameter(tethering) is NULL\n");
2157 _retvm_if(gateway_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2158 "parameter(gateway_address) is NULL\n");
2160 char gateway_buf[TETHERING_STR_INFO_LEN] = {0, };
2162 _retvm_if(!__get_gateway_addr(type, gateway_buf, sizeof(gateway_buf)),
2163 TETHERING_ERROR_OPERATION_FAILED,
2164 "getting gateway address is failed\n");
2166 *gateway_address = strdup(gateway_buf);
2168 return TETHERING_ERROR_NONE;
2173 * @brief Gets the Subnet Mask.
2175 * @privlevel platform
2176 * @privilege http://tizen.org/privilege/tethering.admin
2177 * @remarks @a subnet_mask must be released with free() by you.
2178 * @param[in] tethering The handle of tethering
2179 * @param[in] type The type of tethering
2180 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2181 * @param[out] subnet_mask The local IP address
2182 * @return 0 on success, otherwise negative error value.
2183 * @retval #TETHERING_ERROR_NONE Successful
2184 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2185 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2186 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2187 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2188 * @pre tethering must be enabled.
2189 * @see tethering_is_enabled()
2190 * @see tethering_enable()
2192 API int tethering_get_subnet_mask(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **subnet_mask)
2194 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2195 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2196 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2197 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2199 _retvm_if(tethering_is_enabled(tethering, type) == false,
2200 TETHERING_ERROR_NOT_ENABLED,
2201 "tethering is not enabled\n");
2202 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2203 "parameter(tethering) is NULL\n");
2204 _retvm_if(subnet_mask == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2205 "parameter(subnet_mask) is NULL\n");
2207 *subnet_mask = strdup(TETHERING_SUBNET_MASK);
2208 _retvm_if(*subnet_mask == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2209 "Not enough memory\n");
2211 return TETHERING_ERROR_NONE;
2216 * @brief Gets the data usage.
2218 * @privlevel platform
2219 * @privilege http://tizen.org/privilege/tethering.admin
2220 * @param[in] tethering The handle of tethering
2221 * @param[out] usage The data usage
2222 * @return 0 on success, otherwise negative error value.
2223 * @retval #TETHERING_ERROR_NONE Successful
2224 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2225 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2226 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2227 * @pre tethering must be enabled.
2228 * @see tethering_is_enabled()
2229 * @see tethering_enable()
2231 API int tethering_get_data_usage(tethering_h tethering, tethering_data_usage_cb callback, void *user_data)
2233 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2235 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2236 "parameter(tethering) is NULL\n");
2237 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2238 "parameter(callback) is NULL\n");
2239 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2240 TETHERING_ERROR_NOT_ENABLED,
2241 "tethering is not enabled\n");
2243 __tethering_h *th = (__tethering_h *)tethering;
2244 GDBusProxy *proxy = th->client_bus_proxy;
2246 th->data_usage_cb = callback;
2247 th->data_usage_user_data = user_data;
2249 g_dbus_proxy_call(proxy, "get_data_packet_usage",
2250 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2251 (GAsyncReadyCallback) __get_data_usage_cb, (gpointer)tethering);
2253 return TETHERING_ERROR_NONE;
2258 * @brief Gets the client which is connected by tethering "type".
2260 * @privlevel platform
2261 * @privilege http://tizen.org/privilege/tethering.admin
2262 * @param[in] tethering The handle of tethering
2263 * @param[in] type The type of tethering
2264 * @param[in] callback The callback function to invoke
2265 * @param[in] user_data The user data to be passed to the callback function
2266 * @retval #TETHERING_ERROR_NONE Successful
2267 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2268 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2269 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2270 * @pre tethering must be enabled.
2271 * @see tethering_is_enabled()
2272 * @see tethering_enable()
2274 API int tethering_foreach_connected_clients(tethering_h tethering, tethering_type_e type, tethering_connected_client_cb callback, void *user_data)
2276 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2277 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2278 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2279 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2281 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2282 "parameter(tethering) is NULL\n");
2283 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2284 "parameter(callback) is NULL\n");
2285 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2286 TETHERING_ERROR_NOT_ENABLED,
2287 "tethering is not enabled\n");
2289 mobile_ap_type_e interface;
2290 __tethering_h *th = (__tethering_h *)tethering;
2291 __tethering_client_h client = {0, };
2294 gchar *hostname = NULL;
2295 guint timestamp = 0;
2296 GError *error = NULL;
2297 GVariant *result = NULL;
2298 GVariantIter *outer_iter = NULL;
2299 GVariantIter *inner_iter = NULL;
2300 GVariant *station = NULL;
2301 GVariant *value = NULL;
2304 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "get_station_info",
2305 NULL, G_DBUS_CALL_FLAGS_NONE,
2306 -1, th->cancellable, &error);
2308 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
2309 g_variant_get(result, "(a(a{sv}))", &outer_iter);
2310 while (g_variant_iter_loop(outer_iter, "(@a{sv})", &station)) {
2311 g_variant_get(station, "a{sv}", &inner_iter);
2312 while (g_variant_iter_loop(inner_iter, "{sv}", &key, &value)) {
2313 if (g_strcmp0(key, "Type") == 0) {
2314 interface = g_variant_get_int32(value);
2315 if (interface == MOBILE_AP_TYPE_USB)
2316 client.interface = TETHERING_TYPE_USB;
2317 else if (interface == MOBILE_AP_TYPE_WIFI)
2318 client.interface = TETHERING_TYPE_WIFI;
2319 else if (interface == MOBILE_AP_TYPE_BT)
2320 client.interface = TETHERING_TYPE_BT;
2322 ERR("Invalid interface\n");
2324 g_variant_unref(value);
2327 DBG("interface is %d\n", client.interface);
2328 if (client.interface != type && (TETHERING_TYPE_ALL != type)) {
2330 g_variant_unref(value);
2333 } else if (g_strcmp0(key, "IP") == 0) {
2334 g_variant_get(value, "s", &ip);
2335 SDBG("ip is %s\n", ip);
2336 g_strlcpy(client.ip, ip, sizeof(client.ip));
2337 } else if (g_strcmp0(key, "MAC") == 0) {
2338 g_variant_get(value, "s", &mac);
2339 SDBG("mac is %s\n", mac);
2340 g_strlcpy(client.mac, mac, sizeof(client.mac));
2341 } else if (g_strcmp0(key, "Name") == 0) {
2342 g_variant_get(value, "s", &hostname);
2343 SDBG("hsotname is %s\n", hostname);
2345 client.hostname = g_strdup(hostname);
2346 } else if (g_strcmp0(key, "Time") == 0) {
2347 timestamp = g_variant_get_int32(value);
2348 DBG("timestamp is %d\n", timestamp);
2349 client.tm = (time_t)timestamp;
2351 ERR("Key %s not required\n", key);
2357 g_variant_iter_free(inner_iter);
2358 if (callback((tethering_client_h)&client, user_data) == false) {
2359 DBG("iteration is stopped\n");
2360 g_free(client.hostname);
2361 g_variant_iter_free(outer_iter);
2362 g_variant_unref(station);
2363 g_variant_unref(result);
2365 return TETHERING_ERROR_OPERATION_FAILED;
2367 g_free(client.hostname);
2369 g_variant_iter_free(outer_iter);
2370 g_variant_unref(station);
2371 g_variant_unref(result);
2373 return TETHERING_ERROR_NONE;
2378 * @brief Registers the callback function called when tethering is enabled.
2380 * @privlevel platform
2381 * @privilege http://tizen.org/privilege/tethering.admin
2382 * @param[in] tethering The handle of tethering
2383 * @param[in] type The type of tethering
2384 * @param[in] callback The callback function to invoke
2385 * @param[in] user_data The user data to be passed to the callback function
2386 * @retval #TETHERING_ERROR_NONE Successful
2387 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2388 * @see tethering_unset_enabled_cb()
2390 API int tethering_set_enabled_cb(tethering_h tethering, tethering_type_e type, tethering_enabled_cb callback, void *user_data)
2392 INFO("+ type: %d\n", type);
2393 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2394 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2395 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2396 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2398 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2399 "parameter(tethering) is NULL\n");
2400 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2401 "parameter(callback) is NULL\n");
2403 __tethering_h *th = (__tethering_h *)tethering;
2404 tethering_type_e ti;
2406 if (type != TETHERING_TYPE_ALL) {
2407 th->enabled_cb[type] = callback;
2408 th->enabled_user_data[type] = user_data;
2410 return TETHERING_ERROR_NONE;
2413 /* TETHERING_TYPE_ALL */
2414 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2415 th->enabled_cb[ti] = callback;
2416 th->enabled_user_data[ti] = user_data;
2420 return TETHERING_ERROR_NONE;
2425 * @brief Unregisters the callback function called when tethering is disabled.
2427 * @privlevel platform
2428 * @privilege http://tizen.org/privilege/tethering.admin
2429 * @param[in] tethering The handle of tethering
2430 * @param[in] type The type of tethering
2431 * @retval #TETHERING_ERROR_NONE Successful
2432 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2433 * @see tethering_set_enabled_cb()
2435 API int tethering_unset_enabled_cb(tethering_h tethering, tethering_type_e type)
2437 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2438 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2439 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2440 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2442 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2443 "parameter(tethering) is NULL\n");
2445 __tethering_h *th = (__tethering_h *)tethering;
2446 tethering_type_e ti;
2448 if (type != TETHERING_TYPE_ALL) {
2449 th->enabled_cb[type] = NULL;
2450 th->enabled_user_data[type] = NULL;
2452 return TETHERING_ERROR_NONE;
2455 /* TETHERING_TYPE_ALL */
2456 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2457 th->enabled_cb[ti] = NULL;
2458 th->enabled_user_data[ti] = NULL;
2461 return TETHERING_ERROR_NONE;
2466 * @brief Registers the callback function called when tethering is disabled.
2468 * @privlevel platform
2469 * @privilege http://tizen.org/privilege/tethering.admin
2470 * @param[in] tethering The handle of tethering
2471 * @param[in] type The type of tethering
2472 * @param[in] callback The callback function to invoke
2473 * @param[in] user_data The user data to be passed to the callback function
2474 * @retval #TETHERING_ERROR_NONE Successful
2475 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2476 * @see tethering_unset_disabled_cb()
2478 API int tethering_set_disabled_cb(tethering_h tethering, tethering_type_e type, tethering_disabled_cb callback, void *user_data)
2480 INFO("+ type: %d\n", type);
2481 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2482 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2483 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2484 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2486 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2487 "parameter(tethering) is NULL\n");
2488 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2489 "parameter(callback) is NULL\n");
2491 __tethering_h *th = (__tethering_h *)tethering;
2492 tethering_type_e ti;
2494 if (type != TETHERING_TYPE_ALL) {
2495 th->disabled_cb[type] = callback;
2496 th->disabled_user_data[type] = user_data;
2498 return TETHERING_ERROR_NONE;
2501 /* TETHERING_TYPE_ALL */
2502 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2503 th->disabled_cb[ti] = callback;
2504 th->disabled_user_data[ti] = user_data;
2507 return TETHERING_ERROR_NONE;
2512 * @brief Unregisters the callback function called when tethering is disabled.
2514 * @privlevel platform
2515 * @privilege http://tizen.org/privilege/tethering.admin
2516 * @param[in] tethering The handle of tethering
2517 * @param[in] type The type of tethering
2518 * @retval #TETHERING_ERROR_NONE Successful
2519 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2520 * @see tethering_set_disabled_cb()
2522 API int tethering_unset_disabled_cb(tethering_h tethering, tethering_type_e type)
2524 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2525 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2526 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2527 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2529 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2530 "parameter(tethering) is NULL\n");
2532 __tethering_h *th = (__tethering_h *)tethering;
2533 tethering_type_e ti;
2535 if (type != TETHERING_TYPE_ALL) {
2536 th->disabled_cb[type] = NULL;
2537 th->disabled_user_data[type] = NULL;
2539 return TETHERING_ERROR_NONE;
2542 /* TETHERING_TYPE_ALL */
2543 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2544 th->disabled_cb[ti] = NULL;
2545 th->disabled_user_data[ti] = NULL;
2548 return TETHERING_ERROR_NONE;
2553 * @brief Registers the callback function called when the state of connection is changed.
2555 * @privlevel platform
2556 * @privilege http://tizen.org/privilege/tethering.admin
2557 * @param[in] tethering The handle of tethering
2558 * @param[in] type The type of tethering
2559 * @param[in] callback The callback function to invoke
2560 * @param[in] user_data The user data to be passed to the callback function
2561 * @retval #TETHERING_ERROR_NONE Successful
2562 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2563 * @see tethering_unset_connection_state_changed_cb_cb()
2565 API int tethering_set_connection_state_changed_cb(tethering_h tethering, tethering_type_e type, tethering_connection_state_changed_cb callback, void *user_data)
2567 INFO("+ type: %d\n", type);
2568 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2569 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2570 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2571 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2573 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2574 "parameter(tethering) is NULL\n");
2575 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2576 "parameter(callback) is NULL\n");
2578 __tethering_h *th = (__tethering_h *)tethering;
2579 tethering_type_e ti;
2581 if (type != TETHERING_TYPE_ALL) {
2582 th->changed_cb[type] = callback;
2583 th->changed_user_data[type] = user_data;
2585 return TETHERING_ERROR_NONE;
2588 /* TETHERING_TYPE_ALL */
2589 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_BT; ti++) {
2590 th->changed_cb[ti] = callback;
2591 th->changed_user_data[ti] = user_data;
2594 return TETHERING_ERROR_NONE;
2599 * @brief Unregisters the callback function called when the state of connection is changed.
2601 * @privlevel platform
2602 * @privilege http://tizen.org/privilege/tethering.admin
2603 * @param[in] tethering The handle of tethering
2604 * @param[in] type The type of tethering
2605 * @retval #TETHERING_ERROR_NONE Successful
2606 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2607 * @see tethering_set_connection_state_changed_cb()
2609 API int tethering_unset_connection_state_changed_cb(tethering_h tethering, tethering_type_e type)
2611 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2612 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2613 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2614 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2616 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2617 "parameter(tethering) is NULL\n");
2619 __tethering_h *th = (__tethering_h *)tethering;
2620 tethering_type_e ti;
2622 if (type != TETHERING_TYPE_ALL) {
2623 th->changed_cb[type] = NULL;
2624 th->changed_user_data[type] = NULL;
2626 return TETHERING_ERROR_NONE;
2629 /* TETHERING_TYPE_ALL */
2630 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_BT; ti++) {
2631 th->changed_cb[ti] = NULL;
2632 th->changed_user_data[ti] = NULL;
2635 return TETHERING_ERROR_NONE;
2640 * @brief Registers the callback function called when the security type of Wi-Fi tethering is changed.
2642 * @privlevel platform
2643 * @privilege http://tizen.org/privilege/tethering.admin
2644 * @param[in] tethering The handle of tethering
2645 * @param[in] callback The callback function to invoke
2646 * @param[in] user_data The user data to be passed to the callback function
2647 * @retval #TETHERING_ERROR_NONE Successful
2648 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2649 * @see tethering_wifi_unset_security_type_changed_cb()
2651 API int tethering_wifi_set_security_type_changed_cb(tethering_h tethering, tethering_wifi_security_type_changed_cb callback, void *user_data)
2653 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2654 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2656 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2657 "parameter(tethering) is NULL\n");
2658 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2659 "parameter(callback) is NULL\n");
2661 __tethering_h *th = (__tethering_h *)tethering;
2663 th->security_type_changed_cb = callback;
2664 th->security_type_user_data = user_data;
2666 return TETHERING_ERROR_NONE;
2672 * @brief Unregisters the callback function called when the security type of Wi-Fi tethering is changed.
2674 * @privlevel platform
2675 * @privilege http://tizen.org/privilege/tethering.admin
2676 * @param[in] tethering The handle of tethering
2677 * @param[in] type The type of tethering
2678 * @retval #TETHERING_ERROR_NONE Successful
2679 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2680 * @see tethering_wifi_set_security_type_changed_cb()
2682 API int tethering_wifi_unset_security_type_changed_cb(tethering_h tethering)
2684 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2685 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2687 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2688 "parameter(tethering) is NULL\n");
2690 __tethering_h *th = (__tethering_h *)tethering;
2692 th->security_type_changed_cb = NULL;
2693 th->security_type_user_data = NULL;
2695 return TETHERING_ERROR_NONE;
2700 * @brief Registers the callback function called when the visibility of SSID is changed.
2702 * @privlevel platform
2703 * @privilege http://tizen.org/privilege/tethering.admin
2704 * @param[in] tethering The handle of tethering
2705 * @param[in] callback The callback function to invoke
2706 * @param[in] user_data The user data to be passed to the callback function
2707 * @retval #TETHERING_ERROR_NONE Successful
2708 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2709 * @see tethering_wifi_unset_ssid_visibility_changed_cb_cb()
2711 API int tethering_wifi_set_ssid_visibility_changed_cb(tethering_h tethering, tethering_wifi_ssid_visibility_changed_cb callback, void *user_data)
2713 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2714 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2716 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2717 "parameter(tethering) is NULL\n");
2718 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2719 "parameter(callback) is NULL\n");
2721 __tethering_h *th = (__tethering_h *)tethering;
2723 th->ssid_visibility_changed_cb = callback;
2724 th->ssid_visibility_user_data = user_data;
2726 return TETHERING_ERROR_NONE;
2731 * @brief Unregisters the callback function called when the visibility of SSID is changed.
2733 * @privlevel platform
2734 * @privilege http://tizen.org/privilege/tethering.admin
2735 * @param[in] tethering The handle of tethering
2736 * @retval #TETHERING_ERROR_NONE Successful
2737 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2738 * @see tethering_wifi_set_ssid_visibility_changed_cb()
2740 API int tethering_wifi_unset_ssid_visibility_changed_cb(tethering_h tethering)
2742 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2743 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2745 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2746 "parameter(tethering) is NULL\n");
2748 __tethering_h *th = (__tethering_h *)tethering;
2750 th->ssid_visibility_changed_cb = NULL;
2751 th->ssid_visibility_user_data = NULL;
2753 return TETHERING_ERROR_NONE;
2758 * @brief Registers the callback function called when the passphrase of Wi-Fi tethering is changed.
2760 * @privlevel platform
2761 * @privilege http://tizen.org/privilege/tethering.admin
2762 * @param[in] tethering The handle of tethering
2763 * @param[in] callback The callback function to invoke
2764 * @param[in] user_data The user data to be passed to the callback function
2765 * @retval #TETHERING_ERROR_NONE Successful
2766 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2767 * @see tethering_wifi_unset_passphrase_changed_cb()
2769 API int tethering_wifi_set_passphrase_changed_cb(tethering_h tethering, tethering_wifi_passphrase_changed_cb callback, void *user_data)
2771 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2772 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2774 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2775 "parameter(tethering) is NULL\n");
2776 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2777 "parameter(callback) is NULL\n");
2779 __tethering_h *th = (__tethering_h *)tethering;
2781 th->passphrase_changed_cb = callback;
2782 th->passphrase_user_data = user_data;
2784 return TETHERING_ERROR_NONE;
2789 * @brief Unregisters the callback function called when the passphrase of Wi-Fi tethering is changed.
2791 * @privlevel platform
2792 * @privilege http://tizen.org/privilege/tethering.admin
2793 * @param[in] tethering The handle of tethering
2794 * @retval #TETHERING_ERROR_NONE Successful
2795 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2796 * @see tethering_wifi_set_passphrase_changed_cb()
2798 API int tethering_wifi_unset_passphrase_changed_cb(tethering_h tethering)
2800 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2801 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2803 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2804 "parameter(tethering) is NULL\n");
2806 __tethering_h *th = (__tethering_h *)tethering;
2808 th->passphrase_changed_cb = NULL;
2809 th->passphrase_user_data = NULL;
2811 return TETHERING_ERROR_NONE;
2816 * @brief Sets the security type of Wi-Fi tethering.
2818 * @privlevel platform
2819 * @privilege http://tizen.org/privilege/tethering.admin
2820 * @remarks This change is applied next time Wi-Fi tethering is enabled
2821 * @param[in] tethering The handle of tethering
2822 * @param[in] type The security type
2823 * @return 0 on success, otherwise negative error value.
2824 * @retval #TETHERING_ERROR_NONE Successful
2825 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2826 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2827 * @see tethering_wifi_get_security_type()
2829 API int tethering_wifi_set_security_type(tethering_h tethering, tethering_wifi_security_type_e type)
2831 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2832 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2834 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2835 "parameter(tethering) is NULL\n");
2837 __tethering_h *th = (__tethering_h *)tethering;
2838 tethering_error_e ret = TETHERING_ERROR_NONE;
2839 char *sec_str = NULL;
2841 ret = __set_security_type(type);
2842 if (ret == TETHERING_ERROR_NONE) {
2845 case TETHERING_WIFI_SECURITY_TYPE_NONE:
2846 sec_str = TETHERING_WIFI_SECURITY_TYPE_OPEN_STR;
2848 case TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK:
2849 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR;
2851 case TETHERING_WIFI_SECURITY_TYPE_WPS:
2852 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPS_STR;
2856 __send_dbus_signal(th->client_bus,
2857 SIGNAL_NAME_SECURITY_TYPE_CHANGED, sec_str);
2864 * @brief Gets the security type of Wi-Fi tethering.
2866 * @privlevel platform
2867 * @privilege http://tizen.org/privilege/tethering.admin
2868 * @param[in] tethering The handle of tethering
2869 * @param[out] type The security type
2870 * @return 0 on success, otherwise negative error value.
2871 * @retval #TETHERING_ERROR_NONE Successful
2872 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2873 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2874 * @see tethering_wifi_set_security_type()
2876 API int tethering_wifi_get_security_type(tethering_h tethering, tethering_wifi_security_type_e *type)
2878 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2879 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2881 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2882 "parameter(type) is NULL\n");
2884 return __get_security_type(type);
2889 * @brief Sets the SSID (service set identifier).
2891 * @privlevel platform
2892 * @privilege http://tizen.org/privilege/tethering.admin
2893 * @details If SSID is not set, Device name is used as SSID
2894 * @remarks This change is applied next time Wi-Fi tethering is enabled with same @a tethering handle
2895 * @param[in] tethering The handle of tethering
2896 * @param[out] ssid The SSID
2897 * @return 0 on success, otherwise negative error value.
2898 * @retval #TETHERING_ERROR_NONE Successful
2899 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2900 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2902 API int tethering_wifi_set_ssid(tethering_h tethering, const char *ssid)
2904 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2905 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2907 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2908 "parameter(tethering) is NULL\n");
2909 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2910 "parameter(ssid) is NULL\n");
2912 __tethering_h *th = (__tethering_h *)tethering;
2913 char *p_ssid = NULL;
2916 ssid_len = strlen(ssid);
2917 if (ssid_len > TETHERING_WIFI_SSID_MAX_LEN) {
2918 ERR("parameter(ssid) is too long");
2919 return TETHERING_ERROR_INVALID_PARAMETER;
2922 p_ssid = strdup(ssid);
2923 _retvm_if(p_ssid == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2924 "strdup is failed\n");
2930 return TETHERING_ERROR_NONE;
2935 * @brief Gets the SSID (service set identifier).
2937 * @privlevel platform
2938 * @privilege http://tizen.org/privilege/tethering.admin
2939 * @remarks @a ssid must be released with free() by you.
2940 * @param[in] tethering The handle of tethering
2941 * @param[out] ssid The SSID
2942 * @return 0 on success, otherwise negative error value.
2943 * @retval #TETHERING_ERROR_NONE Successful
2944 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2945 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2946 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2948 API int tethering_wifi_get_ssid(tethering_h tethering, char **ssid)
2950 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2951 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2953 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2954 "parameter(tethering) is NULL\n");
2955 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2956 "parameter(ssid) is NULL\n");
2959 __tethering_h *th = (__tethering_h *)tethering;
2960 char val[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
2962 if (!tethering_is_enabled(NULL, TETHERING_TYPE_WIFI)) {
2963 if (th->ssid != NULL) {
2964 DBG("Private SSID is set\n");
2965 *ssid = strdup(th->ssid);
2967 if (__get_ssid_from_vconf(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
2968 val, sizeof(val)) == false) {
2969 return TETHERING_ERROR_OPERATION_FAILED;
2971 *ssid = strdup(val);
2974 if (__get_ssid_from_vconf(VCONFKEY_MOBILE_HOTSPOT_SSID,
2975 val, sizeof(val)) == false) {
2976 return TETHERING_ERROR_OPERATION_FAILED;
2978 *ssid = strdup(val);
2981 if (*ssid == NULL) {
2982 ERR("strdup is failed\n");
2983 return TETHERING_ERROR_OUT_OF_MEMORY;
2986 return TETHERING_ERROR_NONE;
2991 * @brief Sets the visibility of SSID(service set identifier).
2993 * @privlevel platform
2994 * @privilege http://tizen.org/privilege/tethering.admin
2995 * @details If you set the visibility invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
2996 * @remarks This change is applied next time Wi-Fi tethering is enabled
2997 * @param[in] tethering The handle of tethering
2998 * @param[in] visible The visibility of SSID: (@c true = visible, @c false = invisible)
2999 * @return 0 on success, otherwise negative error value.
3000 * @retval #TETHERING_ERROR_NONE Successful
3001 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3002 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3003 * @see tethering_wifi_get_ssid_visibility()
3005 API int tethering_wifi_set_ssid_visibility(tethering_h tethering, bool visible)
3007 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3008 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3010 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3011 "parameter(tethering) is NULL\n");
3013 __tethering_h *th = (__tethering_h *)tethering;
3014 tethering_error_e ret = TETHERING_ERROR_NONE;
3016 ret = __set_visible(visible);
3017 if (ret == TETHERING_ERROR_NONE) {
3019 __send_dbus_signal(th->client_bus,
3020 SIGNAL_NAME_SSID_VISIBILITY_CHANGED,
3021 visible ? SIGNAL_MSG_SSID_VISIBLE :
3022 SIGNAL_MSG_SSID_HIDE);
3029 * @brief Gets the visibility of SSID(service set identifier).
3031 * @privlevel platform
3032 * @privilege http://tizen.org/privilege/tethering.admin
3033 * @details If the visibility is set invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3034 * @param[in] tethering The handle of tethering
3035 * @param[out] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3036 * @return 0 on success, otherwise negative error value.
3037 * @retval #TETHERING_ERROR_NONE Successful
3038 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3039 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3040 * @see tethering_wifi_set_ssid_visibility()
3042 API int tethering_wifi_get_ssid_visibility(tethering_h tethering, bool *visible)
3044 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3045 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3047 _retvm_if(visible == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3048 "parameter(visible) is NULL\n");
3050 return __get_visible(visible);
3055 * @brief Sets the passphrase.
3057 * @privlevel platform
3058 * @privilege http://tizen.org/privilege/tethering.admin
3059 * @remarks This change is applied next time Wi-Fi tethering is enabled
3060 * @param[in] tethering The handle of tethering
3061 * @param[in] passphrase The passphrase
3062 * @return 0 on success, otherwise negative error value.
3063 * @retval #TETHERING_ERROR_NONE Successful
3064 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3065 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3066 * @see tethering_wifi_get_passphrase()
3068 API int tethering_wifi_set_passphrase(tethering_h tethering, const char *passphrase)
3070 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3071 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3073 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3074 "parameter(tethering) is NULL\n");
3075 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3076 "parameter(passphrase) is NULL\n");
3078 __tethering_h *th = (__tethering_h *)tethering;
3079 GDBusProxy *proxy = th->client_bus_proxy;
3080 GVariant *parameters;
3081 GError *error = NULL;
3082 int passphrase_len = 0;
3086 passphrase_len = strlen(passphrase);
3087 if (passphrase_len < TETHERING_WIFI_KEY_MIN_LEN ||
3088 passphrase_len > TETHERING_WIFI_KEY_MAX_LEN) {
3089 ERR("parameter(passphrase) is too short or long\n");
3090 return TETHERING_ERROR_INVALID_PARAMETER;
3093 parameters = g_dbus_proxy_call_sync(proxy, "set_wifi_tethering_passphrase",
3094 g_variant_new("(s)", passphrase), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3098 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3100 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3101 ret = TETHERING_ERROR_PERMISSION_DENIED;
3103 ret = TETHERING_ERROR_OPERATION_FAILED;
3105 g_error_free(error);
3110 g_variant_get(parameters, "(u)", &ret);
3111 g_variant_unref(parameters);
3113 if (ret == TETHERING_ERROR_NONE) {
3114 __send_dbus_signal(th->client_bus,
3115 SIGNAL_NAME_PASSPHRASE_CHANGED, NULL);
3124 * @brief Gets the passphrase.
3126 * @privlevel platform
3127 * @privilege http://tizen.org/privilege/tethering.admin
3128 * @remarks @a passphrase must be released with free() by you.
3129 * @param[in] tethering The handle of tethering
3130 * @param[out] passphrase The passphrase
3131 * @return 0 on success, otherwise negative error value.
3132 * @retval #TETHERING_ERROR_NONE Successful
3133 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3134 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3135 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3136 * @see tethering_wifi_set_passphrase()
3138 API int tethering_wifi_get_passphrase(tethering_h tethering, char **passphrase)
3140 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3141 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3143 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3144 "parameter(tethering) is NULL\n");
3145 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3146 "parameter(passphrase) is NULL\n");
3148 __tethering_h *th = (__tethering_h *)tethering;
3149 GDBusProxy *proxy = th->client_bus_proxy;
3150 GVariant *parameters;
3151 GError *error = NULL;
3152 unsigned int len = 0;
3153 tethering_error_e ret = TETHERING_ERROR_NONE;
3155 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
3156 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3160 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3162 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3163 ret = TETHERING_ERROR_PERMISSION_DENIED;
3165 ret = TETHERING_ERROR_OPERATION_FAILED;
3167 g_error_free(error);
3172 if (parameters != NULL) {
3173 g_variant_get(parameters, "(siu)", passphrase, &len, &ret);
3174 g_variant_unref(parameters);
3177 return TETHERING_ERROR_NONE;
3180 API int tethering_wifi_set_channel(tethering_h tethering, int channel)
3182 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3183 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3185 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3186 "parameter(tethering) is NULL\n");
3188 __tethering_h *th = (__tethering_h *)tethering;
3189 th->channel = channel;
3191 return TETHERING_ERROR_NONE;
3194 API int tethering_wifi_get_channel(tethering_h tethering, int *channel)
3196 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3197 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3199 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3200 "parameter(tethering) is NULL\n");
3202 _retvm_if(channel == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3203 "parameter(channel) is NULL\n");
3205 __tethering_h *th = (__tethering_h *)tethering;
3206 *channel = th->channel;
3208 return TETHERING_ERROR_NONE;
3211 API int tethering_wifi_set_mode(tethering_h tethering, tethering_wifi_mode_type_e type)
3213 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3214 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3216 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3217 "parameter(tethering) is NULL\n");
3219 __tethering_h *th = (__tethering_h *)tethering;
3221 th->mode_type = type;
3223 return TETHERING_ERROR_NONE;
3226 API int tethering_wifi_get_mode(tethering_h tethering, tethering_wifi_mode_type_e *type)
3228 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3229 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3231 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3232 "parameter(tethering) is NULL\n");
3233 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3234 "parameter(type) is NULL\n");
3236 __tethering_h *th = (__tethering_h *)tethering;
3237 *type = th->mode_type;
3239 return TETHERING_ERROR_NONE;
3245 * @brief Reload the settings (SSID / Passphrase / Security type / SSID visibility).
3247 * @privlevel platform
3248 * @privilege http://tizen.org/privilege/tethering.admin
3249 * @remarks Connected devices via Wi-Fi tethering or MobileAP will be disconnected when the settings are reloaded
3250 * @param[in] tethering The handle of tethering
3251 * @param[in] callback The callback function to invoke
3252 * @param[in] user_data The user data to be passed to the callback function
3253 * @return 0 on success, otherwise negative error value.
3254 * @retval #TETHERING_ERROR_NONE Successful
3255 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3256 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3258 API int tethering_wifi_reload_settings(tethering_h tethering, tethering_wifi_settings_reloaded_cb callback, void *user_data)
3261 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3262 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3264 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3265 "parameter(tethering) is NULL\n");
3266 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3267 "parameter(callback) is NULL\n");
3269 __tethering_h *th = (__tethering_h *)tethering;
3270 _softap_settings_t set = {"", "", "", 0, false};
3271 GDBusProxy *proxy = th->client_bus_proxy;
3276 if (th->settings_reloaded_cb) {
3277 ERR("Operation in progress\n");
3278 return TETHERING_ERROR_OPERATION_FAILED;
3281 ret = __prepare_wifi_settings(tethering, &set);
3282 if (ret != TETHERING_ERROR_NONE) {
3283 ERR("softap settings initialization failed\n");
3284 return TETHERING_ERROR_OPERATION_FAILED;
3287 th->settings_reloaded_cb = callback;
3288 th->settings_reloaded_user_data = user_data;
3290 g_dbus_proxy_call(proxy, "reload_wifi_settings",
3291 g_variant_new("(sssiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type),
3292 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
3293 (GAsyncReadyCallback) __settings_reloaded_cb, (gpointer)tethering);
3295 return TETHERING_ERROR_NONE;
3298 API int tethering_wifi_set_mac_filter(tethering_h tethering, bool mac_filter)
3300 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3301 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3303 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3304 "parameter(tethering) is NULL\n");
3306 __tethering_h *th = (__tethering_h *)tethering;
3307 th->mac_filter = mac_filter;
3309 return TETHERING_ERROR_NONE;
3312 API int tethering_wifi_get_mac_filter(tethering_h tethering, bool *mac_filter)
3314 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3315 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3317 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3318 "parameter(mac_filter) is NULL\n");
3319 _retvm_if(mac_filter == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3320 "parameter(mac_filter) is NULL\n");
3322 __tethering_h *th = (__tethering_h *)tethering;
3323 *mac_filter = th->mac_filter;
3325 return TETHERING_ERROR_NONE;
3328 static int __add_mac_to_file(const char *filepath, const char *mac)
3331 char line[MAX_BUF_SIZE] = "\0";
3332 bool mac_exist = false;
3335 p_mac = strdup(mac);
3336 if (p_mac == NULL) {
3337 ERR("strdup failed\n");
3338 return TETHERING_ERROR_OUT_OF_MEMORY;
3341 fp = fopen(filepath, "a+");
3343 ERR("fopen is failed\n");
3344 return TETHERING_ERROR_OPERATION_FAILED;
3347 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3348 if (strncmp(mac, line, 17) == 0) {
3349 DBG("MAC %s already exist in the list\n", mac);
3356 fprintf(fp, "%s\n", mac);
3358 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3359 allowed_list = g_slist_append(allowed_list, p_mac);
3360 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3361 blocked_list = g_slist_append(blocked_list, p_mac);
3366 return TETHERING_ERROR_NONE;
3369 static int __remove_mac_from_file(const char *filepath, const char *mac)
3373 char line[MAX_BUF_SIZE] = "\0";
3375 fp = fopen(filepath, "r");
3377 ERR("fopen is failed\n");
3378 return TETHERING_ERROR_OPERATION_FAILED;
3381 fp1 = fopen(TEMP_LIST, "w+");
3384 ERR("fopen is failed\n");
3385 return TETHERING_ERROR_OPERATION_FAILED;
3388 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3389 if (strncmp(mac, line, 17) == 0) {
3390 DBG("MAC %s found in the list\n", mac);
3392 if ((strcmp(filepath, ALLOWED_LIST) == 0)) {
3393 GSList *list = NULL;
3394 for (list = allowed_list; list != NULL; list = list->next) {
3395 char *p_mac = (char *)list->data;
3396 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3397 allowed_list = g_slist_remove(allowed_list, p_mac);
3399 } else if ((strcmp(filepath, BLOCKED_LIST) == 0)) {
3400 GSList *list = NULL;
3401 for (list = blocked_list; list != NULL; list = list->next) {
3402 char *p_mac = (char *)list->data;
3403 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3404 blocked_list = g_slist_remove(blocked_list, p_mac);
3408 fprintf(fp1, "%s", line);
3415 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3416 rename(TEMP_LIST, ALLOWED_LIST);
3417 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3418 rename(TEMP_LIST, BLOCKED_LIST);
3420 return TETHERING_ERROR_NONE;
3423 API int tethering_wifi_add_allowed_mac_list(tethering_h tethering, const char *mac)
3425 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3426 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3428 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3429 "parameter(tethering) is NULL\n");
3430 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3431 "parameter(mac) is NULL\n");
3433 return __add_mac_to_file(ALLOWED_LIST, mac);
3436 API int tethering_wifi_remove_allowed_mac_list(tethering_h tethering, const char *mac)
3438 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3439 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3441 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3442 "parameter(tethering) is NULL\n");
3443 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3444 "parameter(mac) is NULL\n");
3446 return __remove_mac_from_file(ALLOWED_LIST, mac);
3449 API int tethering_wifi_get_allowed_mac_list(tethering_h tethering, void **allowed_mac_list)
3451 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3452 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3454 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3455 "parameter(tethering) is NULL\n");
3456 _retvm_if(allowed_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3457 "parameter(allowed_mac_list) is NULL\n");
3459 *allowed_mac_list = g_slist_copy(allowed_list);
3460 return TETHERING_ERROR_NONE;
3463 API int tethering_wifi_add_blocked_mac_list(tethering_h tethering, const char *mac)
3465 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3466 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3468 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3469 "parameter(tethering) is NULL\n");
3470 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3471 "parameter(mac) is NULL\n");
3473 return __add_mac_to_file(BLOCKED_LIST, mac);
3476 API int tethering_wifi_remove_blocked_mac_list(tethering_h tethering, const char *mac)
3478 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3479 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3481 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3482 "parameter(tethering) is NULL\n");
3483 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3484 "parameter(mac) is NULL\n");
3486 return __remove_mac_from_file(BLOCKED_LIST, mac);
3489 API int tethering_wifi_get_blocked_mac_list(tethering_h tethering, void **blocked_mac_list)
3491 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3492 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3494 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3495 "parameter(tethering) is NULL\n");
3496 _retvm_if(blocked_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3497 "parameter(blocked_mac_list) is NULL\n");
3499 *blocked_mac_list = g_slist_copy(blocked_list);
3500 return TETHERING_ERROR_NONE;
3503 API int tethering_wifi_enable_dhcp(tethering_h tethering, bool enable)
3505 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3506 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3508 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3509 "parameter(tethering) is NULL\n");
3511 GVariant *parameters;
3512 GError *error = NULL;
3515 __tethering_h *th = (__tethering_h *)tethering;
3517 GDBusProxy *proxy = th->client_bus_proxy;
3519 parameters = g_dbus_proxy_call_sync(proxy, "enable_dhcp",
3520 g_variant_new("(b)", enable),
3521 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3524 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3525 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3526 result = TETHERING_ERROR_PERMISSION_DENIED;
3528 result = TETHERING_ERROR_OPERATION_FAILED;
3530 g_error_free(error);
3531 th->dhcp_enabled = false;
3536 g_variant_get(parameters, "(u)", &result);
3537 g_variant_unref(parameters);
3540 th->dhcp_enabled = true;
3542 th->dhcp_enabled = false;
3544 return TETHERING_ERROR_NONE;
3547 API int tethering_wifi_set_dhcp_range(tethering_h tethering, char *rangestart, char *rangestop)
3549 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3550 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3552 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3553 "parameter(tethering) is NULL\n");
3554 _retvm_if(rangestart == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3555 "parameter(rangestart) is NULL\n");
3556 _retvm_if(rangestop == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3557 "parameter(rangestop) is NULL\n");
3559 GVariant *parameters;
3560 GError *error = NULL;
3563 __tethering_h *th = (__tethering_h *)tethering;
3565 GDBusProxy *proxy = th->client_bus_proxy;
3567 parameters = g_dbus_proxy_call_sync(proxy, "dhcp_range",
3568 g_variant_new("(ss)", rangestart, rangestop),
3569 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3571 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3573 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3574 result = TETHERING_ERROR_PERMISSION_DENIED;
3576 result = TETHERING_ERROR_OPERATION_FAILED;
3578 g_error_free(error);
3579 th->dhcp_enabled = false;
3584 g_variant_get(parameters, "(u)", &result);
3585 g_variant_unref(parameters);
3587 th->dhcp_enabled = true;
3589 return TETHERING_ERROR_NONE;
3592 API int tethering_wifi_is_dhcp_enabled(tethering_h tethering, bool *dhcp_enabled)
3594 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3595 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3597 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3598 "parameter(tethering) is NULL\n");
3599 _retvm_if(dhcp_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3600 "parameter(dhcp_enabled) is NULL\n");
3602 __tethering_h *th = (__tethering_h *)tethering;
3603 *dhcp_enabled = th->dhcp_enabled;
3605 return TETHERING_ERROR_NONE;
3608 API int tethering_wifi_set_txpower(tethering_h tethering, unsigned int txpower)
3610 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3611 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3613 GError *error = NULL;
3615 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3616 "parameter(tethering) is NULL\n");
3617 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3618 TETHERING_ERROR_NOT_ENABLED,
3619 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3620 __tethering_h *th = (__tethering_h *)tethering;
3622 g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_set_txpower",
3623 g_variant_new("(u)", txpower),
3624 G_DBUS_CALL_FLAGS_NONE,
3625 -1, th->cancellable, &error);
3627 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
3628 g_clear_error(&error);
3629 return TETHERING_ERROR_OPERATION_FAILED;
3631 return TETHERING_ERROR_NONE;
3634 API int tethering_wifi_get_txpower(tethering_h tethering, unsigned int *txpower)
3636 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3637 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3639 GError *error = NULL;
3640 GVariant *result = NULL;
3642 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3643 "parameter(tethering) is NULL\n");
3644 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3645 TETHERING_ERROR_NOT_ENABLED,
3646 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3648 __tethering_h *th = (__tethering_h *)tethering;
3650 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_get_txpower",
3652 G_DBUS_CALL_FLAGS_NONE,
3653 -1, th->cancellable, &error);
3655 if (result != NULL) {
3656 g_variant_get(result, "(u)", txpower);
3657 g_variant_unref(result);
3660 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
3661 g_clear_error(&error);
3662 return TETHERING_ERROR_OPERATION_FAILED;
3664 g_clear_error(&error);
3665 return TETHERING_ERROR_NONE;
3668 API int tethering_wifi_set_mtu(tethering_h tethering, unsigned int mtu)
3670 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3671 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3673 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3674 "parameter(tethering) is NULL\n");
3676 GVariant *parameters;
3677 GError *error = NULL;
3680 __tethering_h *th = (__tethering_h *)tethering;
3682 GDBusProxy *proxy = th->client_bus_proxy;
3684 parameters = g_dbus_proxy_call_sync(proxy, "set_mtu",
3685 g_variant_new("(u)", mtu),
3686 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3688 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3690 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3691 result = TETHERING_ERROR_PERMISSION_DENIED;
3693 result = TETHERING_ERROR_OPERATION_FAILED;
3695 g_error_free(error);
3699 g_variant_get(parameters, "(u)", &result);
3701 g_variant_unref(parameters);
3703 return TETHERING_ERROR_NONE;
3706 API int tethering_wifi_change_mac(tethering_h tethering, char *mac)
3708 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3709 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3711 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3712 "parameter(tethering) is NULL\n");
3713 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3714 "parameter(mac) is NULL\n");
3716 GVariant *parameters;
3717 GError *error = NULL;
3720 __tethering_h *th = (__tethering_h *)tethering;
3722 GDBusProxy *proxy = th->client_bus_proxy;
3724 parameters = g_dbus_proxy_call_sync(proxy, "change_mac",
3725 g_variant_new("(s)", mac),
3726 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3728 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3730 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3731 result = TETHERING_ERROR_PERMISSION_DENIED;
3733 result = TETHERING_ERROR_OPERATION_FAILED;
3735 g_error_free(error);
3739 g_variant_get(parameters, "(u)", &result);
3740 g_variant_unref(parameters);
3742 if (result == MOBILE_AP_ERROR_NOT_PERMITTED)
3743 return TETHERING_ERROR_NOT_SUPPORT_API;
3745 return TETHERING_ERROR_NONE;
3748 API int tethering_wifi_set_max_connected_device(tethering_h tethering, int max_device)
3750 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3751 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3753 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3754 "parameter(tethering) is NULL\n");
3756 __tethering_h *th = (__tethering_h *)tethering;
3758 th->wifi_max_connected = max_device;
3760 return TETHERING_ERROR_NONE;
3763 API int tethering_wifi_get_max_connected_device(tethering_h tethering, int *max_device)
3765 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3766 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3768 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3769 "parameter(tethering) is NULL\n");
3770 _retvm_if(max_device == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3771 "parameter(max_device) is NULL\n");
3773 __tethering_h *th = (__tethering_h *)tethering;
3775 *max_device = th->wifi_max_connected;
3776 return TETHERING_ERROR_NONE;
3779 API int tethering_wifi_enable_port_forwarding(tethering_h tethering, bool enable)
3781 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3782 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3784 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3785 "parameter(tethering) is NULL\n");
3787 GVariant *parameters;
3788 GError *error = NULL;
3791 __tethering_h *th = (__tethering_h *)tethering;
3793 GDBusProxy *proxy = th->client_bus_proxy;
3795 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_forwarding",
3796 g_variant_new("(b)", enable),
3797 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3799 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3801 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3802 result = TETHERING_ERROR_PERMISSION_DENIED;
3804 result = TETHERING_ERROR_OPERATION_FAILED;
3806 g_error_free(error);
3810 g_variant_get(parameters, "(u)", &result);
3811 g_variant_unref(parameters);
3813 th->port_forwarding = true;
3815 return TETHERING_ERROR_NONE;
3818 API int tethering_wifi_add_port_forwarding_rule(tethering_h tethering, char *ifname, char *protocol, char *org_ip, int org_port, char *final_ip, int final_port)
3820 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3821 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3823 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3824 "parameter(tethering) is NULL\n");
3825 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3826 "parameter(protocol) is NULL\n");
3828 GVariant *parameters;
3829 GError *error = NULL;
3831 char cmd[MAX_BUF_SIZE] = { 0, };
3834 __tethering_h *th = (__tethering_h *)tethering;
3836 GDBusProxy *proxy = th->client_bus_proxy;
3838 parameters = g_dbus_proxy_call_sync(proxy, "add_port_forwarding_rule",
3839 g_variant_new("(sssisi)", ifname, protocol, org_ip, org_port, final_ip, final_port),
3840 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3842 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3844 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3845 result = TETHERING_ERROR_PERMISSION_DENIED;
3847 result = TETHERING_ERROR_OPERATION_FAILED;
3849 g_error_free(error);
3853 g_variant_get(parameters, "(u)", &result);
3854 g_variant_unref(parameters);
3856 snprintf(cmd, sizeof(cmd), "%s "PORT_FORWARD_RULE_STR, IPTABLES, TABLE_NAT, TETH_NAT_PRE, ifname, protocol, org_ip, org_port, final_ip, final_port);
3860 ERR("strdup failed\n");
3861 return TETHERING_ERROR_OUT_OF_MEMORY;
3864 port_forwarding = g_slist_append(port_forwarding, list);
3866 return TETHERING_ERROR_NONE;
3869 API int tethering_wifi_reset_port_forwarding_rule(tethering_h tethering)
3871 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3872 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3874 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3875 "parameter(tethering) is NULL\n");
3877 GVariant *parameters;
3878 GError *error = NULL;
3881 __tethering_h *th = (__tethering_h *)tethering;
3883 GDBusProxy *proxy = th->client_bus_proxy;
3885 parameters = g_dbus_proxy_call_sync(proxy, "reset_port_forwarding_rule",
3886 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3888 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3890 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3891 result = TETHERING_ERROR_PERMISSION_DENIED;
3893 result = TETHERING_ERROR_OPERATION_FAILED;
3895 g_error_free(error);
3899 g_variant_get(parameters, "(u)", &result);
3901 g_variant_unref(parameters);
3903 return TETHERING_ERROR_NONE;
3906 API int tethering_wifi_is_port_forwarding_enabled(tethering_h tethering, bool* forwarding_enabled)
3908 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3909 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3911 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3912 "parameter(tethering) is NULL\n");
3913 _retvm_if(forwarding_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3914 "parameter(forwarding_enabled) is NULL\n");
3916 __tethering_h *th = (__tethering_h *)tethering;
3918 *forwarding_enabled = th->port_forwarding;
3920 return TETHERING_ERROR_NONE;
3923 API int tethering_wifi_get_port_forwarding_rule(tethering_h tethering, void **port_forwarding_list)
3925 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3926 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3928 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3929 "parameter(tethering) is NULL\n");
3930 _retvm_if(port_forwarding_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3931 "parameter(port_forwarding_list) is NULL\n");
3933 *port_forwarding_list = g_slist_copy(port_forwarding);
3934 return TETHERING_ERROR_NONE;
3937 API int tethering_wifi_enable_port_filtering(tethering_h tethering, bool enable)
3939 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3940 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3942 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3943 "parameter(tethering) is NULL\n");
3945 GVariant *parameters;
3946 GError *error = NULL;
3949 __tethering_h *th = (__tethering_h *)tethering;
3951 GDBusProxy *proxy = th->client_bus_proxy;
3953 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_filtering",
3954 g_variant_new("(b)", enable),
3955 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3957 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3959 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3960 result = TETHERING_ERROR_PERMISSION_DENIED;
3962 result = TETHERING_ERROR_OPERATION_FAILED;
3964 g_error_free(error);
3968 g_variant_get(parameters, "(u)", &result);
3969 g_variant_unref(parameters);
3971 th->port_filtering = true;
3973 return TETHERING_ERROR_NONE;
3976 API int tethering_wifi_add_port_filtering_rule(tethering_h tethering, int port, char *protocol, bool allow)
3978 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3979 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3981 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3982 "parameter(tethering) is NULL\n");
3983 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3984 "parameter(protocol) is NULL\n");
3986 GVariant *parameters;
3987 GError *error = NULL;
3989 char cmd[MAX_BUF_SIZE] = { 0, };
3992 __tethering_h *th = (__tethering_h *)tethering;
3994 GDBusProxy *proxy = th->client_bus_proxy;
3996 parameters = g_dbus_proxy_call_sync(proxy, "add_port_filtering_rule",
3997 g_variant_new("(isb)", port, protocol, allow),
3998 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4000 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4002 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4003 result = TETHERING_ERROR_PERMISSION_DENIED;
4005 result = TETHERING_ERROR_OPERATION_FAILED;
4007 g_error_free(error);
4011 g_variant_get(parameters, "(u)", &result);
4012 g_variant_unref(parameters);
4015 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_ACCEPT);
4017 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_DROP);
4023 ERR("strdup failed\n");
4024 return TETHERING_ERROR_OUT_OF_MEMORY;
4027 port_filtering = g_slist_append(port_filtering, list);
4029 return TETHERING_ERROR_NONE;
4032 API int tethering_wifi_add_custom_port_filtering_rule(tethering_h tethering, int port1, int port2, char *protocol, bool allow)
4034 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4035 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4037 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4038 "parameter(tethering) is NULL\n");
4039 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4040 "parameter(protocol) is NULL\n");
4042 GVariant *parameters;
4043 GError *error = NULL;
4045 char cmd[MAX_BUF_SIZE] = { 0, };
4048 __tethering_h *th = (__tethering_h *)tethering;
4050 GDBusProxy *proxy = th->client_bus_proxy;
4052 parameters = g_dbus_proxy_call_sync(proxy, "add_custom_port_filtering_rule",
4053 g_variant_new("(iisb)", port1, port2, protocol, allow),
4054 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4056 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4058 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4059 result = TETHERING_ERROR_PERMISSION_DENIED;
4061 result = TETHERING_ERROR_OPERATION_FAILED;
4063 g_error_free(error);
4067 g_variant_get(parameters, "(u)", &result);
4068 g_variant_unref(parameters);
4071 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_ACCEPT);
4073 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_DROP);
4079 ERR("strdup failed\n");
4080 return TETHERING_ERROR_OUT_OF_MEMORY;
4083 custom_port_filtering = g_slist_append(custom_port_filtering, list);
4085 return TETHERING_ERROR_NONE;
4088 API int tethering_wifi_get_port_filtering_rule(tethering_h tethering, void **port_filtering_list)
4090 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4091 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4093 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4094 "parameter(tethering) is NULL\n");
4095 _retvm_if(port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4096 "parameter(port_filtering_list) is NULL\n");
4098 *port_filtering_list = g_slist_copy(port_filtering);
4099 return TETHERING_ERROR_NONE;
4102 API int tethering_wifi_get_custom_port_filtering_rule(tethering_h tethering, void **custom_port_filtering_list)
4104 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4105 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4107 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4108 "parameter(tethering) is NULL\n");
4109 _retvm_if(custom_port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4110 "parameter(custom_port_filtering_list) is NULL\n");
4112 *custom_port_filtering_list = g_slist_copy(custom_port_filtering);
4113 return TETHERING_ERROR_NONE;
4116 API int tethering_wifi_is_port_filtering_enabled(tethering_h tethering, bool* filtering_enabled)
4118 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4119 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4121 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4122 "parameter(tethering) is NULL\n");
4123 _retvm_if(filtering_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4124 "parameter(filtering_enabled) is NULL\n");
4126 __tethering_h *th = (__tethering_h *)tethering;
4128 *filtering_enabled = th->port_filtering;
4130 return TETHERING_ERROR_NONE;
4133 API int tethering_wifi_set_vpn_passthrough_rule(tethering_h tethering, tethering_vpn_passthrough_type_e type, bool enable)
4135 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4136 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4138 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4139 "parameter(tethering) is NULL\n");
4141 GVariant *parameters;
4142 GError *error = NULL;
4145 __tethering_h *th = (__tethering_h *)tethering;
4147 GDBusProxy *proxy = th->client_bus_proxy;
4149 parameters = g_dbus_proxy_call_sync(proxy, "set_vpn_passthrough_rule",
4150 g_variant_new("(ib)", type, enable),
4151 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4153 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4155 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4156 result = TETHERING_ERROR_PERMISSION_DENIED;
4158 result = TETHERING_ERROR_OPERATION_FAILED;
4160 g_error_free(error);
4164 g_variant_get(parameters, "(u)", &result);
4166 g_variant_unref(parameters);
4168 return TETHERING_ERROR_NONE;
4171 API int tethering_wifi_push_wps_button(tethering_h tethering)
4173 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4174 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4176 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4177 "parameter(tethering) is NULL");
4178 __tethering_h *th = (__tethering_h *)tethering;
4179 GDBusProxy *proxy = th->client_bus_proxy;
4180 GVariant *parameters = NULL;
4182 GError *error = NULL;
4184 parameters = g_dbus_proxy_call_sync(proxy, "push_wps_button",
4185 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4188 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4190 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4191 ret = TETHERING_ERROR_PERMISSION_DENIED;
4193 ret = TETHERING_ERROR_OPERATION_FAILED;
4195 g_error_free(error);
4199 if (parameters != NULL) {
4200 g_variant_get(parameters, "(u)", &ret);
4201 g_variant_unref(parameters);
4204 return TETHERING_ERROR_NONE;
4207 API int tethering_wifi_set_wps_pin(tethering_h tethering, const char *wps_pin)
4209 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4210 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4212 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4213 "parameter(tethering) is NULL");
4214 __tethering_h *th = (__tethering_h *)tethering;
4215 GDBusProxy *proxy = th->client_bus_proxy;
4216 GVariant *parameters = NULL;
4218 GError *error = NULL;
4220 parameters = g_dbus_proxy_call_sync(proxy, "set_wps_pin",
4221 g_variant_new("(s)", wps_pin), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4224 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4226 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4227 ret = TETHERING_ERROR_PERMISSION_DENIED;
4229 ret = TETHERING_ERROR_OPERATION_FAILED;
4231 g_error_free(error);
4235 if (parameters != NULL) {
4236 g_variant_get(parameters, "(u)", &ret);
4237 g_variant_unref(parameters);
4240 return TETHERING_ERROR_NONE;