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.
21 #include <sys/ioctl.h>
22 #include <sys/socket.h>
23 #include <netinet/in.h>
25 #include <arpa/inet.h>
27 #include <dbus/dbus.h>
30 #include <ckmc/ckmc-manager.h>
31 #include <tzplatform_config.h>
32 #include "tethering_private.h"
34 #define ALLOWED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.accept")
35 #define BLOCKED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.deny")
36 #define TEMP_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/.hostapd_tmp")
37 #define MAC_ADDR_LEN 18
38 #define MAX_BUF_SIZE 80
41 #define VCONFKEY_WIFI_TXPOWER "db/dnet/txpower" /**< VCONFKEY for TX Power */
42 #define VCONFKEY_WIFI_CHANNEL "db/dnet/channel" /**< VCONFKEY for Channel */
43 #define VCONFKEY_WIFI_SSID "db/dnet/ssid" /**< VCONFKEY for ssid */
45 #define DBUS_DEFAULT_REPLY_TIMEOUT 15000
46 #endif /* TIZEN_TV_EXT */
48 #define IPTABLES "/usr/sbin/iptables"
49 #define TABLE_NAT "nat"
50 #define TETH_NAT_PRE "teth_nat_pre"
51 #define TABLE_FILTER "filter"
52 #define TETH_FILTER_FW "teth_filter_fw"
53 #define ACTION_DROP "DROP"
54 #define ACTION_ACCEPT "ACCEPT"
55 #define PORT_FORWARD_RULE_STR "-t %s -A %s -i %s -p %s -d %s --dport %d -j DNAT --to %s:%d"
56 #define FILTERING_MULTIPORT_RULE_STR "-t %s -A %s -p %s -m multiport --dport %d,%d -j %s"
57 #define FILTERING_RULE_STR "-t %s -A %s -p %s --dport %d -j %s"
60 DUAL_BAND_NONE = 0, //0
61 DUAL_BAND_2G = 1 << 0, //1
62 DUAL_BAND_5G = 1 << 1, //2
63 DUAL_BAND_MIN_INTERFACE = 1 << 2, //4
64 DUAL_BAND_ALL = 7, //7
67 static GSList *allowed_list = NULL;
68 static GSList *blocked_list = NULL;
69 static GSList *port_forwarding = NULL;
70 static GSList *port_filtering = NULL;
71 static GSList *custom_port_filtering = NULL;
73 static void __handle_wifi_tether_on(GDBusConnection *connection, const gchar *sender_name,
74 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
75 GVariant *parameters, gpointer user_data);
77 static void __handle_wifi_tether_off(GDBusConnection *connection, const gchar *sender_name,
78 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
79 GVariant *parameters, gpointer user_data);
81 static void __handle_usb_tether_on(GDBusConnection *connection, const gchar *sender_name,
82 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
83 GVariant *parameters, gpointer user_data);
85 static void __handle_usb_tether_off(GDBusConnection *connection, const gchar *sender_name,
86 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
87 GVariant *parameters, gpointer user_data);
89 static void __handle_bt_tether_on(GDBusConnection *connection, const gchar *sender_name,
90 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
91 GVariant *parameters, gpointer user_data);
93 static void __handle_bt_tether_off(GDBusConnection *connection, const gchar *sender_name,
94 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
95 GVariant *parameters, gpointer user_data);
97 static void __handle_net_closed(GDBusConnection *connection, const gchar *sender_name,
98 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
99 GVariant *parameters, gpointer user_data);
101 static void __handle_no_data_timeout(GDBusConnection *connection, const gchar *sender_name,
102 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
103 GVariant *parameters, gpointer user_data);
105 static void __handle_low_battery_mode(GDBusConnection *connection, const gchar *sender_name,
106 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
107 GVariant *parameters, gpointer user_data);
109 static void __handle_flight_mode(GDBusConnection *connection, const gchar *sender_name,
110 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
111 GVariant *parameters, gpointer user_data);
113 static void __handle_security_type_changed(GDBusConnection *connection, const gchar *sender_name,
114 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
115 GVariant *parameters, gpointer user_data);
117 static void __handle_ssid_visibility_changed(GDBusConnection *connection, const gchar *sender_name,
118 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
119 GVariant *parameters, gpointer user_data);
121 static void __handle_passphrase_changed(GDBusConnection *connection, const gchar *sender_name,
122 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
123 GVariant *parameters, gpointer user_data);
125 static void __handle_dhcp(GDBusConnection *connection, const gchar *sender_name,
126 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
127 GVariant *parameters, gpointer user_data);
129 static __tethering_sig_t sigs[] = {
130 {0, SIGNAL_NAME_NET_CLOSED, __handle_net_closed},
131 {0, SIGNAL_NAME_WIFI_TETHER_ON, __handle_wifi_tether_on},
132 {0, SIGNAL_NAME_WIFI_TETHER_OFF, __handle_wifi_tether_off},
133 {0, SIGNAL_NAME_USB_TETHER_ON, __handle_usb_tether_on},
134 {0, SIGNAL_NAME_USB_TETHER_OFF, __handle_usb_tether_off},
135 {0, SIGNAL_NAME_BT_TETHER_ON, __handle_bt_tether_on},
136 {0, SIGNAL_NAME_BT_TETHER_OFF, __handle_bt_tether_off},
137 {0, SIGNAL_NAME_NO_DATA_TIMEOUT, __handle_no_data_timeout},
138 {0, SIGNAL_NAME_LOW_BATTERY_MODE, __handle_low_battery_mode},
139 {0, SIGNAL_NAME_FLIGHT_MODE, __handle_flight_mode},
140 {0, SIGNAL_NAME_SECURITY_TYPE_CHANGED, __handle_security_type_changed},
141 {0, SIGNAL_NAME_SSID_VISIBILITY_CHANGED, __handle_ssid_visibility_changed},
142 {0, SIGNAL_NAME_PASSPHRASE_CHANGED, __handle_passphrase_changed},
143 {0, SIGNAL_NAME_DHCP_STATUS, __handle_dhcp} };
145 static int retry = 0;
146 static int is_dualband_support = DUAL_BAND_NONE;
148 static void __reset_dualband_support(void)
150 is_dualband_support = DUAL_BAND_NONE;
153 static void __set_dualband_support(int band)
155 is_dualband_support |= band;
159 static gboolean __is_dualband_support(void)
161 return (is_dualband_support == DUAL_BAND_ALL) ? TRUE : FALSE;
163 static void __send_dbus_signal(GDBusConnection *conn, const char *signal_name, const char *arg)
165 if (conn == NULL || signal_name == NULL)
168 GVariant *message = NULL;
169 GError *error = NULL;
172 message = g_variant_new("(s)", arg);
174 g_dbus_connection_emit_signal(conn, NULL, TETHERING_SERVICE_OBJECT_PATH,
175 TETHERING_SERVICE_INTERFACE, signal_name, message, &error);
177 ERR("g_dbus_connection_emit_signal is failed because %s\n", error->message);
182 static bool __any_tethering_is_enabled(tethering_h tethering)
184 if (tethering_is_enabled(tethering, TETHERING_TYPE_USB) ||
185 tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) ||
186 tethering_is_enabled(tethering, TETHERING_TYPE_BT) ||
187 tethering_is_enabled(tethering, TETHERING_TYPE_P2P))
193 static tethering_error_e __set_security_type(const tethering_wifi_security_type_e security_type)
195 if (security_type != TETHERING_WIFI_SECURITY_TYPE_NONE &&
196 security_type != TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK &&
197 security_type != TETHERING_WIFI_SECURITY_TYPE_WPS &&
198 security_type != TETHERING_WIFI_SECURITY_TYPE_SAE) {
199 ERR("Invalid param\n");
200 return TETHERING_ERROR_INVALID_PARAMETER;
203 if (vconf_set_int(VCONFKEY_MOBILE_HOTSPOT_SECURITY, security_type) < 0) {
204 ERR("vconf_set_int is failed\n");
205 return TETHERING_ERROR_OPERATION_FAILED;
208 return TETHERING_ERROR_NONE;
211 static tethering_error_e __get_security_type(tethering_wifi_security_type_e *security_type)
213 if (security_type == NULL) {
214 ERR("Invalid param\n");
215 return TETHERING_ERROR_INVALID_PARAMETER;
218 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_SECURITY,
219 (int *)security_type) < 0) {
220 ERR("vconf_get_int is failed\n");
221 return TETHERING_ERROR_OPERATION_FAILED;
224 return TETHERING_ERROR_NONE;
227 static bool __get_ssid_from_vconf(const char *path, char *ssid, unsigned int size)
229 if (path == NULL || ssid == NULL || size == 0)
233 char *ptr_tmp = NULL;
235 ptr = vconf_get_str(path);
239 if (!g_strcmp0(ptr, ""))
242 if (!g_utf8_validate(ptr, -1, (const char **)&ptr_tmp))
245 g_strlcpy(ssid, ptr, size);
251 static tethering_error_e __set_visible(const bool visible)
253 if (vconf_set_int(VCONFKEY_MOBILE_HOTSPOT_HIDE, visible ? 0 : 1) < 0) {
254 ERR("vconf_set_int is failed\n");
255 return TETHERING_ERROR_OPERATION_FAILED;
258 return TETHERING_ERROR_NONE;
261 static tethering_error_e __get_visible(bool *visible)
263 if (visible == NULL) {
264 ERR("Invalid param\n");
265 return TETHERING_ERROR_INVALID_PARAMETER;
270 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_HIDE, &hide) < 0) {
271 ERR("vconf_get_int is failed\n");
272 return TETHERING_ERROR_OPERATION_FAILED;
279 return TETHERING_ERROR_NONE;
282 static unsigned int __generate_initial_passphrase(char *passphrase, unsigned int size)
284 if (passphrase == NULL ||
285 size == 0 || size < TETHERING_WIFI_KEY_MIN_LEN + 1)
288 guint32 rand_int = 0;
291 for (index = 0; index < TETHERING_WIFI_KEY_MIN_LEN; index++) {
292 rand_int = g_random_int_range('a', 'z');
293 passphrase[index] = rand_int;
295 passphrase[index] = '\0';
300 static tethering_error_e __get_error(int agent_error)
302 tethering_error_e err = TETHERING_ERROR_NONE;
304 switch (agent_error) {
305 case MOBILE_AP_ERROR_NONE:
306 err = TETHERING_ERROR_NONE;
309 case MOBILE_AP_ERROR_RESOURCE:
310 err = TETHERING_ERROR_OUT_OF_MEMORY;
313 case MOBILE_AP_ERROR_INTERNAL:
314 err = TETHERING_ERROR_OPERATION_FAILED;
317 case MOBILE_AP_ERROR_INVALID_PARAM:
318 err = TETHERING_ERROR_INVALID_PARAMETER;
321 case MOBILE_AP_ERROR_ALREADY_ENABLED:
322 err = TETHERING_ERROR_OPERATION_FAILED;
325 case MOBILE_AP_ERROR_NOT_ENABLED:
326 err = TETHERING_ERROR_NOT_ENABLED;
329 case MOBILE_AP_ERROR_NET_OPEN:
330 err = TETHERING_ERROR_OPERATION_FAILED;
333 case MOBILE_AP_ERROR_NET_CLOSE:
334 err = TETHERING_ERROR_OPERATION_FAILED;
337 case MOBILE_AP_ERROR_DHCP:
338 err = TETHERING_ERROR_OPERATION_FAILED;
341 case MOBILE_AP_ERROR_IN_PROGRESS:
342 err = TETHERING_ERROR_OPERATION_FAILED;
345 case MOBILE_AP_ERROR_NOT_PERMITTED:
346 err = TETHERING_ERROR_NOT_PERMITTED;
349 case MOBILE_AP_ERROR_PERMISSION_DENIED:
350 err = TETHERING_ERROR_PERMISSION_DENIED;
353 ERR("Not defined error : %d\n", agent_error);
354 err = TETHERING_ERROR_OPERATION_FAILED;
361 static void __handle_dhcp(GDBusConnection *connection, const gchar *sender_name,
362 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
363 GVariant *parameters, gpointer user_data)
368 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
370 __tethering_h *th = (__tethering_h *)user_data;
372 tethering_type_e type = 0;
373 mobile_ap_type_e ap_type = 0;
374 tethering_connection_state_changed_cb ccb = NULL;
375 __tethering_client_h client;
383 memset(&client, 0, sizeof(__tethering_client_h));
384 g_variant_get(parameters, "(susssu)", &buf, &ap_type, &ip, &mac, &name, ×tamp);
386 if (!g_strcmp0(buf, "DhcpConnected")) {
388 } else if (!g_strcmp0(buf, "DhcpLeaseDeleted")) {
391 ERR("Unknown event [%s]\n", buf);
395 if (ap_type == MOBILE_AP_TYPE_USB)
396 type = TETHERING_TYPE_USB;
397 else if (ap_type == MOBILE_AP_TYPE_WIFI)
398 type = TETHERING_TYPE_WIFI;
399 else if (ap_type == MOBILE_AP_TYPE_BT)
400 type = TETHERING_TYPE_BT;
401 else if (ap_type == MOBILE_AP_TYPE_P2P)
402 type = TETHERING_TYPE_P2P;
404 ERR("Not supported tethering type [%d]\n", ap_type);
408 SINFO("[%s] type %d, ip %s, mac %s, name %s, timestamp %d",
409 buf, ap_type, ip, mac, name, timestamp);
411 ccb = th->changed_cb[type];
414 data = th->changed_user_data[type];
416 client.interface = type;
417 g_strlcpy(client.ip, ip, sizeof(client.ip));
418 g_strlcpy(client.mac, mac, sizeof(client.mac));
420 client.hostname = g_strdup(name);
421 client.tm = (time_t)timestamp;
423 ccb((tethering_client_h)&client, opened, data);
424 g_free(client.hostname);
435 static void __handle_net_closed(GDBusConnection *connection, const gchar *sender_name,
436 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
437 GVariant *parameters, gpointer user_data)
442 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
444 __tethering_h *th = (__tethering_h *)user_data;
445 tethering_type_e type = 0;
446 tethering_disabled_cb dcb = NULL;
448 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_NETWORK_CLOSE;
450 SINFO("Tethering Disabled by network close !");
452 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
453 dcb = th->disabled_cb[type];
456 data = th->disabled_user_data[type];
458 dcb(TETHERING_ERROR_NONE, type, code, data);
465 static void __handle_wifi_tether_on(GDBusConnection *connection, const gchar *sender_name,
466 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
467 GVariant *parameters, gpointer user_data)
472 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
474 __tethering_h *th = (__tethering_h *)user_data;
475 tethering_type_e type = TETHERING_TYPE_WIFI;
476 bool is_requested = false;
477 tethering_enabled_cb ecb = NULL;
480 if (!_tethering_check_handle(th)) {
481 DBG("Tethering handle is not valid now, ignore it.");
486 ecb = th->enabled_cb[type];
492 data = th->enabled_user_data[type];
494 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
500 static void __handle_wifi_tether_off(GDBusConnection *connection, const gchar *sender_name,
501 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
502 GVariant *parameters, gpointer user_data)
507 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
509 __tethering_h *th = (__tethering_h *)user_data;
510 tethering_type_e type = TETHERING_TYPE_WIFI;
511 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
512 tethering_disabled_cb dcb = NULL;
516 if (!_tethering_check_handle(th)) {
517 DBG("Tethering handle is not valid now, ignore it.");
522 dcb = th->disabled_cb[type];
528 data = th->disabled_user_data[type];
529 g_variant_get(parameters, "(s)", &buf);
530 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
531 code = TETHERING_DISABLED_BY_WIFI_ON;
532 else if (!g_strcmp0(buf, SIGNAL_MSG_TIMEOUT))
533 code = TETHERING_DISABLED_BY_TIMEOUT;
536 dcb(TETHERING_ERROR_NONE, type, code, data);
542 static void __handle_usb_tether_on(GDBusConnection *connection, const gchar *sender_name,
543 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
544 GVariant *parameters, gpointer user_data)
549 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
551 __tethering_h *th = (__tethering_h *)user_data;
552 tethering_type_e type = TETHERING_TYPE_USB;
553 bool is_requested = false;
554 tethering_enabled_cb ecb = NULL;
557 if (!_tethering_check_handle(th)) {
558 DBG("Tethering handle is not valid now, ignore it.");
563 ecb = th->enabled_cb[type];
569 data = th->enabled_user_data[type];
571 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
577 static void __handle_usb_tether_off(GDBusConnection *connection, const gchar *sender_name,
578 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
579 GVariant *parameters, gpointer user_data)
584 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
586 __tethering_h *th = (__tethering_h *)user_data;
587 tethering_type_e type = TETHERING_TYPE_USB;
588 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
589 tethering_disabled_cb dcb = NULL;
593 if (!_tethering_check_handle(th)) {
594 DBG("Tethering handle is not valid now, ignore it.");
599 dcb = th->disabled_cb[type];
605 data = th->disabled_user_data[type];
607 g_variant_get(parameters, "(s)", &buf);
608 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
609 code = TETHERING_DISABLED_BY_USB_DISCONNECTION;
611 dcb(TETHERING_ERROR_NONE, type, code, data);
618 static void __handle_bt_tether_on(GDBusConnection *connection, const gchar *sender_name,
619 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
620 GVariant *parameters, gpointer user_data)
625 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
627 __tethering_h *th = (__tethering_h *)user_data;
628 tethering_type_e type = TETHERING_TYPE_BT;
629 bool is_requested = false;
630 tethering_enabled_cb ecb = NULL;
633 if (!_tethering_check_handle(th)) {
634 DBG("Tethering handle is not valid now, ignore it.");
639 ecb = th->enabled_cb[type];
645 data = th->enabled_user_data[type];
647 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
653 static void __handle_bt_tether_off(GDBusConnection *connection, const gchar *sender_name,
654 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
655 GVariant *parameters, gpointer user_data)
660 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
662 __tethering_h *th = (__tethering_h *)user_data;
663 tethering_type_e type = TETHERING_TYPE_BT;
664 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
665 tethering_disabled_cb dcb = NULL;
669 if (!_tethering_check_handle(th)) {
670 DBG("Tethering handle is not valid now, ignore it.");
675 dcb = th->disabled_cb[type];
681 data = th->disabled_user_data[type];
682 g_variant_get(parameters, "(s)", &buf);
683 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
684 code = TETHERING_DISABLED_BY_BT_OFF;
685 else if (!g_strcmp0(buf, SIGNAL_MSG_TIMEOUT))
686 code = TETHERING_DISABLED_BY_TIMEOUT;
688 dcb(TETHERING_ERROR_NONE, type, code, data);
696 static void __handle_no_data_timeout(GDBusConnection *connection, const gchar *sender_name,
697 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
698 GVariant *parameters, gpointer user_data)
703 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
705 __tethering_h *th = (__tethering_h *)user_data;
706 tethering_type_e type = 0;
707 tethering_disabled_cb dcb = NULL;
709 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_TIMEOUT;
711 if (!_tethering_check_handle(th)) {
712 DBG("Tethering handle is not valid now, ignore it.");
717 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
718 dcb = th->disabled_cb[type];
721 data = th->disabled_user_data[type];
723 dcb(TETHERING_ERROR_NONE, type, code, data);
730 static void __handle_low_battery_mode(GDBusConnection *connection, const gchar *sender_name,
731 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
732 GVariant *parameters, gpointer user_data)
737 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
739 __tethering_h *th = (__tethering_h *)user_data;
740 tethering_type_e type = 0;
741 tethering_disabled_cb dcb = NULL;
743 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_LOW_BATTERY;
745 if (!_tethering_check_handle(th)) {
746 DBG("Tethering handle is not valid now, ignore it.");
751 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
752 dcb = th->disabled_cb[type];
755 data = th->disabled_user_data[type];
757 dcb(TETHERING_ERROR_NONE, type, code, data);
764 static void __handle_flight_mode(GDBusConnection *connection, const gchar *sender_name,
765 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
766 GVariant *parameters, gpointer user_data)
771 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
773 __tethering_h *th = (__tethering_h *)user_data;
774 tethering_type_e type = 0;
775 tethering_disabled_cb dcb = NULL;
777 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_FLIGHT_MODE;
779 if (!_tethering_check_handle(th)) {
780 DBG("Tethering handle is not valid now, ignore it.");
785 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
786 dcb = th->disabled_cb[type];
789 data = th->disabled_user_data[type];
791 dcb(TETHERING_ERROR_NONE, type, code, data);
798 static void __handle_security_type_changed(GDBusConnection *connection, const gchar *sender_name,
799 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
800 GVariant *parameters, gpointer user_data)
806 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
807 __tethering_h *th = (__tethering_h *)user_data;
809 tethering_wifi_security_type_changed_cb scb = NULL;
811 tethering_wifi_security_type_e security_type;
814 if (!_tethering_check_handle(th)) {
815 DBG("Tethering handle is not valid now, ignore it.");
820 scb = th->security_type_changed_cb;
826 g_variant_get(parameters, "(s)", &buf);
827 data = th->security_type_user_data;
828 if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_OPEN_STR) == 0)
829 security_type = TETHERING_WIFI_SECURITY_TYPE_NONE;
830 else if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR) == 0)
831 security_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
832 else if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_WPS_STR) == 0)
833 security_type = TETHERING_WIFI_SECURITY_TYPE_WPS;
834 else if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_SAE_STR) == 0)
835 security_type = TETHERING_WIFI_SECURITY_TYPE_SAE;
837 SERR("Unknown type : %s\n", buf);
843 scb(security_type, data);
849 static void __handle_ssid_visibility_changed(GDBusConnection *connection, const gchar *sender_name,
850 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
851 GVariant *parameters, gpointer user_data)
856 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
857 __tethering_h *th = (__tethering_h *)user_data;
859 tethering_wifi_ssid_visibility_changed_cb scb = NULL;
861 bool visible = false;
864 if (!_tethering_check_handle(th)) {
865 DBG("Tethering handle is not valid now, ignore it.");
870 scb = th->ssid_visibility_changed_cb;
876 g_variant_get(parameters, "(s)", &buf);
877 data = th->ssid_visibility_user_data;
878 if (g_strcmp0(buf, SIGNAL_MSG_SSID_VISIBLE) == 0)
888 static void __handle_passphrase_changed(GDBusConnection *connection, const gchar *sender_name,
889 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
890 GVariant *parameters, gpointer user_data)
895 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
896 __tethering_h *th = (__tethering_h *)user_data;
898 tethering_wifi_passphrase_changed_cb pcb = NULL;
901 if (!_tethering_check_handle(th)) {
902 DBG("Tethering handle is not valid now, ignore it.");
907 pcb = th->passphrase_changed_cb;
913 data = th->passphrase_user_data;
921 static void __wifi_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
927 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
928 GError *g_error = NULL;
931 tethering_type_e type = TETHERING_TYPE_WIFI;
932 tethering_error_e error;
933 __tethering_h *th = (__tethering_h *)user_data;
935 tethering_enabled_cb ecb = th->enabled_cb[type];
936 void *data = th->enabled_user_data[type];
938 if (!_tethering_check_handle((tethering_h)user_data)) {
939 DBG("Tethering handle is not valid now, ignore it.");
944 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
946 ERR("DBus error [%s]\n", g_error->message);
947 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
948 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
949 g_error_free(g_error);
950 tethering_enable((tethering_h)th, type);
953 } else if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
954 error = TETHERING_ERROR_PERMISSION_DENIED;
956 error = TETHERING_ERROR_OPERATION_FAILED;
957 g_error_free(g_error);
959 g_variant_get(g_var, "(u)", &info);
960 error = __get_error(info);
964 INFO("cfm event : wifi tethering enable info : %d\n", error);
966 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
967 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_ON].name,
968 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
969 sigs[E_SIGNAL_WIFI_TETHER_ON].cb, (gpointer)th, NULL);
971 SINFO("Tethering enabled event ! error(%d)", error);
978 ecb(error, type, true, data);
979 g_variant_unref(g_var);
985 static void __bt_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
991 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
992 GError *g_error = NULL;
995 tethering_error_e error;
997 __tethering_h *th = (__tethering_h *)user_data;
998 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_BT];
999 void *data = th->enabled_user_data[TETHERING_TYPE_BT];
1001 if (!_tethering_check_handle((tethering_h)user_data)) {
1002 DBG("Tethering handle is not valid now, ignore it.");
1007 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1009 ERR("DBus error [%s]\n", g_error->message);
1010 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
1011 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
1012 g_error_free(g_error);
1013 tethering_enable((tethering_h)th, TETHERING_TYPE_BT);
1018 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1019 error = TETHERING_ERROR_PERMISSION_DENIED;
1021 error = TETHERING_ERROR_OPERATION_FAILED;
1022 g_error_free(g_error);
1024 g_variant_get(g_var, "(u)", &info);
1025 g_variant_unref(g_var);
1026 error = __get_error(info);
1030 sigs[E_SIGNAL_BT_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1031 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_ON].name,
1032 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1033 sigs[E_SIGNAL_BT_TETHER_ON].cb, (gpointer)th, NULL);
1041 ecb(error, TETHERING_TYPE_BT, true, data);
1047 static void __usb_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
1053 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1054 __tethering_h *th = (__tethering_h *)user_data;
1055 GError *g_error = NULL;
1058 tethering_error_e error;
1059 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_USB];
1060 void *data = th->enabled_user_data[TETHERING_TYPE_USB];
1062 if (!_tethering_check_handle((tethering_h)user_data)) {
1063 DBG("Tethering handle is not valid now, ignore it.");
1068 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1070 ERR("DBus error [%s]\n", g_error->message);
1071 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
1072 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
1073 g_error_free(g_error);
1074 tethering_enable((tethering_h)th, TETHERING_TYPE_USB);
1079 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1080 error = TETHERING_ERROR_PERMISSION_DENIED;
1082 error = TETHERING_ERROR_OPERATION_FAILED;
1083 g_error_free(g_error);
1085 g_variant_get(g_var, "(u)", &info);
1086 g_variant_unref(g_var);
1087 error = __get_error(info);
1091 sigs[E_SIGNAL_USB_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1092 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_ON].name,
1093 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1094 sigs[E_SIGNAL_USB_TETHER_ON].cb, (gpointer)th, NULL);
1102 ecb(error, TETHERING_TYPE_USB, true, data);
1108 static void __p2p_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
1114 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1115 __tethering_h *th = (__tethering_h *)user_data;
1116 GError *g_error = NULL;
1119 tethering_error_e error;
1120 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_P2P];
1121 void *data = th->enabled_user_data[TETHERING_TYPE_P2P];
1123 if (!_tethering_check_handle((tethering_h)user_data)) {
1124 DBG("Tethering handle is not valid now, ignore it.");
1129 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1131 ERR("DBus error [%s]\n", g_error->message);
1132 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
1133 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
1134 g_error_free(g_error);
1135 tethering_enable((tethering_h)th, TETHERING_TYPE_P2P);
1140 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1141 error = TETHERING_ERROR_PERMISSION_DENIED;
1143 error = TETHERING_ERROR_OPERATION_FAILED;
1144 g_error_free(g_error);
1146 g_variant_get(g_var, "(u)", &info);
1147 g_variant_unref(g_var);
1148 error = __get_error(info);
1158 ecb(error, TETHERING_TYPE_P2P, true, data);
1164 static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
1170 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1171 GError *g_error = NULL;
1173 guint info, event_type;
1174 tethering_error_e error;
1175 tethering_type_e type;
1176 tethering_h tethering = (tethering_h)user_data;
1177 __tethering_h *th = (__tethering_h *)tethering;
1178 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_REQUEST;
1179 tethering_disabled_cb dcb = NULL;
1182 if (!_tethering_check_handle((tethering_h)user_data)) {
1183 DBG("Tethering handle is not valid now, ignore it.");
1188 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1190 ERR("DBus error [%s]\n", g_error->message);
1191 g_error_free(g_error);
1195 g_variant_get(g_var, "(uu)", &event_type, &info);
1196 INFO("cfm event : %d info : %d\n", event_type, info);
1197 g_variant_unref(g_var);
1198 error = __get_error(info);
1199 INFO("cfm event : %d info : %d\n", event_type, error);
1200 switch (event_type) {
1201 case MOBILE_AP_DISABLE_WIFI_TETHERING_CFM:
1202 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1203 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
1204 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1205 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
1207 type = TETHERING_TYPE_WIFI;
1208 dcb = th->disabled_cb[type];
1209 data = th->disabled_user_data[type];
1211 dcb(error, type, code, data);
1214 case MOBILE_AP_DISABLE_BT_TETHERING_CFM:
1215 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1216 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1217 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1218 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1220 type = TETHERING_TYPE_BT;
1221 dcb = th->disabled_cb[type];
1222 data = th->disabled_user_data[type];
1224 dcb(error, type, code, data);
1227 case MOBILE_AP_DISABLE_USB_TETHERING_CFM:
1228 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1229 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1230 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1231 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1233 type = TETHERING_TYPE_USB;
1234 dcb = th->disabled_cb[type];
1235 data = th->disabled_user_data[type];
1237 dcb(error, type, code, data);
1240 case MOBILE_AP_DISABLE_P2P_TETHERING_CFM:
1241 type = TETHERING_TYPE_P2P;
1242 dcb = th->disabled_cb[type];
1243 data = th->disabled_user_data[type];
1245 dcb(error, type, code, data);
1248 case MOBILE_AP_DISABLE_CFM:
1250 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1251 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
1252 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1253 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
1254 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1255 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1256 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1257 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1258 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1259 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1260 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1261 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1263 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
1264 dcb = th->disabled_cb[type];
1267 data = th->disabled_user_data[type];
1269 dcb(error, type, code, data);
1274 ERR("Invalid event\n");
1282 static void __get_data_usage_cb(GObject *source_object, GAsyncResult *res,
1288 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1290 GError *g_error = NULL;
1293 guint64 tx_bytes, rx_bytes;
1294 __tethering_h *th = (__tethering_h *)user_data;
1295 tethering_error_e tethering_error = TETHERING_ERROR_NONE;
1298 if (!_tethering_check_handle((tethering_h)user_data)) {
1299 DBG("Tethering handle is not valid now, ignore it.");
1304 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1306 ERR("DBus fail [%s]\n", g_error->message);
1307 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1308 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1310 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1314 if (th->data_usage_cb == NULL) {
1315 ERR("There is no data_usage_cb\n");
1320 th->data_usage_cb(tethering_error, 0LL, 0LL, th->data_usage_user_data);
1322 g_variant_get(g_var, "(utt)", &event_type, &tx_bytes, &rx_bytes);
1323 th->data_usage_cb(TETHERING_ERROR_NONE,
1324 rx_bytes, tx_bytes, th->data_usage_user_data);
1325 g_variant_unref(g_var);
1327 th->data_usage_cb = NULL;
1328 th->data_usage_user_data = NULL;
1334 static void __settings_reloaded_cb(GObject *source_object, GAsyncResult *res,
1340 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1341 GError *g_error = NULL;
1344 __tethering_h *th = (__tethering_h *)user_data;
1345 tethering_error_e tethering_error = TETHERING_ERROR_NONE;
1347 if (!_tethering_check_handle((tethering_h)user_data)) {
1348 DBG("Tethering handle is not valid now, ignore it.");
1353 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1355 ERR("DBus fail [%s]\n", g_error->message);
1356 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1357 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1359 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1360 g_error_free(g_error);
1362 g_variant_get(g_var, "(u)", &info);
1363 if (tethering_error == TETHERING_ERROR_NONE)
1364 tethering_error = __get_error(info);
1365 g_variant_unref(g_var);
1368 if (th->settings_reloaded_cb == NULL) {
1369 DBG("There is no settings_reloaded_cb\n-\n");
1374 th->settings_reloaded_cb(tethering_error,
1375 th->settings_reloaded_user_data);
1377 th->settings_reloaded_cb = NULL;
1378 th->settings_reloaded_user_data = NULL;
1384 static void __connect_signals(tethering_h tethering)
1387 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1389 __tethering_h *th = (__tethering_h *)tethering;
1390 GDBusConnection *connection = th->client_bus;
1393 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++) {
1394 sigs[i].sig_id = g_dbus_connection_signal_subscribe(connection,
1395 NULL, TETHERING_SERVICE_INTERFACE, sigs[i].name,
1396 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1397 sigs[i].cb, tethering, NULL);
1402 static void __disconnect_signals(tethering_h tethering)
1406 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1408 __tethering_h *th = (__tethering_h *)tethering;
1409 GDBusConnection *connection = th->client_bus;
1413 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++)
1414 g_dbus_connection_signal_unsubscribe(connection, sigs[i].sig_id);
1420 static bool __get_intf_name(tethering_type_e type, char *buf, unsigned int len)
1422 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1425 case TETHERING_TYPE_USB:
1426 g_strlcpy(buf, TETHERING_USB_IF, len);
1428 case TETHERING_TYPE_WIFI:
1429 g_strlcpy(buf, TETHERING_WIFI_IF, len);
1431 case TETHERING_TYPE_BT:
1432 g_strlcpy(buf, TETHERING_BT_IF, len);
1434 case TETHERING_TYPE_P2P:
1435 g_strlcpy(buf, TETHERING_P2P_IF, len);
1438 ERR("Not supported type : %d\n", type);
1444 static bool __get_gateway_addr(tethering_type_e type, char *buf, unsigned int len)
1446 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1449 case TETHERING_TYPE_USB:
1450 g_strlcpy(buf, TETHERING_USB_GATEWAY, len);
1452 case TETHERING_TYPE_WIFI:
1453 g_strlcpy(buf, TETHERING_WIFI_GATEWAY, len);
1455 case TETHERING_TYPE_BT:
1456 g_strlcpy(buf, TETHERING_BT_GATEWAY, len);
1458 case TETHERING_TYPE_P2P:
1459 g_strlcpy(buf, TETHERING_P2P_GATEWAY, len);
1462 ERR("Not supported type : %d\n", type);
1468 static int __get_common_ssid(char *ssid, unsigned int size)
1471 ERR("ssid is null\n");
1472 return TETHERING_ERROR_INVALID_PARAMETER;
1476 if (__get_ssid_from_vconf(VCONFKEY_WIFI_SSID, ssid, size))
1477 return TETHERING_ERROR_NONE;
1479 ERR("vconf key get failed for ssid or invalid ssid is found");
1480 #endif /* TIZEN_TV_EXT */
1482 if (__get_ssid_from_vconf(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
1483 ssid, size) == false) {
1484 ERR("vconf_get_str is failed and set default ssid");
1485 g_strlcpy(ssid, TETHERING_DEFAULT_SSID, size);
1488 return TETHERING_ERROR_NONE;
1491 static bool __get_wifi_mode_type(tethering_wifi_mode_type_e type, char **buf)
1493 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1496 case TETHERING_WIFI_MODE_TYPE_B:
1497 *buf = g_strdup("b");
1499 case TETHERING_WIFI_MODE_TYPE_G:
1500 *buf = g_strdup("g");
1502 case TETHERING_WIFI_MODE_TYPE_A:
1503 *buf = g_strdup("a");
1505 case TETHERING_WIFI_MODE_TYPE_AD:
1506 *buf = g_strdup("ad");
1509 ERR("Not supported type : %d\n", type);
1515 static int __prepare_wifi_settings(tethering_h tethering, _softap_settings_t *set)
1519 __tethering_h *th = (__tethering_h *)tethering;
1520 tethering_error_e ret = TETHERING_ERROR_NONE;
1523 if (th == NULL || set == NULL) {
1524 ERR("null parameter\n-\n");
1525 return TETHERING_ERROR_INVALID_PARAMETER;
1528 if (th->ssid == NULL)
1529 __get_common_ssid(set->ssid, sizeof(set->ssid));
1531 g_strlcpy(set->ssid, th->ssid, sizeof(set->ssid));
1533 ret = __get_security_type(&set->sec_type);
1534 if (ret != TETHERING_ERROR_NONE)
1535 set->sec_type = th->sec_type;
1537 ret = __get_visible(&set->visibility);
1538 if (ret != TETHERING_ERROR_NONE)
1539 set->visibility = th->visibility;
1541 set->mac_filter = th->mac_filter;
1542 set->max_connected = th->wifi_max_connected;
1543 set->channel = th->channel;
1544 set->txpower = th->txpower;
1546 __get_wifi_mode_type(th->mode_type, &ptr);
1548 g_strlcpy(set->mode, "", sizeof(set->mode));
1550 g_strlcpy(set->mode, ptr, sizeof(set->mode));
1554 if (set->sec_type == TETHERING_WIFI_SECURITY_TYPE_NONE) {
1555 g_strlcpy(set->key, "", sizeof(set->key));
1557 GDBusProxy *proxy = th->client_bus_proxy;
1558 GVariant *parameters;
1559 GError *error = NULL;
1560 char *passphrase = NULL;
1561 unsigned int len = 0;
1563 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
1564 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1567 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
1569 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
1570 ret = TETHERING_ERROR_PERMISSION_DENIED;
1572 ret = TETHERING_ERROR_OPERATION_FAILED;
1574 g_error_free(error);
1578 if (parameters != NULL) {
1579 g_variant_get(parameters, "(siu)", &passphrase, &len, &ret);
1580 g_strlcpy(set->key, passphrase, sizeof(set->key) - 1);
1582 g_variant_unref(parameters);
1586 INFO("ssid: %s security: %d mode: %s channel: %d visibility: %s\n",
1587 set->ssid, set->sec_type, set->mode, set->channel,
1588 (set->visibility) ? "true" : "false");
1590 return TETHERING_ERROR_NONE;
1593 static bool __check_precondition(__tethering_h *th, tethering_type_e type)
1595 int dnet_status = 0;
1596 int cellular_state = 0;
1598 /* data network through cellular */
1599 vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &cellular_state);
1600 if (cellular_state == VCONFKEY_NETWORK_CELLULAR_ON) {
1601 INFO("Data Network can be connected later");
1605 /* data network status */
1606 vconf_get_int(VCONFKEY_NETWORK_STATUS, &dnet_status);
1607 if ((dnet_status == VCONFKEY_NETWORK_WIFI
1608 && type != TETHERING_TYPE_WIFI)
1609 || (th->wifi_sharing && dnet_status == VCONFKEY_NETWORK_WIFI
1610 && type == TETHERING_TYPE_WIFI)
1611 || dnet_status == VCONFKEY_NETWORK_ETHERNET)
1614 ERR("Network is not available!");
1619 static void __set_vconf_values_for_tv(__tethering_h *tethering)
1621 int ret, channel, txpower;
1622 __tethering_h *th = tethering;
1627 ret = vconf_get_int(VCONFKEY_WIFI_CHANNEL, &channel);
1629 ERR("vconf key get failed for channel !!");
1630 channel = TETHERING_WIFI_CHANNEL;
1633 ret = vconf_get_int(VCONFKEY_WIFI_TXPOWER, &txpower);
1635 ERR("vconf key get failed for txpower !!");
1636 txpower = TETHERING_WIFI_MAX_TXPOWER;
1639 th->channel = channel;
1640 th->txpower = txpower;
1642 #endif /* TIZEN_TV_EXT */
1646 * @brief Creates the handle of tethering.
1648 * @privlevel platform
1649 * @privilege http://tizen.org/privilege/tethering.admin
1650 * @remarks The @a tethering must be released tethering_destroy() by you.
1651 * @param[out] tethering A handle of a new mobile ap handle on success
1652 * @return 0 on success, otherwise a negative error value.
1653 * @retval #TETHERING_ERROR_NONE Successful
1654 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1655 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1656 * @retval #TETHERING_ERROR_NOT_SUPPORT_API API is not supported
1657 * @see tethering_destroy()
1659 API int tethering_create(tethering_h *tethering)
1661 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1662 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1663 "parameter(tethering) is NULL\n");
1666 __tethering_h *th = NULL;
1667 GError *error = NULL;
1668 char ssid[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
1670 th = (__tethering_h *)malloc(sizeof(__tethering_h));
1672 _retvm_if(th == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
1673 "malloc is failed\n");
1674 memset(th, 0x00, sizeof(__tethering_h));
1675 th->sec_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
1676 th->visibility = true;
1677 th->mac_filter = false;
1678 th->wifi_sharing = false;
1679 th->channel = TETHERING_WIFI_CHANNEL;
1680 th->mode_type = TETHERING_WIFI_MODE_TYPE_G;
1681 th->wifi_max_connected = TETHERING_WIFI_MAX_STA;
1682 th->txpower = TETHERING_WIFI_MAX_TXPOWER;
1684 if (__generate_initial_passphrase(th->passphrase,
1685 sizeof(th->passphrase)) == 0) {
1686 ERR("random passphrase generation failed\n");
1688 return TETHERING_ERROR_OPERATION_FAILED;
1691 if (__get_common_ssid(ssid, sizeof(ssid)) != TETHERING_ERROR_NONE) {
1692 ERR("common ssid get failed\n");
1694 return TETHERING_ERROR_OPERATION_FAILED;
1698 __set_vconf_values_for_tv(th);
1699 #endif /* TIZEN_TV_EXT */
1700 SINFO("ssid: %s, key: %s, channel: %d, mode: %d, txpower: %d, security: %d max_device: %d\n",
1701 ssid, th->passphrase, th->channel, th->mode_type, th->txpower, th->sec_type,
1702 th->wifi_max_connected);
1704 #if !GLIB_CHECK_VERSION(2, 36, 0)
1707 GCancellable *cancellable = g_cancellable_new();
1708 th->client_bus = g_bus_get_sync(DBUS_BUS_SYSTEM, cancellable, &error);
1710 ERR("Couldn't connect to the System bus[%s]", error->message);
1711 g_error_free(error);
1712 g_cancellable_cancel(cancellable);
1713 g_object_unref(cancellable);
1715 return TETHERING_ERROR_OPERATION_FAILED;
1717 th->cancellable = cancellable;
1719 th->client_bus_proxy = g_dbus_proxy_new_sync(th->client_bus, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION,
1720 NULL, TETHERING_SERVICE_NAME, TETHERING_SERVICE_OBJECT_PATH,
1721 TETHERING_SERVICE_INTERFACE, th->cancellable, &error);
1722 if (!th->client_bus_proxy) {
1724 ERR("Couldn't create the proxy object because of %s\n", error->message);
1725 g_cancellable_cancel(th->cancellable);
1726 g_object_unref(th->cancellable);
1727 g_object_unref(th->client_bus);
1729 return TETHERING_ERROR_OPERATION_FAILED;
1732 __connect_signals((tethering_h)th);
1734 *tethering = (tethering_h)th;
1735 _tethering_add_handle(th);
1736 INFO("Tethering Handle : %p\n", th);
1738 return TETHERING_ERROR_NONE;
1743 * @brief Destroys the handle of tethering.
1745 * @privlevel platform
1746 * @privilege http://tizen.org/privilege/tethering.admin
1747 * @param[in] tethering The handle of tethering
1748 * @return 0 on success, otherwise a negative error value.
1749 * @retval #TETHERING_ERROR_NONE Successful
1750 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1751 * @see tethering_create()
1753 API int tethering_destroy(tethering_h tethering)
1756 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1757 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1758 "parameter(tethering) is NULL\n");
1760 __tethering_h *th = (__tethering_h *)tethering;
1762 INFO("Tethering Handle : %p\n", th);
1764 __disconnect_signals(tethering);
1765 _tethering_remove_handle(th);
1770 g_object_unref(th->cancellable);
1771 g_object_unref(th->client_bus_proxy);
1772 g_object_unref(th->client_bus);
1773 memset(th, 0x00, sizeof(__tethering_h));
1778 return TETHERING_ERROR_NONE;
1783 * @brief Enables the tethering, asynchronously.
1785 * @privlevel platform
1786 * @privilege http://tizen.org/privilege/tethering.admin
1787 * @param[in] tethering The handle of tethering
1788 * @param[in] type The type of tethering
1789 * @return 0 on success, otherwise negative error value.
1790 * @retval #TETHERING_ERROR_NONE Successful
1791 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1792 * @post tethering_enabled_cb() will be invoked.
1793 * @see tethering_is_enabled()
1794 * @see tethering_disable()
1796 API int tethering_enable(tethering_h tethering, tethering_type_e type)
1798 INFO("+ type : %d\n", type);
1799 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1800 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1801 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1802 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1804 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1805 "parameter(tethering) is NULL\n");
1807 tethering_error_e ret = TETHERING_ERROR_NONE;
1808 __tethering_h *th = (__tethering_h *)tethering;
1809 GDBusProxy *proxy = th->client_bus_proxy;
1810 GDBusConnection *connection = th->client_bus;
1813 g_dbus_proxy_set_default_timeout(proxy, DBUS_DEFAULT_REPLY_TIMEOUT);
1814 #else /* TIZEN_TV_EXT */
1815 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1816 #endif /* TIZEN_TV_EXT */
1818 if (__check_precondition(th, type) == FALSE) {
1820 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1821 return TETHERING_ERROR_OPERATION_FAILED;
1825 case TETHERING_TYPE_USB:
1826 g_dbus_connection_signal_unsubscribe(connection,
1827 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1829 g_dbus_proxy_call(proxy, "enable_usb_tethering",
1830 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1831 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1832 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1835 case TETHERING_TYPE_WIFI: {
1836 _softap_settings_t set = {"", "", "", 0, false};
1838 ret = __prepare_wifi_settings(tethering, &set);
1839 if (ret != TETHERING_ERROR_NONE) {
1840 ERR("softap settings initialization failed\n");
1842 return TETHERING_ERROR_OPERATION_FAILED;
1844 g_dbus_connection_signal_unsubscribe(connection,
1845 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1847 SINFO("ssid %s, key %s, channel %d, mode %s, txpower %d, security %d max_device %d\n",
1848 set.ssid, set.key, set.channel, set.mode, set.txpower, set.sec_type,
1851 char key[TETHERING_WIFI_KEY_MAX_LEN + 1] = "wifi_tether";
1852 if (th->wifi_sharing)
1853 g_strlcpy(key, "wifi_sharing", TETHERING_WIFI_KEY_MAX_LEN + 1);
1855 SINFO("enable_wifi_tethering key: %s", key);
1856 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1857 g_variant_new("(ssssiiiiiii)", key, set.ssid, set.key, set.mode,
1858 set.channel, set.visibility, set.mac_filter, set.max_connected,
1859 set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV4),
1860 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1861 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1865 case TETHERING_TYPE_BT:
1866 g_dbus_connection_signal_unsubscribe(connection,
1867 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1869 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1870 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1871 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1872 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1876 case TETHERING_TYPE_P2P: {
1877 _softap_settings_t p2p_set = {"", "", "", 0, false};
1878 ret = __prepare_wifi_settings(tethering, &p2p_set);
1879 if (ret != TETHERING_ERROR_NONE) {
1880 ERR("p2p settings initialization failed\n");
1881 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1883 return TETHERING_ERROR_OPERATION_FAILED;
1886 g_dbus_proxy_call(proxy, "enable_p2p_tethering",
1887 g_variant_new("(ssi)", p2p_set.ssid, p2p_set.key, p2p_set.channel),
1888 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1889 (GAsyncReadyCallback) __p2p_enabled_cfm_cb, (gpointer)tethering);
1893 case TETHERING_TYPE_ALL: {
1894 _softap_settings_t set = {"", "", "", 0, false};
1896 ret = __prepare_wifi_settings(tethering, &set);
1897 if (ret != TETHERING_ERROR_NONE) {
1898 ERR("softap settings initialization failed\n");
1899 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1900 return TETHERING_ERROR_OPERATION_FAILED;
1903 /* TETHERING_TYPE_USB */
1904 g_dbus_connection_signal_unsubscribe(connection,
1905 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1907 g_dbus_proxy_call(proxy, "enable_usb_tethering",
1908 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1909 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1910 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1912 /* TETHERING_TYPE_WIFI */
1913 g_dbus_connection_signal_unsubscribe(connection,
1914 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1916 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1917 g_variant_new("(ssssiiiiiii)", "wifi_tether", set.ssid, set.key, set.mode,
1918 set.channel, set.visibility, set.mac_filter, set.max_connected,
1919 set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV4),
1920 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1921 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1923 /* TETHERING_TYPE_BT */
1924 g_dbus_connection_signal_unsubscribe(connection,
1925 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1927 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1928 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1929 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1930 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1934 ERR("Unknown type : %d\n", type);
1936 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1939 return TETHERING_ERROR_INVALID_PARAMETER;
1942 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1944 return TETHERING_ERROR_NONE;
1947 API int tethering_ipv6_enable(tethering_h tethering, tethering_type_e type)
1949 DBG("+ type : %d\n", type);
1950 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1951 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1952 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1953 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1955 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1956 "parameter(tethering) is NULL\n");
1958 __tethering_h *th = (__tethering_h *)tethering;
1959 GDBusProxy *proxy = th->client_bus_proxy;
1960 GDBusConnection *connection = th->client_bus;
1963 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1965 if (__check_precondition(th, type) == FALSE) {
1967 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1968 return TETHERING_ERROR_OPERATION_FAILED;
1972 case TETHERING_TYPE_USB: {
1973 g_dbus_connection_signal_unsubscribe(connection,
1974 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1976 g_dbus_proxy_call(proxy, "enable_usb_tethering",
1977 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1978 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1979 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1983 case TETHERING_TYPE_WIFI: {
1984 _softap_settings_t set = {"", "", "", 0, false, false, 0, 0};
1986 ret = __prepare_wifi_settings(tethering, &set);
1987 if (ret != TETHERING_ERROR_NONE) {
1988 ERR("softap settings initialization failed\n");
1990 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1991 return TETHERING_ERROR_OPERATION_FAILED;
1993 g_dbus_connection_signal_unsubscribe(connection,
1994 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1996 SINFO("ssid %s, key %s, channel %d, mode %s, txpower %d, security %d max_device %d\n",
1997 set.ssid, set.key, set.channel, set.mode, set.txpower, set.sec_type,
2000 char key[TETHERING_WIFI_KEY_MAX_LEN + 1] = "wifi_tether";
2001 if (th->wifi_sharing)
2002 g_strlcpy(key, "wifi_sharing", TETHERING_WIFI_KEY_MAX_LEN + 1);
2004 SINFO("enable_wifi_tethering key: %s", key);
2005 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
2006 g_variant_new("(ssssiiiiiii)", key, set.ssid, set.key, set.mode,
2007 set.channel, set.visibility, set.mac_filter, set.max_connected,
2008 set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV6),
2009 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2010 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
2014 case TETHERING_TYPE_BT: {
2015 g_dbus_connection_signal_unsubscribe(connection,
2016 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
2018 g_dbus_proxy_call(proxy, "enable_bt_tethering",
2019 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
2020 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2021 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
2027 ERR("Unknown type : %d\n", type);
2029 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
2032 return TETHERING_ERROR_INVALID_PARAMETER;
2036 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
2038 return TETHERING_ERROR_NONE;
2041 API int tethering_ipv6_disable(tethering_h tethering, tethering_type_e type)
2043 DBG("+ type : %d\n", type);
2044 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2045 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2046 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2047 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2049 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2050 "parameter(tethering) is NULL\n");
2052 __tethering_h *th = (__tethering_h *)tethering;
2053 GDBusProxy *proxy = th->client_bus_proxy;
2054 GDBusConnection *connection = th->client_bus;
2057 case TETHERING_TYPE_USB:
2058 g_dbus_connection_signal_unsubscribe(connection,
2059 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
2061 g_dbus_proxy_call(proxy, "disable_usb_tethering",
2062 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
2063 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2064 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2067 case TETHERING_TYPE_WIFI:
2068 DBG("Disable wifi tethering..");
2069 g_dbus_connection_signal_unsubscribe(connection,
2070 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
2072 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
2073 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
2074 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2075 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2078 case TETHERING_TYPE_BT:
2079 g_dbus_connection_signal_unsubscribe(connection,
2080 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
2082 g_dbus_proxy_call(proxy, "disable_bt_tethering",
2083 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
2084 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2085 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2089 ERR("Not supported tethering type [%d]\n", type);
2091 return TETHERING_ERROR_INVALID_PARAMETER;
2094 return TETHERING_ERROR_NONE;
2098 * @brief Disables the tethering, asynchronously.
2100 * @privlevel platform
2101 * @privilege http://tizen.org/privilege/tethering.admin
2102 * @param[in] tethering The handle of tethering
2103 * @param[in] type The type of tethering
2104 * @return 0 on success, otherwise negative error value.
2105 * @retval #TETHERING_ERROR_NONE Successful
2106 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2107 * @post tethering_disabled_cb() will be invoked.
2108 * @see tethering_is_enabled()
2109 * @see tethering_enable()
2111 API int tethering_disable(tethering_h tethering, tethering_type_e type)
2113 INFO("+ type : %d\n", type);
2114 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2115 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2116 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2117 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2119 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2120 "parameter(tethering) is NULL\n");
2122 __tethering_h *th = (__tethering_h *)tethering;
2123 GDBusProxy *proxy = th->client_bus_proxy;
2124 GDBusConnection *connection = th->client_bus;
2127 case TETHERING_TYPE_USB:
2128 g_dbus_connection_signal_unsubscribe(connection,
2129 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
2131 g_dbus_proxy_call(proxy, "disable_usb_tethering",
2132 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
2133 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2134 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2138 case TETHERING_TYPE_WIFI:
2139 g_dbus_connection_signal_unsubscribe(connection,
2140 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
2142 SINFO("Disable Wi-Fi Tethering !");
2144 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
2145 g_variant_new("(ii)", TETHERING_ADDRESS_FAMILY_IPV4, th->mode_type),
2146 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2147 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2150 case TETHERING_TYPE_BT:
2152 g_dbus_connection_signal_unsubscribe(connection,
2153 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
2155 g_dbus_proxy_call(proxy, "disable_bt_tethering",
2156 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
2157 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2158 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2161 case TETHERING_TYPE_P2P:
2162 g_dbus_proxy_call(proxy, "disable_p2p_tethering",
2163 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2164 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2167 case TETHERING_TYPE_ALL:
2168 g_dbus_connection_signal_unsubscribe(connection,
2169 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
2171 g_dbus_proxy_call(proxy, "disable_usb_tethering",
2172 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
2173 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2174 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2176 g_dbus_connection_signal_unsubscribe(connection,
2177 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
2179 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
2180 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
2181 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2182 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2184 g_dbus_connection_signal_unsubscribe(connection,
2185 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
2187 g_dbus_proxy_call(proxy, "disable_bt_tethering",
2188 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
2189 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2190 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
2194 ERR("Not supported tethering type [%d]\n", type);
2196 return TETHERING_ERROR_INVALID_PARAMETER;
2199 return TETHERING_ERROR_NONE;
2204 * @brief Checks whetehr the tethering is enabled or not.
2206 * @privlevel platform
2207 * @privilege http://tizen.org/privilege/tethering.admin
2208 * @param[in] tethering The handle of tethering
2209 * @param[in] type The type of tethering
2210 * @return @c true if tethering is enabled, \n @c false if tethering is disabled.
2212 API bool tethering_is_enabled(tethering_h tethering, tethering_type_e type)
2214 INFO("+ type : %d\n", type);
2216 int vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_NONE;
2218 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2220 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &is_on) != 0)
2224 case TETHERING_TYPE_USB:
2225 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_USB;
2228 case TETHERING_TYPE_WIFI:
2229 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI;
2232 case TETHERING_TYPE_BT:
2233 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_BT;
2236 case TETHERING_TYPE_P2P:
2237 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_P2P;
2241 ERR("Not supported type : %d\n", type);
2244 INFO("- enabled: %s\n", (is_on & vconf_type) ? "true" : "false");
2245 return is_on & vconf_type ? true : false;
2250 * @brief Gets the MAC address of local device as "FC:A1:3E:D6:B1:B1".
2252 * @privlevel platform
2253 * @privilege http://tizen.org/privilege/tethering.admin
2254 * @remarks @a mac_address must be released with free() by you.
2255 * @param[in] tethering The handle of tethering
2256 * @param[in] type The type of tethering
2257 * @param[out] mac_address The MAC address
2258 * @return 0 on success, otherwise a negative error value.
2259 * @retval #TETHERING_ERROR_NONE Successful
2260 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2261 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2262 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2263 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2264 * @pre tethering must be enabled.
2265 * @see tethering_is_enabled()
2266 * @see tethering_enable()
2268 API int tethering_get_mac_address(tethering_h tethering, tethering_type_e type, char **mac_address)
2270 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2271 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2272 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2273 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2275 _retvm_if(tethering_is_enabled(tethering, type) == false,
2276 TETHERING_ERROR_NOT_ENABLED,
2277 "tethering type[%d] is not enabled\n", type);
2278 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2279 "parameter(tethering) is NULL\n");
2280 _retvm_if(mac_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2281 "parameter(mac_address) is NULL\n");
2285 char *macbuf = NULL;
2287 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2288 TETHERING_ERROR_OPERATION_FAILED,
2289 "getting interface name is failed\n");
2291 s = socket(AF_INET, SOCK_DGRAM, 0);
2292 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2293 "getting socket is failed\n");
2294 if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
2295 ERR("getting mac is failed\n");
2297 return TETHERING_ERROR_OPERATION_FAILED;
2301 macbuf = (char *)malloc(TETHERING_STR_INFO_LEN);
2302 _retvm_if(macbuf == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2303 "Not enough memory\n");
2304 snprintf(macbuf, TETHERING_STR_INFO_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
2305 (unsigned char)ifr.ifr_hwaddr.sa_data[0],
2306 (unsigned char)ifr.ifr_hwaddr.sa_data[1],
2307 (unsigned char)ifr.ifr_hwaddr.sa_data[2],
2308 (unsigned char)ifr.ifr_hwaddr.sa_data[3],
2309 (unsigned char)ifr.ifr_hwaddr.sa_data[4],
2310 (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
2312 *mac_address = macbuf;
2314 return TETHERING_ERROR_NONE;
2319 * @brief Gets the name of network interface. For example, usb0.
2321 * @privlevel platform
2322 * @privilege http://tizen.org/privilege/tethering.admin
2323 * @remarks @a interface_name must be released with free() by you.
2324 * @param[in] tethering The handle of tethering
2325 * @param[in] type The type of tethering
2326 * @param[out] interface_name The name of network interface
2327 * @return 0 on success, otherwise negative error value.
2328 * @retval #TETHERING_ERROR_NONE Successful
2329 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2330 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2331 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2332 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2333 * @pre tethering must be enabled.
2334 * @see tethering_is_enabled()
2335 * @see tethering_enable()
2337 API int tethering_get_network_interface_name(tethering_h tethering, tethering_type_e type, char **interface_name)
2339 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2340 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2341 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2342 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2344 _retvm_if(tethering_is_enabled(tethering, type) == false,
2345 TETHERING_ERROR_NOT_ENABLED,
2346 "tethering type[%d] is not enabled\n", type);
2347 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2348 "parameter(tethering) is NULL\n");
2349 _retvm_if(interface_name == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2350 "parameter(interface_name) is NULL\n");
2352 char intf[TETHERING_STR_INFO_LEN] = {0, };
2354 _retvm_if(!__get_intf_name(type, intf, sizeof(intf)),
2355 TETHERING_ERROR_OPERATION_FAILED,
2356 "getting interface name is failed\n");
2357 *interface_name = strdup(intf);
2358 _retvm_if(*interface_name == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2359 "Not enough memory\n");
2361 return TETHERING_ERROR_NONE;
2366 * @brief Gets the local IP address.
2368 * @privlevel platform
2369 * @privilege http://tizen.org/privilege/tethering.admin
2370 * @remarks @a ip_address must be released with free() by you.
2371 * @param[in] tethering The handle of tethering
2372 * @param[in] type The type of tethering
2373 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2374 * @param[out] ip_address The local IP address
2375 * @return 0 on success, otherwise negative error value.
2376 * @retval #TETHERING_ERROR_NONE Successful
2377 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2378 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2379 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2380 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2381 * @pre tethering must be enabled.
2382 * @see tethering_is_enabled()
2383 * @see tethering_enable()
2385 API int tethering_get_ip_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **ip_address)
2387 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2388 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2389 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2390 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2392 _retvm_if(tethering_is_enabled(tethering, type) == false,
2393 TETHERING_ERROR_NOT_ENABLED,
2394 "tethering type[%d] is not enabled\n", type);
2395 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2396 "parameter(tethering) is NULL\n");
2397 _retvm_if(ip_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2398 "parameter(ip_address) is NULL\n");
2404 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2405 TETHERING_ERROR_OPERATION_FAILED,
2406 "getting interface name is failed\n");
2408 s = socket(AF_INET, SOCK_DGRAM, 0);
2409 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2410 "getting socket is failed\n");
2411 if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
2412 ERR("ioctl is failed\n");
2414 return TETHERING_ERROR_OPERATION_FAILED;
2418 ipbuf = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
2419 *ip_address = strdup(ipbuf);
2420 _retvm_if(*ip_address == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2421 "Not enough memory\n");
2423 return TETHERING_ERROR_NONE;
2428 * @brief Gets the Gateway address.
2430 * @privlevel platform
2431 * @privilege http://tizen.org/privilege/tethering.admin
2432 * @remarks @a gateway_address must be released with free() by you.
2433 * @param[in] tethering The handle of tethering
2434 * @param[in] type The type of tethering
2435 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2436 * @param[out] gateway_address The local IP address
2437 * @return 0 on success, otherwise negative error value.
2438 * @retval #TETHERING_ERROR_NONE Successful
2439 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2440 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2441 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2442 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2443 * @pre tethering must be enabled.
2444 * @see tethering_is_enabled()
2445 * @see tethering_enable()
2447 API int tethering_get_gateway_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **gateway_address)
2449 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2450 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2451 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2452 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2454 _retvm_if(tethering_is_enabled(tethering, type) == false,
2455 TETHERING_ERROR_NOT_ENABLED,
2456 "tethering type[%d] is not enabled\n", type);
2457 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2458 "parameter(tethering) is NULL\n");
2459 _retvm_if(gateway_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2460 "parameter(gateway_address) is NULL\n");
2462 char gateway_buf[TETHERING_STR_INFO_LEN] = {0, };
2464 _retvm_if(!__get_gateway_addr(type, gateway_buf, sizeof(gateway_buf)),
2465 TETHERING_ERROR_OPERATION_FAILED,
2466 "getting gateway address is failed\n");
2468 *gateway_address = strdup(gateway_buf);
2470 return TETHERING_ERROR_NONE;
2475 * @brief Gets the Subnet Mask.
2477 * @privlevel platform
2478 * @privilege http://tizen.org/privilege/tethering.admin
2479 * @remarks @a subnet_mask must be released with free() by you.
2480 * @param[in] tethering The handle of tethering
2481 * @param[in] type The type of tethering
2482 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2483 * @param[out] subnet_mask The local IP address
2484 * @return 0 on success, otherwise negative error value.
2485 * @retval #TETHERING_ERROR_NONE Successful
2486 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2487 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2488 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2489 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2490 * @pre tethering must be enabled.
2491 * @see tethering_is_enabled()
2492 * @see tethering_enable()
2494 API int tethering_get_subnet_mask(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **subnet_mask)
2496 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2497 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2498 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2499 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2501 _retvm_if(tethering_is_enabled(tethering, type) == false,
2502 TETHERING_ERROR_NOT_ENABLED,
2503 "tethering is not enabled\n");
2504 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2505 "parameter(tethering) is NULL\n");
2506 _retvm_if(subnet_mask == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2507 "parameter(subnet_mask) is NULL\n");
2509 *subnet_mask = strdup(TETHERING_SUBNET_MASK);
2510 _retvm_if(*subnet_mask == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2511 "Not enough memory\n");
2513 return TETHERING_ERROR_NONE;
2518 * @brief Gets the data usage.
2520 * @privlevel platform
2521 * @privilege http://tizen.org/privilege/tethering.admin
2522 * @param[in] tethering The handle of tethering
2523 * @param[out] usage The data usage
2524 * @return 0 on success, otherwise negative error value.
2525 * @retval #TETHERING_ERROR_NONE Successful
2526 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2527 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2528 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2529 * @pre tethering must be enabled.
2530 * @see tethering_is_enabled()
2531 * @see tethering_enable()
2533 API int tethering_get_data_usage(tethering_h tethering, tethering_data_usage_cb callback, void *user_data)
2535 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2537 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2538 "parameter(tethering) is NULL\n");
2539 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2540 "parameter(callback) is NULL\n");
2541 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2542 TETHERING_ERROR_NOT_ENABLED,
2543 "tethering is not enabled\n");
2545 __tethering_h *th = (__tethering_h *)tethering;
2546 GDBusProxy *proxy = th->client_bus_proxy;
2548 th->data_usage_cb = callback;
2549 th->data_usage_user_data = user_data;
2551 g_dbus_proxy_call(proxy, "get_data_packet_usage",
2552 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2553 (GAsyncReadyCallback) __get_data_usage_cb, (gpointer)tethering);
2555 return TETHERING_ERROR_NONE;
2560 * @brief Gets the client which is connected by tethering "type".
2562 * @privlevel platform
2563 * @privilege http://tizen.org/privilege/tethering.admin
2564 * @param[in] tethering The handle of tethering
2565 * @param[in] type The type of tethering
2566 * @param[in] callback The callback function to invoke
2567 * @param[in] user_data The user data to be passed to the callback function
2568 * @retval #TETHERING_ERROR_NONE Successful
2569 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2570 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2571 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2572 * @pre tethering must be enabled.
2573 * @see tethering_is_enabled()
2574 * @see tethering_enable()
2577 API int tethering_is_dualband_supported(tethering_h tethering, tethering_type_e type, bool *supported)
2579 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2580 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2582 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2583 "parameter(tethering) is NULL\n");
2585 __tethering_h *th = (__tethering_h *)tethering;
2586 gchar *if_name = NULL;
2587 gboolean Is2GBandSupported = FALSE;
2588 gboolean Is5GBandSupported = FALSE;
2589 GError *error = NULL;
2590 GVariant *result = NULL;
2591 GVariantIter *outer_iter = NULL;
2592 GVariantIter *inner_iter = NULL;
2593 GVariant *station = NULL;
2594 GVariant *value = NULL;
2599 __reset_dualband_support();
2600 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "get_wifi_interfaces",
2601 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
2604 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
2605 g_error_free(error);
2606 return TETHERING_ERROR_OPERATION_FAILED;
2608 g_variant_get(result, "(a(a{sv}))", &outer_iter);
2609 while (g_variant_iter_loop(outer_iter, "(@a{sv})", &station)) {
2610 g_variant_get(station, "a{sv}", &inner_iter);
2611 while (g_variant_iter_loop(inner_iter, "{sv}", &key, &value)) {
2612 if (g_strcmp0(key, "IfName") == 0) {
2613 g_variant_get(value, "s", &if_name);
2614 SDBG("Interface Name is %s\n", if_name);
2615 } else if (g_strcmp0(key, "Is2GBandSupported") == 0) {
2616 Is2GBandSupported = g_variant_get_boolean(value);
2617 SDBG("Is2GBandSupported is %d\n", Is2GBandSupported);
2618 if (Is2GBandSupported)
2619 __set_dualband_support(DUAL_BAND_2G);
2620 } else if (g_strcmp0(key, "Is5GBandSupported") == 0) {
2621 Is5GBandSupported = g_variant_get_boolean(value);
2622 SDBG("Is5GBandSupported is %d\n", Is5GBandSupported);
2623 if (Is5GBandSupported)
2624 __set_dualband_support(DUAL_BAND_5G);
2626 ERR("Key %s not required\n", key);
2631 g_variant_iter_free(inner_iter);
2634 __set_dualband_support(DUAL_BAND_MIN_INTERFACE);
2635 *supported = __is_dualband_support();
2636 DBG("count:%d is dualband suppport: %d", count, *supported);
2637 g_variant_iter_free(outer_iter);
2638 g_variant_unref(result);
2640 return TETHERING_ERROR_NONE;
2642 API int tethering_foreach_connected_clients(tethering_h tethering, tethering_type_e type, tethering_connected_client_cb callback, void *user_data)
2644 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2645 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2646 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2647 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2649 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2650 "parameter(tethering) is NULL\n");
2651 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2652 "parameter(callback) is NULL\n");
2653 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2654 TETHERING_ERROR_NOT_ENABLED,
2655 "tethering is not enabled\n");
2657 mobile_ap_type_e interface;
2658 tethering_band_e band;
2659 __tethering_h *th = (__tethering_h *)tethering;
2660 __tethering_client_h client = {0, };
2663 gchar *hostname = NULL;
2664 guint timestamp = 0;
2665 GError *error = NULL;
2666 GVariant *result = NULL;
2667 GVariantIter *outer_iter = NULL;
2668 GVariantIter *inner_iter = NULL;
2669 GVariant *station = NULL;
2670 GVariant *value = NULL;
2673 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "get_station_info",
2674 NULL, G_DBUS_CALL_FLAGS_NONE,
2675 -1, th->cancellable, &error);
2678 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
2679 g_error_free(error);
2680 return TETHERING_ERROR_OPERATION_FAILED;
2683 g_variant_get(result, "(a(a{sv}))", &outer_iter);
2684 while (g_variant_iter_loop(outer_iter, "(@a{sv})", &station)) {
2685 g_variant_get(station, "a{sv}", &inner_iter);
2686 while (g_variant_iter_loop(inner_iter, "{sv}", &key, &value)) {
2687 if (g_strcmp0(key, "Type") == 0) {
2688 interface = g_variant_get_int32(value);
2689 if (interface == MOBILE_AP_TYPE_USB)
2690 client.interface = TETHERING_TYPE_USB;
2691 else if (interface == MOBILE_AP_TYPE_WIFI)
2692 client.interface = TETHERING_TYPE_WIFI;
2693 else if (interface == MOBILE_AP_TYPE_BT)
2694 client.interface = TETHERING_TYPE_BT;
2695 else if (interface == MOBILE_AP_TYPE_P2P)
2696 client.interface = TETHERING_TYPE_P2P;
2698 ERR("Invalid interface\n");
2700 g_variant_unref(value);
2703 DBG("interface is %d\n", client.interface);
2704 if (client.interface != type && (TETHERING_TYPE_ALL != type)) {
2706 g_variant_unref(value);
2709 } else if (g_strcmp0(key, "IP") == 0) {
2710 g_variant_get(value, "s", &ip);
2711 SDBG("ip is %s\n", ip);
2712 g_strlcpy(client.ip, ip, sizeof(client.ip));
2713 } else if (g_strcmp0(key, "MAC") == 0) {
2714 g_variant_get(value, "s", &mac);
2715 SDBG("mac is %s\n", mac);
2716 g_strlcpy(client.mac, mac, sizeof(client.mac));
2717 } else if (g_strcmp0(key, "Name") == 0) {
2718 g_variant_get(value, "s", &hostname);
2719 SDBG("hsotname is %s\n", hostname);
2721 client.hostname = g_strdup(hostname);
2722 } else if (g_strcmp0(key, "Time") == 0) {
2723 timestamp = g_variant_get_int32(value);
2724 DBG("timestamp is %d\n", timestamp);
2725 client.tm = (time_t)timestamp;
2726 } else if (g_strcmp0(key, "Band") == 0) {
2727 band = g_variant_get_int32(value);
2728 client.band = (!band) ? TETHERING_WIFI_BAND_2G : TETHERING_WIFI_BAND_5G;
2729 SDBG("band type %d\n", band);
2731 ERR("Key %s not required\n", key);
2742 g_variant_iter_free(inner_iter);
2743 if ((th->mode_type == 0 || th->mode_type == 1) && client.band != TETHERING_WIFI_BAND_2G) //if band is not for 2g continue
2745 if ((th->mode_type == 2 || th->mode_type == 3) && client.band != TETHERING_WIFI_BAND_5G) //if band is not for 5g continue
2747 SDBG("mode_type: %d and client.band: %d ", th->mode_type, client.band);
2748 if (callback((tethering_client_h)&client, user_data) == false) {
2749 DBG("iteration is stopped\n");
2750 g_free(client.hostname);
2751 client.hostname = NULL;
2752 g_variant_iter_free(outer_iter);
2753 g_variant_unref(result);
2755 return TETHERING_ERROR_OPERATION_FAILED;
2757 g_free(client.hostname);
2758 client.hostname = NULL;
2760 g_variant_iter_free(outer_iter);
2761 g_variant_unref(result);
2763 return TETHERING_ERROR_NONE;
2768 * @brief Registers the callback function called when tethering is enabled.
2770 * @privlevel platform
2771 * @privilege http://tizen.org/privilege/tethering.admin
2772 * @param[in] tethering The handle of tethering
2773 * @param[in] type The type of tethering
2774 * @param[in] callback The callback function to invoke
2775 * @param[in] user_data The user data to be passed to the callback function
2776 * @retval #TETHERING_ERROR_NONE Successful
2777 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2778 * @see tethering_unset_enabled_cb()
2780 API int tethering_set_enabled_cb(tethering_h tethering, tethering_type_e type, tethering_enabled_cb callback, void *user_data)
2782 INFO("+ type: %d\n", type);
2783 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2784 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2785 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2786 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2788 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2789 "parameter(tethering) is NULL\n");
2790 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2791 "parameter(callback) is NULL\n");
2793 __tethering_h *th = (__tethering_h *)tethering;
2794 tethering_type_e ti;
2796 if (type != TETHERING_TYPE_ALL) {
2797 th->enabled_cb[type] = callback;
2798 th->enabled_user_data[type] = user_data;
2800 return TETHERING_ERROR_NONE;
2803 /* TETHERING_TYPE_ALL */
2804 for (ti = TETHERING_TYPE_USB; ti < TETHERING_TYPE_MAX; ti++) {
2805 th->enabled_cb[ti] = callback;
2806 th->enabled_user_data[ti] = user_data;
2810 return TETHERING_ERROR_NONE;
2815 * @brief Unregisters the callback function called when tethering is disabled.
2817 * @privlevel platform
2818 * @privilege http://tizen.org/privilege/tethering.admin
2819 * @param[in] tethering The handle of tethering
2820 * @param[in] type The type of tethering
2821 * @retval #TETHERING_ERROR_NONE Successful
2822 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2823 * @see tethering_set_enabled_cb()
2825 API int tethering_unset_enabled_cb(tethering_h tethering, tethering_type_e type)
2827 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2828 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2829 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2830 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2832 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2833 "parameter(tethering) is NULL\n");
2835 __tethering_h *th = (__tethering_h *)tethering;
2836 tethering_type_e ti;
2838 if (type != TETHERING_TYPE_ALL) {
2839 th->enabled_cb[type] = NULL;
2840 th->enabled_user_data[type] = NULL;
2842 return TETHERING_ERROR_NONE;
2845 /* TETHERING_TYPE_ALL */
2846 for (ti = TETHERING_TYPE_USB; ti < TETHERING_TYPE_MAX; ti++) {
2847 th->enabled_cb[ti] = NULL;
2848 th->enabled_user_data[ti] = NULL;
2851 return TETHERING_ERROR_NONE;
2856 * @brief Registers the callback function called when tethering is disabled.
2858 * @privlevel platform
2859 * @privilege http://tizen.org/privilege/tethering.admin
2860 * @param[in] tethering The handle of tethering
2861 * @param[in] type The type of tethering
2862 * @param[in] callback The callback function to invoke
2863 * @param[in] user_data The user data to be passed to the callback function
2864 * @retval #TETHERING_ERROR_NONE Successful
2865 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2866 * @see tethering_unset_disabled_cb()
2868 API int tethering_set_disabled_cb(tethering_h tethering, tethering_type_e type, tethering_disabled_cb callback, void *user_data)
2870 INFO("+ type: %d\n", type);
2871 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2872 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2873 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2874 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2876 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2877 "parameter(tethering) is NULL\n");
2878 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2879 "parameter(callback) is NULL\n");
2881 __tethering_h *th = (__tethering_h *)tethering;
2882 tethering_type_e ti;
2884 if (type != TETHERING_TYPE_ALL) {
2885 th->disabled_cb[type] = callback;
2886 th->disabled_user_data[type] = user_data;
2888 return TETHERING_ERROR_NONE;
2891 /* TETHERING_TYPE_ALL */
2892 for (ti = TETHERING_TYPE_USB; ti < TETHERING_TYPE_MAX; ti++) {
2893 th->disabled_cb[ti] = callback;
2894 th->disabled_user_data[ti] = user_data;
2897 return TETHERING_ERROR_NONE;
2902 * @brief Unregisters the callback function called when tethering is disabled.
2904 * @privlevel platform
2905 * @privilege http://tizen.org/privilege/tethering.admin
2906 * @param[in] tethering The handle of tethering
2907 * @param[in] type The type of tethering
2908 * @retval #TETHERING_ERROR_NONE Successful
2909 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2910 * @see tethering_set_disabled_cb()
2912 API int tethering_unset_disabled_cb(tethering_h tethering, tethering_type_e type)
2914 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2915 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2916 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2917 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2919 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2920 "parameter(tethering) is NULL\n");
2922 __tethering_h *th = (__tethering_h *)tethering;
2923 tethering_type_e ti;
2925 if (type != TETHERING_TYPE_ALL) {
2926 th->disabled_cb[type] = NULL;
2927 th->disabled_user_data[type] = NULL;
2929 return TETHERING_ERROR_NONE;
2932 /* TETHERING_TYPE_ALL */
2933 for (ti = TETHERING_TYPE_USB; ti < TETHERING_TYPE_MAX; ti++) {
2934 th->disabled_cb[ti] = NULL;
2935 th->disabled_user_data[ti] = NULL;
2938 return TETHERING_ERROR_NONE;
2943 * @brief Registers the callback function called when the state of connection is changed.
2945 * @privlevel platform
2946 * @privilege http://tizen.org/privilege/tethering.admin
2947 * @param[in] tethering The handle of tethering
2948 * @param[in] type The type of tethering
2949 * @param[in] callback The callback function to invoke
2950 * @param[in] user_data The user data to be passed to the callback function
2951 * @retval #TETHERING_ERROR_NONE Successful
2952 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2953 * @see tethering_unset_connection_state_changed_cb_cb()
2955 API int tethering_set_connection_state_changed_cb(tethering_h tethering, tethering_type_e type, tethering_connection_state_changed_cb callback, void *user_data)
2957 INFO("+ type: %d\n", type);
2958 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2959 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2960 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2961 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2963 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2964 "parameter(tethering) is NULL\n");
2965 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2966 "parameter(callback) is NULL\n");
2968 __tethering_h *th = (__tethering_h *)tethering;
2969 tethering_type_e ti;
2971 if (type != TETHERING_TYPE_ALL) {
2972 th->changed_cb[type] = callback;
2973 th->changed_user_data[type] = user_data;
2975 return TETHERING_ERROR_NONE;
2978 /* TETHERING_TYPE_ALL */
2979 for (ti = TETHERING_TYPE_USB; ti < TETHERING_TYPE_MAX; ti++) {
2980 th->changed_cb[ti] = callback;
2981 th->changed_user_data[ti] = user_data;
2984 return TETHERING_ERROR_NONE;
2989 * @brief Unregisters the callback function called when the state of connection is changed.
2991 * @privlevel platform
2992 * @privilege http://tizen.org/privilege/tethering.admin
2993 * @param[in] tethering The handle of tethering
2994 * @param[in] type The type of tethering
2995 * @retval #TETHERING_ERROR_NONE Successful
2996 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2997 * @see tethering_set_connection_state_changed_cb()
2999 API int tethering_unset_connection_state_changed_cb(tethering_h tethering, tethering_type_e type)
3001 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3002 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
3003 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3004 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
3006 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3007 "parameter(tethering) is NULL\n");
3009 __tethering_h *th = (__tethering_h *)tethering;
3010 tethering_type_e ti;
3012 if (type != TETHERING_TYPE_ALL) {
3013 th->changed_cb[type] = NULL;
3014 th->changed_user_data[type] = NULL;
3016 return TETHERING_ERROR_NONE;
3019 /* TETHERING_TYPE_ALL */
3020 for (ti = TETHERING_TYPE_USB; ti < TETHERING_TYPE_MAX; ti++) {
3021 th->changed_cb[ti] = NULL;
3022 th->changed_user_data[ti] = NULL;
3025 return TETHERING_ERROR_NONE;
3030 * @brief Registers the callback function called when the security type of Wi-Fi tethering is changed.
3032 * @privlevel platform
3033 * @privilege http://tizen.org/privilege/tethering.admin
3034 * @param[in] tethering The handle of tethering
3035 * @param[in] callback The callback function to invoke
3036 * @param[in] user_data The user data to be passed to the callback function
3037 * @retval #TETHERING_ERROR_NONE Successful
3038 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3039 * @see tethering_wifi_unset_security_type_changed_cb()
3041 API int tethering_wifi_set_security_type_changed_cb(tethering_h tethering, tethering_wifi_security_type_changed_cb callback, void *user_data)
3043 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3044 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3046 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3047 "parameter(tethering) is NULL\n");
3048 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3049 "parameter(callback) is NULL\n");
3051 __tethering_h *th = (__tethering_h *)tethering;
3053 th->security_type_changed_cb = callback;
3054 th->security_type_user_data = user_data;
3056 return TETHERING_ERROR_NONE;
3062 * @brief Unregisters the callback function called when the security type of Wi-Fi tethering is changed.
3064 * @privlevel platform
3065 * @privilege http://tizen.org/privilege/tethering.admin
3066 * @param[in] tethering The handle of tethering
3067 * @param[in] type The type of tethering
3068 * @retval #TETHERING_ERROR_NONE Successful
3069 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3070 * @see tethering_wifi_set_security_type_changed_cb()
3072 API int tethering_wifi_unset_security_type_changed_cb(tethering_h tethering)
3074 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3075 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3077 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3078 "parameter(tethering) is NULL\n");
3080 __tethering_h *th = (__tethering_h *)tethering;
3082 th->security_type_changed_cb = NULL;
3083 th->security_type_user_data = NULL;
3085 return TETHERING_ERROR_NONE;
3090 * @brief Registers the callback function called when the visibility of SSID is changed.
3092 * @privlevel platform
3093 * @privilege http://tizen.org/privilege/tethering.admin
3094 * @param[in] tethering The handle of tethering
3095 * @param[in] callback The callback function to invoke
3096 * @param[in] user_data The user data to be passed to the callback function
3097 * @retval #TETHERING_ERROR_NONE Successful
3098 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3099 * @see tethering_wifi_unset_ssid_visibility_changed_cb_cb()
3101 API int tethering_wifi_set_ssid_visibility_changed_cb(tethering_h tethering, tethering_wifi_ssid_visibility_changed_cb callback, void *user_data)
3103 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3104 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3106 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3107 "parameter(tethering) is NULL\n");
3108 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3109 "parameter(callback) is NULL\n");
3111 __tethering_h *th = (__tethering_h *)tethering;
3113 th->ssid_visibility_changed_cb = callback;
3114 th->ssid_visibility_user_data = user_data;
3116 return TETHERING_ERROR_NONE;
3121 * @brief Unregisters the callback function called when the visibility of SSID is changed.
3123 * @privlevel platform
3124 * @privilege http://tizen.org/privilege/tethering.admin
3125 * @param[in] tethering The handle of tethering
3126 * @retval #TETHERING_ERROR_NONE Successful
3127 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3128 * @see tethering_wifi_set_ssid_visibility_changed_cb()
3130 API int tethering_wifi_unset_ssid_visibility_changed_cb(tethering_h tethering)
3132 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3133 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3135 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3136 "parameter(tethering) is NULL\n");
3138 __tethering_h *th = (__tethering_h *)tethering;
3140 th->ssid_visibility_changed_cb = NULL;
3141 th->ssid_visibility_user_data = NULL;
3143 return TETHERING_ERROR_NONE;
3148 * @brief Registers the callback function called when the passphrase of Wi-Fi tethering is changed.
3150 * @privlevel platform
3151 * @privilege http://tizen.org/privilege/tethering.admin
3152 * @param[in] tethering The handle of tethering
3153 * @param[in] callback The callback function to invoke
3154 * @param[in] user_data The user data to be passed to the callback function
3155 * @retval #TETHERING_ERROR_NONE Successful
3156 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3157 * @see tethering_wifi_unset_passphrase_changed_cb()
3159 API int tethering_wifi_set_passphrase_changed_cb(tethering_h tethering, tethering_wifi_passphrase_changed_cb callback, void *user_data)
3161 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3162 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3164 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3165 "parameter(tethering) is NULL\n");
3166 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3167 "parameter(callback) is NULL\n");
3169 __tethering_h *th = (__tethering_h *)tethering;
3171 th->passphrase_changed_cb = callback;
3172 th->passphrase_user_data = user_data;
3174 return TETHERING_ERROR_NONE;
3179 * @brief Unregisters the callback function called when the passphrase of Wi-Fi tethering is changed.
3181 * @privlevel platform
3182 * @privilege http://tizen.org/privilege/tethering.admin
3183 * @param[in] tethering The handle of tethering
3184 * @retval #TETHERING_ERROR_NONE Successful
3185 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3186 * @see tethering_wifi_set_passphrase_changed_cb()
3188 API int tethering_wifi_unset_passphrase_changed_cb(tethering_h tethering)
3190 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3191 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3193 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3194 "parameter(tethering) is NULL\n");
3196 __tethering_h *th = (__tethering_h *)tethering;
3198 th->passphrase_changed_cb = NULL;
3199 th->passphrase_user_data = NULL;
3201 return TETHERING_ERROR_NONE;
3206 * @brief Sets the security type of Wi-Fi tethering.
3208 * @privlevel platform
3209 * @privilege http://tizen.org/privilege/tethering.admin
3210 * @remarks This change is applied next time Wi-Fi tethering is enabled
3211 * @param[in] tethering The handle of tethering
3212 * @param[in] type The security type
3213 * @return 0 on success, otherwise negative error value.
3214 * @retval #TETHERING_ERROR_NONE Successful
3215 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3216 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3217 * @see tethering_wifi_get_security_type()
3219 API int tethering_wifi_set_security_type(tethering_h tethering, tethering_wifi_security_type_e type)
3221 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3222 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3224 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3225 "parameter(tethering) is NULL\n");
3227 __tethering_h *th = (__tethering_h *)tethering;
3228 tethering_error_e ret = TETHERING_ERROR_NONE;
3229 char *sec_str = NULL;
3231 ret = __set_security_type(type);
3232 if (ret == TETHERING_ERROR_NONE) {
3234 case TETHERING_WIFI_SECURITY_TYPE_NONE:
3235 sec_str = TETHERING_WIFI_SECURITY_TYPE_OPEN_STR;
3237 case TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK:
3238 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR;
3240 case TETHERING_WIFI_SECURITY_TYPE_WPS:
3241 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPS_STR;
3243 case TETHERING_WIFI_SECURITY_TYPE_SAE:
3244 sec_str = TETHERING_WIFI_SECURITY_TYPE_SAE_STR;
3248 __send_dbus_signal(th->client_bus,
3249 SIGNAL_NAME_SECURITY_TYPE_CHANGED, sec_str);
3256 * @brief Gets the security type of Wi-Fi tethering.
3258 * @privlevel platform
3259 * @privilege http://tizen.org/privilege/tethering.admin
3260 * @param[in] tethering The handle of tethering
3261 * @param[out] type The security type
3262 * @return 0 on success, otherwise negative error value.
3263 * @retval #TETHERING_ERROR_NONE Successful
3264 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3265 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3266 * @see tethering_wifi_set_security_type()
3268 API int tethering_wifi_get_security_type(tethering_h tethering, tethering_wifi_security_type_e *type)
3270 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3271 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3273 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3274 "parameter(tethering) is NULL\n");
3275 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3276 "parameter(type) is NULL\n");
3278 return __get_security_type(type);
3283 * @brief Sets the SSID (service set identifier).
3285 * @privlevel platform
3286 * @privilege http://tizen.org/privilege/tethering.admin
3287 * @details If SSID is not set, Device name is used as SSID
3288 * @remarks This change is applied next time Wi-Fi tethering is enabled with same @a tethering handle
3289 * @param[in] tethering The handle of tethering
3290 * @param[out] ssid The SSID
3291 * @return 0 on success, otherwise negative error value.
3292 * @retval #TETHERING_ERROR_NONE Successful
3293 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3294 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3296 API int tethering_wifi_set_ssid(tethering_h tethering, const char *ssid)
3298 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3299 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3301 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3302 "parameter(tethering) is NULL\n");
3303 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3304 "parameter(ssid) is NULL\n");
3306 __tethering_h *th = (__tethering_h *)tethering;
3307 char *p_ssid = NULL;
3310 ssid_len = strlen(ssid);
3311 if (ssid_len > TETHERING_WIFI_SSID_MAX_LEN) {
3312 ERR("parameter(ssid) is too long");
3313 return TETHERING_ERROR_INVALID_PARAMETER;
3316 p_ssid = strdup(ssid);
3317 _retvm_if(p_ssid == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
3318 "strdup is failed\n");
3321 GDBusProxy *proxy = th->client_bus_proxy;
3322 GVariant *parameters;
3323 GError *error = NULL;
3324 tethering_error_e ret = TETHERING_ERROR_NONE;
3326 parameters = g_dbus_proxy_call_sync(proxy, "set_wifi_tethering_ssid",
3327 g_variant_new("(s)", ssid), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3330 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3332 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3333 ret = TETHERING_ERROR_PERMISSION_DENIED;
3335 ret = TETHERING_ERROR_OPERATION_FAILED;
3337 g_error_free(error);
3342 if (parameters != NULL) {
3343 g_variant_get(parameters, "(u)", &ret);
3344 g_variant_unref(parameters);
3347 SINFO("set tethering ssid : %s", ssid);
3348 #endif /* TIZEN_TV_EXT */
3354 return TETHERING_ERROR_NONE;
3359 * @brief Gets the SSID (service set identifier).
3361 * @privlevel platform
3362 * @privilege http://tizen.org/privilege/tethering.admin
3363 * @remarks @a ssid must be released with free() by you.
3364 * @param[in] tethering The handle of tethering
3365 * @param[out] ssid The SSID
3366 * @return 0 on success, otherwise negative error value.
3367 * @retval #TETHERING_ERROR_NONE Successful
3368 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3369 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3370 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3372 API int tethering_wifi_get_ssid(tethering_h tethering, char **ssid)
3374 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3375 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3377 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3378 "parameter(tethering) is NULL\n");
3379 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3380 "parameter(ssid) is NULL\n");
3383 __tethering_h *th = (__tethering_h *)tethering;
3384 char val[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
3387 if (__get_ssid_from_vconf(VCONFKEY_WIFI_SSID,
3388 val, sizeof(val)) == true) {
3389 *ssid = strdup(val);
3390 SINFO("get tethering ssid : %s", *ssid);
3391 return TETHERING_ERROR_NONE;
3393 #endif /* TIZEN_TV_EXT */
3395 if (!tethering_is_enabled(NULL, TETHERING_TYPE_WIFI)) {
3396 if (th->ssid != NULL) {
3397 DBG("Private SSID is set\n");
3398 *ssid = strdup(th->ssid);
3400 if (__get_ssid_from_vconf(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
3401 val, sizeof(val)) == false) {
3402 return TETHERING_ERROR_OPERATION_FAILED;
3404 *ssid = strdup(val);
3407 if (__get_ssid_from_vconf(VCONFKEY_MOBILE_HOTSPOT_SSID,
3408 val, sizeof(val)) == false) {
3409 return TETHERING_ERROR_OPERATION_FAILED;
3411 *ssid = strdup(val);
3414 if (*ssid == NULL) {
3415 ERR("strdup is failed\n");
3416 return TETHERING_ERROR_OUT_OF_MEMORY;
3419 return TETHERING_ERROR_NONE;
3424 * @brief Sets the visibility of SSID(service set identifier).
3426 * @privlevel platform
3427 * @privilege http://tizen.org/privilege/tethering.admin
3428 * @details If you set the visibility invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3429 * @remarks This change is applied next time Wi-Fi tethering is enabled
3430 * @param[in] tethering The handle of tethering
3431 * @param[in] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3432 * @return 0 on success, otherwise negative error value.
3433 * @retval #TETHERING_ERROR_NONE Successful
3434 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3435 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3436 * @see tethering_wifi_get_ssid_visibility()
3438 API int tethering_wifi_set_ssid_visibility(tethering_h tethering, bool visible)
3440 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3441 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3443 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3444 "parameter(tethering) is NULL\n");
3446 __tethering_h *th = (__tethering_h *)tethering;
3447 tethering_error_e ret = TETHERING_ERROR_NONE;
3449 ret = __set_visible(visible);
3450 if (ret == TETHERING_ERROR_NONE) {
3451 __send_dbus_signal(th->client_bus,
3452 SIGNAL_NAME_SSID_VISIBILITY_CHANGED,
3453 visible ? SIGNAL_MSG_SSID_VISIBLE :
3454 SIGNAL_MSG_SSID_HIDE);
3461 * @brief Gets the visibility of SSID(service set identifier).
3463 * @privlevel platform
3464 * @privilege http://tizen.org/privilege/tethering.admin
3465 * @details If the visibility is set invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3466 * @param[in] tethering The handle of tethering
3467 * @param[out] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3468 * @return 0 on success, otherwise negative error value.
3469 * @retval #TETHERING_ERROR_NONE Successful
3470 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3471 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3472 * @see tethering_wifi_set_ssid_visibility()
3474 API int tethering_wifi_get_ssid_visibility(tethering_h tethering, bool *visible)
3476 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3477 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3479 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3480 "parameter(tethering) is NULL\n");
3481 _retvm_if(visible == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3482 "parameter(visible) is NULL\n");
3484 return __get_visible(visible);
3489 * @brief Sets the passphrase.
3491 * @privlevel platform
3492 * @privilege http://tizen.org/privilege/tethering.admin
3493 * @remarks This change is applied next time Wi-Fi tethering is enabled
3494 * @param[in] tethering The handle of tethering
3495 * @param[in] passphrase The passphrase
3496 * @return 0 on success, otherwise negative error value.
3497 * @retval #TETHERING_ERROR_NONE Successful
3498 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3499 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3500 * @see tethering_wifi_get_passphrase()
3502 API int tethering_wifi_set_passphrase(tethering_h tethering, const char *passphrase)
3504 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3505 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3507 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3508 "parameter(tethering) is NULL\n");
3509 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3510 "parameter(passphrase) is NULL\n");
3512 __tethering_h *th = (__tethering_h *)tethering;
3513 GDBusProxy *proxy = th->client_bus_proxy;
3514 GVariant *parameters;
3515 GError *error = NULL;
3516 int passphrase_len = 0;
3520 passphrase_len = strlen(passphrase);
3521 if (passphrase_len < TETHERING_WIFI_KEY_MIN_LEN ||
3522 passphrase_len > TETHERING_WIFI_KEY_MAX_LEN) {
3523 ERR("parameter(passphrase) is too short or long\n");
3524 return TETHERING_ERROR_INVALID_PARAMETER;
3527 parameters = g_dbus_proxy_call_sync(proxy, "set_wifi_tethering_passphrase",
3528 g_variant_new("(s)", passphrase), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3531 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3533 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3534 ret = TETHERING_ERROR_PERMISSION_DENIED;
3536 ret = TETHERING_ERROR_OPERATION_FAILED;
3538 g_error_free(error);
3542 g_variant_get(parameters, "(u)", &ret);
3543 g_variant_unref(parameters);
3545 if (ret == TETHERING_ERROR_NONE) {
3546 __send_dbus_signal(th->client_bus,
3547 SIGNAL_NAME_PASSPHRASE_CHANGED, NULL);
3556 * @brief Gets the passphrase.
3558 * @privlevel platform
3559 * @privilege http://tizen.org/privilege/tethering.admin
3560 * @remarks @a passphrase must be released with free() by you.
3561 * @param[in] tethering The handle of tethering
3562 * @param[out] passphrase The passphrase
3563 * @return 0 on success, otherwise negative error value.
3564 * @retval #TETHERING_ERROR_NONE Successful
3565 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3566 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3567 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3568 * @see tethering_wifi_set_passphrase()
3570 API int tethering_wifi_get_passphrase(tethering_h tethering, char **passphrase)
3572 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3573 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3575 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3576 "parameter(tethering) is NULL\n");
3577 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3578 "parameter(passphrase) is NULL\n");
3580 __tethering_h *th = (__tethering_h *)tethering;
3581 GDBusProxy *proxy = th->client_bus_proxy;
3582 GVariant *parameters;
3583 GError *error = NULL;
3584 unsigned int len = 0;
3585 tethering_error_e ret = TETHERING_ERROR_NONE;
3587 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
3588 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3591 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3593 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3594 ret = TETHERING_ERROR_PERMISSION_DENIED;
3596 ret = TETHERING_ERROR_OPERATION_FAILED;
3598 g_error_free(error);
3602 if (parameters != NULL) {
3603 g_variant_get(parameters, "(siu)", passphrase, &len, &ret);
3604 g_variant_unref(parameters);
3607 return TETHERING_ERROR_NONE;
3610 API int tethering_wifi_set_channel(tethering_h tethering, int channel)
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");
3618 __tethering_h *th = (__tethering_h *)tethering;
3621 GDBusProxy *proxy = th->client_bus_proxy;
3622 GVariant *parameters;
3623 GError *error = NULL;
3624 tethering_error_e ret = TETHERING_ERROR_NONE;
3626 parameters = g_dbus_proxy_call_sync(proxy, "set_wifi_tethering_channel",
3627 g_variant_new("(i)", channel), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3630 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3632 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3633 ret = TETHERING_ERROR_PERMISSION_DENIED;
3635 ret = TETHERING_ERROR_OPERATION_FAILED;
3637 g_error_free(error);
3641 if (parameters != NULL) {
3642 g_variant_get(parameters, "(u)", &ret);
3643 g_variant_unref(parameters);
3646 SINFO("set channel : %d", channel);
3647 #endif /* TIZEN_TV_EXT */
3649 th->channel = channel;
3651 return TETHERING_ERROR_NONE;
3654 API int tethering_wifi_get_channel(tethering_h tethering, int *channel)
3656 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3657 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3659 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3660 "parameter(tethering) is NULL\n");
3662 _retvm_if(channel == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3663 "parameter(channel) is NULL\n");
3665 __tethering_h *th = (__tethering_h *)tethering;
3667 GDBusProxy *proxy = th->client_bus_proxy;
3668 GVariant *parameters = NULL;
3669 GError *error = NULL;
3671 int vconf_channel = -1;
3672 tethering_error_e ret = TETHERING_ERROR_NONE;
3674 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_channel",
3675 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3678 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3680 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3681 ret = TETHERING_ERROR_PERMISSION_DENIED;
3683 ret = TETHERING_ERROR_OPERATION_FAILED;
3685 g_error_free(error);
3689 if (parameters != NULL) {
3690 g_variant_get(parameters, "(iu)", &ch, &ret);
3691 g_variant_unref(parameters);
3695 ERR("failed to get Hostapd channel, set th->channel");
3696 *channel = th->channel;
3700 if (vconf_get_int(VCONFKEY_WIFI_CHANNEL, &vconf_channel) < 0)
3701 ERR("Failed to get vconf key for channel");
3703 *channel = vconf_channel;
3705 SINFO("get tethering channel : %d", *channel);
3706 #else /* TIZEN_TV_EXT */
3707 *channel = th->channel;
3708 #endif /* TIZEN_TV_EXT */
3710 return TETHERING_ERROR_NONE;
3713 API int tethering_wifi_set_mode(tethering_h tethering, tethering_wifi_mode_type_e type)
3715 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3716 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3718 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3719 "parameter(tethering) is NULL\n");
3721 __tethering_h *th = (__tethering_h *)tethering;
3723 th->mode_type = type;
3725 return TETHERING_ERROR_NONE;
3728 API int tethering_wifi_get_mode(tethering_h tethering, tethering_wifi_mode_type_e *type)
3730 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3731 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3733 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3734 "parameter(tethering) is NULL\n");
3735 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3736 "parameter(type) is NULL\n");
3738 __tethering_h *th = (__tethering_h *)tethering;
3739 *type = th->mode_type;
3741 return TETHERING_ERROR_NONE;
3747 * @brief Reload the settings (SSID / Passphrase / Security type / SSID visibility).
3749 * @privlevel platform
3750 * @privilege http://tizen.org/privilege/tethering.admin
3751 * @remarks Connected devices via Wi-Fi tethering or MobileAP will be disconnected when the settings are reloaded
3752 * @param[in] tethering The handle of tethering
3753 * @param[in] callback The callback function to invoke
3754 * @param[in] user_data The user data to be passed to the callback function
3755 * @return 0 on success, otherwise negative error value.
3756 * @retval #TETHERING_ERROR_NONE Successful
3757 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3758 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3760 API int tethering_wifi_reload_settings(tethering_h tethering, tethering_wifi_settings_reloaded_cb callback, void *user_data)
3763 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3764 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3766 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3767 "parameter(tethering) is NULL\n");
3768 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3769 "parameter(callback) is NULL\n");
3771 __tethering_h *th = (__tethering_h *)tethering;
3772 _softap_settings_t set = {"", "", "", 0, false};
3773 GDBusProxy *proxy = th->client_bus_proxy;
3778 if (th->settings_reloaded_cb) {
3779 ERR("Operation in progress\n");
3780 return TETHERING_ERROR_OPERATION_FAILED;
3783 ret = __prepare_wifi_settings(tethering, &set);
3784 if (ret != TETHERING_ERROR_NONE) {
3785 ERR("softap settings initialization failed\n");
3786 return TETHERING_ERROR_OPERATION_FAILED;
3789 th->settings_reloaded_cb = callback;
3790 th->settings_reloaded_user_data = user_data;
3792 SINFO("ssid %s, key %s, channel %d, mode %s, txpower %d, security %d max_device %d\n",
3793 set.ssid, set.key, set.channel, set.mode, set.txpower, set.sec_type,
3796 g_dbus_proxy_call(proxy, "reload_wifi_settings",
3797 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type, set.txpower),
3798 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
3799 (GAsyncReadyCallback) __settings_reloaded_cb, (gpointer)tethering);
3801 return TETHERING_ERROR_NONE;
3804 API int tethering_wifi_set_mac_filter(tethering_h tethering, bool mac_filter)
3806 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3807 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3809 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3810 "parameter(tethering) is NULL\n");
3812 __tethering_h *th = (__tethering_h *)tethering;
3813 th->mac_filter = mac_filter;
3815 return TETHERING_ERROR_NONE;
3818 API int tethering_wifi_get_mac_filter(tethering_h tethering, bool *mac_filter)
3820 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3821 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3823 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3824 "parameter(mac_filter) is NULL\n");
3825 _retvm_if(mac_filter == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3826 "parameter(mac_filter) is NULL\n");
3828 __tethering_h *th = (__tethering_h *)tethering;
3829 *mac_filter = th->mac_filter;
3831 return TETHERING_ERROR_NONE;
3834 static int __add_mac_to_file(const char *filepath, const char *mac)
3837 char line[MAX_BUF_SIZE] = "\0";
3838 bool mac_exist = false;
3841 fp = fopen(filepath, "a+");
3843 ERR("fopen is failed\n");
3844 return TETHERING_ERROR_OPERATION_FAILED;
3847 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3848 if (strncmp(mac, line, 17) == 0) {
3849 DBG("MAC %s already exist in the list\n", mac);
3856 p_mac = strdup(mac);
3857 if (p_mac == NULL) {
3858 ERR("strdup failed\n");
3860 return TETHERING_ERROR_OUT_OF_MEMORY;
3863 fprintf(fp, "%s\n", mac);
3865 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3866 allowed_list = g_slist_append(allowed_list, p_mac);
3867 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3868 blocked_list = g_slist_append(blocked_list, p_mac);
3875 return TETHERING_ERROR_NONE;
3878 static int __remove_mac_from_file(const char *filepath, const char *mac)
3882 char line[MAX_BUF_SIZE] = "\0";
3884 fp = fopen(filepath, "r");
3886 ERR("fopen is failed\n");
3887 return TETHERING_ERROR_OPERATION_FAILED;
3890 fp1 = fopen(TEMP_LIST, "w+");
3893 ERR("fopen is failed\n");
3894 return TETHERING_ERROR_OPERATION_FAILED;
3897 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3898 if (strncmp(mac, line, 17) == 0) {
3899 DBG("MAC %s found in the list\n", mac);
3901 if ((strcmp(filepath, ALLOWED_LIST) == 0)) {
3902 GSList *list = NULL;
3903 for (list = allowed_list; list != NULL; list = list->next) {
3904 char *p_mac = (char *)list->data;
3905 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3906 allowed_list = g_slist_remove(allowed_list, p_mac);
3908 } else if ((strcmp(filepath, BLOCKED_LIST) == 0)) {
3909 GSList *list = NULL;
3910 for (list = blocked_list; list != NULL; list = list->next) {
3911 char *p_mac = (char *)list->data;
3912 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3913 blocked_list = g_slist_remove(blocked_list, p_mac);
3917 fprintf(fp1, "%s", line);
3924 if ((strcmp(filepath, ALLOWED_LIST) == 0)) {
3925 if (rename(TEMP_LIST, ALLOWED_LIST) != 0) {
3926 ERR("rename is failed (%s -> %s)", TEMP_LIST, ALLOWED_LIST);
3927 return TETHERING_ERROR_OPERATION_FAILED;
3929 } else if ((strcmp(filepath, BLOCKED_LIST) == 0)) {
3930 if (rename(TEMP_LIST, BLOCKED_LIST) != 0) {
3931 ERR("rename is failed (%s -> %s)", TEMP_LIST, BLOCKED_LIST);
3932 return TETHERING_ERROR_OPERATION_FAILED;
3936 return TETHERING_ERROR_NONE;
3939 API int tethering_wifi_add_allowed_mac_list(tethering_h tethering, const char *mac)
3941 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3942 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3944 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3945 "parameter(tethering) is NULL\n");
3946 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3947 "parameter(mac) is NULL\n");
3949 return __add_mac_to_file(ALLOWED_LIST, mac);
3952 API int tethering_wifi_remove_allowed_mac_list(tethering_h tethering, const char *mac)
3954 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3955 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3957 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3958 "parameter(tethering) is NULL\n");
3959 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3960 "parameter(mac) is NULL\n");
3962 return __remove_mac_from_file(ALLOWED_LIST, mac);
3965 API int tethering_wifi_get_allowed_mac_list(tethering_h tethering, void **allowed_mac_list)
3967 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3968 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3970 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3971 "parameter(tethering) is NULL\n");
3972 _retvm_if(allowed_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3973 "parameter(allowed_mac_list) is NULL\n");
3975 *allowed_mac_list = g_slist_copy(allowed_list);
3976 return TETHERING_ERROR_NONE;
3979 API int tethering_wifi_add_blocked_mac_list(tethering_h tethering, const char *mac)
3981 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3982 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3984 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3985 "parameter(tethering) is NULL\n");
3986 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3987 "parameter(mac) is NULL\n");
3989 return __add_mac_to_file(BLOCKED_LIST, mac);
3992 API int tethering_wifi_remove_blocked_mac_list(tethering_h tethering, const char *mac)
3994 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3995 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3997 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3998 "parameter(tethering) is NULL\n");
3999 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4000 "parameter(mac) is NULL\n");
4002 return __remove_mac_from_file(BLOCKED_LIST, mac);
4005 API int tethering_wifi_get_blocked_mac_list(tethering_h tethering, void **blocked_mac_list)
4007 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4008 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4010 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4011 "parameter(tethering) is NULL\n");
4012 _retvm_if(blocked_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4013 "parameter(blocked_mac_list) is NULL\n");
4015 *blocked_mac_list = g_slist_copy(blocked_list);
4016 return TETHERING_ERROR_NONE;
4019 API int tethering_wifi_enable_dhcp(tethering_h tethering, bool enable)
4021 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4022 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4024 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4025 "parameter(tethering) is NULL\n");
4027 GVariant *parameters;
4028 GError *error = NULL;
4031 __tethering_h *th = (__tethering_h *)tethering;
4033 GDBusProxy *proxy = th->client_bus_proxy;
4035 parameters = g_dbus_proxy_call_sync(proxy, "enable_dhcp",
4036 g_variant_new("(b)", enable),
4037 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4040 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4041 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4042 result = TETHERING_ERROR_PERMISSION_DENIED;
4044 result = TETHERING_ERROR_OPERATION_FAILED;
4046 g_error_free(error);
4047 th->dhcp_enabled = false;
4052 g_variant_get(parameters, "(u)", &result);
4053 g_variant_unref(parameters);
4056 th->dhcp_enabled = true;
4058 th->dhcp_enabled = false;
4060 return TETHERING_ERROR_NONE;
4063 API int tethering_wifi_set_dhcp_range(tethering_h tethering, char *rangestart, char *rangestop)
4065 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4066 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4068 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4069 "parameter(tethering) is NULL\n");
4070 _retvm_if(rangestart == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4071 "parameter(rangestart) is NULL\n");
4072 _retvm_if(rangestop == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4073 "parameter(rangestop) is NULL\n");
4075 GVariant *parameters;
4076 GError *error = NULL;
4079 __tethering_h *th = (__tethering_h *)tethering;
4081 GDBusProxy *proxy = th->client_bus_proxy;
4083 parameters = g_dbus_proxy_call_sync(proxy, "dhcp_range",
4084 g_variant_new("(ss)", rangestart, rangestop),
4085 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4087 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4089 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4090 result = TETHERING_ERROR_PERMISSION_DENIED;
4092 result = TETHERING_ERROR_OPERATION_FAILED;
4094 g_error_free(error);
4095 th->dhcp_enabled = false;
4100 g_variant_get(parameters, "(u)", &result);
4101 g_variant_unref(parameters);
4103 th->dhcp_enabled = true;
4105 return TETHERING_ERROR_NONE;
4108 API int tethering_wifi_is_dhcp_enabled(tethering_h tethering, bool *dhcp_enabled)
4110 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4111 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4113 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4114 "parameter(tethering) is NULL\n");
4115 _retvm_if(dhcp_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4116 "parameter(dhcp_enabled) is NULL\n");
4118 __tethering_h *th = (__tethering_h *)tethering;
4119 *dhcp_enabled = th->dhcp_enabled;
4121 return TETHERING_ERROR_NONE;
4124 API int tethering_wifi_set_txpower(tethering_h tethering, unsigned int txpower)
4126 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4127 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4129 GError *error = NULL;
4131 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4132 "parameter(tethering) is NULL\n");
4133 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
4134 TETHERING_ERROR_NOT_ENABLED,
4135 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
4136 __tethering_h *th = (__tethering_h *)tethering;
4137 th->txpower = txpower;
4139 g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_set_txpower",
4140 g_variant_new("(u)", txpower),
4141 G_DBUS_CALL_FLAGS_NONE,
4142 -1, th->cancellable, &error);
4144 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
4145 g_clear_error(&error);
4146 return TETHERING_ERROR_OPERATION_FAILED;
4148 return TETHERING_ERROR_NONE;
4151 API int tethering_wifi_get_txpower(tethering_h tethering, unsigned int *txpower)
4153 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4154 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4156 GError *error = NULL;
4157 GVariant *result = NULL;
4159 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4160 "parameter(tethering) is NULL\n");
4161 _retvm_if(txpower == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4162 "parameter(txpower) is NULL\n");
4163 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
4164 TETHERING_ERROR_NOT_ENABLED,
4165 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
4167 __tethering_h *th = (__tethering_h *)tethering;
4169 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_get_txpower",
4171 G_DBUS_CALL_FLAGS_NONE,
4172 -1, th->cancellable, &error);
4174 if (result != NULL) {
4175 g_variant_get(result, "(u)", txpower);
4176 g_variant_unref(result);
4179 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
4180 g_clear_error(&error);
4181 return TETHERING_ERROR_OPERATION_FAILED;
4183 g_clear_error(&error);
4184 return TETHERING_ERROR_NONE;
4187 API int tethering_wifi_set_mtu(tethering_h tethering, unsigned int mtu)
4189 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4190 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4192 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4193 "parameter(tethering) is NULL\n");
4195 GVariant *parameters;
4196 GError *error = NULL;
4199 __tethering_h *th = (__tethering_h *)tethering;
4201 GDBusProxy *proxy = th->client_bus_proxy;
4203 parameters = g_dbus_proxy_call_sync(proxy, "set_mtu",
4204 g_variant_new("(u)", mtu),
4205 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4207 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4209 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4210 result = TETHERING_ERROR_PERMISSION_DENIED;
4212 result = TETHERING_ERROR_OPERATION_FAILED;
4214 g_error_free(error);
4218 g_variant_get(parameters, "(u)", &result);
4220 g_variant_unref(parameters);
4222 return TETHERING_ERROR_NONE;
4225 API int tethering_wifi_change_mac(tethering_h tethering, char *mac)
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\n");
4232 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4233 "parameter(mac) is NULL\n");
4235 GVariant *parameters;
4236 GError *error = NULL;
4239 __tethering_h *th = (__tethering_h *)tethering;
4241 GDBusProxy *proxy = th->client_bus_proxy;
4243 parameters = g_dbus_proxy_call_sync(proxy, "change_mac",
4244 g_variant_new("(s)", mac),
4245 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4247 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4249 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4250 result = TETHERING_ERROR_PERMISSION_DENIED;
4252 result = TETHERING_ERROR_OPERATION_FAILED;
4254 g_error_free(error);
4258 g_variant_get(parameters, "(u)", &result);
4259 g_variant_unref(parameters);
4261 if (result == MOBILE_AP_ERROR_NOT_PERMITTED)
4262 return TETHERING_ERROR_NOT_SUPPORT_API;
4264 return TETHERING_ERROR_NONE;
4267 API int tethering_wifi_set_max_connected_device(tethering_h tethering, int max_device)
4269 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4270 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4272 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4273 "parameter(tethering) is NULL\n");
4275 __tethering_h *th = (__tethering_h *)tethering;
4277 th->wifi_max_connected = max_device;
4279 return TETHERING_ERROR_NONE;
4282 API int tethering_wifi_get_max_connected_device(tethering_h tethering, int *max_device)
4284 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4285 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4287 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4288 "parameter(tethering) is NULL\n");
4289 _retvm_if(max_device == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4290 "parameter(max_device) is NULL\n");
4292 __tethering_h *th = (__tethering_h *)tethering;
4294 *max_device = th->wifi_max_connected;
4295 return TETHERING_ERROR_NONE;
4298 API int tethering_wifi_enable_port_forwarding(tethering_h tethering, bool enable)
4300 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4301 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4303 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4304 "parameter(tethering) is NULL\n");
4306 GVariant *parameters;
4307 GError *error = NULL;
4310 __tethering_h *th = (__tethering_h *)tethering;
4312 GDBusProxy *proxy = th->client_bus_proxy;
4314 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_forwarding",
4315 g_variant_new("(b)", enable),
4316 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4318 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4320 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4321 result = TETHERING_ERROR_PERMISSION_DENIED;
4323 result = TETHERING_ERROR_OPERATION_FAILED;
4325 g_error_free(error);
4329 g_variant_get(parameters, "(u)", &result);
4330 g_variant_unref(parameters);
4332 th->port_forwarding = true;
4334 return TETHERING_ERROR_NONE;
4337 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)
4339 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4340 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4342 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4343 "parameter(tethering) is NULL\n");
4344 _retvm_if(ifname == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4345 "parameter(ifname) is NULL\n");
4346 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4347 "parameter(protocol) is NULL\n");
4348 _retvm_if(org_ip == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4349 "parameter(org_ip) is NULL\n");
4350 _retvm_if(final_ip == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4351 "parameter(final_ip) is NULL\n");
4353 GVariant *parameters;
4354 GError *error = NULL;
4356 char cmd[MAX_BUF_SIZE] = { 0, };
4359 __tethering_h *th = (__tethering_h *)tethering;
4361 GDBusProxy *proxy = th->client_bus_proxy;
4363 parameters = g_dbus_proxy_call_sync(proxy, "add_port_forwarding_rule",
4364 g_variant_new("(sssisi)", ifname, protocol, org_ip, org_port, final_ip, final_port),
4365 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4367 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4369 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4370 result = TETHERING_ERROR_PERMISSION_DENIED;
4372 result = TETHERING_ERROR_OPERATION_FAILED;
4374 g_error_free(error);
4378 g_variant_get(parameters, "(u)", &result);
4379 g_variant_unref(parameters);
4381 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);
4385 ERR("strdup failed\n");
4386 return TETHERING_ERROR_OUT_OF_MEMORY;
4389 port_forwarding = g_slist_append(port_forwarding, list);
4391 return TETHERING_ERROR_NONE;
4394 API int tethering_wifi_reset_port_forwarding_rule(tethering_h tethering)
4396 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4397 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4399 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4400 "parameter(tethering) is NULL\n");
4402 GVariant *parameters;
4403 GError *error = NULL;
4406 __tethering_h *th = (__tethering_h *)tethering;
4408 GDBusProxy *proxy = th->client_bus_proxy;
4410 parameters = g_dbus_proxy_call_sync(proxy, "reset_port_forwarding_rule",
4411 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4413 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4415 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4416 result = TETHERING_ERROR_PERMISSION_DENIED;
4418 result = TETHERING_ERROR_OPERATION_FAILED;
4420 g_error_free(error);
4424 g_variant_get(parameters, "(u)", &result);
4426 g_variant_unref(parameters);
4428 return TETHERING_ERROR_NONE;
4431 API int tethering_wifi_is_port_forwarding_enabled(tethering_h tethering, bool *forwarding_enabled)
4433 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4434 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4436 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4437 "parameter(tethering) is NULL\n");
4438 _retvm_if(forwarding_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4439 "parameter(forwarding_enabled) is NULL\n");
4441 __tethering_h *th = (__tethering_h *)tethering;
4443 *forwarding_enabled = th->port_forwarding;
4445 return TETHERING_ERROR_NONE;
4448 API int tethering_wifi_get_port_forwarding_rule(tethering_h tethering, void **port_forwarding_list)
4450 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4451 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4453 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4454 "parameter(tethering) is NULL\n");
4455 _retvm_if(port_forwarding_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4456 "parameter(port_forwarding_list) is NULL\n");
4458 *port_forwarding_list = g_slist_copy(port_forwarding);
4459 return TETHERING_ERROR_NONE;
4462 API int tethering_wifi_enable_port_filtering(tethering_h tethering, bool enable)
4464 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4465 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4467 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4468 "parameter(tethering) is NULL\n");
4470 GVariant *parameters;
4471 GError *error = NULL;
4474 __tethering_h *th = (__tethering_h *)tethering;
4476 GDBusProxy *proxy = th->client_bus_proxy;
4478 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_filtering",
4479 g_variant_new("(b)", enable),
4480 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4482 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4484 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4485 result = TETHERING_ERROR_PERMISSION_DENIED;
4487 result = TETHERING_ERROR_OPERATION_FAILED;
4489 g_error_free(error);
4493 g_variant_get(parameters, "(u)", &result);
4494 g_variant_unref(parameters);
4496 th->port_filtering = true;
4498 return TETHERING_ERROR_NONE;
4501 API int tethering_wifi_add_port_filtering_rule(tethering_h tethering, int port, char *protocol, bool allow)
4503 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4504 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4506 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4507 "parameter(tethering) is NULL\n");
4508 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4509 "parameter(protocol) is NULL\n");
4511 GVariant *parameters;
4512 GError *error = NULL;
4517 __tethering_h *th = (__tethering_h *)tethering;
4519 GDBusProxy *proxy = th->client_bus_proxy;
4521 parameters = g_dbus_proxy_call_sync(proxy, "add_port_filtering_rule",
4522 g_variant_new("(isb)", port, protocol, allow),
4523 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4525 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4527 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4528 result = TETHERING_ERROR_PERMISSION_DENIED;
4530 result = TETHERING_ERROR_OPERATION_FAILED;
4532 g_error_free(error);
4536 g_variant_get(parameters, "(u)", &result);
4537 g_variant_unref(parameters);
4540 ret = asprintf(&list, "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_ACCEPT);
4542 ret = asprintf(&list, "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_DROP);
4544 if (ret == -1 || list == NULL) {
4545 ERR("asprintf failed\n");
4546 return TETHERING_ERROR_OUT_OF_MEMORY;
4549 DBG("cmd:%s", list);
4551 port_filtering = g_slist_append(port_filtering, list);
4553 return TETHERING_ERROR_NONE;
4556 API int tethering_wifi_add_custom_port_filtering_rule(tethering_h tethering, int port1, int port2, char *protocol, bool allow)
4558 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4559 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4561 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4562 "parameter(tethering) is NULL\n");
4563 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4564 "parameter(protocol) is NULL\n");
4566 GVariant *parameters;
4567 GError *error = NULL;
4572 __tethering_h *th = (__tethering_h *)tethering;
4574 GDBusProxy *proxy = th->client_bus_proxy;
4576 parameters = g_dbus_proxy_call_sync(proxy, "add_custom_port_filtering_rule",
4577 g_variant_new("(iisb)", port1, port2, protocol, allow),
4578 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4580 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4582 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4583 result = TETHERING_ERROR_PERMISSION_DENIED;
4585 result = TETHERING_ERROR_OPERATION_FAILED;
4587 g_error_free(error);
4591 g_variant_get(parameters, "(u)", &result);
4592 g_variant_unref(parameters);
4595 ret = asprintf(&list, "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_ACCEPT);
4597 ret = asprintf(&list, "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_DROP);
4599 if (ret == -1 || list == NULL) {
4600 ERR("asprintf failed\n");
4601 return TETHERING_ERROR_OUT_OF_MEMORY;
4604 DBG("cmd:%s", list);
4606 custom_port_filtering = g_slist_append(custom_port_filtering, list);
4608 return TETHERING_ERROR_NONE;
4611 API int tethering_wifi_get_port_filtering_rule(tethering_h tethering, void **port_filtering_list)
4613 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4614 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4616 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4617 "parameter(tethering) is NULL\n");
4618 _retvm_if(port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4619 "parameter(port_filtering_list) is NULL\n");
4621 *port_filtering_list = g_slist_copy(port_filtering);
4622 return TETHERING_ERROR_NONE;
4625 API int tethering_wifi_get_custom_port_filtering_rule(tethering_h tethering, void **custom_port_filtering_list)
4627 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4628 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4630 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4631 "parameter(tethering) is NULL\n");
4632 _retvm_if(custom_port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4633 "parameter(custom_port_filtering_list) is NULL\n");
4635 *custom_port_filtering_list = g_slist_copy(custom_port_filtering);
4636 return TETHERING_ERROR_NONE;
4639 API int tethering_wifi_is_port_filtering_enabled(tethering_h tethering, bool *filtering_enabled)
4641 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4642 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4644 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4645 "parameter(tethering) is NULL\n");
4646 _retvm_if(filtering_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4647 "parameter(filtering_enabled) is NULL\n");
4649 __tethering_h *th = (__tethering_h *)tethering;
4651 *filtering_enabled = th->port_filtering;
4653 return TETHERING_ERROR_NONE;
4656 API int tethering_wifi_set_vpn_passthrough_rule(tethering_h tethering, tethering_vpn_passthrough_type_e type, bool enable)
4658 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4659 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4661 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4662 "parameter(tethering) is NULL\n");
4664 GVariant *parameters;
4665 GError *error = NULL;
4668 __tethering_h *th = (__tethering_h *)tethering;
4670 GDBusProxy *proxy = th->client_bus_proxy;
4672 parameters = g_dbus_proxy_call_sync(proxy, "set_vpn_passthrough_rule",
4673 g_variant_new("(ib)", type, enable),
4674 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4676 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4678 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4679 result = TETHERING_ERROR_PERMISSION_DENIED;
4681 result = TETHERING_ERROR_OPERATION_FAILED;
4683 g_error_free(error);
4687 g_variant_get(parameters, "(u)", &result);
4689 g_variant_unref(parameters);
4691 return TETHERING_ERROR_NONE;
4694 API int tethering_wifi_push_wps_button(tethering_h tethering)
4696 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4697 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4699 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4700 "parameter(tethering) is NULL");
4701 __tethering_h *th = (__tethering_h *)tethering;
4702 GDBusProxy *proxy = th->client_bus_proxy;
4703 GVariant *parameters = NULL;
4705 GError *error = NULL;
4707 parameters = g_dbus_proxy_call_sync(proxy, "push_wps_button",
4708 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4711 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4713 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4714 ret = TETHERING_ERROR_PERMISSION_DENIED;
4716 ret = TETHERING_ERROR_OPERATION_FAILED;
4718 g_error_free(error);
4722 if (parameters != NULL) {
4723 g_variant_get(parameters, "(u)", &ret);
4724 g_variant_unref(parameters);
4727 return TETHERING_ERROR_NONE;
4730 API int tethering_wifi_set_wps_pin(tethering_h tethering, const char *wps_pin)
4732 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4733 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4735 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4736 "parameter(tethering) is NULL");
4737 _retvm_if(wps_pin == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4738 "parameter(wps_pin) is NULL");
4740 __tethering_h *th = (__tethering_h *)tethering;
4741 GDBusProxy *proxy = th->client_bus_proxy;
4742 GVariant *parameters = NULL;
4744 GError *error = NULL;
4746 parameters = g_dbus_proxy_call_sync(proxy, "set_wps_pin",
4747 g_variant_new("(s)", wps_pin), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4750 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4752 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4753 ret = TETHERING_ERROR_PERMISSION_DENIED;
4755 ret = TETHERING_ERROR_OPERATION_FAILED;
4757 g_error_free(error);
4761 if (parameters != NULL) {
4762 g_variant_get(parameters, "(u)", &ret);
4763 g_variant_unref(parameters);
4766 return TETHERING_ERROR_NONE;
4769 API int tethering_wifi_is_sharing_supported(tethering_h tethering, bool *supported)
4771 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4772 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4774 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4775 "parameter(tethering) is NULL\n");
4776 _retvm_if(supported == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4777 "parameter(supported) is NULL\n");
4779 /** Check if wifi-sharing is supported */
4780 __tethering_h *th = (__tethering_h *)tethering;
4781 GDBusProxy *proxy = th->client_bus_proxy;
4783 int ret = TETHERING_ERROR_NONE;
4786 GVariant *value = NULL;
4787 GVariantIter *iter = NULL;
4788 GVariantIter *sub_iter = NULL;
4789 GVariant *parameters = NULL;
4790 GError *error = NULL;
4792 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_interfaces",
4793 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4795 if (!parameters && error) {
4796 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4798 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4799 ret = TETHERING_ERROR_PERMISSION_DENIED;
4801 ret = TETHERING_ERROR_OPERATION_FAILED;
4803 g_error_free(error);
4807 g_variant_get(parameters, "(a(a{sv}))", &iter);
4809 g_variant_unref(parameters);
4810 ret = TETHERING_ERROR_OPERATION_FAILED;
4814 while (g_variant_iter_loop(iter, "(a{sv})", &sub_iter)) {
4815 while (g_variant_iter_loop(sub_iter, "{sv}", &key, &value)) {
4816 if (g_strcmp0(key, "IfName") == 0) {
4817 const gchar *interface = g_variant_get_string(value, NULL);
4818 ERR("interface: %s\n", interface);
4819 if (strncmp(interface, "wlan", 4) == 0)
4824 g_variant_unref(parameters);
4835 API int tethering_wifi_set_sharing(tethering_h tethering, bool sharing)
4837 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4838 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4840 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4841 "parameter(tethering) is NULL\n");
4843 __tethering_h *th = (__tethering_h *)tethering;
4844 th->wifi_sharing = sharing;
4846 return TETHERING_ERROR_NONE;
4849 API int tethering_wifi_get_sharing(tethering_h tethering, bool *sharing)
4851 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4852 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4854 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4855 "parameter(tethering) is NULL\n");
4856 _retvm_if(sharing == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4857 "parameter(sharing) is NULL\n");
4859 __tethering_h *th = (__tethering_h *)tethering;
4860 *sharing = th->wifi_sharing;
4862 return TETHERING_ERROR_NONE;