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 if (!_tethering_check_handle((tethering_h)user_data))
771 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
774 ERR("DBus error [%s]\n", g_error->message);
775 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
776 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
777 g_error_free(g_error);
778 tethering_enable((tethering_h)th, TETHERING_TYPE_WIFI);
780 } else if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
781 error = TETHERING_ERROR_PERMISSION_DENIED;
783 error = TETHERING_ERROR_OPERATION_FAILED;
784 g_error_free(g_error);
787 g_variant_get(g_var, "(u)", &info);
788 error = __get_error(info);
792 INFO("cfm event : wifi tethering enable info : %d\n", error);
794 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
795 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_ON].name,
796 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
797 sigs[E_SIGNAL_WIFI_TETHER_ON].cb, (gpointer)th, NULL);
803 ecb(error, TETHERING_TYPE_WIFI, true, data);
804 g_variant_unref(g_var);
808 static void __bt_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
812 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
813 GError *g_error = NULL;
816 tethering_error_e error;
818 __tethering_h *th = (__tethering_h *)user_data;
819 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_BT];
820 void *data = th->enabled_user_data[TETHERING_TYPE_BT];
822 if (!_tethering_check_handle((tethering_h)user_data))
825 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
828 ERR("DBus error [%s]\n", g_error->message);
829 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
830 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
831 g_error_free(g_error);
832 tethering_enable((tethering_h)th, TETHERING_TYPE_BT);
836 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
837 error = TETHERING_ERROR_PERMISSION_DENIED;
839 error = TETHERING_ERROR_OPERATION_FAILED;
840 g_error_free(g_error);
843 g_variant_get(g_var, "(u)", &info);
844 g_variant_unref(g_var);
845 error = __get_error(info);
849 sigs[E_SIGNAL_BT_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
850 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_ON].name,
851 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
852 sigs[E_SIGNAL_BT_TETHER_ON].cb, (gpointer)th, NULL);
859 ecb(error, TETHERING_TYPE_BT, true, data);
864 static void __usb_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
869 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
870 __tethering_h *th = (__tethering_h *)user_data;
871 GError *g_error = NULL;
874 tethering_error_e error;
875 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_USB];
876 void *data = th->enabled_user_data[TETHERING_TYPE_USB];
878 if (!_tethering_check_handle((tethering_h)user_data))
881 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
883 ERR("DBus error [%s]\n", g_error->message);
884 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
885 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
886 g_error_free(g_error);
887 tethering_enable((tethering_h)th, TETHERING_TYPE_USB);
891 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
892 error = TETHERING_ERROR_PERMISSION_DENIED;
894 error = TETHERING_ERROR_OPERATION_FAILED;
895 g_error_free(g_error);
897 g_variant_get(g_var, "(u)", &info);
898 g_variant_unref(g_var);
899 error = __get_error(info);
903 sigs[E_SIGNAL_USB_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
904 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_ON].name,
905 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
906 sigs[E_SIGNAL_USB_TETHER_ON].cb, (gpointer)th, NULL);
913 ecb(error, TETHERING_TYPE_USB, true, data);
918 static void __p2p_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
923 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
924 __tethering_h *th = (__tethering_h *)user_data;
925 GError *g_error = NULL;
928 tethering_error_e error;
929 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_P2P];
930 void *data = th->enabled_user_data[TETHERING_TYPE_P2P];
932 if (!_tethering_check_handle((tethering_h)user_data))
935 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
937 ERR("DBus error [%s]\n", g_error->message);
938 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
939 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
940 g_error_free(g_error);
941 tethering_enable((tethering_h)th, TETHERING_TYPE_P2P);
945 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
946 error = TETHERING_ERROR_PERMISSION_DENIED;
948 error = TETHERING_ERROR_OPERATION_FAILED;
949 g_error_free(g_error);
951 g_variant_get(g_var, "(u)", &info);
952 g_variant_unref(g_var);
953 error = __get_error(info);
962 ecb(error, TETHERING_TYPE_P2P, true, data);
966 static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
971 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
972 GError *g_error = NULL;
974 guint info, event_type;
975 tethering_error_e error;
976 tethering_type_e type;
977 tethering_h tethering = (tethering_h)user_data;
978 __tethering_h *th = (__tethering_h *)tethering;
979 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_REQUEST;
980 tethering_disabled_cb dcb = NULL;
983 if (!_tethering_check_handle((tethering_h)user_data))
986 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
989 ERR("DBus error [%s]\n", g_error->message);
990 g_error_free(g_error);
994 g_variant_get(g_var, "(uu)", &event_type, &info);
995 INFO("cfm event : %d info : %d\n", event_type, info);
996 g_variant_unref(g_var);
997 error = __get_error(info);
998 INFO("cfm event : %d info : %d\n", event_type, error);
999 switch (event_type) {
1000 case MOBILE_AP_DISABLE_WIFI_TETHERING_CFM:
1001 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1002 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
1003 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1004 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
1006 type = TETHERING_TYPE_WIFI;
1007 dcb = th->disabled_cb[type];
1008 data = th->disabled_user_data[type];
1010 dcb(error, type, code, data);
1013 case MOBILE_AP_DISABLE_BT_TETHERING_CFM:
1014 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1015 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1016 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1017 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1019 type = TETHERING_TYPE_BT;
1020 dcb = th->disabled_cb[type];
1021 data = th->disabled_user_data[type];
1023 dcb(error, type, code, data);
1027 case MOBILE_AP_DISABLE_USB_TETHERING_CFM:
1028 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1029 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1030 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1031 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1033 type = TETHERING_TYPE_USB;
1034 dcb = th->disabled_cb[type];
1035 data = th->disabled_user_data[type];
1037 dcb(error, type, code, data);
1041 case MOBILE_AP_DISABLE_P2P_TETHERING_CFM:
1042 type = TETHERING_TYPE_P2P;
1043 dcb = th->disabled_cb[type];
1044 data = th->disabled_user_data[type];
1046 dcb(error, type, code, data);
1049 case MOBILE_AP_DISABLE_CFM:
1051 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1052 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
1053 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1054 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
1055 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1056 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1057 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1058 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1059 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1060 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1061 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1062 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1064 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
1065 dcb = th->disabled_cb[type];
1068 data = th->disabled_user_data[type];
1070 dcb(error, type, code, data);
1075 ERR("Invalid event\n");
1081 static void __get_data_usage_cb(GObject *source_object, GAsyncResult *res,
1086 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1088 GError *g_error = NULL;
1091 guint64 tx_bytes, rx_bytes;
1092 __tethering_h *th = (__tethering_h *)user_data;
1093 tethering_error_e tethering_error = TETHERING_ERROR_NONE;
1096 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1099 ERR("DBus fail [%s]\n", g_error->message);
1100 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1101 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1103 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1108 if (th->data_usage_cb == NULL) {
1109 ERR("There is no data_usage_cb\n");
1113 th->data_usage_cb(tethering_error, 0LL, 0LL, th->data_usage_user_data);
1115 g_variant_get(g_var, "(utt)", &event_type, &tx_bytes, &rx_bytes);
1116 th->data_usage_cb(TETHERING_ERROR_NONE,
1117 rx_bytes, tx_bytes, th->data_usage_user_data);
1118 g_variant_unref(g_var);
1120 th->data_usage_cb = NULL;
1121 th->data_usage_user_data = NULL;
1126 static void __settings_reloaded_cb(GObject *source_object, GAsyncResult *res,
1131 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1132 GError *g_error = NULL;
1135 __tethering_h *th = (__tethering_h *)user_data;
1136 tethering_error_e tethering_error;
1138 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1140 ERR("DBus fail [%s]\n", g_error->message);
1141 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1142 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1144 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1145 g_error_free(g_error);
1147 if (th->settings_reloaded_cb == NULL) {
1148 DBG("There is no settings_reloaded_cb\n-\n");
1151 g_variant_get(g_var, "(u)", &info);
1152 tethering_error = __get_error(info);
1153 g_variant_unref(g_var);
1155 th->settings_reloaded_cb(tethering_error,
1156 th->settings_reloaded_user_data);
1158 th->settings_reloaded_cb = NULL;
1159 th->settings_reloaded_user_data = NULL;
1163 static void __connect_signals(tethering_h tethering)
1166 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1168 __tethering_h *th = (__tethering_h *)tethering;
1169 GDBusConnection *connection = th->client_bus;
1172 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++) {
1173 sigs[i].sig_id = g_dbus_connection_signal_subscribe(connection,
1174 NULL, TETHERING_SERVICE_INTERFACE, sigs[i].name,
1175 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1176 sigs[i].cb, tethering, NULL);
1181 static void __disconnect_signals(tethering_h tethering)
1185 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1187 __tethering_h *th = (__tethering_h *)tethering;
1188 GDBusConnection *connection = th->client_bus;
1192 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++)
1193 g_dbus_connection_signal_unsubscribe(connection, sigs[i].sig_id);
1199 static bool __get_intf_name(tethering_type_e type, char *buf, unsigned int len)
1201 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1205 case TETHERING_TYPE_USB:
1206 g_strlcpy(buf, TETHERING_USB_IF, len);
1209 case TETHERING_TYPE_WIFI:
1210 g_strlcpy(buf, TETHERING_WIFI_IF, len);
1213 case TETHERING_TYPE_BT:
1214 g_strlcpy(buf, TETHERING_BT_IF, len);
1218 ERR("Not supported type : %d\n", type);
1224 static bool __get_gateway_addr(tethering_type_e type, char *buf, unsigned int len)
1226 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1229 case TETHERING_TYPE_USB:
1230 g_strlcpy(buf, TETHERING_USB_GATEWAY, len);
1233 case TETHERING_TYPE_WIFI:
1234 g_strlcpy(buf, TETHERING_WIFI_GATEWAY, len);
1237 case TETHERING_TYPE_BT:
1238 g_strlcpy(buf, TETHERING_BT_GATEWAY, len);
1242 ERR("Not supported type : %d\n", type);
1248 static int __get_common_ssid(char *ssid, unsigned int size)
1251 ERR("ssid is null\n"); //LCOV_EXCL_LINE
1252 return TETHERING_ERROR_INVALID_PARAMETER;
1256 char *ptr_tmp = NULL;
1258 ptr = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1260 ERR("vconf_get_str is failed and set default ssid");
1261 g_strlcpy(ssid, TETHERING_DEFAULT_SSID, size);
1263 g_strlcpy(ssid, ptr, size);
1267 if (!g_utf8_validate(ssid, -1, (const char **)&ptr_tmp))
1270 return TETHERING_ERROR_NONE;
1273 static bool __get_wifi_mode_type(tethering_wifi_mode_type_e type, char **buf)
1275 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1278 case TETHERING_WIFI_MODE_TYPE_B:
1279 *buf = g_strdup("b");
1281 case TETHERING_WIFI_MODE_TYPE_G:
1282 *buf = g_strdup("g");
1284 case TETHERING_WIFI_MODE_TYPE_A:
1285 *buf = g_strdup("a");
1287 case TETHERING_WIFI_MODE_TYPE_AD:
1288 *buf = g_strdup("ad");
1291 ERR("Not supported type : %d\n", type);
1297 static int __prepare_wifi_settings(tethering_h tethering, _softap_settings_t *set)
1301 __tethering_h *th = (__tethering_h *)tethering;
1302 tethering_error_e ret = TETHERING_ERROR_NONE;
1305 if (th == NULL || set == NULL) {
1306 ERR("null parameter\n-\n");
1307 return TETHERING_ERROR_INVALID_PARAMETER;
1310 if (th->ssid == NULL)
1311 __get_common_ssid(set->ssid, sizeof(set->ssid));
1313 g_strlcpy(set->ssid, th->ssid, sizeof(set->ssid));
1315 ret = __get_security_type(&set->sec_type);
1316 if (ret != TETHERING_ERROR_NONE)
1317 set->sec_type = th->sec_type;
1319 ret = __get_visible(&set->visibility);
1320 if (ret != TETHERING_ERROR_NONE)
1321 set->visibility = th->visibility;
1323 set->mac_filter = th->mac_filter;
1324 set->max_connected = th->wifi_max_connected;
1325 set->channel = th->channel;
1327 __get_wifi_mode_type(th->mode_type, &ptr);
1329 g_strlcpy(set->mode, "", sizeof(set->mode));
1331 g_strlcpy(set->mode, ptr, sizeof(set->mode));
1335 if (set->sec_type == TETHERING_WIFI_SECURITY_TYPE_NONE) {
1336 g_strlcpy(set->key, "", sizeof(set->key));
1338 GDBusProxy *proxy = th->client_bus_proxy;
1339 GVariant *parameters;
1340 GError *error = NULL;
1341 char *passphrase = NULL;
1342 unsigned int len = 0;
1344 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
1345 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1349 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
1351 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
1352 ret = TETHERING_ERROR_PERMISSION_DENIED;
1354 ret = TETHERING_ERROR_OPERATION_FAILED;
1356 g_error_free(error);
1361 if (parameters != NULL) {
1362 g_variant_get(parameters, "(siu)", &passphrase, &len, &ret);
1363 g_variant_unref(parameters);
1366 g_strlcpy(set->key, passphrase, sizeof(set->key));
1369 INFO("ssid: %s security: %d mode: %s channel: %d visibility: %s\n",
1370 set->ssid, set->sec_type, set->mode, set->channel,
1371 (set->visibility) ? "true" : "false");
1373 return TETHERING_ERROR_NONE;
1376 static bool __check_precondition(tethering_type_e type)
1379 int cellular_state = 0;
1382 /* data network through cellular */
1383 vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &cellular_state);
1384 if (cellular_state == VCONFKEY_NETWORK_CELLULAR_ON) {
1385 INFO("Data Network can be connected later");
1390 /* data network through ethernet */
1391 vconf_get_int(VCONFKEY_NETWORK_STATUS, &dnet_state);
1392 if (dnet_state == VCONFKEY_NETWORK_ETHERNET) {
1393 INFO("Data Network is connected");
1397 vconf_get_int(VCONFKEY_DNET_STATE, &dnet_state);
1398 if (dnet_state > VCONFKEY_DNET_OFF) {
1399 INFO("Data Network is connected");
1402 #endif/*TIZEN_TV_EXT*/
1404 /* data network through wifi */
1405 if (type != TETHERING_TYPE_WIFI) {
1406 vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
1407 if (wifi_state > VCONFKEY_WIFI_UNCONNECTED) {
1408 INFO("Wi-Fi is connected!");
1413 ERR("Network is not available!");
1419 * @brief Creates the handle of tethering.
1421 * @privlevel platform
1422 * @privilege http://tizen.org/privilege/tethering.admin
1423 * @remarks The @a tethering must be released tethering_destroy() by you.
1424 * @param[out] tethering A handle of a new mobile ap handle on success
1425 * @return 0 on success, otherwise a negative error value.
1426 * @retval #TETHERING_ERROR_NONE Successful
1427 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1428 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1429 * @retval #TETHERING_ERROR_NOT_SUPPORT_API API is not supported
1430 * @see tethering_destroy()
1432 API int tethering_create(tethering_h *tethering)
1434 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1435 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1436 "parameter(tethering) is NULL\n");
1439 __tethering_h *th = NULL;
1440 GError *error = NULL;
1441 char ssid[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
1443 th = (__tethering_h *)malloc(sizeof(__tethering_h));
1445 _retvm_if(th == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
1446 "malloc is failed\n");
1447 memset(th, 0x00, sizeof(__tethering_h));
1448 th->sec_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
1449 th->visibility = true;
1450 th->mac_filter = false;
1452 th->mode_type = TETHERING_WIFI_MODE_TYPE_G;
1453 th->wifi_max_connected = TETHERING_WIFI_MAX_STA;
1455 if (__generate_initial_passphrase(th->passphrase,
1456 sizeof(th->passphrase)) == 0) {
1457 ERR("random passphrase generation failed\n"); //LCOV_EXCL_LINE
1459 return TETHERING_ERROR_OPERATION_FAILED;
1462 if (__get_common_ssid(ssid, sizeof(ssid)) != TETHERING_ERROR_NONE) {
1463 ERR("common ssid get failed\n"); //LCOV_EXCL_LINE
1465 return TETHERING_ERROR_OPERATION_FAILED;
1468 #if !GLIB_CHECK_VERSION(2, 36, 0)
1471 GCancellable *cancellable = g_cancellable_new();
1472 th->client_bus = g_bus_get_sync(DBUS_BUS_SYSTEM, cancellable, &error);
1475 ERR("Couldn't connect to the System bus[%s]", error->message);
1476 g_error_free(error);
1477 g_cancellable_cancel(cancellable);
1478 g_object_unref(cancellable);
1480 return TETHERING_ERROR_OPERATION_FAILED;
1483 th->cancellable = cancellable;
1485 th->client_bus_proxy = g_dbus_proxy_new_sync(th->client_bus, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION,
1486 NULL, TETHERING_SERVICE_NAME, TETHERING_SERVICE_OBJECT_PATH,
1487 TETHERING_SERVICE_INTERFACE, th->cancellable, &error);
1488 if (!th->client_bus_proxy) {
1491 ERR("Couldn't create the proxy object because of %s\n", error->message);
1492 g_cancellable_cancel(th->cancellable);
1493 g_object_unref(th->cancellable);
1494 g_object_unref(th->client_bus);
1496 return TETHERING_ERROR_OPERATION_FAILED;
1500 __connect_signals((tethering_h)th);
1502 *tethering = (tethering_h)th;
1503 _tethering_add_handle(th);
1504 INFO("Tethering Handle : 0x%X\n", th);
1506 return TETHERING_ERROR_NONE;
1511 * @brief Destroys the handle of tethering.
1513 * @privlevel platform
1514 * @privilege http://tizen.org/privilege/tethering.admin
1515 * @param[in] tethering The handle of tethering
1516 * @return 0 on success, otherwise a negative error value.
1517 * @retval #TETHERING_ERROR_NONE Successful
1518 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1519 * @see tethering_create()
1521 API int tethering_destroy(tethering_h tethering)
1524 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1525 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1526 "parameter(tethering) is NULL\n");
1528 __tethering_h *th = (__tethering_h *)tethering;
1530 INFO("Tethering Handle : 0x%X\n", th);
1532 __disconnect_signals(tethering);
1537 g_object_unref(th->cancellable);
1538 g_object_unref(th->client_bus_proxy);
1539 g_object_unref(th->client_bus);
1540 memset(th, 0x00, sizeof(__tethering_h));
1542 _tethering_remove_handle(th);
1546 return TETHERING_ERROR_NONE;
1551 * @brief Enables the tethering, asynchronously.
1553 * @privlevel platform
1554 * @privilege http://tizen.org/privilege/tethering.admin
1555 * @param[in] tethering The handle of tethering
1556 * @param[in] type The type of tethering
1557 * @return 0 on success, otherwise negative error value.
1558 * @retval #TETHERING_ERROR_NONE Successful
1559 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1560 * @post tethering_enabled_cb() will be invoked.
1561 * @see tethering_is_enabled()
1562 * @see tethering_disable()
1564 API int tethering_enable(tethering_h tethering, tethering_type_e type)
1566 INFO("+ type : %d\n", type);
1567 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1568 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1569 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1570 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1572 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1573 "parameter(tethering) is NULL\n");
1575 tethering_error_e ret = TETHERING_ERROR_NONE;
1576 __tethering_h *th = (__tethering_h *)tethering;
1577 GDBusProxy *proxy = th->client_bus_proxy;
1578 GDBusConnection *connection = th->client_bus;
1580 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1582 if (__check_precondition(type) == FALSE) {
1585 return TETHERING_ERROR_OPERATION_FAILED;
1591 case TETHERING_TYPE_USB:
1592 g_dbus_connection_signal_unsubscribe(connection,
1593 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1595 g_dbus_proxy_call(proxy, "enable_usb_tethering", NULL,
1596 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1597 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1601 case TETHERING_TYPE_WIFI: {
1602 _softap_settings_t set = {"", "", "", 0, false};
1604 ret = __prepare_wifi_settings(tethering, &set);
1605 if (ret != TETHERING_ERROR_NONE) {
1606 ERR("softap settings initialization failed\n");
1608 return TETHERING_ERROR_OPERATION_FAILED;
1610 g_dbus_connection_signal_unsubscribe(connection,
1611 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1613 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1614 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),
1615 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1616 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1620 case TETHERING_TYPE_BT:
1621 g_dbus_connection_signal_unsubscribe(connection,
1622 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1624 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1625 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1626 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1627 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1631 case TETHERING_TYPE_P2P: {
1632 _softap_settings_t p2p_set = {"", "", "", 0, false};
1633 ret = __prepare_wifi_settings(tethering, &p2p_set);
1634 if (ret != TETHERING_ERROR_NONE) {
1635 ERR("p2p settings initialization failed\n");
1637 return TETHERING_ERROR_OPERATION_FAILED;
1640 g_dbus_proxy_call(proxy, "enable_p2p_tethering",
1641 g_variant_new("(ssi)", p2p_set.ssid, p2p_set.key, p2p_set.channel),
1642 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1643 (GAsyncReadyCallback) __p2p_enabled_cfm_cb, (gpointer)tethering);
1647 case TETHERING_TYPE_ALL: {
1648 _softap_settings_t set = {"", "", "", 0, false};
1650 ret = __prepare_wifi_settings(tethering, &set);
1651 if (ret != TETHERING_ERROR_NONE) {
1652 ERR("softap settings initialization failed\n");
1653 return TETHERING_ERROR_OPERATION_FAILED;
1656 /* TETHERING_TYPE_USB */
1657 g_dbus_connection_signal_unsubscribe(connection,
1658 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1660 g_dbus_proxy_call(proxy, "enable_usb_tethering", NULL,
1661 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1662 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1664 /* TETHERING_TYPE_WIFI */
1665 g_dbus_connection_signal_unsubscribe(connection,
1666 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1668 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1669 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode,
1670 set.channel, set.visibility, set.mac_filter, set.max_connected,
1671 set.sec_type, TETHERING_ADDRESS_FAMILY_IPV4),
1672 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1673 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1675 /* TETHERING_TYPE_BT */
1676 g_dbus_connection_signal_unsubscribe(connection,
1677 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1679 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1680 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1681 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1682 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1687 ERR("Unknown type : %d\n", type);
1689 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1692 return TETHERING_ERROR_INVALID_PARAMETER;
1695 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1697 return TETHERING_ERROR_NONE;
1700 API int tethering_ipv6_enable(tethering_h tethering, tethering_type_e type)
1702 DBG("+ type : %d\n", type);
1703 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1704 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1705 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1706 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1708 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1709 "parameter(tethering) is NULL\n");
1711 __tethering_h *th = (__tethering_h *)tethering;
1712 GDBusProxy *proxy = th->client_bus_proxy;
1713 GDBusConnection *connection = th->client_bus;
1716 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1718 if (__check_precondition(type) == FALSE) {
1721 return TETHERING_ERROR_OPERATION_FAILED;
1727 case TETHERING_TYPE_WIFI: {
1728 _softap_settings_t set = {"", "", "", 0, false, false, 0, 0};
1730 ret = __prepare_wifi_settings(tethering, &set);
1731 if (ret != TETHERING_ERROR_NONE) {
1732 ERR("softap settings initialization failed\n");
1734 return TETHERING_ERROR_OPERATION_FAILED;
1736 g_dbus_connection_signal_unsubscribe(connection,
1737 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1738 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1739 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),
1740 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1741 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1744 case TETHERING_TYPE_BT: {
1745 g_dbus_connection_signal_unsubscribe(connection,
1746 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1749 g_dbus_proxy_call(proxy, "enable_bt_tethering", g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1750 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1751 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1757 ERR("Unknown type : %d\n", type);
1759 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1762 return TETHERING_ERROR_INVALID_PARAMETER;
1766 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1768 return TETHERING_ERROR_NONE;
1771 API int tethering_ipv6_disable(tethering_h tethering, tethering_type_e type)
1773 DBG("+ type : %d\n", type);
1774 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1775 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1776 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1777 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1779 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1780 "parameter(tethering) is NULL\n");
1782 __tethering_h *th = (__tethering_h *)tethering;
1783 GDBusProxy *proxy = th->client_bus_proxy;
1784 GDBusConnection *connection = th->client_bus;
1787 case TETHERING_TYPE_WIFI:
1788 DBG("Disable wifi tethering..");
1789 g_dbus_connection_signal_unsubscribe(connection,
1790 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1792 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1793 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1794 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1795 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1797 case TETHERING_TYPE_BT:
1798 g_dbus_connection_signal_unsubscribe(connection,
1799 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1801 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1802 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1803 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1804 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1808 ERR("Not supported tethering type [%d]\n", type);
1810 return TETHERING_ERROR_INVALID_PARAMETER;
1813 return TETHERING_ERROR_NONE;
1817 * @brief Disables the tethering, asynchronously.
1819 * @privlevel platform
1820 * @privilege http://tizen.org/privilege/tethering.admin
1821 * @param[in] tethering The handle of tethering
1822 * @param[in] type The type of tethering
1823 * @return 0 on success, otherwise negative error value.
1824 * @retval #TETHERING_ERROR_NONE Successful
1825 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1826 * @post tethering_disabled_cb() will be invoked.
1827 * @see tethering_is_enabled()
1828 * @see tethering_enable()
1830 API int tethering_disable(tethering_h tethering, tethering_type_e type)
1832 INFO("+ type : %d\n", type);
1833 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1834 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1835 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1836 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1838 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1839 "parameter(tethering) is NULL\n");
1841 __tethering_h *th = (__tethering_h *)tethering;
1842 GDBusProxy *proxy = th->client_bus_proxy;
1843 GDBusConnection *connection = th->client_bus;
1846 case TETHERING_TYPE_USB:
1847 g_dbus_connection_signal_unsubscribe(connection,
1848 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1850 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1851 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1852 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1856 case TETHERING_TYPE_WIFI:
1858 g_dbus_connection_signal_unsubscribe(connection,
1859 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1861 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1862 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1863 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1864 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1867 case TETHERING_TYPE_BT:
1869 g_dbus_connection_signal_unsubscribe(connection,
1870 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1872 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1873 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1874 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1875 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1878 case TETHERING_TYPE_P2P:
1879 g_dbus_proxy_call(proxy, "disable_p2p_tethering",
1880 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1881 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1884 case TETHERING_TYPE_ALL:
1885 g_dbus_connection_signal_unsubscribe(connection,
1886 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1888 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1889 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1890 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1892 g_dbus_connection_signal_unsubscribe(connection,
1893 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1895 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1896 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1897 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1898 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1900 g_dbus_connection_signal_unsubscribe(connection,
1901 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1903 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1904 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1905 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1906 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1910 ERR("Not supported tethering type [%d]\n", type);
1912 return TETHERING_ERROR_INVALID_PARAMETER;
1915 return TETHERING_ERROR_NONE;
1920 * @brief Checks whetehr the tethering is enabled or not.
1922 * @privlevel platform
1923 * @privilege http://tizen.org/privilege/tethering.admin
1924 * @param[in] tethering The handle of tethering
1925 * @param[in] type The type of tethering
1926 * @return @c true if tethering is enabled, \n @c false if tethering is disabled.
1928 API bool tethering_is_enabled(tethering_h tethering, tethering_type_e type)
1930 INFO("+ type : %d\n", type);
1932 int vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_NONE;
1934 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1936 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &is_on) != 0)
1940 case TETHERING_TYPE_USB:
1941 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_USB;
1944 case TETHERING_TYPE_WIFI:
1945 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI;
1948 case TETHERING_TYPE_BT:
1949 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_BT;
1952 case TETHERING_TYPE_P2P:
1953 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_P2P;
1957 ERR("Not supported type : %d\n", type);
1960 INFO("- enabled: %s\n", (is_on & vconf_type) ? "true" : "false");
1961 return is_on & vconf_type ? true : false;
1966 * @brief Gets the MAC address of local device as "FC:A1:3E:D6:B1:B1".
1968 * @privlevel platform
1969 * @privilege http://tizen.org/privilege/tethering.admin
1970 * @remarks @a mac_address must be released with free() by you.
1971 * @param[in] tethering The handle of tethering
1972 * @param[in] type The type of tethering
1973 * @param[out] mac_address The MAC address
1974 * @return 0 on success, otherwise a negative error value.
1975 * @retval #TETHERING_ERROR_NONE Successful
1976 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1977 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1978 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
1979 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
1980 * @pre tethering must be enabled.
1981 * @see tethering_is_enabled()
1982 * @see tethering_enable()
1984 API int tethering_get_mac_address(tethering_h tethering, tethering_type_e type, char **mac_address)
1986 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1987 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1988 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1989 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1991 _retvm_if(tethering_is_enabled(tethering, type) == false,
1992 TETHERING_ERROR_NOT_ENABLED,
1993 "tethering type[%d] is not enabled\n", type);
1994 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1995 "parameter(tethering) is NULL\n");
1996 _retvm_if(mac_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1997 "parameter(mac_address) is NULL\n");
2001 char *macbuf = NULL;
2003 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2004 TETHERING_ERROR_OPERATION_FAILED,
2005 "getting interface name is failed\n");
2007 s = socket(AF_INET, SOCK_DGRAM, 0);
2008 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2009 "getting socket is failed\n");
2010 if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
2011 ERR("getting mac is failed\n");
2013 return TETHERING_ERROR_OPERATION_FAILED;
2017 macbuf = (char *)malloc(TETHERING_STR_INFO_LEN);
2018 _retvm_if(macbuf == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2019 "Not enough memory\n");
2020 snprintf(macbuf, TETHERING_STR_INFO_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
2021 (unsigned char)ifr.ifr_hwaddr.sa_data[0],
2022 (unsigned char)ifr.ifr_hwaddr.sa_data[1],
2023 (unsigned char)ifr.ifr_hwaddr.sa_data[2],
2024 (unsigned char)ifr.ifr_hwaddr.sa_data[3],
2025 (unsigned char)ifr.ifr_hwaddr.sa_data[4],
2026 (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
2028 *mac_address = macbuf;
2030 return TETHERING_ERROR_NONE;
2035 * @brief Gets the name of network interface. For example, usb0.
2037 * @privlevel platform
2038 * @privilege http://tizen.org/privilege/tethering.admin
2039 * @remarks @a interface_name must be released with free() by you.
2040 * @param[in] tethering The handle of tethering
2041 * @param[in] type The type of tethering
2042 * @param[out] interface_name The name of network interface
2043 * @return 0 on success, otherwise negative error value.
2044 * @retval #TETHERING_ERROR_NONE Successful
2045 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2046 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2047 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2048 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2049 * @pre tethering must be enabled.
2050 * @see tethering_is_enabled()
2051 * @see tethering_enable()
2053 API int tethering_get_network_interface_name(tethering_h tethering, tethering_type_e type, char **interface_name)
2055 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2056 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2057 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2058 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2060 _retvm_if(tethering_is_enabled(tethering, type) == false,
2061 TETHERING_ERROR_NOT_ENABLED,
2062 "tethering type[%d] is not enabled\n", type);
2063 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2064 "parameter(tethering) is NULL\n");
2065 _retvm_if(interface_name == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2066 "parameter(interface_name) is NULL\n");
2068 char intf[TETHERING_STR_INFO_LEN] = {0, };
2070 _retvm_if(!__get_intf_name(type, intf, sizeof(intf)),
2071 TETHERING_ERROR_OPERATION_FAILED,
2072 "getting interface name is failed\n");
2073 *interface_name = strdup(intf);
2074 _retvm_if(*interface_name == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2075 "Not enough memory\n");
2077 return TETHERING_ERROR_NONE;
2082 * @brief Gets the local IP address.
2084 * @privlevel platform
2085 * @privilege http://tizen.org/privilege/tethering.admin
2086 * @remarks @a ip_address must be released with free() by you.
2087 * @param[in] tethering The handle of tethering
2088 * @param[in] type The type of tethering
2089 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2090 * @param[out] ip_address The local IP address
2091 * @return 0 on success, otherwise negative error value.
2092 * @retval #TETHERING_ERROR_NONE Successful
2093 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2094 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2095 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2096 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2097 * @pre tethering must be enabled.
2098 * @see tethering_is_enabled()
2099 * @see tethering_enable()
2101 API int tethering_get_ip_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **ip_address)
2103 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2104 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2105 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2106 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2108 _retvm_if(tethering_is_enabled(tethering, type) == false,
2109 TETHERING_ERROR_NOT_ENABLED,
2110 "tethering type[%d] is not enabled\n", type);
2111 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2112 "parameter(tethering) is NULL\n");
2113 _retvm_if(ip_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2114 "parameter(ip_address) is NULL\n");
2120 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2121 TETHERING_ERROR_OPERATION_FAILED,
2122 "getting interface name is failed\n");
2124 s = socket(AF_INET, SOCK_DGRAM, 0);
2125 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2126 "getting socket is failed\n");
2127 if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
2128 ERR("ioctl is failed\n");
2130 return TETHERING_ERROR_OPERATION_FAILED;
2134 ipbuf = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
2135 *ip_address = strdup(ipbuf);
2136 _retvm_if(*ip_address == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2137 "Not enough memory\n");
2139 return TETHERING_ERROR_NONE;
2144 * @brief Gets the Gateway address.
2146 * @privlevel platform
2147 * @privilege http://tizen.org/privilege/tethering.admin
2148 * @remarks @a gateway_address must be released with free() by you.
2149 * @param[in] tethering The handle of tethering
2150 * @param[in] type The type of tethering
2151 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2152 * @param[out] gateway_address The local IP address
2153 * @return 0 on success, otherwise negative error value.
2154 * @retval #TETHERING_ERROR_NONE Successful
2155 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2156 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2157 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2158 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2159 * @pre tethering must be enabled.
2160 * @see tethering_is_enabled()
2161 * @see tethering_enable()
2163 API int tethering_get_gateway_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **gateway_address)
2165 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2166 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2167 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2168 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2170 _retvm_if(tethering_is_enabled(tethering, type) == false,
2171 TETHERING_ERROR_NOT_ENABLED,
2172 "tethering type[%d] is not enabled\n", type);
2173 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2174 "parameter(tethering) is NULL\n");
2175 _retvm_if(gateway_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2176 "parameter(gateway_address) is NULL\n");
2178 char gateway_buf[TETHERING_STR_INFO_LEN] = {0, };
2180 _retvm_if(!__get_gateway_addr(type, gateway_buf, sizeof(gateway_buf)),
2181 TETHERING_ERROR_OPERATION_FAILED,
2182 "getting gateway address is failed\n");
2184 *gateway_address = strdup(gateway_buf);
2186 return TETHERING_ERROR_NONE;
2191 * @brief Gets the Subnet Mask.
2193 * @privlevel platform
2194 * @privilege http://tizen.org/privilege/tethering.admin
2195 * @remarks @a subnet_mask must be released with free() by you.
2196 * @param[in] tethering The handle of tethering
2197 * @param[in] type The type of tethering
2198 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2199 * @param[out] subnet_mask The local IP address
2200 * @return 0 on success, otherwise negative error value.
2201 * @retval #TETHERING_ERROR_NONE Successful
2202 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2203 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2204 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2205 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2206 * @pre tethering must be enabled.
2207 * @see tethering_is_enabled()
2208 * @see tethering_enable()
2210 API int tethering_get_subnet_mask(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **subnet_mask)
2212 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2213 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2214 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2215 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2217 _retvm_if(tethering_is_enabled(tethering, type) == false,
2218 TETHERING_ERROR_NOT_ENABLED,
2219 "tethering is not enabled\n");
2220 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2221 "parameter(tethering) is NULL\n");
2222 _retvm_if(subnet_mask == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2223 "parameter(subnet_mask) is NULL\n");
2225 *subnet_mask = strdup(TETHERING_SUBNET_MASK);
2226 _retvm_if(*subnet_mask == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2227 "Not enough memory\n");
2229 return TETHERING_ERROR_NONE;
2234 * @brief Gets the data usage.
2236 * @privlevel platform
2237 * @privilege http://tizen.org/privilege/tethering.admin
2238 * @param[in] tethering The handle of tethering
2239 * @param[out] usage The data usage
2240 * @return 0 on success, otherwise negative error value.
2241 * @retval #TETHERING_ERROR_NONE Successful
2242 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2243 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2244 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2245 * @pre tethering must be enabled.
2246 * @see tethering_is_enabled()
2247 * @see tethering_enable()
2249 API int tethering_get_data_usage(tethering_h tethering, tethering_data_usage_cb callback, void *user_data)
2251 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2253 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2254 "parameter(tethering) is NULL\n");
2255 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2256 "parameter(callback) is NULL\n");
2257 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2258 TETHERING_ERROR_NOT_ENABLED,
2259 "tethering is not enabled\n");
2261 __tethering_h *th = (__tethering_h *)tethering;
2262 GDBusProxy *proxy = th->client_bus_proxy;
2264 th->data_usage_cb = callback;
2265 th->data_usage_user_data = user_data;
2267 g_dbus_proxy_call(proxy, "get_data_packet_usage",
2268 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2269 (GAsyncReadyCallback) __get_data_usage_cb, (gpointer)tethering);
2271 return TETHERING_ERROR_NONE;
2276 * @brief Gets the client which is connected by tethering "type".
2278 * @privlevel platform
2279 * @privilege http://tizen.org/privilege/tethering.admin
2280 * @param[in] tethering The handle of tethering
2281 * @param[in] type The type of tethering
2282 * @param[in] callback The callback function to invoke
2283 * @param[in] user_data The user data to be passed to the callback function
2284 * @retval #TETHERING_ERROR_NONE Successful
2285 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2286 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2287 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2288 * @pre tethering must be enabled.
2289 * @see tethering_is_enabled()
2290 * @see tethering_enable()
2292 API int tethering_foreach_connected_clients(tethering_h tethering, tethering_type_e type, tethering_connected_client_cb callback, void *user_data)
2294 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2295 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2296 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2297 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2299 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2300 "parameter(tethering) is NULL\n");
2301 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2302 "parameter(callback) is NULL\n");
2303 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2304 TETHERING_ERROR_NOT_ENABLED,
2305 "tethering is not enabled\n");
2307 mobile_ap_type_e interface;
2308 __tethering_h *th = (__tethering_h *)tethering;
2309 __tethering_client_h client = {0, };
2312 gchar *hostname = NULL;
2313 guint timestamp = 0;
2314 GError *error = NULL;
2315 GVariant *result = NULL;
2316 GVariantIter *outer_iter = NULL;
2317 GVariantIter *inner_iter = NULL;
2318 GVariant *station = NULL;
2319 GVariant *value = NULL;
2322 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "get_station_info",
2323 NULL, G_DBUS_CALL_FLAGS_NONE,
2324 -1, th->cancellable, &error);
2326 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
2327 g_variant_get(result, "(a(a{sv}))", &outer_iter);
2328 while (g_variant_iter_loop(outer_iter, "(@a{sv})", &station)) {
2329 g_variant_get(station, "a{sv}", &inner_iter);
2330 while (g_variant_iter_loop(inner_iter, "{sv}", &key, &value)) {
2331 if (g_strcmp0(key, "Type") == 0) {
2332 interface = g_variant_get_int32(value);
2333 if (interface == MOBILE_AP_TYPE_USB)
2334 client.interface = TETHERING_TYPE_USB;
2335 else if (interface == MOBILE_AP_TYPE_WIFI)
2336 client.interface = TETHERING_TYPE_WIFI;
2337 else if (interface == MOBILE_AP_TYPE_BT)
2338 client.interface = TETHERING_TYPE_BT;
2340 ERR("Invalid interface\n");
2342 g_variant_unref(value);
2345 DBG("interface is %d\n", client.interface);
2346 if (client.interface != type && (TETHERING_TYPE_ALL != type)) {
2348 g_variant_unref(value);
2351 } else if (g_strcmp0(key, "IP") == 0) {
2352 g_variant_get(value, "s", &ip);
2353 SDBG("ip is %s\n", ip);
2354 g_strlcpy(client.ip, ip, sizeof(client.ip));
2355 } else if (g_strcmp0(key, "MAC") == 0) {
2356 g_variant_get(value, "s", &mac);
2357 SDBG("mac is %s\n", mac);
2358 g_strlcpy(client.mac, mac, sizeof(client.mac));
2359 } else if (g_strcmp0(key, "Name") == 0) {
2360 g_variant_get(value, "s", &hostname);
2361 SDBG("hsotname is %s\n", hostname);
2363 client.hostname = g_strdup(hostname);
2364 } else if (g_strcmp0(key, "Time") == 0) {
2365 timestamp = g_variant_get_int32(value);
2366 DBG("timestamp is %d\n", timestamp);
2367 client.tm = (time_t)timestamp;
2369 ERR("Key %s not required\n", key);
2375 g_variant_iter_free(inner_iter);
2376 if (callback((tethering_client_h)&client, user_data) == false) {
2377 DBG("iteration is stopped\n");
2378 g_free(client.hostname);
2379 g_variant_iter_free(outer_iter);
2380 g_variant_unref(station);
2381 g_variant_unref(result);
2383 return TETHERING_ERROR_OPERATION_FAILED;
2385 g_free(client.hostname);
2387 g_variant_iter_free(outer_iter);
2388 g_variant_unref(station);
2389 g_variant_unref(result);
2391 return TETHERING_ERROR_NONE;
2396 * @brief Registers the callback function called when tethering is enabled.
2398 * @privlevel platform
2399 * @privilege http://tizen.org/privilege/tethering.admin
2400 * @param[in] tethering The handle of tethering
2401 * @param[in] type The type of tethering
2402 * @param[in] callback The callback function to invoke
2403 * @param[in] user_data The user data to be passed to the callback function
2404 * @retval #TETHERING_ERROR_NONE Successful
2405 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2406 * @see tethering_unset_enabled_cb()
2408 API int tethering_set_enabled_cb(tethering_h tethering, tethering_type_e type, tethering_enabled_cb callback, void *user_data)
2410 INFO("+ type: %d\n", type);
2411 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2412 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2413 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2414 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2416 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2417 "parameter(tethering) is NULL\n");
2418 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2419 "parameter(callback) is NULL\n");
2421 __tethering_h *th = (__tethering_h *)tethering;
2422 tethering_type_e ti;
2424 if (type != TETHERING_TYPE_ALL) {
2425 th->enabled_cb[type] = callback;
2426 th->enabled_user_data[type] = user_data;
2428 return TETHERING_ERROR_NONE;
2431 /* TETHERING_TYPE_ALL */
2432 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2433 th->enabled_cb[ti] = callback;
2434 th->enabled_user_data[ti] = user_data;
2438 return TETHERING_ERROR_NONE;
2443 * @brief Unregisters the callback function called when tethering is disabled.
2445 * @privlevel platform
2446 * @privilege http://tizen.org/privilege/tethering.admin
2447 * @param[in] tethering The handle of tethering
2448 * @param[in] type The type of tethering
2449 * @retval #TETHERING_ERROR_NONE Successful
2450 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2451 * @see tethering_set_enabled_cb()
2453 API int tethering_unset_enabled_cb(tethering_h tethering, tethering_type_e type)
2455 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2456 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2457 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2458 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2460 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2461 "parameter(tethering) is NULL\n");
2463 __tethering_h *th = (__tethering_h *)tethering;
2464 tethering_type_e ti;
2466 if (type != TETHERING_TYPE_ALL) {
2467 th->enabled_cb[type] = NULL;
2468 th->enabled_user_data[type] = NULL;
2470 return TETHERING_ERROR_NONE;
2473 /* TETHERING_TYPE_ALL */
2474 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2475 th->enabled_cb[ti] = NULL;
2476 th->enabled_user_data[ti] = NULL;
2479 return TETHERING_ERROR_NONE;
2484 * @brief Registers the callback function called when tethering is disabled.
2486 * @privlevel platform
2487 * @privilege http://tizen.org/privilege/tethering.admin
2488 * @param[in] tethering The handle of tethering
2489 * @param[in] type The type of tethering
2490 * @param[in] callback The callback function to invoke
2491 * @param[in] user_data The user data to be passed to the callback function
2492 * @retval #TETHERING_ERROR_NONE Successful
2493 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2494 * @see tethering_unset_disabled_cb()
2496 API int tethering_set_disabled_cb(tethering_h tethering, tethering_type_e type, tethering_disabled_cb callback, void *user_data)
2498 INFO("+ type: %d\n", type);
2499 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2500 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2501 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2502 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2504 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2505 "parameter(tethering) is NULL\n");
2506 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2507 "parameter(callback) is NULL\n");
2509 __tethering_h *th = (__tethering_h *)tethering;
2510 tethering_type_e ti;
2512 if (type != TETHERING_TYPE_ALL) {
2513 th->disabled_cb[type] = callback;
2514 th->disabled_user_data[type] = user_data;
2516 return TETHERING_ERROR_NONE;
2519 /* TETHERING_TYPE_ALL */
2520 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2521 th->disabled_cb[ti] = callback;
2522 th->disabled_user_data[ti] = user_data;
2525 return TETHERING_ERROR_NONE;
2530 * @brief Unregisters the callback function called when tethering is disabled.
2532 * @privlevel platform
2533 * @privilege http://tizen.org/privilege/tethering.admin
2534 * @param[in] tethering The handle of tethering
2535 * @param[in] type The type of tethering
2536 * @retval #TETHERING_ERROR_NONE Successful
2537 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2538 * @see tethering_set_disabled_cb()
2540 API int tethering_unset_disabled_cb(tethering_h tethering, tethering_type_e type)
2542 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2543 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2544 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2545 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2547 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2548 "parameter(tethering) is NULL\n");
2550 __tethering_h *th = (__tethering_h *)tethering;
2551 tethering_type_e ti;
2553 if (type != TETHERING_TYPE_ALL) {
2554 th->disabled_cb[type] = NULL;
2555 th->disabled_user_data[type] = NULL;
2557 return TETHERING_ERROR_NONE;
2560 /* TETHERING_TYPE_ALL */
2561 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2562 th->disabled_cb[ti] = NULL;
2563 th->disabled_user_data[ti] = NULL;
2566 return TETHERING_ERROR_NONE;
2571 * @brief Registers the callback function called when the state of connection is changed.
2573 * @privlevel platform
2574 * @privilege http://tizen.org/privilege/tethering.admin
2575 * @param[in] tethering The handle of tethering
2576 * @param[in] type The type of tethering
2577 * @param[in] callback The callback function to invoke
2578 * @param[in] user_data The user data to be passed to the callback function
2579 * @retval #TETHERING_ERROR_NONE Successful
2580 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2581 * @see tethering_unset_connection_state_changed_cb_cb()
2583 API int tethering_set_connection_state_changed_cb(tethering_h tethering, tethering_type_e type, tethering_connection_state_changed_cb callback, void *user_data)
2585 INFO("+ type: %d\n", type);
2586 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2587 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2588 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2589 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2591 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2592 "parameter(tethering) is NULL\n");
2593 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2594 "parameter(callback) is NULL\n");
2596 __tethering_h *th = (__tethering_h *)tethering;
2597 tethering_type_e ti;
2599 if (type != TETHERING_TYPE_ALL) {
2600 th->changed_cb[type] = callback;
2601 th->changed_user_data[type] = user_data;
2603 return TETHERING_ERROR_NONE;
2606 /* TETHERING_TYPE_ALL */
2607 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_BT; ti++) {
2608 th->changed_cb[ti] = callback;
2609 th->changed_user_data[ti] = user_data;
2612 return TETHERING_ERROR_NONE;
2617 * @brief Unregisters the callback function called when the state of connection is changed.
2619 * @privlevel platform
2620 * @privilege http://tizen.org/privilege/tethering.admin
2621 * @param[in] tethering The handle of tethering
2622 * @param[in] type The type of tethering
2623 * @retval #TETHERING_ERROR_NONE Successful
2624 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2625 * @see tethering_set_connection_state_changed_cb()
2627 API int tethering_unset_connection_state_changed_cb(tethering_h tethering, tethering_type_e type)
2629 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2630 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2631 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2632 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2634 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2635 "parameter(tethering) is NULL\n");
2637 __tethering_h *th = (__tethering_h *)tethering;
2638 tethering_type_e ti;
2640 if (type != TETHERING_TYPE_ALL) {
2641 th->changed_cb[type] = NULL;
2642 th->changed_user_data[type] = NULL;
2644 return TETHERING_ERROR_NONE;
2647 /* TETHERING_TYPE_ALL */
2648 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_BT; ti++) {
2649 th->changed_cb[ti] = NULL;
2650 th->changed_user_data[ti] = NULL;
2653 return TETHERING_ERROR_NONE;
2658 * @brief Registers the callback function called when the security type of Wi-Fi tethering is changed.
2660 * @privlevel platform
2661 * @privilege http://tizen.org/privilege/tethering.admin
2662 * @param[in] tethering The handle of tethering
2663 * @param[in] callback The callback function to invoke
2664 * @param[in] user_data The user data to be passed to the callback function
2665 * @retval #TETHERING_ERROR_NONE Successful
2666 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2667 * @see tethering_wifi_unset_security_type_changed_cb()
2669 API int tethering_wifi_set_security_type_changed_cb(tethering_h tethering, tethering_wifi_security_type_changed_cb callback, void *user_data)
2671 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2672 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2674 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2675 "parameter(tethering) is NULL\n");
2676 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2677 "parameter(callback) is NULL\n");
2679 __tethering_h *th = (__tethering_h *)tethering;
2681 th->security_type_changed_cb = callback;
2682 th->security_type_user_data = user_data;
2684 return TETHERING_ERROR_NONE;
2690 * @brief Unregisters the callback function called when the security type of Wi-Fi tethering is changed.
2692 * @privlevel platform
2693 * @privilege http://tizen.org/privilege/tethering.admin
2694 * @param[in] tethering The handle of tethering
2695 * @param[in] type The type of tethering
2696 * @retval #TETHERING_ERROR_NONE Successful
2697 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2698 * @see tethering_wifi_set_security_type_changed_cb()
2700 API int tethering_wifi_unset_security_type_changed_cb(tethering_h tethering)
2702 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2703 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2705 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2706 "parameter(tethering) is NULL\n");
2708 __tethering_h *th = (__tethering_h *)tethering;
2710 th->security_type_changed_cb = NULL;
2711 th->security_type_user_data = NULL;
2713 return TETHERING_ERROR_NONE;
2718 * @brief Registers the callback function called when the visibility of SSID is changed.
2720 * @privlevel platform
2721 * @privilege http://tizen.org/privilege/tethering.admin
2722 * @param[in] tethering The handle of tethering
2723 * @param[in] callback The callback function to invoke
2724 * @param[in] user_data The user data to be passed to the callback function
2725 * @retval #TETHERING_ERROR_NONE Successful
2726 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2727 * @see tethering_wifi_unset_ssid_visibility_changed_cb_cb()
2729 API int tethering_wifi_set_ssid_visibility_changed_cb(tethering_h tethering, tethering_wifi_ssid_visibility_changed_cb callback, void *user_data)
2731 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2732 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2734 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2735 "parameter(tethering) is NULL\n");
2736 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2737 "parameter(callback) is NULL\n");
2739 __tethering_h *th = (__tethering_h *)tethering;
2741 th->ssid_visibility_changed_cb = callback;
2742 th->ssid_visibility_user_data = user_data;
2744 return TETHERING_ERROR_NONE;
2749 * @brief Unregisters the callback function called when the visibility of SSID is changed.
2751 * @privlevel platform
2752 * @privilege http://tizen.org/privilege/tethering.admin
2753 * @param[in] tethering The handle of tethering
2754 * @retval #TETHERING_ERROR_NONE Successful
2755 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2756 * @see tethering_wifi_set_ssid_visibility_changed_cb()
2758 API int tethering_wifi_unset_ssid_visibility_changed_cb(tethering_h tethering)
2760 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2761 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2763 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2764 "parameter(tethering) is NULL\n");
2766 __tethering_h *th = (__tethering_h *)tethering;
2768 th->ssid_visibility_changed_cb = NULL;
2769 th->ssid_visibility_user_data = NULL;
2771 return TETHERING_ERROR_NONE;
2776 * @brief Registers the callback function called when the passphrase of Wi-Fi tethering is changed.
2778 * @privlevel platform
2779 * @privilege http://tizen.org/privilege/tethering.admin
2780 * @param[in] tethering The handle of tethering
2781 * @param[in] callback The callback function to invoke
2782 * @param[in] user_data The user data to be passed to the callback function
2783 * @retval #TETHERING_ERROR_NONE Successful
2784 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2785 * @see tethering_wifi_unset_passphrase_changed_cb()
2787 API int tethering_wifi_set_passphrase_changed_cb(tethering_h tethering, tethering_wifi_passphrase_changed_cb callback, void *user_data)
2789 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2790 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2792 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2793 "parameter(tethering) is NULL\n");
2794 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2795 "parameter(callback) is NULL\n");
2797 __tethering_h *th = (__tethering_h *)tethering;
2799 th->passphrase_changed_cb = callback;
2800 th->passphrase_user_data = user_data;
2802 return TETHERING_ERROR_NONE;
2807 * @brief Unregisters the callback function called when the passphrase of Wi-Fi tethering is changed.
2809 * @privlevel platform
2810 * @privilege http://tizen.org/privilege/tethering.admin
2811 * @param[in] tethering The handle of tethering
2812 * @retval #TETHERING_ERROR_NONE Successful
2813 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2814 * @see tethering_wifi_set_passphrase_changed_cb()
2816 API int tethering_wifi_unset_passphrase_changed_cb(tethering_h tethering)
2818 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2819 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2821 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2822 "parameter(tethering) is NULL\n");
2824 __tethering_h *th = (__tethering_h *)tethering;
2826 th->passphrase_changed_cb = NULL;
2827 th->passphrase_user_data = NULL;
2829 return TETHERING_ERROR_NONE;
2834 * @brief Sets the security type of Wi-Fi tethering.
2836 * @privlevel platform
2837 * @privilege http://tizen.org/privilege/tethering.admin
2838 * @remarks This change is applied next time Wi-Fi tethering is enabled
2839 * @param[in] tethering The handle of tethering
2840 * @param[in] type The security type
2841 * @return 0 on success, otherwise negative error value.
2842 * @retval #TETHERING_ERROR_NONE Successful
2843 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2844 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2845 * @see tethering_wifi_get_security_type()
2847 API int tethering_wifi_set_security_type(tethering_h tethering, tethering_wifi_security_type_e type)
2849 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2850 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2852 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2853 "parameter(tethering) is NULL\n");
2855 __tethering_h *th = (__tethering_h *)tethering;
2856 tethering_error_e ret = TETHERING_ERROR_NONE;
2857 char *sec_str = NULL;
2859 ret = __set_security_type(type);
2860 if (ret == TETHERING_ERROR_NONE) {
2863 case TETHERING_WIFI_SECURITY_TYPE_NONE:
2864 sec_str = TETHERING_WIFI_SECURITY_TYPE_OPEN_STR;
2866 case TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK:
2867 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR;
2869 case TETHERING_WIFI_SECURITY_TYPE_WPS:
2870 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPS_STR;
2874 __send_dbus_signal(th->client_bus,
2875 SIGNAL_NAME_SECURITY_TYPE_CHANGED, sec_str);
2882 * @brief Gets the security type of Wi-Fi tethering.
2884 * @privlevel platform
2885 * @privilege http://tizen.org/privilege/tethering.admin
2886 * @param[in] tethering The handle of tethering
2887 * @param[out] type The security type
2888 * @return 0 on success, otherwise negative error value.
2889 * @retval #TETHERING_ERROR_NONE Successful
2890 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2891 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2892 * @see tethering_wifi_set_security_type()
2894 API int tethering_wifi_get_security_type(tethering_h tethering, tethering_wifi_security_type_e *type)
2896 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2897 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2899 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2900 "parameter(type) is NULL\n");
2902 return __get_security_type(type);
2907 * @brief Sets the SSID (service set identifier).
2909 * @privlevel platform
2910 * @privilege http://tizen.org/privilege/tethering.admin
2911 * @details If SSID is not set, Device name is used as SSID
2912 * @remarks This change is applied next time Wi-Fi tethering is enabled with same @a tethering handle
2913 * @param[in] tethering The handle of tethering
2914 * @param[out] ssid The SSID
2915 * @return 0 on success, otherwise negative error value.
2916 * @retval #TETHERING_ERROR_NONE Successful
2917 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2918 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2920 API int tethering_wifi_set_ssid(tethering_h tethering, const char *ssid)
2922 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2923 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2925 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2926 "parameter(tethering) is NULL\n");
2927 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2928 "parameter(ssid) is NULL\n");
2930 __tethering_h *th = (__tethering_h *)tethering;
2931 char *p_ssid = NULL;
2934 ssid_len = strlen(ssid);
2935 if (ssid_len > TETHERING_WIFI_SSID_MAX_LEN) {
2936 ERR("parameter(ssid) is too long");
2937 return TETHERING_ERROR_INVALID_PARAMETER;
2940 p_ssid = strdup(ssid);
2941 _retvm_if(p_ssid == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2942 "strdup is failed\n");
2948 return TETHERING_ERROR_NONE;
2953 * @brief Gets the SSID (service set identifier).
2955 * @privlevel platform
2956 * @privilege http://tizen.org/privilege/tethering.admin
2957 * @remarks @a ssid must be released with free() by you.
2958 * @param[in] tethering The handle of tethering
2959 * @param[out] ssid The SSID
2960 * @return 0 on success, otherwise negative error value.
2961 * @retval #TETHERING_ERROR_NONE Successful
2962 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2963 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2964 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2966 API int tethering_wifi_get_ssid(tethering_h tethering, char **ssid)
2968 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2969 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2971 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2972 "parameter(tethering) is NULL\n");
2973 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2974 "parameter(ssid) is NULL\n");
2977 __tethering_h *th = (__tethering_h *)tethering;
2978 char val[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
2980 if (!tethering_is_enabled(NULL, TETHERING_TYPE_WIFI)) {
2981 if (th->ssid != NULL) {
2982 DBG("Private SSID is set\n");
2983 *ssid = strdup(th->ssid);
2985 if (__get_ssid_from_vconf(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
2986 val, sizeof(val)) == false) {
2987 return TETHERING_ERROR_OPERATION_FAILED;
2989 *ssid = strdup(val);
2992 if (__get_ssid_from_vconf(VCONFKEY_MOBILE_HOTSPOT_SSID,
2993 val, sizeof(val)) == false) {
2994 return TETHERING_ERROR_OPERATION_FAILED;
2996 *ssid = strdup(val);
2999 if (*ssid == NULL) {
3000 ERR("strdup is failed\n");
3001 return TETHERING_ERROR_OUT_OF_MEMORY;
3004 return TETHERING_ERROR_NONE;
3009 * @brief Sets the visibility of SSID(service set identifier).
3011 * @privlevel platform
3012 * @privilege http://tizen.org/privilege/tethering.admin
3013 * @details If you set the visibility invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3014 * @remarks This change is applied next time Wi-Fi tethering is enabled
3015 * @param[in] tethering The handle of tethering
3016 * @param[in] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3017 * @return 0 on success, otherwise negative error value.
3018 * @retval #TETHERING_ERROR_NONE Successful
3019 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3020 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3021 * @see tethering_wifi_get_ssid_visibility()
3023 API int tethering_wifi_set_ssid_visibility(tethering_h tethering, bool visible)
3025 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3026 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3028 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3029 "parameter(tethering) is NULL\n");
3031 __tethering_h *th = (__tethering_h *)tethering;
3032 tethering_error_e ret = TETHERING_ERROR_NONE;
3034 ret = __set_visible(visible);
3035 if (ret == TETHERING_ERROR_NONE) {
3037 __send_dbus_signal(th->client_bus,
3038 SIGNAL_NAME_SSID_VISIBILITY_CHANGED,
3039 visible ? SIGNAL_MSG_SSID_VISIBLE :
3040 SIGNAL_MSG_SSID_HIDE);
3047 * @brief Gets the visibility of SSID(service set identifier).
3049 * @privlevel platform
3050 * @privilege http://tizen.org/privilege/tethering.admin
3051 * @details If the visibility is set invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3052 * @param[in] tethering The handle of tethering
3053 * @param[out] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3054 * @return 0 on success, otherwise negative error value.
3055 * @retval #TETHERING_ERROR_NONE Successful
3056 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3057 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3058 * @see tethering_wifi_set_ssid_visibility()
3060 API int tethering_wifi_get_ssid_visibility(tethering_h tethering, bool *visible)
3062 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3063 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3065 _retvm_if(visible == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3066 "parameter(visible) is NULL\n");
3068 return __get_visible(visible);
3073 * @brief Sets the passphrase.
3075 * @privlevel platform
3076 * @privilege http://tizen.org/privilege/tethering.admin
3077 * @remarks This change is applied next time Wi-Fi tethering is enabled
3078 * @param[in] tethering The handle of tethering
3079 * @param[in] passphrase The passphrase
3080 * @return 0 on success, otherwise negative error value.
3081 * @retval #TETHERING_ERROR_NONE Successful
3082 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3083 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3084 * @see tethering_wifi_get_passphrase()
3086 API int tethering_wifi_set_passphrase(tethering_h tethering, const char *passphrase)
3088 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3089 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3091 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3092 "parameter(tethering) is NULL\n");
3093 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3094 "parameter(passphrase) is NULL\n");
3096 __tethering_h *th = (__tethering_h *)tethering;
3097 GDBusProxy *proxy = th->client_bus_proxy;
3098 GVariant *parameters;
3099 GError *error = NULL;
3100 int passphrase_len = 0;
3104 passphrase_len = strlen(passphrase);
3105 if (passphrase_len < TETHERING_WIFI_KEY_MIN_LEN ||
3106 passphrase_len > TETHERING_WIFI_KEY_MAX_LEN) {
3107 ERR("parameter(passphrase) is too short or long\n");
3108 return TETHERING_ERROR_INVALID_PARAMETER;
3111 parameters = g_dbus_proxy_call_sync(proxy, "set_wifi_tethering_passphrase",
3112 g_variant_new("(s)", passphrase), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3116 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3118 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3119 ret = TETHERING_ERROR_PERMISSION_DENIED;
3121 ret = TETHERING_ERROR_OPERATION_FAILED;
3123 g_error_free(error);
3128 g_variant_get(parameters, "(u)", &ret);
3129 g_variant_unref(parameters);
3131 if (ret == TETHERING_ERROR_NONE) {
3132 __send_dbus_signal(th->client_bus,
3133 SIGNAL_NAME_PASSPHRASE_CHANGED, NULL);
3142 * @brief Gets the passphrase.
3144 * @privlevel platform
3145 * @privilege http://tizen.org/privilege/tethering.admin
3146 * @remarks @a passphrase must be released with free() by you.
3147 * @param[in] tethering The handle of tethering
3148 * @param[out] passphrase The passphrase
3149 * @return 0 on success, otherwise negative error value.
3150 * @retval #TETHERING_ERROR_NONE Successful
3151 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3152 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3153 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3154 * @see tethering_wifi_set_passphrase()
3156 API int tethering_wifi_get_passphrase(tethering_h tethering, char **passphrase)
3158 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3159 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3161 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3162 "parameter(tethering) is NULL\n");
3163 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3164 "parameter(passphrase) is NULL\n");
3166 __tethering_h *th = (__tethering_h *)tethering;
3167 GDBusProxy *proxy = th->client_bus_proxy;
3168 GVariant *parameters;
3169 GError *error = NULL;
3170 unsigned int len = 0;
3171 tethering_error_e ret = TETHERING_ERROR_NONE;
3173 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
3174 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3178 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3180 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3181 ret = TETHERING_ERROR_PERMISSION_DENIED;
3183 ret = TETHERING_ERROR_OPERATION_FAILED;
3185 g_error_free(error);
3190 if (parameters != NULL) {
3191 g_variant_get(parameters, "(siu)", passphrase, &len, &ret);
3192 g_variant_unref(parameters);
3195 return TETHERING_ERROR_NONE;
3198 API int tethering_wifi_set_channel(tethering_h tethering, int channel)
3200 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3201 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3203 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3204 "parameter(tethering) is NULL\n");
3206 __tethering_h *th = (__tethering_h *)tethering;
3207 th->channel = channel;
3209 return TETHERING_ERROR_NONE;
3212 API int tethering_wifi_get_channel(tethering_h tethering, int *channel)
3214 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3215 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3217 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3218 "parameter(tethering) is NULL\n");
3220 _retvm_if(channel == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3221 "parameter(channel) is NULL\n");
3223 __tethering_h *th = (__tethering_h *)tethering;
3224 *channel = th->channel;
3226 return TETHERING_ERROR_NONE;
3229 API int tethering_wifi_set_mode(tethering_h tethering, tethering_wifi_mode_type_e type)
3231 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3232 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3234 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3235 "parameter(tethering) is NULL\n");
3237 __tethering_h *th = (__tethering_h *)tethering;
3239 th->mode_type = type;
3241 return TETHERING_ERROR_NONE;
3244 API int tethering_wifi_get_mode(tethering_h tethering, tethering_wifi_mode_type_e *type)
3246 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3247 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3249 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3250 "parameter(tethering) is NULL\n");
3251 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3252 "parameter(type) is NULL\n");
3254 __tethering_h *th = (__tethering_h *)tethering;
3255 *type = th->mode_type;
3257 return TETHERING_ERROR_NONE;
3263 * @brief Reload the settings (SSID / Passphrase / Security type / SSID visibility).
3265 * @privlevel platform
3266 * @privilege http://tizen.org/privilege/tethering.admin
3267 * @remarks Connected devices via Wi-Fi tethering or MobileAP will be disconnected when the settings are reloaded
3268 * @param[in] tethering The handle of tethering
3269 * @param[in] callback The callback function to invoke
3270 * @param[in] user_data The user data to be passed to the callback function
3271 * @return 0 on success, otherwise negative error value.
3272 * @retval #TETHERING_ERROR_NONE Successful
3273 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3274 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3276 API int tethering_wifi_reload_settings(tethering_h tethering, tethering_wifi_settings_reloaded_cb callback, void *user_data)
3279 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3280 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3282 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3283 "parameter(tethering) is NULL\n");
3284 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3285 "parameter(callback) is NULL\n");
3287 __tethering_h *th = (__tethering_h *)tethering;
3288 _softap_settings_t set = {"", "", "", 0, false};
3289 GDBusProxy *proxy = th->client_bus_proxy;
3294 if (th->settings_reloaded_cb) {
3295 ERR("Operation in progress\n");
3296 return TETHERING_ERROR_OPERATION_FAILED;
3299 ret = __prepare_wifi_settings(tethering, &set);
3300 if (ret != TETHERING_ERROR_NONE) {
3301 ERR("softap settings initialization failed\n");
3302 return TETHERING_ERROR_OPERATION_FAILED;
3305 th->settings_reloaded_cb = callback;
3306 th->settings_reloaded_user_data = user_data;
3308 g_dbus_proxy_call(proxy, "reload_wifi_settings",
3309 g_variant_new("(sssiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type),
3310 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
3311 (GAsyncReadyCallback) __settings_reloaded_cb, (gpointer)tethering);
3313 return TETHERING_ERROR_NONE;
3316 API int tethering_wifi_set_mac_filter(tethering_h tethering, bool mac_filter)
3318 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3319 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3321 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3322 "parameter(tethering) is NULL\n");
3324 __tethering_h *th = (__tethering_h *)tethering;
3325 th->mac_filter = mac_filter;
3327 return TETHERING_ERROR_NONE;
3330 API int tethering_wifi_get_mac_filter(tethering_h tethering, bool *mac_filter)
3332 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3333 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3335 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3336 "parameter(mac_filter) is NULL\n");
3337 _retvm_if(mac_filter == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3338 "parameter(mac_filter) is NULL\n");
3340 __tethering_h *th = (__tethering_h *)tethering;
3341 *mac_filter = th->mac_filter;
3343 return TETHERING_ERROR_NONE;
3346 static int __add_mac_to_file(const char *filepath, const char *mac)
3349 char line[MAX_BUF_SIZE] = "\0";
3350 bool mac_exist = false;
3353 p_mac = strdup(mac);
3354 if (p_mac == NULL) {
3355 ERR("strdup failed\n");
3356 return TETHERING_ERROR_OUT_OF_MEMORY;
3359 fp = fopen(filepath, "a+");
3361 ERR("fopen is failed\n");
3362 return TETHERING_ERROR_OPERATION_FAILED;
3365 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3366 if (strncmp(mac, line, 17) == 0) {
3367 DBG("MAC %s already exist in the list\n", mac);
3374 fprintf(fp, "%s\n", mac);
3376 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3377 allowed_list = g_slist_append(allowed_list, p_mac);
3378 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3379 blocked_list = g_slist_append(blocked_list, p_mac);
3384 return TETHERING_ERROR_NONE;
3387 static int __remove_mac_from_file(const char *filepath, const char *mac)
3391 char line[MAX_BUF_SIZE] = "\0";
3393 fp = fopen(filepath, "r");
3395 ERR("fopen is failed\n");
3396 return TETHERING_ERROR_OPERATION_FAILED;
3399 fp1 = fopen(TEMP_LIST, "w+");
3402 ERR("fopen is failed\n");
3403 return TETHERING_ERROR_OPERATION_FAILED;
3406 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3407 if (strncmp(mac, line, 17) == 0) {
3408 DBG("MAC %s found in the list\n", mac);
3410 if ((strcmp(filepath, ALLOWED_LIST) == 0)) {
3411 GSList *list = NULL;
3412 for (list = allowed_list; list != NULL; list = list->next) {
3413 char *p_mac = (char *)list->data;
3414 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3415 allowed_list = g_slist_remove(allowed_list, p_mac);
3417 } else if ((strcmp(filepath, BLOCKED_LIST) == 0)) {
3418 GSList *list = NULL;
3419 for (list = blocked_list; list != NULL; list = list->next) {
3420 char *p_mac = (char *)list->data;
3421 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3422 blocked_list = g_slist_remove(blocked_list, p_mac);
3426 fprintf(fp1, "%s", line);
3433 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3434 rename(TEMP_LIST, ALLOWED_LIST);
3435 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3436 rename(TEMP_LIST, BLOCKED_LIST);
3438 return TETHERING_ERROR_NONE;
3441 API int tethering_wifi_add_allowed_mac_list(tethering_h tethering, const char *mac)
3443 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3444 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3446 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3447 "parameter(tethering) is NULL\n");
3448 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3449 "parameter(mac) is NULL\n");
3451 return __add_mac_to_file(ALLOWED_LIST, mac);
3454 API int tethering_wifi_remove_allowed_mac_list(tethering_h tethering, const char *mac)
3456 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3457 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3459 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3460 "parameter(tethering) is NULL\n");
3461 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3462 "parameter(mac) is NULL\n");
3464 return __remove_mac_from_file(ALLOWED_LIST, mac);
3467 API int tethering_wifi_get_allowed_mac_list(tethering_h tethering, void **allowed_mac_list)
3469 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3470 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3472 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3473 "parameter(tethering) is NULL\n");
3474 _retvm_if(allowed_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3475 "parameter(allowed_mac_list) is NULL\n");
3477 *allowed_mac_list = g_slist_copy(allowed_list);
3478 return TETHERING_ERROR_NONE;
3481 API int tethering_wifi_add_blocked_mac_list(tethering_h tethering, const char *mac)
3483 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3484 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3486 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3487 "parameter(tethering) is NULL\n");
3488 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3489 "parameter(mac) is NULL\n");
3491 return __add_mac_to_file(BLOCKED_LIST, mac);
3494 API int tethering_wifi_remove_blocked_mac_list(tethering_h tethering, const char *mac)
3496 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3497 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3499 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3500 "parameter(tethering) is NULL\n");
3501 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3502 "parameter(mac) is NULL\n");
3504 return __remove_mac_from_file(BLOCKED_LIST, mac);
3507 API int tethering_wifi_get_blocked_mac_list(tethering_h tethering, void **blocked_mac_list)
3509 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3510 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3512 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3513 "parameter(tethering) is NULL\n");
3514 _retvm_if(blocked_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3515 "parameter(blocked_mac_list) is NULL\n");
3517 *blocked_mac_list = g_slist_copy(blocked_list);
3518 return TETHERING_ERROR_NONE;
3521 API int tethering_wifi_enable_dhcp(tethering_h tethering, bool enable)
3523 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3524 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3526 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3527 "parameter(tethering) is NULL\n");
3529 GVariant *parameters;
3530 GError *error = NULL;
3533 __tethering_h *th = (__tethering_h *)tethering;
3535 GDBusProxy *proxy = th->client_bus_proxy;
3537 parameters = g_dbus_proxy_call_sync(proxy, "enable_dhcp",
3538 g_variant_new("(b)", enable),
3539 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3542 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3543 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3544 result = TETHERING_ERROR_PERMISSION_DENIED;
3546 result = TETHERING_ERROR_OPERATION_FAILED;
3548 g_error_free(error);
3549 th->dhcp_enabled = false;
3554 g_variant_get(parameters, "(u)", &result);
3555 g_variant_unref(parameters);
3558 th->dhcp_enabled = true;
3560 th->dhcp_enabled = false;
3562 return TETHERING_ERROR_NONE;
3565 API int tethering_wifi_set_dhcp_range(tethering_h tethering, char *rangestart, char *rangestop)
3567 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3568 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3570 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3571 "parameter(tethering) is NULL\n");
3572 _retvm_if(rangestart == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3573 "parameter(rangestart) is NULL\n");
3574 _retvm_if(rangestop == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3575 "parameter(rangestop) is NULL\n");
3577 GVariant *parameters;
3578 GError *error = NULL;
3581 __tethering_h *th = (__tethering_h *)tethering;
3583 GDBusProxy *proxy = th->client_bus_proxy;
3585 parameters = g_dbus_proxy_call_sync(proxy, "dhcp_range",
3586 g_variant_new("(ss)", rangestart, rangestop),
3587 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3589 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3591 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3592 result = TETHERING_ERROR_PERMISSION_DENIED;
3594 result = TETHERING_ERROR_OPERATION_FAILED;
3596 g_error_free(error);
3597 th->dhcp_enabled = false;
3602 g_variant_get(parameters, "(u)", &result);
3603 g_variant_unref(parameters);
3605 th->dhcp_enabled = true;
3607 return TETHERING_ERROR_NONE;
3610 API int tethering_wifi_is_dhcp_enabled(tethering_h tethering, bool *dhcp_enabled)
3612 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3613 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3615 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3616 "parameter(tethering) is NULL\n");
3617 _retvm_if(dhcp_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3618 "parameter(dhcp_enabled) is NULL\n");
3620 __tethering_h *th = (__tethering_h *)tethering;
3621 *dhcp_enabled = th->dhcp_enabled;
3623 return TETHERING_ERROR_NONE;
3626 API int tethering_wifi_set_txpower(tethering_h tethering, unsigned int txpower)
3628 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3629 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3631 GError *error = NULL;
3633 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3634 "parameter(tethering) is NULL\n");
3635 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3636 TETHERING_ERROR_NOT_ENABLED,
3637 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3638 __tethering_h *th = (__tethering_h *)tethering;
3640 g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_set_txpower",
3641 g_variant_new("(u)", txpower),
3642 G_DBUS_CALL_FLAGS_NONE,
3643 -1, th->cancellable, &error);
3645 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
3646 g_clear_error(&error);
3647 return TETHERING_ERROR_OPERATION_FAILED;
3649 return TETHERING_ERROR_NONE;
3652 API int tethering_wifi_get_txpower(tethering_h tethering, unsigned int *txpower)
3654 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3655 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3657 GError *error = NULL;
3658 GVariant *result = NULL;
3660 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3661 "parameter(tethering) is NULL\n");
3662 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3663 TETHERING_ERROR_NOT_ENABLED,
3664 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3666 __tethering_h *th = (__tethering_h *)tethering;
3668 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_get_txpower",
3670 G_DBUS_CALL_FLAGS_NONE,
3671 -1, th->cancellable, &error);
3673 if (result != NULL) {
3674 g_variant_get(result, "(u)", txpower);
3675 g_variant_unref(result);
3678 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
3679 g_clear_error(&error);
3680 return TETHERING_ERROR_OPERATION_FAILED;
3682 g_clear_error(&error);
3683 return TETHERING_ERROR_NONE;
3686 API int tethering_wifi_set_mtu(tethering_h tethering, unsigned int mtu)
3688 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3689 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3691 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3692 "parameter(tethering) is NULL\n");
3694 GVariant *parameters;
3695 GError *error = NULL;
3698 __tethering_h *th = (__tethering_h *)tethering;
3700 GDBusProxy *proxy = th->client_bus_proxy;
3702 parameters = g_dbus_proxy_call_sync(proxy, "set_mtu",
3703 g_variant_new("(u)", mtu),
3704 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3706 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3708 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3709 result = TETHERING_ERROR_PERMISSION_DENIED;
3711 result = TETHERING_ERROR_OPERATION_FAILED;
3713 g_error_free(error);
3717 g_variant_get(parameters, "(u)", &result);
3719 g_variant_unref(parameters);
3721 return TETHERING_ERROR_NONE;
3724 API int tethering_wifi_change_mac(tethering_h tethering, char *mac)
3726 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3727 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3729 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3730 "parameter(tethering) is NULL\n");
3731 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3732 "parameter(mac) is NULL\n");
3734 GVariant *parameters;
3735 GError *error = NULL;
3738 __tethering_h *th = (__tethering_h *)tethering;
3740 GDBusProxy *proxy = th->client_bus_proxy;
3742 parameters = g_dbus_proxy_call_sync(proxy, "change_mac",
3743 g_variant_new("(s)", mac),
3744 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3746 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3748 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3749 result = TETHERING_ERROR_PERMISSION_DENIED;
3751 result = TETHERING_ERROR_OPERATION_FAILED;
3753 g_error_free(error);
3757 g_variant_get(parameters, "(u)", &result);
3758 g_variant_unref(parameters);
3760 if (result == MOBILE_AP_ERROR_NOT_PERMITTED)
3761 return TETHERING_ERROR_NOT_SUPPORT_API;
3763 return TETHERING_ERROR_NONE;
3766 API int tethering_wifi_set_max_connected_device(tethering_h tethering, int max_device)
3768 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3769 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3771 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3772 "parameter(tethering) is NULL\n");
3774 __tethering_h *th = (__tethering_h *)tethering;
3776 th->wifi_max_connected = max_device;
3778 return TETHERING_ERROR_NONE;
3781 API int tethering_wifi_get_max_connected_device(tethering_h tethering, int *max_device)
3783 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3784 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3786 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3787 "parameter(tethering) is NULL\n");
3788 _retvm_if(max_device == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3789 "parameter(max_device) is NULL\n");
3791 __tethering_h *th = (__tethering_h *)tethering;
3793 *max_device = th->wifi_max_connected;
3794 return TETHERING_ERROR_NONE;
3797 API int tethering_wifi_enable_port_forwarding(tethering_h tethering, bool enable)
3799 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3800 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3802 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3803 "parameter(tethering) is NULL\n");
3805 GVariant *parameters;
3806 GError *error = NULL;
3809 __tethering_h *th = (__tethering_h *)tethering;
3811 GDBusProxy *proxy = th->client_bus_proxy;
3813 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_forwarding",
3814 g_variant_new("(b)", enable),
3815 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3817 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3819 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3820 result = TETHERING_ERROR_PERMISSION_DENIED;
3822 result = TETHERING_ERROR_OPERATION_FAILED;
3824 g_error_free(error);
3828 g_variant_get(parameters, "(u)", &result);
3829 g_variant_unref(parameters);
3831 th->port_forwarding = true;
3833 return TETHERING_ERROR_NONE;
3836 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)
3838 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3839 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3841 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3842 "parameter(tethering) is NULL\n");
3843 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3844 "parameter(protocol) is NULL\n");
3846 GVariant *parameters;
3847 GError *error = NULL;
3849 char cmd[MAX_BUF_SIZE] = { 0, };
3852 __tethering_h *th = (__tethering_h *)tethering;
3854 GDBusProxy *proxy = th->client_bus_proxy;
3856 parameters = g_dbus_proxy_call_sync(proxy, "add_port_forwarding_rule",
3857 g_variant_new("(sssisi)", ifname, protocol, org_ip, org_port, final_ip, final_port),
3858 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3860 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3862 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3863 result = TETHERING_ERROR_PERMISSION_DENIED;
3865 result = TETHERING_ERROR_OPERATION_FAILED;
3867 g_error_free(error);
3871 g_variant_get(parameters, "(u)", &result);
3872 g_variant_unref(parameters);
3874 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);
3878 ERR("strdup failed\n");
3879 return TETHERING_ERROR_OUT_OF_MEMORY;
3882 port_forwarding = g_slist_append(port_forwarding, list);
3884 return TETHERING_ERROR_NONE;
3887 API int tethering_wifi_reset_port_forwarding_rule(tethering_h tethering)
3889 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3890 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3892 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3893 "parameter(tethering) is NULL\n");
3895 GVariant *parameters;
3896 GError *error = NULL;
3899 __tethering_h *th = (__tethering_h *)tethering;
3901 GDBusProxy *proxy = th->client_bus_proxy;
3903 parameters = g_dbus_proxy_call_sync(proxy, "reset_port_forwarding_rule",
3904 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3906 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3908 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3909 result = TETHERING_ERROR_PERMISSION_DENIED;
3911 result = TETHERING_ERROR_OPERATION_FAILED;
3913 g_error_free(error);
3917 g_variant_get(parameters, "(u)", &result);
3919 g_variant_unref(parameters);
3921 return TETHERING_ERROR_NONE;
3924 API int tethering_wifi_is_port_forwarding_enabled(tethering_h tethering, bool* forwarding_enabled)
3926 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3927 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3929 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3930 "parameter(tethering) is NULL\n");
3931 _retvm_if(forwarding_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3932 "parameter(forwarding_enabled) is NULL\n");
3934 __tethering_h *th = (__tethering_h *)tethering;
3936 *forwarding_enabled = th->port_forwarding;
3938 return TETHERING_ERROR_NONE;
3941 API int tethering_wifi_get_port_forwarding_rule(tethering_h tethering, void **port_forwarding_list)
3943 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3944 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3946 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3947 "parameter(tethering) is NULL\n");
3948 _retvm_if(port_forwarding_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3949 "parameter(port_forwarding_list) is NULL\n");
3951 *port_forwarding_list = g_slist_copy(port_forwarding);
3952 return TETHERING_ERROR_NONE;
3955 API int tethering_wifi_enable_port_filtering(tethering_h tethering, bool enable)
3957 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3958 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3960 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3961 "parameter(tethering) is NULL\n");
3963 GVariant *parameters;
3964 GError *error = NULL;
3967 __tethering_h *th = (__tethering_h *)tethering;
3969 GDBusProxy *proxy = th->client_bus_proxy;
3971 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_filtering",
3972 g_variant_new("(b)", enable),
3973 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3975 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3977 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3978 result = TETHERING_ERROR_PERMISSION_DENIED;
3980 result = TETHERING_ERROR_OPERATION_FAILED;
3982 g_error_free(error);
3986 g_variant_get(parameters, "(u)", &result);
3987 g_variant_unref(parameters);
3989 th->port_filtering = true;
3991 return TETHERING_ERROR_NONE;
3994 API int tethering_wifi_add_port_filtering_rule(tethering_h tethering, int port, char *protocol, bool allow)
3996 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3997 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3999 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4000 "parameter(tethering) is NULL\n");
4001 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4002 "parameter(protocol) is NULL\n");
4004 GVariant *parameters;
4005 GError *error = NULL;
4007 char cmd[MAX_BUF_SIZE] = { 0, };
4010 __tethering_h *th = (__tethering_h *)tethering;
4012 GDBusProxy *proxy = th->client_bus_proxy;
4014 parameters = g_dbus_proxy_call_sync(proxy, "add_port_filtering_rule",
4015 g_variant_new("(isb)", port, protocol, allow),
4016 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4018 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4020 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4021 result = TETHERING_ERROR_PERMISSION_DENIED;
4023 result = TETHERING_ERROR_OPERATION_FAILED;
4025 g_error_free(error);
4029 g_variant_get(parameters, "(u)", &result);
4030 g_variant_unref(parameters);
4033 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_ACCEPT);
4035 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_DROP);
4041 ERR("strdup failed\n");
4042 return TETHERING_ERROR_OUT_OF_MEMORY;
4045 port_filtering = g_slist_append(port_filtering, list);
4047 return TETHERING_ERROR_NONE;
4050 API int tethering_wifi_add_custom_port_filtering_rule(tethering_h tethering, int port1, int port2, char *protocol, bool allow)
4052 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4053 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4055 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4056 "parameter(tethering) is NULL\n");
4057 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4058 "parameter(protocol) is NULL\n");
4060 GVariant *parameters;
4061 GError *error = NULL;
4063 char cmd[MAX_BUF_SIZE] = { 0, };
4066 __tethering_h *th = (__tethering_h *)tethering;
4068 GDBusProxy *proxy = th->client_bus_proxy;
4070 parameters = g_dbus_proxy_call_sync(proxy, "add_custom_port_filtering_rule",
4071 g_variant_new("(iisb)", port1, port2, protocol, allow),
4072 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4074 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4076 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4077 result = TETHERING_ERROR_PERMISSION_DENIED;
4079 result = TETHERING_ERROR_OPERATION_FAILED;
4081 g_error_free(error);
4085 g_variant_get(parameters, "(u)", &result);
4086 g_variant_unref(parameters);
4089 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_ACCEPT);
4091 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_DROP);
4097 ERR("strdup failed\n");
4098 return TETHERING_ERROR_OUT_OF_MEMORY;
4101 custom_port_filtering = g_slist_append(custom_port_filtering, list);
4103 return TETHERING_ERROR_NONE;
4106 API int tethering_wifi_get_port_filtering_rule(tethering_h tethering, void **port_filtering_list)
4108 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4109 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4111 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4112 "parameter(tethering) is NULL\n");
4113 _retvm_if(port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4114 "parameter(port_filtering_list) is NULL\n");
4116 *port_filtering_list = g_slist_copy(port_filtering);
4117 return TETHERING_ERROR_NONE;
4120 API int tethering_wifi_get_custom_port_filtering_rule(tethering_h tethering, void **custom_port_filtering_list)
4122 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4123 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4125 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4126 "parameter(tethering) is NULL\n");
4127 _retvm_if(custom_port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4128 "parameter(custom_port_filtering_list) is NULL\n");
4130 *custom_port_filtering_list = g_slist_copy(custom_port_filtering);
4131 return TETHERING_ERROR_NONE;
4134 API int tethering_wifi_is_port_filtering_enabled(tethering_h tethering, bool* filtering_enabled)
4136 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4137 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4139 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4140 "parameter(tethering) is NULL\n");
4141 _retvm_if(filtering_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4142 "parameter(filtering_enabled) is NULL\n");
4144 __tethering_h *th = (__tethering_h *)tethering;
4146 *filtering_enabled = th->port_filtering;
4148 return TETHERING_ERROR_NONE;
4151 API int tethering_wifi_set_vpn_passthrough_rule(tethering_h tethering, tethering_vpn_passthrough_type_e type, bool enable)
4153 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4154 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4156 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4157 "parameter(tethering) is NULL\n");
4159 GVariant *parameters;
4160 GError *error = NULL;
4163 __tethering_h *th = (__tethering_h *)tethering;
4165 GDBusProxy *proxy = th->client_bus_proxy;
4167 parameters = g_dbus_proxy_call_sync(proxy, "set_vpn_passthrough_rule",
4168 g_variant_new("(ib)", type, enable),
4169 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4171 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4173 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4174 result = TETHERING_ERROR_PERMISSION_DENIED;
4176 result = TETHERING_ERROR_OPERATION_FAILED;
4178 g_error_free(error);
4182 g_variant_get(parameters, "(u)", &result);
4184 g_variant_unref(parameters);
4186 return TETHERING_ERROR_NONE;
4189 API int tethering_wifi_push_wps_button(tethering_h tethering)
4191 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4192 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4194 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4195 "parameter(tethering) is NULL");
4196 __tethering_h *th = (__tethering_h *)tethering;
4197 GDBusProxy *proxy = th->client_bus_proxy;
4198 GVariant *parameters = NULL;
4200 GError *error = NULL;
4202 parameters = g_dbus_proxy_call_sync(proxy, "push_wps_button",
4203 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4206 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4208 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4209 ret = TETHERING_ERROR_PERMISSION_DENIED;
4211 ret = TETHERING_ERROR_OPERATION_FAILED;
4213 g_error_free(error);
4217 if (parameters != NULL) {
4218 g_variant_get(parameters, "(u)", &ret);
4219 g_variant_unref(parameters);
4222 return TETHERING_ERROR_NONE;
4225 API int tethering_wifi_set_wps_pin(tethering_h tethering, const char *wps_pin)
4227 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4228 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4230 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4231 "parameter(tethering) is NULL");
4232 __tethering_h *th = (__tethering_h *)tethering;
4233 GDBusProxy *proxy = th->client_bus_proxy;
4234 GVariant *parameters = NULL;
4236 GError *error = NULL;
4238 parameters = g_dbus_proxy_call_sync(proxy, "set_wps_pin",
4239 g_variant_new("(s)", wps_pin), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4242 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4244 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4245 ret = TETHERING_ERROR_PERMISSION_DENIED;
4247 ret = TETHERING_ERROR_OPERATION_FAILED;
4249 g_error_free(error);
4253 if (parameters != NULL) {
4254 g_variant_get(parameters, "(u)", &ret);
4255 g_variant_unref(parameters);
4258 return TETHERING_ERROR_NONE;