2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 #include <sys/ioctl.h>
21 #include <sys/socket.h>
22 #include <netinet/in.h>
24 #include <arpa/inet.h>
26 #include <dbus/dbus.h>
29 #include <openssl/evp.h>
30 #include <openssl/sha.h>
31 #include <ckmc/ckmc-manager.h>
32 #include <tzplatform_config.h>
33 #include "tethering_private.h"
35 #define ALLOWED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.accept")
36 #define BLOCKED_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/hostapd.deny")
37 #define TEMP_LIST tzplatform_mkpath(TZ_SYS_VAR, "/lib/hostapd/.hostapd_tmp")
38 #define MAC_ADDR_LEN 18
39 #define MAX_BUF_SIZE 80
41 #define IPTABLES "/usr/sbin/iptables"
42 #define TABLE_NAT "nat"
43 #define TETH_NAT_PRE "teth_nat_pre"
44 #define TABLE_FILTER "filter"
45 #define TETH_FILTER_FW "teth_filter_fw"
46 #define ACTION_DROP "DROP"
47 #define ACTION_ACCEPT "ACCEPT"
48 #define PORT_FORWARD_RULE_STR "-t %s -A %s -i %s -p %s -d %s --dport %d -j DNAT --to %s:%d"
49 #define FILTERING_MULTIPORT_RULE_STR "-t %s -A %s -p %s -m multiport --dport %d,%d -j %s"
50 #define FILTERING_RULE_STR "-t %s -A %s -p %s --dport %d -j %s"
52 static GSList *allowed_list = NULL;
53 static GSList *blocked_list = NULL;
54 static GSList *port_forwarding = NULL;
55 static GSList *port_filtering = NULL;
56 static GSList *custom_port_filtering = NULL;
58 static void __handle_wifi_tether_on(GDBusConnection *connection, const gchar *sender_name,
59 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
60 GVariant *parameters, gpointer user_data);
62 static void __handle_wifi_tether_off(GDBusConnection *connection, const gchar *sender_name,
63 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
64 GVariant *parameters, gpointer user_data);
66 static void __handle_usb_tether_on(GDBusConnection *connection, const gchar *sender_name,
67 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
68 GVariant *parameters, gpointer user_data);
70 static void __handle_usb_tether_off(GDBusConnection *connection, const gchar *sender_name,
71 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
72 GVariant *parameters, gpointer user_data);
74 static void __handle_bt_tether_on(GDBusConnection *connection, const gchar *sender_name,
75 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
76 GVariant *parameters, gpointer user_data);
78 static void __handle_bt_tether_off(GDBusConnection *connection, const gchar *sender_name,
79 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
80 GVariant *parameters, gpointer user_data);
82 static void __handle_net_closed(GDBusConnection *connection, const gchar *sender_name,
83 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
84 GVariant *parameters, gpointer user_data);
86 static void __handle_no_data_timeout(GDBusConnection *connection, const gchar *sender_name,
87 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
88 GVariant *parameters, gpointer user_data);
90 static void __handle_low_battery_mode(GDBusConnection *connection, const gchar *sender_name,
91 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
92 GVariant *parameters, gpointer user_data);
94 static void __handle_flight_mode(GDBusConnection *connection, const gchar *sender_name,
95 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
96 GVariant *parameters, gpointer user_data);
98 static void __handle_security_type_changed(GDBusConnection *connection, const gchar *sender_name,
99 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
100 GVariant *parameters, gpointer user_data);
102 static void __handle_ssid_visibility_changed(GDBusConnection *connection, const gchar *sender_name,
103 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
104 GVariant *parameters, gpointer user_data);
106 static void __handle_passphrase_changed(GDBusConnection *connection, const gchar *sender_name,
107 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
108 GVariant *parameters, gpointer user_data);
110 static void __handle_dhcp(GDBusConnection *connection, const gchar *sender_name,
111 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
112 GVariant *parameters, gpointer user_data);
114 static __tethering_sig_t sigs[] = {
115 {0, SIGNAL_NAME_NET_CLOSED, __handle_net_closed},
116 {0, SIGNAL_NAME_WIFI_TETHER_ON, __handle_wifi_tether_on},
117 {0, SIGNAL_NAME_WIFI_TETHER_OFF, __handle_wifi_tether_off},
118 {0, SIGNAL_NAME_USB_TETHER_ON, __handle_usb_tether_on},
119 {0, SIGNAL_NAME_USB_TETHER_OFF, __handle_usb_tether_off},
120 {0, SIGNAL_NAME_BT_TETHER_ON, __handle_bt_tether_on},
121 {0, SIGNAL_NAME_BT_TETHER_OFF, __handle_bt_tether_off},
122 {0, SIGNAL_NAME_NO_DATA_TIMEOUT, __handle_no_data_timeout},
123 {0, SIGNAL_NAME_LOW_BATTERY_MODE, __handle_low_battery_mode},
124 {0, SIGNAL_NAME_FLIGHT_MODE, __handle_flight_mode},
125 {0, SIGNAL_NAME_SECURITY_TYPE_CHANGED, __handle_security_type_changed},
126 {0, SIGNAL_NAME_SSID_VISIBILITY_CHANGED, __handle_ssid_visibility_changed},
127 {0, SIGNAL_NAME_PASSPHRASE_CHANGED, __handle_passphrase_changed},
128 {0, SIGNAL_NAME_DHCP_STATUS, __handle_dhcp} };
130 static int retry = 0;
132 static void __send_dbus_signal(GDBusConnection *conn, const char *signal_name, const char *arg)
134 if (conn == NULL || signal_name == NULL)
135 return; //LCOV_EXCL_LINE
137 GVariant *message = NULL;
138 GError *error = NULL;
141 message = g_variant_new("(s)", arg);
143 g_dbus_connection_emit_signal(conn, NULL, TETHERING_SERVICE_OBJECT_PATH,
144 TETHERING_SERVICE_INTERFACE, signal_name, message, &error);
146 ERR("g_dbus_connection_emit_signal is failed because %s\n", error->message); //LCOV_EXCL_LINE
147 g_error_free(error); //LCOV_EXCL_LINE
149 g_variant_unref(message);
152 static bool __any_tethering_is_enabled(tethering_h tethering)
154 if (tethering_is_enabled(tethering, TETHERING_TYPE_USB) ||
155 tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) ||
156 tethering_is_enabled(tethering, TETHERING_TYPE_BT) ||
157 tethering_is_enabled(tethering, TETHERING_TYPE_P2P))
163 static tethering_error_e __set_security_type(const tethering_wifi_security_type_e security_type)
165 if (security_type != TETHERING_WIFI_SECURITY_TYPE_NONE &&
166 security_type != TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK &&
167 security_type != TETHERING_WIFI_SECURITY_TYPE_WPS) {
168 ERR("Invalid param\n"); //LCOV_EXCL_LINE
169 return TETHERING_ERROR_INVALID_PARAMETER;
172 if (vconf_set_int(VCONFKEY_MOBILE_HOTSPOT_SECURITY, security_type) < 0) {
173 ERR("vconf_set_int is failed\n"); //LCOV_EXCL_LINE
174 return TETHERING_ERROR_OPERATION_FAILED;
177 return TETHERING_ERROR_NONE;
180 static tethering_error_e __get_security_type(tethering_wifi_security_type_e *security_type)
182 if (security_type == NULL) {
183 ERR("Invalid param\n"); //LCOV_EXCL_LINE
184 return TETHERING_ERROR_INVALID_PARAMETER;
187 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_SECURITY,
188 (int *)security_type) < 0) {
189 ERR("vconf_get_int is failed\n"); //LCOV_EXCL_LINE
190 return TETHERING_ERROR_OPERATION_FAILED;
193 return TETHERING_ERROR_NONE;
196 static bool __get_ssid_from_vconf(const char *path, char *ssid, unsigned int size)
198 if (path == NULL || ssid == NULL || size == 0)
202 char *ptr_tmp = NULL;
204 ptr = vconf_get_str(path);
208 if (!g_utf8_validate(ptr, -1, (const char **)&ptr_tmp))
211 g_strlcpy(ssid, ptr, size);
217 static tethering_error_e __set_visible(const bool visible)
219 if (vconf_set_int(VCONFKEY_MOBILE_HOTSPOT_HIDE, visible ? 0 : 1) < 0) {
220 ERR("vconf_set_int is failed\n"); //LCOV_EXCL_LINE
221 return TETHERING_ERROR_OPERATION_FAILED;
224 return TETHERING_ERROR_NONE;
227 static tethering_error_e __get_visible(bool *visible)
229 if (visible == NULL) {
230 ERR("Invalid param\n"); //LCOV_EXCL_LINE
231 return TETHERING_ERROR_INVALID_PARAMETER;
236 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_HIDE, &hide) < 0) {
237 ERR("vconf_get_int is failed\n"); //LCOV_EXCL_LINE
238 return TETHERING_ERROR_OPERATION_FAILED;
245 return TETHERING_ERROR_NONE;
248 static unsigned int __generate_initial_passphrase(char *passphrase, unsigned int size)
250 if (passphrase == NULL ||
251 size == 0 || size < TETHERING_WIFI_KEY_MIN_LEN + 1)
254 guint32 rand_int = 0;
257 for (index = 0; index < TETHERING_WIFI_KEY_MIN_LEN; index++) {
258 rand_int = g_random_int_range('a', 'z');
259 passphrase[index] = rand_int;
261 passphrase[index] = '\0';
266 static tethering_error_e __get_error(int agent_error)
268 tethering_error_e err = TETHERING_ERROR_NONE;
270 switch (agent_error) {
271 case MOBILE_AP_ERROR_NONE:
272 err = TETHERING_ERROR_NONE;
276 case MOBILE_AP_ERROR_RESOURCE:
277 err = TETHERING_ERROR_OUT_OF_MEMORY;
281 case MOBILE_AP_ERROR_INTERNAL:
282 err = TETHERING_ERROR_OPERATION_FAILED;
285 case MOBILE_AP_ERROR_INVALID_PARAM:
286 err = TETHERING_ERROR_INVALID_PARAMETER;
290 case MOBILE_AP_ERROR_ALREADY_ENABLED:
291 err = TETHERING_ERROR_OPERATION_FAILED;
294 case MOBILE_AP_ERROR_NOT_ENABLED:
295 err = TETHERING_ERROR_NOT_ENABLED;
298 case MOBILE_AP_ERROR_NET_OPEN:
299 err = TETHERING_ERROR_OPERATION_FAILED;
302 case MOBILE_AP_ERROR_NET_CLOSE:
303 err = TETHERING_ERROR_OPERATION_FAILED;
306 case MOBILE_AP_ERROR_DHCP:
307 err = TETHERING_ERROR_OPERATION_FAILED;
310 case MOBILE_AP_ERROR_IN_PROGRESS:
311 err = TETHERING_ERROR_OPERATION_FAILED;
314 case MOBILE_AP_ERROR_NOT_PERMITTED:
315 err = TETHERING_ERROR_NOT_PERMITTED;
318 case MOBILE_AP_ERROR_PERMISSION_DENIED:
319 err = TETHERING_ERROR_PERMISSION_DENIED;
323 ERR("Not defined error : %d\n", agent_error);
324 err = TETHERING_ERROR_OPERATION_FAILED;
332 static void __handle_dhcp(GDBusConnection *connection, const gchar *sender_name,
333 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
334 GVariant *parameters, gpointer user_data)
338 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
340 __tethering_h *th = (__tethering_h *)user_data;
342 tethering_type_e type = 0;
343 mobile_ap_type_e ap_type = 0;
344 tethering_connection_state_changed_cb ccb = NULL;
345 __tethering_client_h client;
353 memset(&client, 0, sizeof(__tethering_client_h));
354 g_variant_get(parameters, "(susssu)", &buf, &ap_type, &ip, &mac, &name, ×tamp);
356 if (!g_strcmp0(buf, "DhcpConnected")) {
358 } else if (!g_strcmp0(buf, "DhcpLeaseDeleted")) {
361 ERR("Unknown event [%s]\n", buf);
365 if (ap_type == MOBILE_AP_TYPE_USB)
366 type = TETHERING_TYPE_USB;
367 else if (ap_type == MOBILE_AP_TYPE_WIFI)
368 type = TETHERING_TYPE_WIFI;
369 else if (ap_type == MOBILE_AP_TYPE_BT)
370 type = TETHERING_TYPE_BT;
371 else if (ap_type == MOBILE_AP_TYPE_P2P)
372 type = TETHERING_TYPE_P2P;
374 ERR("Not supported tethering type [%d]\n", ap_type);
378 ccb = th->changed_cb[type];
381 data = th->changed_user_data[type];
383 client.interface = type;
384 g_strlcpy(client.ip, ip, sizeof(client.ip));
385 g_strlcpy(client.mac, mac, sizeof(client.mac));
387 client.hostname = g_strdup(name);
388 client.tm = (time_t)timestamp;
390 ccb((tethering_client_h)&client, opened, data);
391 g_free(client.hostname);
400 static void __handle_net_closed(GDBusConnection *connection, const gchar *sender_name,
401 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
402 GVariant *parameters, gpointer user_data)
406 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
408 __tethering_h *th = (__tethering_h *)user_data;
409 tethering_type_e type = 0;
410 tethering_disabled_cb dcb = NULL;
412 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_NETWORK_CLOSE;
414 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
415 dcb = th->disabled_cb[type];
418 data = th->disabled_user_data[type];
420 dcb(TETHERING_ERROR_NONE, type, code, data);
427 static void __handle_wifi_tether_on(GDBusConnection *connection, const gchar *sender_name,
428 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
429 GVariant *parameters, gpointer user_data)
433 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
435 __tethering_h *th = (__tethering_h *)user_data;
436 tethering_type_e type = TETHERING_TYPE_WIFI;
437 bool is_requested = false;
438 tethering_enabled_cb ecb = NULL;
441 ecb = th->enabled_cb[type];
444 data = th->enabled_user_data[type];
446 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
450 static void __handle_wifi_tether_off(GDBusConnection *connection, const gchar *sender_name,
451 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
452 GVariant *parameters, gpointer user_data)
456 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
458 __tethering_h *th = (__tethering_h *)user_data;
459 tethering_type_e type = TETHERING_TYPE_WIFI;
460 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
461 tethering_disabled_cb dcb = NULL;
465 dcb = th->disabled_cb[type];
468 data = th->disabled_user_data[type];
469 g_variant_get(parameters, "(s)", &buf);
470 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
471 code = TETHERING_DISABLED_BY_WIFI_ON;
472 else if (!g_strcmp0(buf, SIGNAL_MSG_TIMEOUT))
473 code = TETHERING_DISABLED_BY_TIMEOUT;
476 dcb(TETHERING_ERROR_NONE, type, code, data);
482 static void __handle_usb_tether_on(GDBusConnection *connection, const gchar *sender_name,
483 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
484 GVariant *parameters, gpointer user_data)
488 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
490 __tethering_h *th = (__tethering_h *)user_data;
491 tethering_type_e type = TETHERING_TYPE_USB;
492 bool is_requested = false;
493 tethering_enabled_cb ecb = NULL;
496 ecb = th->enabled_cb[type];
499 data = th->enabled_user_data[type];
501 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
505 static void __handle_usb_tether_off(GDBusConnection *connection, const gchar *sender_name,
506 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
507 GVariant *parameters, gpointer user_data)
511 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
513 __tethering_h *th = (__tethering_h *)user_data;
514 tethering_type_e type = TETHERING_TYPE_USB;
515 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
516 tethering_disabled_cb dcb = NULL;
520 dcb = th->disabled_cb[type];
523 data = th->disabled_user_data[type];
525 g_variant_get(parameters, "(s)", &buf);
526 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
527 code = TETHERING_DISABLED_BY_USB_DISCONNECTION;
529 dcb(TETHERING_ERROR_NONE, type, code, data);
535 static void __handle_bt_tether_on(GDBusConnection *connection, const gchar *sender_name,
536 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
537 GVariant *parameters, gpointer user_data)
541 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
543 __tethering_h *th = (__tethering_h *)user_data;
544 tethering_type_e type = TETHERING_TYPE_BT;
545 bool is_requested = false;
546 tethering_enabled_cb ecb = NULL;
549 ecb = th->enabled_cb[type];
552 data = th->enabled_user_data[type];
554 ecb(TETHERING_ERROR_NONE, type, is_requested, data);
558 static void __handle_bt_tether_off(GDBusConnection *connection, const gchar *sender_name,
559 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
560 GVariant *parameters, gpointer user_data)
564 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
566 __tethering_h *th = (__tethering_h *)user_data;
567 tethering_type_e type = TETHERING_TYPE_BT;
568 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_OTHERS;
569 tethering_disabled_cb dcb = NULL;
573 dcb = th->disabled_cb[type];
576 data = th->disabled_user_data[type];
577 g_variant_get(parameters, "(s)", &buf);
578 if (!g_strcmp0(buf, SIGNAL_MSG_NOT_AVAIL_INTERFACE))
579 code = TETHERING_DISABLED_BY_BT_OFF;
580 else if (!g_strcmp0(buf, SIGNAL_MSG_TIMEOUT))
581 code = TETHERING_DISABLED_BY_TIMEOUT;
583 dcb(TETHERING_ERROR_NONE, type, code, data);
590 static void __handle_no_data_timeout(GDBusConnection *connection, const gchar *sender_name,
591 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
592 GVariant *parameters, gpointer user_data)
596 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
598 __tethering_h *th = (__tethering_h *)user_data;
599 tethering_type_e type = 0;
600 tethering_disabled_cb dcb = NULL;
602 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_TIMEOUT;
604 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
605 dcb = th->disabled_cb[type];
608 data = th->disabled_user_data[type];
610 dcb(TETHERING_ERROR_NONE, type, code, data);
615 static void __handle_low_battery_mode(GDBusConnection *connection, const gchar *sender_name,
616 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
617 GVariant *parameters, gpointer user_data)
621 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
623 __tethering_h *th = (__tethering_h *)user_data;
624 tethering_type_e type = 0;
625 tethering_disabled_cb dcb = NULL;
627 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_LOW_BATTERY;
629 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
630 dcb = th->disabled_cb[type];
633 data = th->disabled_user_data[type];
635 dcb(TETHERING_ERROR_NONE, type, code, data);
640 static void __handle_flight_mode(GDBusConnection *connection, const gchar *sender_name,
641 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
642 GVariant *parameters, gpointer user_data)
646 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
648 __tethering_h *th = (__tethering_h *)user_data;
649 tethering_type_e type = 0;
650 tethering_disabled_cb dcb = NULL;
652 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_FLIGHT_MODE;
654 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
655 dcb = th->disabled_cb[type];
658 data = th->disabled_user_data[type];
660 dcb(TETHERING_ERROR_NONE, type, code, data);
666 static void __handle_security_type_changed(GDBusConnection *connection, const gchar *sender_name,
667 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
668 GVariant *parameters, gpointer user_data)
673 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
674 __tethering_h *th = (__tethering_h *)user_data;
676 tethering_wifi_security_type_changed_cb scb = NULL;
678 tethering_wifi_security_type_e security_type;
681 scb = th->security_type_changed_cb;
685 g_variant_get(parameters, "(s)", &buf);
686 data = th->security_type_user_data;
687 if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_OPEN_STR) == 0)
688 security_type = TETHERING_WIFI_SECURITY_TYPE_NONE;
689 else if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR) == 0)
690 security_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
691 else if (g_strcmp0(buf, TETHERING_WIFI_SECURITY_TYPE_WPS_STR) == 0)
692 security_type = TETHERING_WIFI_SECURITY_TYPE_WPS;
694 SERR("Unknown type : %s\n", buf); //LCOV_EXCL_LINE
699 scb(security_type, data);
704 static void __handle_ssid_visibility_changed(GDBusConnection *connection, const gchar *sender_name,
705 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
706 GVariant *parameters, gpointer user_data)
708 DBG("+\n"); //LCOV_EXCL_LINE
710 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
711 __tethering_h *th = (__tethering_h *)user_data;
713 tethering_wifi_ssid_visibility_changed_cb scb = NULL;
715 bool visible = false;
718 scb = th->ssid_visibility_changed_cb;
720 DBG("-\n"); //LCOV_EXCL_LINE
723 g_variant_get(parameters, "(s)", &buf);
724 data = th->ssid_visibility_user_data;
725 if (g_strcmp0(buf, SIGNAL_MSG_SSID_VISIBLE) == 0)
730 DBG("-\n"); //LCOV_EXCL_LINE
733 static void __handle_passphrase_changed(GDBusConnection *connection, const gchar *sender_name,
734 const gchar *object_path, const gchar *interface_name, const gchar *signal_name,
735 GVariant *parameters, gpointer user_data)
737 DBG("+\n"); //LCOV_EXCL_LINE
739 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
740 __tethering_h *th = (__tethering_h *)user_data;
742 tethering_wifi_passphrase_changed_cb pcb = NULL;
745 pcb = th->passphrase_changed_cb;
749 data = th->passphrase_user_data;
752 DBG("-\n"); //LCOV_EXCL_LINE
755 static void __wifi_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
758 INFO("+\n"); //LCOV_EXCL_LINE
760 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
761 GError *g_error = NULL;
764 tethering_error_e error;
765 __tethering_h *th = (__tethering_h *)user_data;
766 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_WIFI];
767 void *data = th->enabled_user_data[TETHERING_TYPE_WIFI];
769 if (!_tethering_check_handle((tethering_h)user_data))
772 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
775 ERR("DBus error [%s]\n", g_error->message);
776 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
777 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
778 g_error_free(g_error);
779 tethering_enable((tethering_h)th, TETHERING_TYPE_WIFI);
781 } else if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
782 error = TETHERING_ERROR_PERMISSION_DENIED;
784 error = TETHERING_ERROR_OPERATION_FAILED;
785 g_error_free(g_error);
788 g_variant_get(g_var, "(u)", &info);
789 error = __get_error(info);
793 INFO("cfm event : wifi tethering enable info : %d\n", error); //LCOV_EXCL_LINE
795 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
796 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_ON].name,
797 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
798 sigs[E_SIGNAL_WIFI_TETHER_ON].cb, (gpointer)th, NULL);
801 INFO("-\n"); //LCOV_EXCL_LINE
804 ecb(error, TETHERING_TYPE_WIFI, true, data);
805 g_variant_unref(g_var);
806 INFO("-\n"); //LCOV_EXCL_LINE
809 static void __bt_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
812 DBG("+\n"); //LCOV_EXCL_LINE
813 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
814 GError *g_error = NULL;
817 tethering_error_e error;
819 __tethering_h *th = (__tethering_h *)user_data;
820 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_BT];
821 void *data = th->enabled_user_data[TETHERING_TYPE_BT];
823 if (!_tethering_check_handle((tethering_h)user_data))
826 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
829 ERR("DBus error [%s]\n", g_error->message);
830 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
831 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
832 g_error_free(g_error);
833 tethering_enable((tethering_h)th, TETHERING_TYPE_BT);
837 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
838 error = TETHERING_ERROR_PERMISSION_DENIED;
840 error = TETHERING_ERROR_OPERATION_FAILED;
841 g_error_free(g_error);
844 g_variant_get(g_var, "(u)", &info);
845 g_variant_unref(g_var);
846 error = __get_error(info);
850 sigs[E_SIGNAL_BT_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
851 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_ON].name,
852 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
853 sigs[E_SIGNAL_BT_TETHER_ON].cb, (gpointer)th, NULL);
856 DBG("-\n"); //LCOV_EXCL_LINE
860 ecb(error, TETHERING_TYPE_BT, true, data);
865 static void __usb_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
870 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
871 __tethering_h *th = (__tethering_h *)user_data;
872 GError *g_error = NULL;
875 tethering_error_e error;
876 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_USB];
877 void *data = th->enabled_user_data[TETHERING_TYPE_USB];
879 if (!_tethering_check_handle((tethering_h)user_data))
882 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
884 ERR("DBus error [%s]\n", g_error->message);
885 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
886 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
887 g_error_free(g_error);
888 tethering_enable((tethering_h)th, TETHERING_TYPE_USB);
892 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
893 error = TETHERING_ERROR_PERMISSION_DENIED;
895 error = TETHERING_ERROR_OPERATION_FAILED;
896 g_error_free(g_error);
898 g_variant_get(g_var, "(u)", &info);
899 g_variant_unref(g_var);
900 error = __get_error(info);
904 sigs[E_SIGNAL_USB_TETHER_ON].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
905 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_ON].name,
906 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
907 sigs[E_SIGNAL_USB_TETHER_ON].cb, (gpointer)th, NULL);
914 ecb(error, TETHERING_TYPE_USB, true, data);
918 static void __p2p_enabled_cfm_cb(GObject *source_object, GAsyncResult *res,
923 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
924 __tethering_h *th = (__tethering_h *)user_data;
925 GError *g_error = NULL;
928 tethering_error_e error;
929 tethering_enabled_cb ecb = th->enabled_cb[TETHERING_TYPE_P2P];
930 void *data = th->enabled_user_data[TETHERING_TYPE_P2P];
932 if (!_tethering_check_handle((tethering_h)user_data))
935 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
937 ERR("DBus error [%s]\n", g_error->message);
938 if (g_error->code == G_DBUS_ERROR_NO_REPLY &&
939 ++retry < TETHERING_ERROR_RECOVERY_MAX) {
940 g_error_free(g_error);
941 tethering_enable((tethering_h)th, TETHERING_TYPE_P2P);
945 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
946 error = TETHERING_ERROR_PERMISSION_DENIED;
948 error = TETHERING_ERROR_OPERATION_FAILED;
949 g_error_free(g_error);
951 g_variant_get(g_var, "(u)", &info);
952 g_variant_unref(g_var);
953 error = __get_error(info);
962 ecb(error, TETHERING_TYPE_P2P, true, data);
967 static void __disabled_cfm_cb(GObject *source_object, GAsyncResult *res,
970 INFO("+\n"); //LCOV_EXCL_LINE
972 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
973 GError *g_error = NULL;
975 guint info, event_type;
976 tethering_error_e error;
977 tethering_type_e type;
978 tethering_h tethering = (tethering_h)user_data;
979 __tethering_h *th = (__tethering_h *)tethering;
980 tethering_disabled_cause_e code = TETHERING_DISABLED_BY_REQUEST;
981 tethering_disabled_cb dcb = NULL;
984 if (!_tethering_check_handle((tethering_h)user_data))
987 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
990 ERR("DBus error [%s]\n", g_error->message);
991 g_error_free(g_error);
995 g_variant_get(g_var, "(uu)", &event_type, &info);
996 INFO("cfm event : %d info : %d\n", event_type, info);
997 g_variant_unref(g_var);
998 error = __get_error(info);
999 INFO("cfm event : %d info : %d\n", event_type, error);
1000 switch (event_type) {
1001 case MOBILE_AP_DISABLE_WIFI_TETHERING_CFM:
1002 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1003 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
1004 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1005 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
1007 type = TETHERING_TYPE_WIFI;
1008 dcb = th->disabled_cb[type];
1009 data = th->disabled_user_data[type];
1011 dcb(error, type, code, data);
1014 case MOBILE_AP_DISABLE_BT_TETHERING_CFM:
1015 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1016 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1017 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1018 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1020 type = TETHERING_TYPE_BT;
1021 dcb = th->disabled_cb[type];
1022 data = th->disabled_user_data[type];
1024 dcb(error, type, code, data);
1028 case MOBILE_AP_DISABLE_USB_TETHERING_CFM:
1029 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1030 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1031 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1032 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1034 type = TETHERING_TYPE_USB;
1035 dcb = th->disabled_cb[type];
1036 data = th->disabled_user_data[type];
1038 dcb(error, type, code, data);
1041 case MOBILE_AP_DISABLE_P2P_TETHERING_CFM:
1042 type = TETHERING_TYPE_P2P;
1043 dcb = th->disabled_cb[type];
1044 data = th->disabled_user_data[type];
1046 dcb(error, type, code, data);
1049 case MOBILE_AP_DISABLE_CFM:
1051 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1052 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_WIFI_TETHER_OFF].name,
1053 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1054 sigs[E_SIGNAL_WIFI_TETHER_OFF].cb, (gpointer)th, NULL);
1055 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1056 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_BT_TETHER_OFF].name,
1057 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1058 sigs[E_SIGNAL_BT_TETHER_OFF].cb, (gpointer)th, NULL);
1059 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id = g_dbus_connection_signal_subscribe(th->client_bus,
1060 NULL, TETHERING_SERVICE_INTERFACE, sigs[E_SIGNAL_USB_TETHER_OFF].name,
1061 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1062 sigs[E_SIGNAL_USB_TETHER_OFF].cb, (gpointer)th, NULL);
1064 for (type = TETHERING_TYPE_USB; type <= TETHERING_TYPE_BT; type++) {
1065 dcb = th->disabled_cb[type];
1068 data = th->disabled_user_data[type];
1070 dcb(error, type, code, data);
1075 ERR("Invalid event\n");
1079 INFO("-\n"); //LCOV_EXCL_LINE
1082 static void __get_data_usage_cb(GObject *source_object, GAsyncResult *res,
1087 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1089 GError *g_error = NULL;
1092 guint64 tx_bytes, rx_bytes;
1093 __tethering_h *th = (__tethering_h *)user_data;
1094 tethering_error_e tethering_error = TETHERING_ERROR_NONE;
1097 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1100 ERR("DBus fail [%s]\n", g_error->message);
1101 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1102 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1104 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1109 if (th->data_usage_cb == NULL) {
1110 ERR("There is no data_usage_cb\n"); //LCOV_EXCL_LINE
1114 th->data_usage_cb(tethering_error, 0LL, 0LL, th->data_usage_user_data);
1116 g_variant_get(g_var, "(utt)", &event_type, &tx_bytes, &rx_bytes);
1117 th->data_usage_cb(TETHERING_ERROR_NONE,
1118 rx_bytes, tx_bytes, th->data_usage_user_data);
1119 g_variant_unref(g_var);
1121 th->data_usage_cb = NULL;
1122 th->data_usage_user_data = NULL;
1127 static void __settings_reloaded_cb(GObject *source_object, GAsyncResult *res,
1132 _retm_if(user_data == NULL, "parameter(user_data) is NULL\n");
1133 GError *g_error = NULL;
1136 __tethering_h *th = (__tethering_h *)user_data;
1137 tethering_error_e tethering_error = TETHERING_ERROR_NONE;
1139 g_var = g_dbus_proxy_call_finish(th->client_bus_proxy, res, &g_error);
1141 ERR("DBus fail [%s]\n", g_error->message); //LCOV_EXCL_LINE
1142 if (g_error->code == G_DBUS_ERROR_ACCESS_DENIED)
1143 tethering_error = TETHERING_ERROR_PERMISSION_DENIED;
1145 tethering_error = TETHERING_ERROR_OPERATION_FAILED;
1146 g_error_free(g_error);
1148 if (th->settings_reloaded_cb == NULL) {
1149 DBG("There is no settings_reloaded_cb\n-\n");
1152 g_variant_get(g_var, "(u)", &info);
1153 if (tethering_error == TETHERING_ERROR_NONE)
1154 tethering_error = __get_error(info);
1155 g_variant_unref(g_var);
1157 th->settings_reloaded_cb(tethering_error,
1158 th->settings_reloaded_user_data);
1160 th->settings_reloaded_cb = NULL;
1161 th->settings_reloaded_user_data = NULL;
1165 static void __connect_signals(tethering_h tethering)
1168 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1170 __tethering_h *th = (__tethering_h *)tethering;
1171 GDBusConnection *connection = th->client_bus;
1174 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++) {
1175 sigs[i].sig_id = g_dbus_connection_signal_subscribe(connection,
1176 NULL, TETHERING_SERVICE_INTERFACE, sigs[i].name,
1177 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1178 sigs[i].cb, tethering, NULL);
1183 static void __disconnect_signals(tethering_h tethering)
1187 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1189 __tethering_h *th = (__tethering_h *)tethering;
1190 GDBusConnection *connection = th->client_bus;
1194 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++)
1195 g_dbus_connection_signal_unsubscribe(connection, sigs[i].sig_id);
1201 static bool __get_intf_name(tethering_type_e type, char *buf, unsigned int len)
1203 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1207 case TETHERING_TYPE_USB:
1208 g_strlcpy(buf, TETHERING_USB_IF, len);
1211 case TETHERING_TYPE_WIFI:
1212 g_strlcpy(buf, TETHERING_WIFI_IF, len);
1215 case TETHERING_TYPE_BT:
1216 g_strlcpy(buf, TETHERING_BT_IF, len);
1221 ERR("Not supported type : %d\n", type);
1228 static bool __get_gateway_addr(tethering_type_e type, char *buf, unsigned int len)
1230 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1234 case TETHERING_TYPE_USB:
1235 g_strlcpy(buf, TETHERING_USB_GATEWAY, len);
1238 case TETHERING_TYPE_WIFI:
1239 g_strlcpy(buf, TETHERING_WIFI_GATEWAY, len);
1242 case TETHERING_TYPE_BT:
1243 g_strlcpy(buf, TETHERING_BT_GATEWAY, len);
1247 ERR("Not supported type : %d\n", type);
1254 static int __get_common_ssid(char *ssid, unsigned int size)
1257 ERR("ssid is null\n"); //LCOV_EXCL_LINE
1258 return TETHERING_ERROR_INVALID_PARAMETER;
1262 char *ptr_tmp = NULL;
1264 ptr = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1266 ERR("vconf_get_str is failed and set default ssid");
1267 g_strlcpy(ssid, TETHERING_DEFAULT_SSID, size);
1269 g_strlcpy(ssid, ptr, size);
1273 if (!g_utf8_validate(ssid, -1, (const char **)&ptr_tmp))
1276 return TETHERING_ERROR_NONE;
1279 static bool __get_wifi_mode_type(tethering_wifi_mode_type_e type, char **buf)
1281 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1284 case TETHERING_WIFI_MODE_TYPE_B:
1285 *buf = g_strdup("b");
1287 case TETHERING_WIFI_MODE_TYPE_G:
1288 *buf = g_strdup("g");
1290 case TETHERING_WIFI_MODE_TYPE_A:
1291 *buf = g_strdup("a");
1293 case TETHERING_WIFI_MODE_TYPE_AD:
1294 *buf = g_strdup("ad");
1297 ERR("Not supported type : %d\n", type);
1303 static int __prepare_wifi_settings(tethering_h tethering, _softap_settings_t *set)
1307 __tethering_h *th = (__tethering_h *)tethering;
1308 tethering_error_e ret = TETHERING_ERROR_NONE;
1311 if (th == NULL || set == NULL) {
1312 ERR("null parameter\n-\n"); //LCOV_EXCL_LINE
1313 return TETHERING_ERROR_INVALID_PARAMETER;
1316 if (th->ssid == NULL)
1317 __get_common_ssid(set->ssid, sizeof(set->ssid));
1319 g_strlcpy(set->ssid, th->ssid, sizeof(set->ssid));
1321 ret = __get_security_type(&set->sec_type);
1322 if (ret != TETHERING_ERROR_NONE)
1323 set->sec_type = th->sec_type;
1325 ret = __get_visible(&set->visibility);
1326 if (ret != TETHERING_ERROR_NONE)
1327 set->visibility = th->visibility;
1329 set->mac_filter = th->mac_filter;
1330 set->max_connected = th->wifi_max_connected;
1331 set->channel = th->channel;
1333 __get_wifi_mode_type(th->mode_type, &ptr);
1335 g_strlcpy(set->mode, "", sizeof(set->mode));
1337 g_strlcpy(set->mode, ptr, sizeof(set->mode));
1341 if (set->sec_type == TETHERING_WIFI_SECURITY_TYPE_NONE) {
1342 g_strlcpy(set->key, "", sizeof(set->key));
1344 GDBusProxy *proxy = th->client_bus_proxy;
1345 GVariant *parameters;
1346 GError *error = NULL;
1347 char *passphrase = NULL;
1348 unsigned int len = 0;
1350 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
1351 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1355 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
1357 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
1358 ret = TETHERING_ERROR_PERMISSION_DENIED;
1360 ret = TETHERING_ERROR_OPERATION_FAILED;
1362 g_error_free(error);
1367 if (parameters != NULL) {
1368 g_variant_get(parameters, "(siu)", &passphrase, &len, &ret);
1369 g_variant_unref(parameters);
1372 g_strlcpy(set->key, passphrase, sizeof(set->key));
1375 INFO("ssid: %s security: %d mode: %s channel: %d visibility: %s\n",
1376 set->ssid, set->sec_type, set->mode, set->channel,
1377 (set->visibility) ? "true" : "false");
1379 return TETHERING_ERROR_NONE;
1382 static bool __check_precondition(tethering_type_e type)
1384 int dnet_status = 0;
1385 int cellular_state = 0;
1387 /* data network through cellular */
1388 vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &cellular_state);
1389 if (cellular_state == VCONFKEY_NETWORK_CELLULAR_ON) {
1390 INFO("Data Network can be connected later");
1394 /* data network status */
1395 vconf_get_int(VCONFKEY_NETWORK_STATUS, &dnet_status);
1396 if ((dnet_status == VCONFKEY_NETWORK_WIFI
1397 && type != TETHERING_TYPE_WIFI)
1398 || dnet_status == VCONFKEY_NETWORK_ETHERNET)
1401 ERR("Network is not available!");
1407 * @brief Creates the handle of tethering.
1409 * @privlevel platform
1410 * @privilege http://tizen.org/privilege/tethering.admin
1411 * @remarks The @a tethering must be released tethering_destroy() by you.
1412 * @param[out] tethering A handle of a new mobile ap handle on success
1413 * @return 0 on success, otherwise a negative error value.
1414 * @retval #TETHERING_ERROR_NONE Successful
1415 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1416 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1417 * @retval #TETHERING_ERROR_NOT_SUPPORT_API API is not supported
1418 * @see tethering_destroy()
1420 API int tethering_create(tethering_h *tethering)
1422 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1423 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1424 "parameter(tethering) is NULL\n");
1427 __tethering_h *th = NULL;
1428 GError *error = NULL;
1429 char ssid[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
1431 th = (__tethering_h *)malloc(sizeof(__tethering_h));
1433 _retvm_if(th == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
1434 "malloc is failed\n");
1435 memset(th, 0x00, sizeof(__tethering_h));
1436 th->sec_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
1437 th->visibility = true;
1438 th->mac_filter = false;
1439 th->channel = TETHERING_WIFI_CHANNEL;
1440 th->mode_type = TETHERING_WIFI_MODE_TYPE_G;
1441 th->wifi_max_connected = TETHERING_WIFI_MAX_STA;
1443 if (__generate_initial_passphrase(th->passphrase,
1444 sizeof(th->passphrase)) == 0) {
1446 ERR("random passphrase generation failed\n");
1448 return TETHERING_ERROR_OPERATION_FAILED;
1452 if (__get_common_ssid(ssid, sizeof(ssid)) != TETHERING_ERROR_NONE) {
1454 ERR("common ssid get failed\n");
1456 return TETHERING_ERROR_OPERATION_FAILED;
1460 #if !GLIB_CHECK_VERSION(2, 36, 0)
1463 GCancellable *cancellable = g_cancellable_new();
1464 th->client_bus = g_bus_get_sync(DBUS_BUS_SYSTEM, cancellable, &error);
1467 ERR("Couldn't connect to the System bus[%s]", error->message);
1468 g_error_free(error);
1469 g_cancellable_cancel(cancellable);
1470 g_object_unref(cancellable);
1472 return TETHERING_ERROR_OPERATION_FAILED;
1475 th->cancellable = cancellable;
1477 th->client_bus_proxy = g_dbus_proxy_new_sync(th->client_bus, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION,
1478 NULL, TETHERING_SERVICE_NAME, TETHERING_SERVICE_OBJECT_PATH,
1479 TETHERING_SERVICE_INTERFACE, th->cancellable, &error);
1480 if (!th->client_bus_proxy) {
1483 ERR("Couldn't create the proxy object because of %s\n", error->message);
1484 g_cancellable_cancel(th->cancellable);
1485 g_object_unref(th->cancellable);
1486 g_object_unref(th->client_bus);
1488 return TETHERING_ERROR_OPERATION_FAILED;
1492 __connect_signals((tethering_h)th);
1494 *tethering = (tethering_h)th;
1495 _tethering_add_handle(th);
1496 INFO("Tethering Handle : %p\n", th);
1498 return TETHERING_ERROR_NONE;
1503 * @brief Destroys the handle of tethering.
1505 * @privlevel platform
1506 * @privilege http://tizen.org/privilege/tethering.admin
1507 * @param[in] tethering The handle of tethering
1508 * @return 0 on success, otherwise a negative error value.
1509 * @retval #TETHERING_ERROR_NONE Successful
1510 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1511 * @see tethering_create()
1513 API int tethering_destroy(tethering_h tethering)
1516 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1517 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1518 "parameter(tethering) is NULL\n");
1520 __tethering_h *th = (__tethering_h *)tethering;
1522 INFO("Tethering Handle : %p\n", th);
1524 __disconnect_signals(tethering);
1525 _tethering_remove_handle(th);
1530 g_object_unref(th->cancellable);
1531 g_object_unref(th->client_bus_proxy);
1532 g_object_unref(th->client_bus);
1533 memset(th, 0x00, sizeof(__tethering_h));
1538 return TETHERING_ERROR_NONE;
1543 * @brief Enables the tethering, asynchronously.
1545 * @privlevel platform
1546 * @privilege http://tizen.org/privilege/tethering.admin
1547 * @param[in] tethering The handle of tethering
1548 * @param[in] type The type of tethering
1549 * @return 0 on success, otherwise negative error value.
1550 * @retval #TETHERING_ERROR_NONE Successful
1551 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1552 * @post tethering_enabled_cb() will be invoked.
1553 * @see tethering_is_enabled()
1554 * @see tethering_disable()
1556 API int tethering_enable(tethering_h tethering, tethering_type_e type)
1558 INFO("+ type : %d\n", type);
1559 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1560 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1561 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1562 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1564 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1565 "parameter(tethering) is NULL\n");
1567 tethering_error_e ret = TETHERING_ERROR_NONE;
1568 __tethering_h *th = (__tethering_h *)tethering;
1569 GDBusProxy *proxy = th->client_bus_proxy;
1570 GDBusConnection *connection = th->client_bus;
1572 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1574 if (__check_precondition(type) == FALSE) {
1577 return TETHERING_ERROR_OPERATION_FAILED;
1583 case TETHERING_TYPE_USB:
1584 g_dbus_connection_signal_unsubscribe(connection,
1585 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1587 g_dbus_proxy_call(proxy, "enable_usb_tethering",
1588 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1589 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1590 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1594 case TETHERING_TYPE_WIFI: {
1595 _softap_settings_t set = {"", "", "", 0, false};
1597 ret = __prepare_wifi_settings(tethering, &set);
1598 if (ret != TETHERING_ERROR_NONE) {
1600 ERR("softap settings initialization failed\n");
1602 return TETHERING_ERROR_OPERATION_FAILED;
1605 g_dbus_connection_signal_unsubscribe(connection,
1606 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1608 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1609 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type, TETHERING_ADDRESS_FAMILY_IPV4),
1610 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1611 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1615 case TETHERING_TYPE_BT:
1616 g_dbus_connection_signal_unsubscribe(connection,
1617 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1619 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1620 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1621 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1622 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1627 case TETHERING_TYPE_P2P: {
1628 _softap_settings_t p2p_set = {"", "", "", 0, false};
1629 ret = __prepare_wifi_settings(tethering, &p2p_set);
1630 if (ret != TETHERING_ERROR_NONE) {
1631 ERR("p2p settings initialization failed\n");
1633 return TETHERING_ERROR_OPERATION_FAILED;
1636 g_dbus_proxy_call(proxy, "enable_p2p_tethering",
1637 g_variant_new("(ssi)", p2p_set.ssid, p2p_set.key, p2p_set.channel),
1638 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1639 (GAsyncReadyCallback) __p2p_enabled_cfm_cb, (gpointer)tethering);
1643 case TETHERING_TYPE_ALL: {
1644 _softap_settings_t set = {"", "", "", 0, false};
1646 ret = __prepare_wifi_settings(tethering, &set);
1647 if (ret != TETHERING_ERROR_NONE) {
1648 ERR("softap settings initialization failed\n");
1649 return TETHERING_ERROR_OPERATION_FAILED;
1652 /* TETHERING_TYPE_USB */
1653 g_dbus_connection_signal_unsubscribe(connection,
1654 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1656 g_dbus_proxy_call(proxy, "enable_usb_tethering",
1657 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1658 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1659 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1661 /* TETHERING_TYPE_WIFI */
1662 g_dbus_connection_signal_unsubscribe(connection,
1663 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1665 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1666 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode,
1667 set.channel, set.visibility, set.mac_filter, set.max_connected,
1668 set.sec_type, TETHERING_ADDRESS_FAMILY_IPV4),
1669 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1670 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1672 /* TETHERING_TYPE_BT */
1673 g_dbus_connection_signal_unsubscribe(connection,
1674 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1676 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1677 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1678 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1679 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1683 ERR("Unknown type : %d\n", type);
1685 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1688 return TETHERING_ERROR_INVALID_PARAMETER;
1692 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1694 return TETHERING_ERROR_NONE;
1697 API int tethering_ipv6_enable(tethering_h tethering, tethering_type_e type)
1699 DBG("+ type : %d\n", type);
1700 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1701 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1702 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1703 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1705 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1706 "parameter(tethering) is NULL\n");
1708 __tethering_h *th = (__tethering_h *)tethering;
1709 GDBusProxy *proxy = th->client_bus_proxy;
1710 GDBusConnection *connection = th->client_bus;
1713 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1715 if (__check_precondition(type) == FALSE) {
1718 return TETHERING_ERROR_OPERATION_FAILED;
1723 case TETHERING_TYPE_USB: {
1724 g_dbus_connection_signal_unsubscribe(connection,
1725 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1727 g_dbus_proxy_call(proxy, "enable_usb_tethering",
1728 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1729 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1730 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1734 case TETHERING_TYPE_WIFI: {
1735 _softap_settings_t set = {"", "", "", 0, false, false, 0, 0};
1737 ret = __prepare_wifi_settings(tethering, &set);
1738 if (ret != TETHERING_ERROR_NONE) {
1739 ERR("softap settings initialization failed\n");
1741 return TETHERING_ERROR_OPERATION_FAILED;
1743 g_dbus_connection_signal_unsubscribe(connection,
1744 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1745 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1746 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type, TETHERING_ADDRESS_FAMILY_IPV6),
1747 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1748 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1752 case TETHERING_TYPE_BT: {
1753 g_dbus_connection_signal_unsubscribe(connection,
1754 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1756 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1757 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1758 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1759 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1765 ERR("Unknown type : %d\n", type);
1767 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1770 return TETHERING_ERROR_INVALID_PARAMETER;
1774 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1776 return TETHERING_ERROR_NONE;
1779 API int tethering_ipv6_disable(tethering_h tethering, tethering_type_e type)
1781 DBG("+ type : %d\n", type);
1782 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1783 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1784 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1785 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1787 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1788 "parameter(tethering) is NULL\n");
1790 __tethering_h *th = (__tethering_h *)tethering;
1791 GDBusProxy *proxy = th->client_bus_proxy;
1792 GDBusConnection *connection = th->client_bus;
1795 case TETHERING_TYPE_USB:
1796 g_dbus_connection_signal_unsubscribe(connection,
1797 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1799 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1800 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1801 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1802 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1805 case TETHERING_TYPE_WIFI:
1806 DBG("Disable wifi tethering..");
1807 g_dbus_connection_signal_unsubscribe(connection,
1808 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1810 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1811 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1812 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1813 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1816 case TETHERING_TYPE_BT:
1817 g_dbus_connection_signal_unsubscribe(connection,
1818 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1820 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1821 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1822 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1823 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1827 ERR("Not supported tethering type [%d]\n", type);
1829 return TETHERING_ERROR_INVALID_PARAMETER;
1832 return TETHERING_ERROR_NONE;
1836 * @brief Disables the tethering, asynchronously.
1838 * @privlevel platform
1839 * @privilege http://tizen.org/privilege/tethering.admin
1840 * @param[in] tethering The handle of tethering
1841 * @param[in] type The type of tethering
1842 * @return 0 on success, otherwise negative error value.
1843 * @retval #TETHERING_ERROR_NONE Successful
1844 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1845 * @post tethering_disabled_cb() will be invoked.
1846 * @see tethering_is_enabled()
1847 * @see tethering_enable()
1849 API int tethering_disable(tethering_h tethering, tethering_type_e type)
1851 INFO("+ type : %d\n", type);
1852 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1853 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1854 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1855 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1857 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1858 "parameter(tethering) is NULL\n");
1860 __tethering_h *th = (__tethering_h *)tethering;
1861 GDBusProxy *proxy = th->client_bus_proxy;
1862 GDBusConnection *connection = th->client_bus;
1866 case TETHERING_TYPE_USB:
1867 g_dbus_connection_signal_unsubscribe(connection,
1868 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1870 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1871 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1872 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1873 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1878 case TETHERING_TYPE_WIFI:
1880 g_dbus_connection_signal_unsubscribe(connection,
1881 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1883 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1884 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1885 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1886 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1889 case TETHERING_TYPE_BT:
1891 g_dbus_connection_signal_unsubscribe(connection,
1892 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1894 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1895 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1896 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1897 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1901 case TETHERING_TYPE_P2P:
1902 g_dbus_proxy_call(proxy, "disable_p2p_tethering",
1903 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1904 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1907 case TETHERING_TYPE_ALL:
1908 g_dbus_connection_signal_unsubscribe(connection,
1909 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1911 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1912 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1913 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1914 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1916 g_dbus_connection_signal_unsubscribe(connection,
1917 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1919 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1920 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1921 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1922 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1924 g_dbus_connection_signal_unsubscribe(connection,
1925 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1927 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1928 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1929 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1930 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1934 ERR("Not supported tethering type [%d]\n", type);
1936 return TETHERING_ERROR_INVALID_PARAMETER;
1940 return TETHERING_ERROR_NONE;
1945 * @brief Checks whetehr the tethering is enabled or not.
1947 * @privlevel platform
1948 * @privilege http://tizen.org/privilege/tethering.admin
1949 * @param[in] tethering The handle of tethering
1950 * @param[in] type The type of tethering
1951 * @return @c true if tethering is enabled, \n @c false if tethering is disabled.
1953 API bool tethering_is_enabled(tethering_h tethering, tethering_type_e type)
1955 INFO("+ type : %d\n", type);
1957 int vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_NONE;
1959 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1961 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &is_on) != 0)
1965 case TETHERING_TYPE_USB:
1966 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_USB;
1969 case TETHERING_TYPE_WIFI:
1970 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI;
1973 case TETHERING_TYPE_BT:
1974 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_BT;
1977 case TETHERING_TYPE_P2P:
1978 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_P2P;
1982 ERR("Not supported type : %d\n", type);
1985 INFO("- enabled: %s\n", (is_on & vconf_type) ? "true" : "false");
1986 return is_on & vconf_type ? true : false;
1991 * @brief Gets the MAC address of local device as "FC:A1:3E:D6:B1:B1".
1993 * @privlevel platform
1994 * @privilege http://tizen.org/privilege/tethering.admin
1995 * @remarks @a mac_address must be released with free() by you.
1996 * @param[in] tethering The handle of tethering
1997 * @param[in] type The type of tethering
1998 * @param[out] mac_address The MAC address
1999 * @return 0 on success, otherwise a negative error value.
2000 * @retval #TETHERING_ERROR_NONE Successful
2001 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2002 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2003 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2004 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2005 * @pre tethering must be enabled.
2006 * @see tethering_is_enabled()
2007 * @see tethering_enable()
2009 API int tethering_get_mac_address(tethering_h tethering, tethering_type_e type, char **mac_address)
2011 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2012 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE); //LCOV_EXCL_LINE
2013 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2014 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE); //LCOV_EXCL_LINE
2016 _retvm_if(tethering_is_enabled(tethering, type) == false,
2017 TETHERING_ERROR_NOT_ENABLED,
2018 "tethering type[%d] is not enabled\n", type);
2019 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2020 "parameter(tethering) is NULL\n");
2021 _retvm_if(mac_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2022 "parameter(mac_address) is NULL\n");
2026 char *macbuf = NULL;
2028 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2029 TETHERING_ERROR_OPERATION_FAILED,
2030 "getting interface name is failed\n");
2032 s = socket(AF_INET, SOCK_DGRAM, 0);
2033 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2034 "getting socket is failed\n");
2035 if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
2037 ERR("getting mac is failed\n");
2039 return TETHERING_ERROR_OPERATION_FAILED;
2044 macbuf = (char *)malloc(TETHERING_STR_INFO_LEN);
2045 _retvm_if(macbuf == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2046 "Not enough memory\n");
2047 snprintf(macbuf, TETHERING_STR_INFO_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
2048 (unsigned char)ifr.ifr_hwaddr.sa_data[0],
2049 (unsigned char)ifr.ifr_hwaddr.sa_data[1],
2050 (unsigned char)ifr.ifr_hwaddr.sa_data[2],
2051 (unsigned char)ifr.ifr_hwaddr.sa_data[3],
2052 (unsigned char)ifr.ifr_hwaddr.sa_data[4],
2053 (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
2055 *mac_address = macbuf;
2057 return TETHERING_ERROR_NONE;
2062 * @brief Gets the name of network interface. For example, usb0.
2064 * @privlevel platform
2065 * @privilege http://tizen.org/privilege/tethering.admin
2066 * @remarks @a interface_name must be released with free() by you.
2067 * @param[in] tethering The handle of tethering
2068 * @param[in] type The type of tethering
2069 * @param[out] interface_name The name of network interface
2070 * @return 0 on success, otherwise negative error value.
2071 * @retval #TETHERING_ERROR_NONE Successful
2072 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2073 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2074 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2075 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2076 * @pre tethering must be enabled.
2077 * @see tethering_is_enabled()
2078 * @see tethering_enable()
2080 API int tethering_get_network_interface_name(tethering_h tethering, tethering_type_e type, char **interface_name)
2082 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2083 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2084 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2085 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2087 _retvm_if(tethering_is_enabled(tethering, type) == false,
2088 TETHERING_ERROR_NOT_ENABLED,
2089 "tethering type[%d] is not enabled\n", type);
2090 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2091 "parameter(tethering) is NULL\n");
2092 _retvm_if(interface_name == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2093 "parameter(interface_name) is NULL\n");
2095 char intf[TETHERING_STR_INFO_LEN] = {0, };
2097 _retvm_if(!__get_intf_name(type, intf, sizeof(intf)),
2098 TETHERING_ERROR_OPERATION_FAILED,
2099 "getting interface name is failed\n");
2100 *interface_name = strdup(intf);
2101 _retvm_if(*interface_name == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2102 "Not enough memory\n");
2104 return TETHERING_ERROR_NONE;
2109 * @brief Gets the local IP address.
2111 * @privlevel platform
2112 * @privilege http://tizen.org/privilege/tethering.admin
2113 * @remarks @a ip_address must be released with free() by you.
2114 * @param[in] tethering The handle of tethering
2115 * @param[in] type The type of tethering
2116 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2117 * @param[out] ip_address The local IP address
2118 * @return 0 on success, otherwise negative error value.
2119 * @retval #TETHERING_ERROR_NONE Successful
2120 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2121 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2122 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2123 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2124 * @pre tethering must be enabled.
2125 * @see tethering_is_enabled()
2126 * @see tethering_enable()
2128 API int tethering_get_ip_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **ip_address)
2130 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2131 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE); //LCOV_EXCL_LINE
2132 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2133 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE); //LCOV_EXCL_LINE
2135 _retvm_if(tethering_is_enabled(tethering, type) == false,
2136 TETHERING_ERROR_NOT_ENABLED,
2137 "tethering type[%d] is not enabled\n", type);
2138 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2139 "parameter(tethering) is NULL\n");
2140 _retvm_if(ip_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2141 "parameter(ip_address) is NULL\n");
2147 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2148 TETHERING_ERROR_OPERATION_FAILED,
2149 "getting interface name is failed\n");
2151 s = socket(AF_INET, SOCK_DGRAM, 0);
2152 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2153 "getting socket is failed\n");
2154 if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
2155 ERR("ioctl is failed\n");
2157 return TETHERING_ERROR_OPERATION_FAILED;
2161 ipbuf = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
2162 *ip_address = strdup(ipbuf);
2163 _retvm_if(*ip_address == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2164 "Not enough memory\n");
2166 return TETHERING_ERROR_NONE;
2171 * @brief Gets the Gateway address.
2173 * @privlevel platform
2174 * @privilege http://tizen.org/privilege/tethering.admin
2175 * @remarks @a gateway_address must be released with free() by you.
2176 * @param[in] tethering The handle of tethering
2177 * @param[in] type The type of tethering
2178 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2179 * @param[out] gateway_address The local IP address
2180 * @return 0 on success, otherwise negative error value.
2181 * @retval #TETHERING_ERROR_NONE Successful
2182 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2183 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2184 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2185 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2186 * @pre tethering must be enabled.
2187 * @see tethering_is_enabled()
2188 * @see tethering_enable()
2190 API int tethering_get_gateway_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **gateway_address)
2192 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2193 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2194 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2195 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2197 _retvm_if(tethering_is_enabled(tethering, type) == false,
2198 TETHERING_ERROR_NOT_ENABLED,
2199 "tethering type[%d] is not enabled\n", type);
2200 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2201 "parameter(tethering) is NULL\n");
2202 _retvm_if(gateway_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2203 "parameter(gateway_address) is NULL\n");
2205 char gateway_buf[TETHERING_STR_INFO_LEN] = {0, };
2207 _retvm_if(!__get_gateway_addr(type, gateway_buf, sizeof(gateway_buf)),
2208 TETHERING_ERROR_OPERATION_FAILED,
2209 "getting gateway address is failed\n");
2211 *gateway_address = strdup(gateway_buf);
2213 return TETHERING_ERROR_NONE;
2218 * @brief Gets the Subnet Mask.
2220 * @privlevel platform
2221 * @privilege http://tizen.org/privilege/tethering.admin
2222 * @remarks @a subnet_mask must be released with free() by you.
2223 * @param[in] tethering The handle of tethering
2224 * @param[in] type The type of tethering
2225 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2226 * @param[out] subnet_mask The local IP address
2227 * @return 0 on success, otherwise negative error value.
2228 * @retval #TETHERING_ERROR_NONE Successful
2229 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2230 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2231 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2232 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2233 * @pre tethering must be enabled.
2234 * @see tethering_is_enabled()
2235 * @see tethering_enable()
2237 API int tethering_get_subnet_mask(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **subnet_mask)
2239 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2240 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2241 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2242 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2244 _retvm_if(tethering_is_enabled(tethering, type) == false,
2245 TETHERING_ERROR_NOT_ENABLED,
2246 "tethering is not enabled\n");
2247 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2248 "parameter(tethering) is NULL\n");
2249 _retvm_if(subnet_mask == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2250 "parameter(subnet_mask) is NULL\n");
2252 *subnet_mask = strdup(TETHERING_SUBNET_MASK);
2253 _retvm_if(*subnet_mask == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2254 "Not enough memory\n");
2256 return TETHERING_ERROR_NONE;
2261 * @brief Gets the data usage.
2263 * @privlevel platform
2264 * @privilege http://tizen.org/privilege/tethering.admin
2265 * @param[in] tethering The handle of tethering
2266 * @param[out] usage The data usage
2267 * @return 0 on success, otherwise negative error value.
2268 * @retval #TETHERING_ERROR_NONE Successful
2269 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2270 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2271 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2272 * @pre tethering must be enabled.
2273 * @see tethering_is_enabled()
2274 * @see tethering_enable()
2276 API int tethering_get_data_usage(tethering_h tethering, tethering_data_usage_cb callback, void *user_data)
2278 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2280 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2281 "parameter(tethering) is NULL\n");
2282 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2283 "parameter(callback) is NULL\n");
2284 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2285 TETHERING_ERROR_NOT_ENABLED,
2286 "tethering is not enabled\n");
2288 __tethering_h *th = (__tethering_h *)tethering;
2289 GDBusProxy *proxy = th->client_bus_proxy;
2291 th->data_usage_cb = callback;
2292 th->data_usage_user_data = user_data;
2294 g_dbus_proxy_call(proxy, "get_data_packet_usage",
2295 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2296 (GAsyncReadyCallback) __get_data_usage_cb, (gpointer)tethering);
2298 return TETHERING_ERROR_NONE;
2303 * @brief Gets the client which is connected by tethering "type".
2305 * @privlevel platform
2306 * @privilege http://tizen.org/privilege/tethering.admin
2307 * @param[in] tethering The handle of tethering
2308 * @param[in] type The type of tethering
2309 * @param[in] callback The callback function to invoke
2310 * @param[in] user_data The user data to be passed to the callback function
2311 * @retval #TETHERING_ERROR_NONE Successful
2312 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2313 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2314 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2315 * @pre tethering must be enabled.
2316 * @see tethering_is_enabled()
2317 * @see tethering_enable()
2319 API int tethering_foreach_connected_clients(tethering_h tethering, tethering_type_e type, tethering_connected_client_cb callback, void *user_data)
2321 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2322 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2323 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2324 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2326 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2327 "parameter(tethering) is NULL\n");
2328 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2329 "parameter(callback) is NULL\n");
2330 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2331 TETHERING_ERROR_NOT_ENABLED,
2332 "tethering is not enabled\n");
2334 mobile_ap_type_e interface;
2335 __tethering_h *th = (__tethering_h *)tethering;
2336 __tethering_client_h client = {0, };
2339 gchar *hostname = NULL;
2340 guint timestamp = 0;
2341 GError *error = NULL;
2342 GVariant *result = NULL;
2343 GVariantIter *outer_iter = NULL;
2344 GVariantIter *inner_iter = NULL;
2345 GVariant *station = NULL;
2346 GVariant *value = NULL;
2349 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "get_station_info",
2350 NULL, G_DBUS_CALL_FLAGS_NONE,
2351 -1, th->cancellable, &error);
2353 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message); //LCOV_EXCL_LINE
2354 g_variant_get(result, "(a(a{sv}))", &outer_iter);
2356 while (g_variant_iter_loop(outer_iter, "(@a{sv})", &station)) {
2357 g_variant_get(station, "a{sv}", &inner_iter);
2358 while (g_variant_iter_loop(inner_iter, "{sv}", &key, &value)) {
2359 if (g_strcmp0(key, "Type") == 0) {
2360 interface = g_variant_get_int32(value);
2361 if (interface == MOBILE_AP_TYPE_USB)
2362 client.interface = TETHERING_TYPE_USB;
2363 else if (interface == MOBILE_AP_TYPE_WIFI)
2364 client.interface = TETHERING_TYPE_WIFI;
2365 else if (interface == MOBILE_AP_TYPE_BT)
2366 client.interface = TETHERING_TYPE_BT;
2367 else if (interface == MOBILE_AP_TYPE_P2P)
2368 client.interface = TETHERING_TYPE_P2P;
2370 ERR("Invalid interface\n");
2372 g_variant_unref(value);
2375 DBG("interface is %d\n", client.interface);
2376 if (client.interface != type && (TETHERING_TYPE_ALL != type)) {
2378 g_variant_unref(value);
2381 } else if (g_strcmp0(key, "IP") == 0) {
2382 g_variant_get(value, "s", &ip);
2383 SDBG("ip is %s\n", ip);
2384 g_strlcpy(client.ip, ip, sizeof(client.ip));
2385 } else if (g_strcmp0(key, "MAC") == 0) {
2386 g_variant_get(value, "s", &mac);
2387 SDBG("mac is %s\n", mac);
2388 g_strlcpy(client.mac, mac, sizeof(client.mac));
2389 } else if (g_strcmp0(key, "Name") == 0) {
2390 g_variant_get(value, "s", &hostname);
2391 SDBG("hsotname is %s\n", hostname);
2393 client.hostname = g_strdup(hostname);
2394 } else if (g_strcmp0(key, "Time") == 0) {
2395 timestamp = g_variant_get_int32(value);
2396 DBG("timestamp is %d\n", timestamp);
2397 client.tm = (time_t)timestamp;
2399 ERR("Key %s not required\n", key);
2410 g_variant_iter_free(inner_iter);
2411 if (callback((tethering_client_h)&client, user_data) == false) {
2412 DBG("iteration is stopped\n");
2413 g_free(client.hostname);
2414 client.hostname = NULL;
2415 g_variant_iter_free(outer_iter);
2416 g_variant_unref(station);
2417 g_variant_unref(result);
2419 return TETHERING_ERROR_OPERATION_FAILED;
2421 g_free(client.hostname);
2422 client.hostname = NULL;
2425 g_variant_iter_free(outer_iter);
2426 g_variant_unref(station);
2427 g_variant_unref(result);
2429 return TETHERING_ERROR_NONE;
2434 * @brief Registers the callback function called when tethering is enabled.
2436 * @privlevel platform
2437 * @privilege http://tizen.org/privilege/tethering.admin
2438 * @param[in] tethering The handle of tethering
2439 * @param[in] type The type of tethering
2440 * @param[in] callback The callback function to invoke
2441 * @param[in] user_data The user data to be passed to the callback function
2442 * @retval #TETHERING_ERROR_NONE Successful
2443 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2444 * @see tethering_unset_enabled_cb()
2446 API int tethering_set_enabled_cb(tethering_h tethering, tethering_type_e type, tethering_enabled_cb callback, void *user_data)
2448 INFO("+ type: %d\n", type);
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 == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2455 "parameter(tethering) is NULL\n");
2456 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2457 "parameter(callback) is NULL\n");
2459 __tethering_h *th = (__tethering_h *)tethering;
2460 tethering_type_e ti;
2462 if (type != TETHERING_TYPE_ALL) {
2463 th->enabled_cb[type] = callback;
2464 th->enabled_user_data[type] = user_data;
2466 return TETHERING_ERROR_NONE;
2469 /* TETHERING_TYPE_ALL */
2470 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2471 th->enabled_cb[ti] = callback;
2472 th->enabled_user_data[ti] = user_data;
2476 return TETHERING_ERROR_NONE;
2481 * @brief Unregisters the callback function called when tethering is disabled.
2483 * @privlevel platform
2484 * @privilege http://tizen.org/privilege/tethering.admin
2485 * @param[in] tethering The handle of tethering
2486 * @param[in] type The type of tethering
2487 * @retval #TETHERING_ERROR_NONE Successful
2488 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2489 * @see tethering_set_enabled_cb()
2491 API int tethering_unset_enabled_cb(tethering_h tethering, tethering_type_e type)
2493 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2494 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2495 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2496 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2498 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2499 "parameter(tethering) is NULL\n");
2501 __tethering_h *th = (__tethering_h *)tethering;
2502 tethering_type_e ti;
2504 if (type != TETHERING_TYPE_ALL) {
2505 th->enabled_cb[type] = NULL;
2506 th->enabled_user_data[type] = NULL;
2508 return TETHERING_ERROR_NONE;
2511 /* TETHERING_TYPE_ALL */
2512 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2513 th->enabled_cb[ti] = NULL;
2514 th->enabled_user_data[ti] = NULL;
2517 return TETHERING_ERROR_NONE;
2522 * @brief Registers the callback function called when tethering is disabled.
2524 * @privlevel platform
2525 * @privilege http://tizen.org/privilege/tethering.admin
2526 * @param[in] tethering The handle of tethering
2527 * @param[in] type The type of tethering
2528 * @param[in] callback The callback function to invoke
2529 * @param[in] user_data The user data to be passed to the callback function
2530 * @retval #TETHERING_ERROR_NONE Successful
2531 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2532 * @see tethering_unset_disabled_cb()
2534 API int tethering_set_disabled_cb(tethering_h tethering, tethering_type_e type, tethering_disabled_cb callback, void *user_data)
2536 INFO("+ type: %d\n", type);
2537 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2538 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2539 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2540 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2542 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2543 "parameter(tethering) is NULL\n");
2544 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2545 "parameter(callback) is NULL\n");
2547 __tethering_h *th = (__tethering_h *)tethering;
2548 tethering_type_e ti;
2550 if (type != TETHERING_TYPE_ALL) {
2551 th->disabled_cb[type] = callback;
2552 th->disabled_user_data[type] = user_data;
2554 return TETHERING_ERROR_NONE;
2557 /* TETHERING_TYPE_ALL */
2558 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2559 th->disabled_cb[ti] = callback;
2560 th->disabled_user_data[ti] = user_data;
2563 return TETHERING_ERROR_NONE;
2568 * @brief Unregisters the callback function called when tethering is disabled.
2570 * @privlevel platform
2571 * @privilege http://tizen.org/privilege/tethering.admin
2572 * @param[in] tethering The handle of tethering
2573 * @param[in] type The type of tethering
2574 * @retval #TETHERING_ERROR_NONE Successful
2575 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2576 * @see tethering_set_disabled_cb()
2578 API int tethering_unset_disabled_cb(tethering_h tethering, tethering_type_e type)
2580 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2581 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2582 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2583 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2585 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2586 "parameter(tethering) is NULL\n");
2588 __tethering_h *th = (__tethering_h *)tethering;
2589 tethering_type_e ti;
2591 if (type != TETHERING_TYPE_ALL) {
2592 th->disabled_cb[type] = NULL;
2593 th->disabled_user_data[type] = NULL;
2595 return TETHERING_ERROR_NONE;
2598 /* TETHERING_TYPE_ALL */
2599 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2600 th->disabled_cb[ti] = NULL;
2601 th->disabled_user_data[ti] = NULL;
2604 return TETHERING_ERROR_NONE;
2609 * @brief Registers the callback function called when the state of connection is changed.
2611 * @privlevel platform
2612 * @privilege http://tizen.org/privilege/tethering.admin
2613 * @param[in] tethering The handle of tethering
2614 * @param[in] type The type of tethering
2615 * @param[in] callback The callback function to invoke
2616 * @param[in] user_data The user data to be passed to the callback function
2617 * @retval #TETHERING_ERROR_NONE Successful
2618 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2619 * @see tethering_unset_connection_state_changed_cb_cb()
2621 API int tethering_set_connection_state_changed_cb(tethering_h tethering, tethering_type_e type, tethering_connection_state_changed_cb callback, void *user_data)
2623 INFO("+ type: %d\n", type);
2624 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2625 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2626 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2627 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2629 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2630 "parameter(tethering) is NULL\n");
2631 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2632 "parameter(callback) is NULL\n");
2634 __tethering_h *th = (__tethering_h *)tethering;
2635 tethering_type_e ti;
2637 if (type != TETHERING_TYPE_ALL) {
2638 th->changed_cb[type] = callback;
2639 th->changed_user_data[type] = user_data;
2641 return TETHERING_ERROR_NONE;
2644 /* TETHERING_TYPE_ALL */
2645 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2646 th->changed_cb[ti] = callback;
2647 th->changed_user_data[ti] = user_data;
2650 return TETHERING_ERROR_NONE;
2655 * @brief Unregisters the callback function called when the state of connection is changed.
2657 * @privlevel platform
2658 * @privilege http://tizen.org/privilege/tethering.admin
2659 * @param[in] tethering The handle of tethering
2660 * @param[in] type The type of tethering
2661 * @retval #TETHERING_ERROR_NONE Successful
2662 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2663 * @see tethering_set_connection_state_changed_cb()
2665 API int tethering_unset_connection_state_changed_cb(tethering_h tethering, tethering_type_e type)
2667 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2668 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2669 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2670 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2672 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2673 "parameter(tethering) is NULL\n");
2675 __tethering_h *th = (__tethering_h *)tethering;
2676 tethering_type_e ti;
2678 if (type != TETHERING_TYPE_ALL) {
2679 th->changed_cb[type] = NULL;
2680 th->changed_user_data[type] = NULL;
2682 return TETHERING_ERROR_NONE;
2685 /* TETHERING_TYPE_ALL */
2686 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2687 th->changed_cb[ti] = NULL;
2688 th->changed_user_data[ti] = NULL;
2691 return TETHERING_ERROR_NONE;
2696 * @brief Registers the callback function called when the security type of Wi-Fi tethering is changed.
2698 * @privlevel platform
2699 * @privilege http://tizen.org/privilege/tethering.admin
2700 * @param[in] tethering The handle of tethering
2701 * @param[in] callback The callback function to invoke
2702 * @param[in] user_data The user data to be passed to the callback function
2703 * @retval #TETHERING_ERROR_NONE Successful
2704 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2705 * @see tethering_wifi_unset_security_type_changed_cb()
2707 API int tethering_wifi_set_security_type_changed_cb(tethering_h tethering, tethering_wifi_security_type_changed_cb callback, void *user_data)
2709 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2710 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2712 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2713 "parameter(tethering) is NULL\n");
2714 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2715 "parameter(callback) is NULL\n");
2717 __tethering_h *th = (__tethering_h *)tethering;
2719 th->security_type_changed_cb = callback;
2720 th->security_type_user_data = user_data;
2722 return TETHERING_ERROR_NONE;
2728 * @brief Unregisters the callback function called when the security type of Wi-Fi tethering is changed.
2730 * @privlevel platform
2731 * @privilege http://tizen.org/privilege/tethering.admin
2732 * @param[in] tethering The handle of tethering
2733 * @param[in] type The type of tethering
2734 * @retval #TETHERING_ERROR_NONE Successful
2735 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2736 * @see tethering_wifi_set_security_type_changed_cb()
2738 API int tethering_wifi_unset_security_type_changed_cb(tethering_h tethering)
2740 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2741 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2743 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2744 "parameter(tethering) is NULL\n");
2746 __tethering_h *th = (__tethering_h *)tethering;
2748 th->security_type_changed_cb = NULL;
2749 th->security_type_user_data = NULL;
2751 return TETHERING_ERROR_NONE;
2756 * @brief Registers the callback function called when the visibility of SSID is changed.
2758 * @privlevel platform
2759 * @privilege http://tizen.org/privilege/tethering.admin
2760 * @param[in] tethering The handle of tethering
2761 * @param[in] callback The callback function to invoke
2762 * @param[in] user_data The user data to be passed to the callback function
2763 * @retval #TETHERING_ERROR_NONE Successful
2764 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2765 * @see tethering_wifi_unset_ssid_visibility_changed_cb_cb()
2767 API int tethering_wifi_set_ssid_visibility_changed_cb(tethering_h tethering, tethering_wifi_ssid_visibility_changed_cb callback, void *user_data)
2769 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2770 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2772 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2773 "parameter(tethering) is NULL\n");
2774 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2775 "parameter(callback) is NULL\n");
2777 __tethering_h *th = (__tethering_h *)tethering;
2779 th->ssid_visibility_changed_cb = callback;
2780 th->ssid_visibility_user_data = user_data;
2782 return TETHERING_ERROR_NONE;
2787 * @brief Unregisters the callback function called when the visibility of SSID is changed.
2789 * @privlevel platform
2790 * @privilege http://tizen.org/privilege/tethering.admin
2791 * @param[in] tethering The handle of tethering
2792 * @retval #TETHERING_ERROR_NONE Successful
2793 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2794 * @see tethering_wifi_set_ssid_visibility_changed_cb()
2796 API int tethering_wifi_unset_ssid_visibility_changed_cb(tethering_h tethering)
2798 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2799 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2801 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2802 "parameter(tethering) is NULL\n");
2804 __tethering_h *th = (__tethering_h *)tethering;
2806 th->ssid_visibility_changed_cb = NULL;
2807 th->ssid_visibility_user_data = NULL;
2809 return TETHERING_ERROR_NONE;
2814 * @brief Registers the callback function called when the passphrase of Wi-Fi tethering is changed.
2816 * @privlevel platform
2817 * @privilege http://tizen.org/privilege/tethering.admin
2818 * @param[in] tethering The handle of tethering
2819 * @param[in] callback The callback function to invoke
2820 * @param[in] user_data The user data to be passed to the callback function
2821 * @retval #TETHERING_ERROR_NONE Successful
2822 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2823 * @see tethering_wifi_unset_passphrase_changed_cb()
2825 API int tethering_wifi_set_passphrase_changed_cb(tethering_h tethering, tethering_wifi_passphrase_changed_cb callback, void *user_data)
2827 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2828 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2830 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2831 "parameter(tethering) is NULL\n");
2832 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2833 "parameter(callback) is NULL\n");
2835 __tethering_h *th = (__tethering_h *)tethering;
2837 th->passphrase_changed_cb = callback;
2838 th->passphrase_user_data = user_data;
2840 return TETHERING_ERROR_NONE;
2845 * @brief Unregisters the callback function called when the passphrase of Wi-Fi tethering is changed.
2847 * @privlevel platform
2848 * @privilege http://tizen.org/privilege/tethering.admin
2849 * @param[in] tethering The handle of tethering
2850 * @retval #TETHERING_ERROR_NONE Successful
2851 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2852 * @see tethering_wifi_set_passphrase_changed_cb()
2854 API int tethering_wifi_unset_passphrase_changed_cb(tethering_h tethering)
2856 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2857 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2859 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2860 "parameter(tethering) is NULL\n");
2862 __tethering_h *th = (__tethering_h *)tethering;
2864 th->passphrase_changed_cb = NULL;
2865 th->passphrase_user_data = NULL;
2867 return TETHERING_ERROR_NONE;
2872 * @brief Sets the security type of Wi-Fi tethering.
2874 * @privlevel platform
2875 * @privilege http://tizen.org/privilege/tethering.admin
2876 * @remarks This change is applied next time Wi-Fi tethering is enabled
2877 * @param[in] tethering The handle of tethering
2878 * @param[in] type The security type
2879 * @return 0 on success, otherwise negative error value.
2880 * @retval #TETHERING_ERROR_NONE Successful
2881 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2882 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2883 * @see tethering_wifi_get_security_type()
2885 API int tethering_wifi_set_security_type(tethering_h tethering, tethering_wifi_security_type_e type)
2887 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2888 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2890 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2891 "parameter(tethering) is NULL\n");
2893 __tethering_h *th = (__tethering_h *)tethering;
2894 tethering_error_e ret = TETHERING_ERROR_NONE;
2895 char *sec_str = NULL;
2897 ret = __set_security_type(type);
2898 if (ret == TETHERING_ERROR_NONE) {
2901 case TETHERING_WIFI_SECURITY_TYPE_NONE:
2902 sec_str = TETHERING_WIFI_SECURITY_TYPE_OPEN_STR;
2904 case TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK:
2905 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR;
2907 case TETHERING_WIFI_SECURITY_TYPE_WPS:
2908 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPS_STR;
2912 __send_dbus_signal(th->client_bus,
2913 SIGNAL_NAME_SECURITY_TYPE_CHANGED, sec_str);
2920 * @brief Gets the security type of Wi-Fi tethering.
2922 * @privlevel platform
2923 * @privilege http://tizen.org/privilege/tethering.admin
2924 * @param[in] tethering The handle of tethering
2925 * @param[out] type The security type
2926 * @return 0 on success, otherwise negative error value.
2927 * @retval #TETHERING_ERROR_NONE Successful
2928 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2929 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2930 * @see tethering_wifi_set_security_type()
2932 API int tethering_wifi_get_security_type(tethering_h tethering, tethering_wifi_security_type_e *type)
2934 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2935 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2937 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2938 "parameter(type) is NULL\n");
2940 return __get_security_type(type);
2945 * @brief Sets the SSID (service set identifier).
2947 * @privlevel platform
2948 * @privilege http://tizen.org/privilege/tethering.admin
2949 * @details If SSID is not set, Device name is used as SSID
2950 * @remarks This change is applied next time Wi-Fi tethering is enabled with same @a tethering handle
2951 * @param[in] tethering The handle of tethering
2952 * @param[out] ssid The SSID
2953 * @return 0 on success, otherwise negative error value.
2954 * @retval #TETHERING_ERROR_NONE Successful
2955 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2956 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2958 API int tethering_wifi_set_ssid(tethering_h tethering, const char *ssid)
2960 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2961 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2963 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2964 "parameter(tethering) is NULL\n");
2965 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2966 "parameter(ssid) is NULL\n");
2968 __tethering_h *th = (__tethering_h *)tethering;
2969 char *p_ssid = NULL;
2972 ssid_len = strlen(ssid);
2973 if (ssid_len > TETHERING_WIFI_SSID_MAX_LEN) {
2974 ERR("parameter(ssid) is too long");
2975 return TETHERING_ERROR_INVALID_PARAMETER;
2978 p_ssid = strdup(ssid);
2979 _retvm_if(p_ssid == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2980 "strdup is failed\n");
2986 return TETHERING_ERROR_NONE;
2991 * @brief Gets the SSID (service set identifier).
2993 * @privlevel platform
2994 * @privilege http://tizen.org/privilege/tethering.admin
2995 * @remarks @a ssid must be released with free() by you.
2996 * @param[in] tethering The handle of tethering
2997 * @param[out] ssid The SSID
2998 * @return 0 on success, otherwise negative error value.
2999 * @retval #TETHERING_ERROR_NONE Successful
3000 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3001 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3002 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3004 API int tethering_wifi_get_ssid(tethering_h tethering, char **ssid)
3006 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3007 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3009 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3010 "parameter(tethering) is NULL\n");
3011 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3012 "parameter(ssid) is NULL\n");
3015 __tethering_h *th = (__tethering_h *)tethering;
3016 char val[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
3018 if (!tethering_is_enabled(NULL, TETHERING_TYPE_WIFI)) {
3019 if (th->ssid != NULL) {
3020 DBG("Private SSID is set\n");
3021 *ssid = strdup(th->ssid);
3023 if (__get_ssid_from_vconf(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
3024 val, sizeof(val)) == false) {
3025 return TETHERING_ERROR_OPERATION_FAILED;
3027 *ssid = strdup(val);
3030 if (__get_ssid_from_vconf(VCONFKEY_MOBILE_HOTSPOT_SSID,
3031 val, sizeof(val)) == false) {
3032 return TETHERING_ERROR_OPERATION_FAILED;
3034 *ssid = strdup(val);
3037 if (*ssid == NULL) {
3038 ERR("strdup is failed\n"); //LCOV_EXCL_LINE
3039 return TETHERING_ERROR_OUT_OF_MEMORY;
3042 return TETHERING_ERROR_NONE;
3047 * @brief Sets the visibility of SSID(service set identifier).
3049 * @privlevel platform
3050 * @privilege http://tizen.org/privilege/tethering.admin
3051 * @details If you set the visibility invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3052 * @remarks This change is applied next time Wi-Fi tethering is enabled
3053 * @param[in] tethering The handle of tethering
3054 * @param[in] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3055 * @return 0 on success, otherwise negative error value.
3056 * @retval #TETHERING_ERROR_NONE Successful
3057 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3058 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3059 * @see tethering_wifi_get_ssid_visibility()
3061 API int tethering_wifi_set_ssid_visibility(tethering_h tethering, bool visible)
3063 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3064 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3066 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3067 "parameter(tethering) is NULL\n");
3069 __tethering_h *th = (__tethering_h *)tethering;
3070 tethering_error_e ret = TETHERING_ERROR_NONE;
3072 ret = __set_visible(visible);
3073 if (ret == TETHERING_ERROR_NONE) {
3074 __send_dbus_signal(th->client_bus,
3075 SIGNAL_NAME_SSID_VISIBILITY_CHANGED,
3076 visible ? SIGNAL_MSG_SSID_VISIBLE :
3077 SIGNAL_MSG_SSID_HIDE);
3084 * @brief Gets the visibility of SSID(service set identifier).
3086 * @privlevel platform
3087 * @privilege http://tizen.org/privilege/tethering.admin
3088 * @details If the visibility is set invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3089 * @param[in] tethering The handle of tethering
3090 * @param[out] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3091 * @return 0 on success, otherwise negative error value.
3092 * @retval #TETHERING_ERROR_NONE Successful
3093 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3094 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3095 * @see tethering_wifi_set_ssid_visibility()
3097 API int tethering_wifi_get_ssid_visibility(tethering_h tethering, bool *visible)
3099 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3100 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3102 _retvm_if(visible == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3103 "parameter(visible) is NULL\n");
3105 return __get_visible(visible);
3110 * @brief Sets the passphrase.
3112 * @privlevel platform
3113 * @privilege http://tizen.org/privilege/tethering.admin
3114 * @remarks This change is applied next time Wi-Fi tethering is enabled
3115 * @param[in] tethering The handle of tethering
3116 * @param[in] passphrase The passphrase
3117 * @return 0 on success, otherwise negative error value.
3118 * @retval #TETHERING_ERROR_NONE Successful
3119 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3120 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3121 * @see tethering_wifi_get_passphrase()
3123 API int tethering_wifi_set_passphrase(tethering_h tethering, const char *passphrase)
3125 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3126 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3128 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3129 "parameter(tethering) is NULL\n");
3130 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3131 "parameter(passphrase) is NULL\n");
3133 __tethering_h *th = (__tethering_h *)tethering;
3134 GDBusProxy *proxy = th->client_bus_proxy;
3135 GVariant *parameters;
3136 GError *error = NULL;
3137 int passphrase_len = 0;
3141 passphrase_len = strlen(passphrase);
3142 if (passphrase_len < TETHERING_WIFI_KEY_MIN_LEN ||
3143 passphrase_len > TETHERING_WIFI_KEY_MAX_LEN) {
3144 ERR("parameter(passphrase) is too short or long\n");
3145 return TETHERING_ERROR_INVALID_PARAMETER;
3148 parameters = g_dbus_proxy_call_sync(proxy, "set_wifi_tethering_passphrase",
3149 g_variant_new("(s)", passphrase), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3153 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3155 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3156 ret = TETHERING_ERROR_PERMISSION_DENIED;
3158 ret = TETHERING_ERROR_OPERATION_FAILED;
3160 g_error_free(error);
3165 g_variant_get(parameters, "(u)", &ret);
3166 g_variant_unref(parameters);
3168 if (ret == TETHERING_ERROR_NONE) {
3169 __send_dbus_signal(th->client_bus,
3170 SIGNAL_NAME_PASSPHRASE_CHANGED, NULL);
3179 * @brief Gets the passphrase.
3181 * @privlevel platform
3182 * @privilege http://tizen.org/privilege/tethering.admin
3183 * @remarks @a passphrase must be released with free() by you.
3184 * @param[in] tethering The handle of tethering
3185 * @param[out] passphrase The passphrase
3186 * @return 0 on success, otherwise negative error value.
3187 * @retval #TETHERING_ERROR_NONE Successful
3188 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3189 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3190 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3191 * @see tethering_wifi_set_passphrase()
3193 API int tethering_wifi_get_passphrase(tethering_h tethering, char **passphrase)
3195 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3196 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3198 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3199 "parameter(tethering) is NULL\n");
3200 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3201 "parameter(passphrase) is NULL\n");
3203 __tethering_h *th = (__tethering_h *)tethering;
3204 GDBusProxy *proxy = th->client_bus_proxy;
3205 GVariant *parameters;
3206 GError *error = NULL;
3207 unsigned int len = 0;
3208 tethering_error_e ret = TETHERING_ERROR_NONE;
3210 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
3211 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3215 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3217 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3218 ret = TETHERING_ERROR_PERMISSION_DENIED;
3220 ret = TETHERING_ERROR_OPERATION_FAILED;
3222 g_error_free(error);
3227 if (parameters != NULL) {
3228 g_variant_get(parameters, "(siu)", passphrase, &len, &ret);
3229 g_variant_unref(parameters);
3232 return TETHERING_ERROR_NONE;
3235 API int tethering_wifi_set_channel(tethering_h tethering, int channel)
3237 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3238 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3240 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3241 "parameter(tethering) is NULL\n");
3243 __tethering_h *th = (__tethering_h *)tethering;
3244 th->channel = channel;
3246 return TETHERING_ERROR_NONE;
3249 API int tethering_wifi_get_channel(tethering_h tethering, int *channel)
3251 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3252 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3254 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3255 "parameter(tethering) is NULL\n");
3257 _retvm_if(channel == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3258 "parameter(channel) is NULL\n");
3260 __tethering_h *th = (__tethering_h *)tethering;
3261 *channel = th->channel;
3263 return TETHERING_ERROR_NONE;
3266 API int tethering_wifi_set_mode(tethering_h tethering, tethering_wifi_mode_type_e type)
3268 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3269 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3271 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3272 "parameter(tethering) is NULL\n");
3274 __tethering_h *th = (__tethering_h *)tethering;
3276 th->mode_type = type;
3278 return TETHERING_ERROR_NONE;
3281 API int tethering_wifi_get_mode(tethering_h tethering, tethering_wifi_mode_type_e *type)
3283 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3284 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3286 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3287 "parameter(tethering) is NULL\n");
3288 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3289 "parameter(type) is NULL\n");
3291 __tethering_h *th = (__tethering_h *)tethering;
3292 *type = th->mode_type;
3294 return TETHERING_ERROR_NONE;
3300 * @brief Reload the settings (SSID / Passphrase / Security type / SSID visibility).
3302 * @privlevel platform
3303 * @privilege http://tizen.org/privilege/tethering.admin
3304 * @remarks Connected devices via Wi-Fi tethering or MobileAP will be disconnected when the settings are reloaded
3305 * @param[in] tethering The handle of tethering
3306 * @param[in] callback The callback function to invoke
3307 * @param[in] user_data The user data to be passed to the callback function
3308 * @return 0 on success, otherwise negative error value.
3309 * @retval #TETHERING_ERROR_NONE Successful
3310 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3311 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3313 API int tethering_wifi_reload_settings(tethering_h tethering, tethering_wifi_settings_reloaded_cb callback, void *user_data)
3316 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3317 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3319 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3320 "parameter(tethering) is NULL\n");
3321 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3322 "parameter(callback) is NULL\n");
3324 __tethering_h *th = (__tethering_h *)tethering;
3325 _softap_settings_t set = {"", "", "", 0, false};
3326 GDBusProxy *proxy = th->client_bus_proxy;
3331 if (th->settings_reloaded_cb) {
3332 ERR("Operation in progress\n"); //LCOV_EXCL_LINE
3333 return TETHERING_ERROR_OPERATION_FAILED;
3336 ret = __prepare_wifi_settings(tethering, &set);
3337 if (ret != TETHERING_ERROR_NONE) {
3338 ERR("softap settings initialization failed\n"); //LCOV_EXCL_LINE
3339 return TETHERING_ERROR_OPERATION_FAILED;
3342 th->settings_reloaded_cb = callback;
3343 th->settings_reloaded_user_data = user_data;
3345 g_dbus_proxy_call(proxy, "reload_wifi_settings",
3346 g_variant_new("(sssiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type),
3347 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
3348 (GAsyncReadyCallback) __settings_reloaded_cb, (gpointer)tethering);
3350 return TETHERING_ERROR_NONE;
3353 API int tethering_wifi_set_mac_filter(tethering_h tethering, bool mac_filter)
3355 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3356 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3358 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3359 "parameter(tethering) is NULL\n");
3361 __tethering_h *th = (__tethering_h *)tethering;
3362 th->mac_filter = mac_filter;
3364 return TETHERING_ERROR_NONE;
3367 API int tethering_wifi_get_mac_filter(tethering_h tethering, bool *mac_filter)
3369 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3370 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3372 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3373 "parameter(mac_filter) is NULL\n");
3374 _retvm_if(mac_filter == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3375 "parameter(mac_filter) is NULL\n");
3377 __tethering_h *th = (__tethering_h *)tethering;
3378 *mac_filter = th->mac_filter;
3380 return TETHERING_ERROR_NONE;
3383 static int __add_mac_to_file(const char *filepath, const char *mac)
3386 char line[MAX_BUF_SIZE] = "\0";
3387 bool mac_exist = false;
3390 p_mac = strdup(mac);
3391 if (p_mac == NULL) {
3392 ERR("strdup failed\n"); //LCOV_EXCL_LINE
3393 return TETHERING_ERROR_OUT_OF_MEMORY;
3396 fp = fopen(filepath, "a+");
3398 ERR("fopen is failed\n"); //LCOV_EXCL_LINE
3399 return TETHERING_ERROR_OPERATION_FAILED;
3402 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3403 if (strncmp(mac, line, 17) == 0) {
3404 DBG("MAC %s already exist in the list\n", mac); //LCOV_EXCL_LINE
3411 fprintf(fp, "%s\n", mac);
3413 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3414 allowed_list = g_slist_append(allowed_list, p_mac);
3415 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3416 blocked_list = g_slist_append(blocked_list, p_mac);
3421 return TETHERING_ERROR_NONE;
3424 static int __remove_mac_from_file(const char *filepath, const char *mac)
3428 char line[MAX_BUF_SIZE] = "\0";
3430 fp = fopen(filepath, "r");
3432 ERR("fopen is failed\n");
3433 return TETHERING_ERROR_OPERATION_FAILED;
3436 fp1 = fopen(TEMP_LIST, "w+");
3439 ERR("fopen is failed\n");
3440 return TETHERING_ERROR_OPERATION_FAILED;
3443 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3444 if (strncmp(mac, line, 17) == 0) {
3445 DBG("MAC %s found in the list\n", mac);
3447 if ((strcmp(filepath, ALLOWED_LIST) == 0)) {
3448 GSList *list = NULL;
3449 for (list = allowed_list; list != NULL; list = list->next) {
3450 char *p_mac = (char *)list->data;
3451 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3452 allowed_list = g_slist_remove(allowed_list, p_mac);
3454 } else if ((strcmp(filepath, BLOCKED_LIST) == 0)) {
3455 GSList *list = NULL;
3456 for (list = blocked_list; list != NULL; list = list->next) {
3457 char *p_mac = (char *)list->data;
3458 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3459 blocked_list = g_slist_remove(blocked_list, p_mac);
3463 fprintf(fp1, "%s", line);
3470 if ((strcmp(filepath, ALLOWED_LIST) == 0)) {
3471 if (rename(TEMP_LIST, ALLOWED_LIST) != 0) {
3472 ERR("rename is failed (%s -> %s)", TEMP_LIST, ALLOWED_LIST);
3473 return TETHERING_ERROR_OPERATION_FAILED;
3475 } else if ((strcmp(filepath, BLOCKED_LIST) == 0)) {
3476 if (rename(TEMP_LIST, BLOCKED_LIST) != 0) {
3477 ERR("rename is failed (%s -> %s)", TEMP_LIST, BLOCKED_LIST);
3478 return TETHERING_ERROR_OPERATION_FAILED;
3482 return TETHERING_ERROR_NONE;
3485 API int tethering_wifi_add_allowed_mac_list(tethering_h tethering, const char *mac)
3487 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3488 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3490 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3491 "parameter(tethering) is NULL\n");
3492 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3493 "parameter(mac) is NULL\n");
3495 return __add_mac_to_file(ALLOWED_LIST, mac);
3498 API int tethering_wifi_remove_allowed_mac_list(tethering_h tethering, const char *mac)
3500 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3501 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3503 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3504 "parameter(tethering) is NULL\n");
3505 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3506 "parameter(mac) is NULL\n");
3508 return __remove_mac_from_file(ALLOWED_LIST, mac);
3511 API int tethering_wifi_get_allowed_mac_list(tethering_h tethering, void **allowed_mac_list)
3513 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3514 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3516 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3517 "parameter(tethering) is NULL\n");
3518 _retvm_if(allowed_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3519 "parameter(allowed_mac_list) is NULL\n");
3521 *allowed_mac_list = g_slist_copy(allowed_list);
3522 return TETHERING_ERROR_NONE;
3525 API int tethering_wifi_add_blocked_mac_list(tethering_h tethering, const char *mac)
3527 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3528 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3530 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3531 "parameter(tethering) is NULL\n");
3532 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3533 "parameter(mac) is NULL\n");
3535 return __add_mac_to_file(BLOCKED_LIST, mac);
3538 API int tethering_wifi_remove_blocked_mac_list(tethering_h tethering, const char *mac)
3540 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3541 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3543 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3544 "parameter(tethering) is NULL\n");
3545 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3546 "parameter(mac) is NULL\n");
3548 return __remove_mac_from_file(BLOCKED_LIST, mac);
3551 API int tethering_wifi_get_blocked_mac_list(tethering_h tethering, void **blocked_mac_list)
3553 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3554 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3556 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3557 "parameter(tethering) is NULL\n");
3558 _retvm_if(blocked_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3559 "parameter(blocked_mac_list) is NULL\n");
3561 *blocked_mac_list = g_slist_copy(blocked_list);
3562 return TETHERING_ERROR_NONE;
3565 API int tethering_wifi_enable_dhcp(tethering_h tethering, bool enable)
3567 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3568 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3570 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3571 "parameter(tethering) is NULL\n");
3573 GVariant *parameters;
3574 GError *error = NULL;
3577 __tethering_h *th = (__tethering_h *)tethering;
3579 GDBusProxy *proxy = th->client_bus_proxy;
3581 parameters = g_dbus_proxy_call_sync(proxy, "enable_dhcp",
3582 g_variant_new("(b)", enable),
3583 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3587 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3588 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3589 result = TETHERING_ERROR_PERMISSION_DENIED;
3591 result = TETHERING_ERROR_OPERATION_FAILED;
3593 g_error_free(error);
3594 th->dhcp_enabled = false;
3600 g_variant_get(parameters, "(u)", &result);
3601 g_variant_unref(parameters);
3604 th->dhcp_enabled = true;
3606 th->dhcp_enabled = false;
3608 return TETHERING_ERROR_NONE;
3611 API int tethering_wifi_set_dhcp_range(tethering_h tethering, char *rangestart, char *rangestop)
3613 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3614 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3616 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3617 "parameter(tethering) is NULL\n");
3618 _retvm_if(rangestart == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3619 "parameter(rangestart) is NULL\n");
3620 _retvm_if(rangestop == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3621 "parameter(rangestop) is NULL\n");
3623 GVariant *parameters;
3624 GError *error = NULL;
3627 __tethering_h *th = (__tethering_h *)tethering;
3629 GDBusProxy *proxy = th->client_bus_proxy;
3631 parameters = g_dbus_proxy_call_sync(proxy, "dhcp_range",
3632 g_variant_new("(ss)", rangestart, rangestop),
3633 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3636 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3638 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3639 result = TETHERING_ERROR_PERMISSION_DENIED;
3641 result = TETHERING_ERROR_OPERATION_FAILED;
3643 g_error_free(error);
3644 th->dhcp_enabled = false;
3650 g_variant_get(parameters, "(u)", &result);
3651 g_variant_unref(parameters);
3653 th->dhcp_enabled = true;
3655 return TETHERING_ERROR_NONE;
3658 API int tethering_wifi_is_dhcp_enabled(tethering_h tethering, bool *dhcp_enabled)
3660 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3661 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3663 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3664 "parameter(tethering) is NULL\n");
3665 _retvm_if(dhcp_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3666 "parameter(dhcp_enabled) is NULL\n");
3668 __tethering_h *th = (__tethering_h *)tethering;
3669 *dhcp_enabled = th->dhcp_enabled;
3671 return TETHERING_ERROR_NONE;
3674 API int tethering_wifi_set_txpower(tethering_h tethering, unsigned int txpower)
3676 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3677 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3679 GError *error = NULL;
3681 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3682 "parameter(tethering) is NULL\n");
3683 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3684 TETHERING_ERROR_NOT_ENABLED,
3685 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3686 __tethering_h *th = (__tethering_h *)tethering;
3688 g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_set_txpower",
3689 g_variant_new("(u)", txpower),
3690 G_DBUS_CALL_FLAGS_NONE,
3691 -1, th->cancellable, &error);
3694 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
3695 g_clear_error(&error);
3696 return TETHERING_ERROR_OPERATION_FAILED;
3699 return TETHERING_ERROR_NONE;
3702 API int tethering_wifi_get_txpower(tethering_h tethering, unsigned int *txpower)
3704 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3705 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3707 GError *error = NULL;
3708 GVariant *result = NULL;
3710 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3711 "parameter(tethering) is NULL\n");
3712 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3713 TETHERING_ERROR_NOT_ENABLED,
3714 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3716 __tethering_h *th = (__tethering_h *)tethering;
3718 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_get_txpower",
3720 G_DBUS_CALL_FLAGS_NONE,
3721 -1, th->cancellable, &error);
3723 if (result != NULL) {
3724 g_variant_get(result, "(u)", txpower);
3725 g_variant_unref(result);
3729 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
3730 g_clear_error(&error);
3731 return TETHERING_ERROR_OPERATION_FAILED;
3734 g_clear_error(&error);
3735 return TETHERING_ERROR_NONE;
3738 API int tethering_wifi_set_mtu(tethering_h tethering, unsigned int mtu)
3740 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3741 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3743 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3744 "parameter(tethering) is NULL\n");
3746 GVariant *parameters;
3747 GError *error = NULL;
3750 __tethering_h *th = (__tethering_h *)tethering;
3752 GDBusProxy *proxy = th->client_bus_proxy;
3754 parameters = g_dbus_proxy_call_sync(proxy, "set_mtu",
3755 g_variant_new("(u)", mtu),
3756 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3759 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3761 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3762 result = TETHERING_ERROR_PERMISSION_DENIED;
3764 result = TETHERING_ERROR_OPERATION_FAILED;
3766 g_error_free(error);
3771 g_variant_get(parameters, "(u)", &result);
3773 g_variant_unref(parameters);
3775 return TETHERING_ERROR_NONE;
3778 API int tethering_wifi_change_mac(tethering_h tethering, char *mac)
3780 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3781 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3783 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3784 "parameter(tethering) is NULL\n");
3785 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3786 "parameter(mac) is NULL\n");
3788 GVariant *parameters;
3789 GError *error = NULL;
3792 __tethering_h *th = (__tethering_h *)tethering;
3794 GDBusProxy *proxy = th->client_bus_proxy;
3796 parameters = g_dbus_proxy_call_sync(proxy, "change_mac",
3797 g_variant_new("(s)", mac),
3798 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3801 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3803 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3804 result = TETHERING_ERROR_PERMISSION_DENIED;
3806 result = TETHERING_ERROR_OPERATION_FAILED;
3808 g_error_free(error);
3813 g_variant_get(parameters, "(u)", &result);
3814 g_variant_unref(parameters);
3816 if (result == MOBILE_AP_ERROR_NOT_PERMITTED)
3817 return TETHERING_ERROR_NOT_SUPPORT_API;
3819 return TETHERING_ERROR_NONE;
3822 API int tethering_wifi_set_max_connected_device(tethering_h tethering, int max_device)
3824 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3825 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3827 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3828 "parameter(tethering) is NULL\n");
3830 __tethering_h *th = (__tethering_h *)tethering;
3832 th->wifi_max_connected = max_device;
3834 return TETHERING_ERROR_NONE;
3837 API int tethering_wifi_get_max_connected_device(tethering_h tethering, int *max_device)
3839 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3840 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3842 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3843 "parameter(tethering) is NULL\n");
3844 _retvm_if(max_device == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3845 "parameter(max_device) is NULL\n");
3847 __tethering_h *th = (__tethering_h *)tethering;
3849 *max_device = th->wifi_max_connected;
3850 return TETHERING_ERROR_NONE;
3853 API int tethering_wifi_enable_port_forwarding(tethering_h tethering, bool enable)
3855 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3856 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3858 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3859 "parameter(tethering) is NULL\n");
3861 GVariant *parameters;
3862 GError *error = NULL;
3865 __tethering_h *th = (__tethering_h *)tethering;
3867 GDBusProxy *proxy = th->client_bus_proxy;
3869 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_forwarding",
3870 g_variant_new("(b)", enable),
3871 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3874 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3876 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3877 result = TETHERING_ERROR_PERMISSION_DENIED;
3879 result = TETHERING_ERROR_OPERATION_FAILED;
3881 g_error_free(error);
3886 g_variant_get(parameters, "(u)", &result);
3887 g_variant_unref(parameters);
3889 th->port_forwarding = true;
3891 return TETHERING_ERROR_NONE;
3894 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)
3896 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3897 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3899 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3900 "parameter(tethering) is NULL\n");
3901 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3902 "parameter(protocol) is NULL\n");
3904 GVariant *parameters;
3905 GError *error = NULL;
3907 char cmd[MAX_BUF_SIZE] = { 0, };
3910 __tethering_h *th = (__tethering_h *)tethering;
3912 GDBusProxy *proxy = th->client_bus_proxy;
3914 parameters = g_dbus_proxy_call_sync(proxy, "add_port_forwarding_rule",
3915 g_variant_new("(sssisi)", ifname, protocol, org_ip, org_port, final_ip, final_port),
3916 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3919 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3921 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3922 result = TETHERING_ERROR_PERMISSION_DENIED;
3924 result = TETHERING_ERROR_OPERATION_FAILED;
3926 g_error_free(error);
3931 g_variant_get(parameters, "(u)", &result);
3932 g_variant_unref(parameters);
3934 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);
3938 ERR("strdup failed\n"); //LCOV_EXCL_LINE
3939 return TETHERING_ERROR_OUT_OF_MEMORY;
3942 port_forwarding = g_slist_append(port_forwarding, list);
3944 return TETHERING_ERROR_NONE;
3947 API int tethering_wifi_reset_port_forwarding_rule(tethering_h tethering)
3949 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3950 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3952 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3953 "parameter(tethering) is NULL\n");
3955 GVariant *parameters;
3956 GError *error = NULL;
3959 __tethering_h *th = (__tethering_h *)tethering;
3961 GDBusProxy *proxy = th->client_bus_proxy;
3963 parameters = g_dbus_proxy_call_sync(proxy, "reset_port_forwarding_rule",
3964 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3967 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3969 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3970 result = TETHERING_ERROR_PERMISSION_DENIED;
3972 result = TETHERING_ERROR_OPERATION_FAILED;
3974 g_error_free(error);
3979 g_variant_get(parameters, "(u)", &result);
3981 g_variant_unref(parameters);
3983 return TETHERING_ERROR_NONE;
3986 API int tethering_wifi_is_port_forwarding_enabled(tethering_h tethering, bool* forwarding_enabled)
3988 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3989 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3991 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3992 "parameter(tethering) is NULL\n");
3993 _retvm_if(forwarding_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3994 "parameter(forwarding_enabled) is NULL\n");
3996 __tethering_h *th = (__tethering_h *)tethering;
3998 *forwarding_enabled = th->port_forwarding;
4000 return TETHERING_ERROR_NONE;
4003 API int tethering_wifi_get_port_forwarding_rule(tethering_h tethering, void **port_forwarding_list)
4005 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4006 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4008 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4009 "parameter(tethering) is NULL\n");
4010 _retvm_if(port_forwarding_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4011 "parameter(port_forwarding_list) is NULL\n");
4013 *port_forwarding_list = g_slist_copy(port_forwarding);
4014 return TETHERING_ERROR_NONE;
4017 API int tethering_wifi_enable_port_filtering(tethering_h tethering, bool enable)
4019 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4020 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4022 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4023 "parameter(tethering) is NULL\n");
4025 GVariant *parameters;
4026 GError *error = NULL;
4029 __tethering_h *th = (__tethering_h *)tethering;
4031 GDBusProxy *proxy = th->client_bus_proxy;
4033 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_filtering",
4034 g_variant_new("(b)", enable),
4035 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4038 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4040 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4041 result = TETHERING_ERROR_PERMISSION_DENIED;
4043 result = TETHERING_ERROR_OPERATION_FAILED;
4045 g_error_free(error);
4050 g_variant_get(parameters, "(u)", &result);
4051 g_variant_unref(parameters);
4053 th->port_filtering = true;
4055 return TETHERING_ERROR_NONE;
4058 API int tethering_wifi_add_port_filtering_rule(tethering_h tethering, int port, char *protocol, bool allow)
4060 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4061 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4063 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4064 "parameter(tethering) is NULL\n");
4065 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4066 "parameter(protocol) is NULL\n");
4068 GVariant *parameters;
4069 GError *error = NULL;
4071 char cmd[MAX_BUF_SIZE] = { 0, };
4074 __tethering_h *th = (__tethering_h *)tethering;
4076 GDBusProxy *proxy = th->client_bus_proxy;
4078 parameters = g_dbus_proxy_call_sync(proxy, "add_port_filtering_rule",
4079 g_variant_new("(isb)", port, protocol, allow),
4080 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4083 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4085 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4086 result = TETHERING_ERROR_PERMISSION_DENIED;
4088 result = TETHERING_ERROR_OPERATION_FAILED;
4090 g_error_free(error);
4095 g_variant_get(parameters, "(u)", &result);
4096 g_variant_unref(parameters);
4099 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_ACCEPT);
4101 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_DROP);
4107 ERR("strdup failed\n"); //LCOV_EXCL_LINE
4108 return TETHERING_ERROR_OUT_OF_MEMORY;
4111 port_filtering = g_slist_append(port_filtering, list);
4113 return TETHERING_ERROR_NONE;
4116 API int tethering_wifi_add_custom_port_filtering_rule(tethering_h tethering, int port1, int port2, char *protocol, bool allow)
4118 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4119 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4121 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4122 "parameter(tethering) is NULL\n");
4123 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4124 "parameter(protocol) is NULL\n");
4126 GVariant *parameters;
4127 GError *error = NULL;
4129 char cmd[MAX_BUF_SIZE] = { 0, };
4132 __tethering_h *th = (__tethering_h *)tethering;
4134 GDBusProxy *proxy = th->client_bus_proxy;
4136 parameters = g_dbus_proxy_call_sync(proxy, "add_custom_port_filtering_rule",
4137 g_variant_new("(iisb)", port1, port2, protocol, allow),
4138 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4141 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4143 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4144 result = TETHERING_ERROR_PERMISSION_DENIED;
4146 result = TETHERING_ERROR_OPERATION_FAILED;
4148 g_error_free(error);
4153 g_variant_get(parameters, "(u)", &result);
4154 g_variant_unref(parameters);
4157 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_ACCEPT);
4159 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_DROP);
4165 ERR("strdup failed\n"); //LCOV_EXCL_LINE
4166 return TETHERING_ERROR_OUT_OF_MEMORY;
4169 custom_port_filtering = g_slist_append(custom_port_filtering, list);
4171 return TETHERING_ERROR_NONE;
4174 API int tethering_wifi_get_port_filtering_rule(tethering_h tethering, void **port_filtering_list)
4176 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4177 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4179 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4180 "parameter(tethering) is NULL\n");
4181 _retvm_if(port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4182 "parameter(port_filtering_list) is NULL\n");
4184 *port_filtering_list = g_slist_copy(port_filtering);
4185 return TETHERING_ERROR_NONE;
4188 API int tethering_wifi_get_custom_port_filtering_rule(tethering_h tethering, void **custom_port_filtering_list)
4190 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4191 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4193 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4194 "parameter(tethering) is NULL\n");
4195 _retvm_if(custom_port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4196 "parameter(custom_port_filtering_list) is NULL\n");
4198 *custom_port_filtering_list = g_slist_copy(custom_port_filtering);
4199 return TETHERING_ERROR_NONE;
4202 API int tethering_wifi_is_port_filtering_enabled(tethering_h tethering, bool* filtering_enabled)
4204 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4205 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4207 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4208 "parameter(tethering) is NULL\n");
4209 _retvm_if(filtering_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4210 "parameter(filtering_enabled) is NULL\n");
4212 __tethering_h *th = (__tethering_h *)tethering;
4214 *filtering_enabled = th->port_filtering;
4216 return TETHERING_ERROR_NONE;
4219 API int tethering_wifi_set_vpn_passthrough_rule(tethering_h tethering, tethering_vpn_passthrough_type_e type, bool enable)
4221 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4222 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4224 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4225 "parameter(tethering) is NULL\n");
4227 GVariant *parameters;
4228 GError *error = NULL;
4231 __tethering_h *th = (__tethering_h *)tethering;
4233 GDBusProxy *proxy = th->client_bus_proxy;
4235 parameters = g_dbus_proxy_call_sync(proxy, "set_vpn_passthrough_rule",
4236 g_variant_new("(ib)", type, enable),
4237 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4240 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4242 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4243 result = TETHERING_ERROR_PERMISSION_DENIED;
4245 result = TETHERING_ERROR_OPERATION_FAILED;
4247 g_error_free(error);
4252 g_variant_get(parameters, "(u)", &result);
4254 g_variant_unref(parameters);
4256 return TETHERING_ERROR_NONE;
4259 API int tethering_wifi_push_wps_button(tethering_h tethering)
4261 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4262 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4264 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4265 "parameter(tethering) is NULL");
4266 __tethering_h *th = (__tethering_h *)tethering;
4267 GDBusProxy *proxy = th->client_bus_proxy;
4268 GVariant *parameters = NULL;
4270 GError *error = NULL;
4272 parameters = g_dbus_proxy_call_sync(proxy, "push_wps_button",
4273 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4277 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4279 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4280 ret = TETHERING_ERROR_PERMISSION_DENIED;
4282 ret = TETHERING_ERROR_OPERATION_FAILED;
4284 g_error_free(error);
4289 if (parameters != NULL) {
4290 g_variant_get(parameters, "(u)", &ret);
4291 g_variant_unref(parameters);
4294 return TETHERING_ERROR_NONE;
4297 API int tethering_wifi_set_wps_pin(tethering_h tethering, const char *wps_pin)
4299 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4300 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4302 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4303 "parameter(tethering) is NULL");
4304 __tethering_h *th = (__tethering_h *)tethering;
4305 GDBusProxy *proxy = th->client_bus_proxy;
4306 GVariant *parameters = NULL;
4308 GError *error = NULL;
4310 parameters = g_dbus_proxy_call_sync(proxy, "set_wps_pin",
4311 g_variant_new("(s)", wps_pin), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4315 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4317 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4318 ret = TETHERING_ERROR_PERMISSION_DENIED;
4320 ret = TETHERING_ERROR_OPERATION_FAILED;
4322 g_error_free(error);
4327 if (parameters != NULL) {
4328 g_variant_get(parameters, "(u)", &ret);
4329 g_variant_unref(parameters);
4332 return TETHERING_ERROR_NONE;