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;
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 tethering_error = __get_error(info);
1154 g_variant_unref(g_var);
1156 th->settings_reloaded_cb(tethering_error,
1157 th->settings_reloaded_user_data);
1159 th->settings_reloaded_cb = NULL;
1160 th->settings_reloaded_user_data = NULL;
1164 static void __connect_signals(tethering_h tethering)
1167 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1169 __tethering_h *th = (__tethering_h *)tethering;
1170 GDBusConnection *connection = th->client_bus;
1173 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++) {
1174 sigs[i].sig_id = g_dbus_connection_signal_subscribe(connection,
1175 NULL, TETHERING_SERVICE_INTERFACE, sigs[i].name,
1176 TETHERING_SERVICE_OBJECT_PATH, NULL, G_DBUS_SIGNAL_FLAGS_NONE,
1177 sigs[i].cb, tethering, NULL);
1182 static void __disconnect_signals(tethering_h tethering)
1186 _retm_if(tethering == NULL, "parameter(tethering) is NULL\n");
1188 __tethering_h *th = (__tethering_h *)tethering;
1189 GDBusConnection *connection = th->client_bus;
1193 for (i = E_SIGNAL_NET_CLOSED; i < E_SIGNAL_MAX; i++)
1194 g_dbus_connection_signal_unsubscribe(connection, sigs[i].sig_id);
1200 static bool __get_intf_name(tethering_type_e type, char *buf, unsigned int len)
1202 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1206 case TETHERING_TYPE_USB:
1207 g_strlcpy(buf, TETHERING_USB_IF, len);
1210 case TETHERING_TYPE_WIFI:
1211 g_strlcpy(buf, TETHERING_WIFI_IF, len);
1214 case TETHERING_TYPE_BT:
1215 g_strlcpy(buf, TETHERING_BT_IF, len);
1220 ERR("Not supported type : %d\n", type);
1227 static bool __get_gateway_addr(tethering_type_e type, char *buf, unsigned int len)
1229 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1233 case TETHERING_TYPE_USB:
1234 g_strlcpy(buf, TETHERING_USB_GATEWAY, len);
1237 case TETHERING_TYPE_WIFI:
1238 g_strlcpy(buf, TETHERING_WIFI_GATEWAY, len);
1241 case TETHERING_TYPE_BT:
1242 g_strlcpy(buf, TETHERING_BT_GATEWAY, len);
1246 ERR("Not supported type : %d\n", type);
1253 static int __get_common_ssid(char *ssid, unsigned int size)
1256 ERR("ssid is null\n"); //LCOV_EXCL_LINE
1257 return TETHERING_ERROR_INVALID_PARAMETER;
1261 char *ptr_tmp = NULL;
1263 ptr = vconf_get_str(VCONFKEY_SETAPPL_DEVICE_NAME_STR);
1265 ERR("vconf_get_str is failed and set default ssid");
1266 g_strlcpy(ssid, TETHERING_DEFAULT_SSID, size);
1268 g_strlcpy(ssid, ptr, size);
1272 if (!g_utf8_validate(ssid, -1, (const char **)&ptr_tmp))
1275 return TETHERING_ERROR_NONE;
1278 static bool __get_wifi_mode_type(tethering_wifi_mode_type_e type, char **buf)
1280 _retvm_if(buf == NULL, false, "parameter(buf) is NULL\n");
1283 case TETHERING_WIFI_MODE_TYPE_B:
1284 *buf = g_strdup("b");
1286 case TETHERING_WIFI_MODE_TYPE_G:
1287 *buf = g_strdup("g");
1289 case TETHERING_WIFI_MODE_TYPE_A:
1290 *buf = g_strdup("a");
1292 case TETHERING_WIFI_MODE_TYPE_AD:
1293 *buf = g_strdup("ad");
1296 ERR("Not supported type : %d\n", type);
1302 static int __prepare_wifi_settings(tethering_h tethering, _softap_settings_t *set)
1306 __tethering_h *th = (__tethering_h *)tethering;
1307 tethering_error_e ret = TETHERING_ERROR_NONE;
1310 if (th == NULL || set == NULL) {
1311 ERR("null parameter\n-\n"); //LCOV_EXCL_LINE
1312 return TETHERING_ERROR_INVALID_PARAMETER;
1315 if (th->ssid == NULL)
1316 __get_common_ssid(set->ssid, sizeof(set->ssid));
1318 g_strlcpy(set->ssid, th->ssid, sizeof(set->ssid));
1320 ret = __get_security_type(&set->sec_type);
1321 if (ret != TETHERING_ERROR_NONE)
1322 set->sec_type = th->sec_type;
1324 ret = __get_visible(&set->visibility);
1325 if (ret != TETHERING_ERROR_NONE)
1326 set->visibility = th->visibility;
1328 set->mac_filter = th->mac_filter;
1329 set->max_connected = th->wifi_max_connected;
1330 set->channel = th->channel;
1332 __get_wifi_mode_type(th->mode_type, &ptr);
1334 g_strlcpy(set->mode, "", sizeof(set->mode));
1336 g_strlcpy(set->mode, ptr, sizeof(set->mode));
1340 if (set->sec_type == TETHERING_WIFI_SECURITY_TYPE_NONE) {
1341 g_strlcpy(set->key, "", sizeof(set->key));
1343 GDBusProxy *proxy = th->client_bus_proxy;
1344 GVariant *parameters;
1345 GError *error = NULL;
1346 char *passphrase = NULL;
1347 unsigned int len = 0;
1349 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
1350 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
1354 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
1356 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
1357 ret = TETHERING_ERROR_PERMISSION_DENIED;
1359 ret = TETHERING_ERROR_OPERATION_FAILED;
1361 g_error_free(error);
1366 if (parameters != NULL) {
1367 g_variant_get(parameters, "(siu)", &passphrase, &len, &ret);
1368 g_variant_unref(parameters);
1371 g_strlcpy(set->key, passphrase, sizeof(set->key));
1374 INFO("ssid: %s security: %d mode: %s channel: %d visibility: %s\n",
1375 set->ssid, set->sec_type, set->mode, set->channel,
1376 (set->visibility) ? "true" : "false");
1378 return TETHERING_ERROR_NONE;
1381 static bool __check_precondition(tethering_type_e type)
1383 int dnet_status = 0;
1384 int cellular_state = 0;
1386 /* data network through cellular */
1387 vconf_get_int(VCONFKEY_NETWORK_CELLULAR_STATE, &cellular_state);
1388 if (cellular_state == VCONFKEY_NETWORK_CELLULAR_ON) {
1389 INFO("Data Network can be connected later");
1393 /* data network status */
1394 vconf_get_int(VCONFKEY_NETWORK_STATUS, &dnet_status);
1395 if ((dnet_status == VCONFKEY_NETWORK_WIFI
1396 && type != TETHERING_TYPE_WIFI)
1397 || dnet_status == VCONFKEY_NETWORK_ETHERNET)
1400 ERR("Network is not available!");
1406 * @brief Creates the handle of tethering.
1408 * @privlevel platform
1409 * @privilege http://tizen.org/privilege/tethering.admin
1410 * @remarks The @a tethering must be released tethering_destroy() by you.
1411 * @param[out] tethering A handle of a new mobile ap handle on success
1412 * @return 0 on success, otherwise a negative error value.
1413 * @retval #TETHERING_ERROR_NONE Successful
1414 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1415 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1416 * @retval #TETHERING_ERROR_NOT_SUPPORT_API API is not supported
1417 * @see tethering_destroy()
1419 API int tethering_create(tethering_h *tethering)
1421 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1422 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1423 "parameter(tethering) is NULL\n");
1426 __tethering_h *th = NULL;
1427 GError *error = NULL;
1428 char ssid[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
1430 th = (__tethering_h *)malloc(sizeof(__tethering_h));
1432 _retvm_if(th == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
1433 "malloc is failed\n");
1434 memset(th, 0x00, sizeof(__tethering_h));
1435 th->sec_type = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK;
1436 th->visibility = true;
1437 th->mac_filter = false;
1438 th->channel = TETHERING_WIFI_CHANNEL;
1439 th->mode_type = TETHERING_WIFI_MODE_TYPE_G;
1440 th->wifi_max_connected = TETHERING_WIFI_MAX_STA;
1442 if (__generate_initial_passphrase(th->passphrase,
1443 sizeof(th->passphrase)) == 0) {
1445 ERR("random passphrase generation failed\n");
1447 return TETHERING_ERROR_OPERATION_FAILED;
1451 if (__get_common_ssid(ssid, sizeof(ssid)) != TETHERING_ERROR_NONE) {
1453 ERR("common ssid get failed\n");
1455 return TETHERING_ERROR_OPERATION_FAILED;
1459 #if !GLIB_CHECK_VERSION(2, 36, 0)
1462 GCancellable *cancellable = g_cancellable_new();
1463 th->client_bus = g_bus_get_sync(DBUS_BUS_SYSTEM, cancellable, &error);
1466 ERR("Couldn't connect to the System bus[%s]", error->message);
1467 g_error_free(error);
1468 g_cancellable_cancel(cancellable);
1469 g_object_unref(cancellable);
1471 return TETHERING_ERROR_OPERATION_FAILED;
1474 th->cancellable = cancellable;
1476 th->client_bus_proxy = g_dbus_proxy_new_sync(th->client_bus, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START_AT_CONSTRUCTION,
1477 NULL, TETHERING_SERVICE_NAME, TETHERING_SERVICE_OBJECT_PATH,
1478 TETHERING_SERVICE_INTERFACE, th->cancellable, &error);
1479 if (!th->client_bus_proxy) {
1482 ERR("Couldn't create the proxy object because of %s\n", error->message);
1483 g_cancellable_cancel(th->cancellable);
1484 g_object_unref(th->cancellable);
1485 g_object_unref(th->client_bus);
1487 return TETHERING_ERROR_OPERATION_FAILED;
1491 __connect_signals((tethering_h)th);
1493 *tethering = (tethering_h)th;
1494 _tethering_add_handle(th);
1495 INFO("Tethering Handle : %p\n", th);
1497 return TETHERING_ERROR_NONE;
1502 * @brief Destroys the handle of tethering.
1504 * @privlevel platform
1505 * @privilege http://tizen.org/privilege/tethering.admin
1506 * @param[in] tethering The handle of tethering
1507 * @return 0 on success, otherwise a negative error value.
1508 * @retval #TETHERING_ERROR_NONE Successful
1509 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1510 * @see tethering_create()
1512 API int tethering_destroy(tethering_h tethering)
1515 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1516 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1517 "parameter(tethering) is NULL\n");
1519 __tethering_h *th = (__tethering_h *)tethering;
1521 INFO("Tethering Handle : %p\n", th);
1523 __disconnect_signals(tethering);
1524 _tethering_remove_handle(th);
1529 g_object_unref(th->cancellable);
1530 g_object_unref(th->client_bus_proxy);
1531 g_object_unref(th->client_bus);
1532 memset(th, 0x00, sizeof(__tethering_h));
1537 return TETHERING_ERROR_NONE;
1542 * @brief Enables the tethering, asynchronously.
1544 * @privlevel platform
1545 * @privilege http://tizen.org/privilege/tethering.admin
1546 * @param[in] tethering The handle of tethering
1547 * @param[in] type The type of tethering
1548 * @return 0 on success, otherwise negative error value.
1549 * @retval #TETHERING_ERROR_NONE Successful
1550 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1551 * @post tethering_enabled_cb() will be invoked.
1552 * @see tethering_is_enabled()
1553 * @see tethering_disable()
1555 API int tethering_enable(tethering_h tethering, tethering_type_e type)
1557 INFO("+ type : %d\n", type);
1558 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1559 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1560 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1561 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1563 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1564 "parameter(tethering) is NULL\n");
1566 tethering_error_e ret = TETHERING_ERROR_NONE;
1567 __tethering_h *th = (__tethering_h *)tethering;
1568 GDBusProxy *proxy = th->client_bus_proxy;
1569 GDBusConnection *connection = th->client_bus;
1571 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1573 if (__check_precondition(type) == FALSE) {
1576 return TETHERING_ERROR_OPERATION_FAILED;
1582 case TETHERING_TYPE_USB:
1583 g_dbus_connection_signal_unsubscribe(connection,
1584 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1586 g_dbus_proxy_call(proxy, "enable_usb_tethering", NULL,
1587 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1588 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1592 case TETHERING_TYPE_WIFI: {
1593 _softap_settings_t set = {"", "", "", 0, false};
1595 ret = __prepare_wifi_settings(tethering, &set);
1596 if (ret != TETHERING_ERROR_NONE) {
1598 ERR("softap settings initialization failed\n");
1600 return TETHERING_ERROR_OPERATION_FAILED;
1603 g_dbus_connection_signal_unsubscribe(connection,
1604 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1606 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1607 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),
1608 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1609 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1613 case TETHERING_TYPE_BT:
1614 g_dbus_connection_signal_unsubscribe(connection,
1615 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1617 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1618 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1619 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1620 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1625 case TETHERING_TYPE_P2P: {
1626 _softap_settings_t p2p_set = {"", "", "", 0, false};
1627 ret = __prepare_wifi_settings(tethering, &p2p_set);
1628 if (ret != TETHERING_ERROR_NONE) {
1629 ERR("p2p settings initialization failed\n");
1631 return TETHERING_ERROR_OPERATION_FAILED;
1634 g_dbus_proxy_call(proxy, "enable_p2p_tethering",
1635 g_variant_new("(ssi)", p2p_set.ssid, p2p_set.key, p2p_set.channel),
1636 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1637 (GAsyncReadyCallback) __p2p_enabled_cfm_cb, (gpointer)tethering);
1641 case TETHERING_TYPE_ALL: {
1642 _softap_settings_t set = {"", "", "", 0, false};
1644 ret = __prepare_wifi_settings(tethering, &set);
1645 if (ret != TETHERING_ERROR_NONE) {
1646 ERR("softap settings initialization failed\n");
1647 return TETHERING_ERROR_OPERATION_FAILED;
1650 /* TETHERING_TYPE_USB */
1651 g_dbus_connection_signal_unsubscribe(connection,
1652 sigs[E_SIGNAL_USB_TETHER_ON].sig_id);
1654 g_dbus_proxy_call(proxy, "enable_usb_tethering", NULL,
1655 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1656 (GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
1658 /* TETHERING_TYPE_WIFI */
1659 g_dbus_connection_signal_unsubscribe(connection,
1660 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1662 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1663 g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode,
1664 set.channel, set.visibility, set.mac_filter, set.max_connected,
1665 set.sec_type, TETHERING_ADDRESS_FAMILY_IPV4),
1666 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1667 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1669 /* TETHERING_TYPE_BT */
1670 g_dbus_connection_signal_unsubscribe(connection,
1671 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1673 g_dbus_proxy_call(proxy, "enable_bt_tethering",
1674 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1675 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1676 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1680 ERR("Unknown type : %d\n", type);
1682 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1685 return TETHERING_ERROR_INVALID_PARAMETER;
1689 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1691 return TETHERING_ERROR_NONE;
1694 API int tethering_ipv6_enable(tethering_h tethering, tethering_type_e type)
1696 DBG("+ type : %d\n", type);
1697 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1698 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1699 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1700 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1702 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1703 "parameter(tethering) is NULL\n");
1705 __tethering_h *th = (__tethering_h *)tethering;
1706 GDBusProxy *proxy = th->client_bus_proxy;
1707 GDBusConnection *connection = th->client_bus;
1710 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_INFINITE);
1712 if (__check_precondition(type) == FALSE) {
1715 return TETHERING_ERROR_OPERATION_FAILED;
1720 case TETHERING_TYPE_WIFI: {
1721 _softap_settings_t set = {"", "", "", 0, false, false, 0, 0};
1723 ret = __prepare_wifi_settings(tethering, &set);
1724 if (ret != TETHERING_ERROR_NONE) {
1725 ERR("softap settings initialization failed\n");
1727 return TETHERING_ERROR_OPERATION_FAILED;
1729 g_dbus_connection_signal_unsubscribe(connection,
1730 sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
1731 g_dbus_proxy_call(proxy, "enable_wifi_tethering",
1732 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),
1733 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1734 (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
1737 case TETHERING_TYPE_BT: {
1738 g_dbus_connection_signal_unsubscribe(connection,
1739 sigs[E_SIGNAL_BT_TETHER_ON].sig_id);
1742 g_dbus_proxy_call(proxy, "enable_bt_tethering", g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1743 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1744 (GAsyncReadyCallback) __bt_enabled_cfm_cb, (gpointer)tethering);
1750 ERR("Unknown type : %d\n", type);
1752 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1755 return TETHERING_ERROR_INVALID_PARAMETER;
1759 g_dbus_proxy_set_default_timeout(proxy, DBUS_TIMEOUT_USE_DEFAULT);
1761 return TETHERING_ERROR_NONE;
1764 API int tethering_ipv6_disable(tethering_h tethering, tethering_type_e type)
1766 DBG("+ type : %d\n", type);
1767 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1768 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1769 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1770 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1772 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1773 "parameter(tethering) is NULL\n");
1775 __tethering_h *th = (__tethering_h *)tethering;
1776 GDBusProxy *proxy = th->client_bus_proxy;
1777 GDBusConnection *connection = th->client_bus;
1780 case TETHERING_TYPE_WIFI:
1781 DBG("Disable wifi tethering..");
1782 g_dbus_connection_signal_unsubscribe(connection,
1783 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1785 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1786 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1787 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1788 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1790 case TETHERING_TYPE_BT:
1791 g_dbus_connection_signal_unsubscribe(connection,
1792 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1794 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1795 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV6),
1796 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1797 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1801 ERR("Not supported tethering type [%d]\n", type);
1803 return TETHERING_ERROR_INVALID_PARAMETER;
1806 return TETHERING_ERROR_NONE;
1810 * @brief Disables the tethering, asynchronously.
1812 * @privlevel platform
1813 * @privilege http://tizen.org/privilege/tethering.admin
1814 * @param[in] tethering The handle of tethering
1815 * @param[in] type The type of tethering
1816 * @return 0 on success, otherwise negative error value.
1817 * @retval #TETHERING_ERROR_NONE Successful
1818 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1819 * @post tethering_disabled_cb() will be invoked.
1820 * @see tethering_is_enabled()
1821 * @see tethering_enable()
1823 API int tethering_disable(tethering_h tethering, tethering_type_e type)
1825 INFO("+ type : %d\n", type);
1826 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1827 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
1828 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1829 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
1831 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1832 "parameter(tethering) is NULL\n");
1834 __tethering_h *th = (__tethering_h *)tethering;
1835 GDBusProxy *proxy = th->client_bus_proxy;
1836 GDBusConnection *connection = th->client_bus;
1840 case TETHERING_TYPE_USB:
1841 g_dbus_connection_signal_unsubscribe(connection,
1842 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1844 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1845 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1846 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1851 case TETHERING_TYPE_WIFI:
1853 g_dbus_connection_signal_unsubscribe(connection,
1854 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1856 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1857 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1858 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1859 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1862 case TETHERING_TYPE_BT:
1864 g_dbus_connection_signal_unsubscribe(connection,
1865 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1867 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1868 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1869 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1870 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1874 case TETHERING_TYPE_P2P:
1875 g_dbus_proxy_call(proxy, "disable_p2p_tethering",
1876 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1877 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1880 case TETHERING_TYPE_ALL:
1881 g_dbus_connection_signal_unsubscribe(connection,
1882 sigs[E_SIGNAL_USB_TETHER_OFF].sig_id);
1884 g_dbus_proxy_call(proxy, "disable_usb_tethering",
1885 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1886 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1888 g_dbus_connection_signal_unsubscribe(connection,
1889 sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
1891 g_dbus_proxy_call(proxy, "disable_wifi_tethering",
1892 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1893 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1894 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1896 g_dbus_connection_signal_unsubscribe(connection,
1897 sigs[E_SIGNAL_BT_TETHER_OFF].sig_id);
1899 g_dbus_proxy_call(proxy, "disable_bt_tethering",
1900 g_variant_new("(i)", TETHERING_ADDRESS_FAMILY_IPV4),
1901 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
1902 (GAsyncReadyCallback) __disabled_cfm_cb, (gpointer)tethering);
1906 ERR("Not supported tethering type [%d]\n", type);
1908 return TETHERING_ERROR_INVALID_PARAMETER;
1912 return TETHERING_ERROR_NONE;
1917 * @brief Checks whetehr the tethering is enabled or not.
1919 * @privlevel platform
1920 * @privilege http://tizen.org/privilege/tethering.admin
1921 * @param[in] tethering The handle of tethering
1922 * @param[in] type The type of tethering
1923 * @return @c true if tethering is enabled, \n @c false if tethering is disabled.
1925 API bool tethering_is_enabled(tethering_h tethering, tethering_type_e type)
1927 INFO("+ type : %d\n", type);
1929 int vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_NONE;
1931 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1933 if (vconf_get_int(VCONFKEY_MOBILE_HOTSPOT_MODE, &is_on) != 0)
1937 case TETHERING_TYPE_USB:
1938 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_USB;
1941 case TETHERING_TYPE_WIFI:
1942 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_WIFI;
1945 case TETHERING_TYPE_BT:
1946 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_BT;
1949 case TETHERING_TYPE_P2P:
1950 vconf_type = VCONFKEY_MOBILE_HOTSPOT_MODE_P2P;
1954 ERR("Not supported type : %d\n", type);
1957 INFO("- enabled: %s\n", (is_on & vconf_type) ? "true" : "false");
1958 return is_on & vconf_type ? true : false;
1963 * @brief Gets the MAC address of local device as "FC:A1:3E:D6:B1:B1".
1965 * @privlevel platform
1966 * @privilege http://tizen.org/privilege/tethering.admin
1967 * @remarks @a mac_address must be released with free() by you.
1968 * @param[in] tethering The handle of tethering
1969 * @param[in] type The type of tethering
1970 * @param[out] mac_address The MAC address
1971 * @return 0 on success, otherwise a negative error value.
1972 * @retval #TETHERING_ERROR_NONE Successful
1973 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
1974 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
1975 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
1976 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
1977 * @pre tethering must be enabled.
1978 * @see tethering_is_enabled()
1979 * @see tethering_enable()
1981 API int tethering_get_mac_address(tethering_h tethering, tethering_type_e type, char **mac_address)
1983 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
1984 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE); //LCOV_EXCL_LINE
1985 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
1986 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE); //LCOV_EXCL_LINE
1988 _retvm_if(tethering_is_enabled(tethering, type) == false,
1989 TETHERING_ERROR_NOT_ENABLED,
1990 "tethering type[%d] is not enabled\n", type);
1991 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1992 "parameter(tethering) is NULL\n");
1993 _retvm_if(mac_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
1994 "parameter(mac_address) is NULL\n");
1998 char *macbuf = NULL;
2000 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2001 TETHERING_ERROR_OPERATION_FAILED,
2002 "getting interface name is failed\n");
2004 s = socket(AF_INET, SOCK_DGRAM, 0);
2005 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2006 "getting socket is failed\n");
2007 if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
2009 ERR("getting mac is failed\n");
2011 return TETHERING_ERROR_OPERATION_FAILED;
2016 macbuf = (char *)malloc(TETHERING_STR_INFO_LEN);
2017 _retvm_if(macbuf == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2018 "Not enough memory\n");
2019 snprintf(macbuf, TETHERING_STR_INFO_LEN, "%02X:%02X:%02X:%02X:%02X:%02X",
2020 (unsigned char)ifr.ifr_hwaddr.sa_data[0],
2021 (unsigned char)ifr.ifr_hwaddr.sa_data[1],
2022 (unsigned char)ifr.ifr_hwaddr.sa_data[2],
2023 (unsigned char)ifr.ifr_hwaddr.sa_data[3],
2024 (unsigned char)ifr.ifr_hwaddr.sa_data[4],
2025 (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
2027 *mac_address = macbuf;
2029 return TETHERING_ERROR_NONE;
2034 * @brief Gets the name of network interface. For example, usb0.
2036 * @privlevel platform
2037 * @privilege http://tizen.org/privilege/tethering.admin
2038 * @remarks @a interface_name must be released with free() by you.
2039 * @param[in] tethering The handle of tethering
2040 * @param[in] type The type of tethering
2041 * @param[out] interface_name The name of network interface
2042 * @return 0 on success, otherwise negative error value.
2043 * @retval #TETHERING_ERROR_NONE Successful
2044 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2045 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2046 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2047 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2048 * @pre tethering must be enabled.
2049 * @see tethering_is_enabled()
2050 * @see tethering_enable()
2052 API int tethering_get_network_interface_name(tethering_h tethering, tethering_type_e type, char **interface_name)
2054 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2055 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2056 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2057 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2059 _retvm_if(tethering_is_enabled(tethering, type) == false,
2060 TETHERING_ERROR_NOT_ENABLED,
2061 "tethering type[%d] is not enabled\n", type);
2062 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2063 "parameter(tethering) is NULL\n");
2064 _retvm_if(interface_name == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2065 "parameter(interface_name) is NULL\n");
2067 char intf[TETHERING_STR_INFO_LEN] = {0, };
2069 _retvm_if(!__get_intf_name(type, intf, sizeof(intf)),
2070 TETHERING_ERROR_OPERATION_FAILED,
2071 "getting interface name is failed\n");
2072 *interface_name = strdup(intf);
2073 _retvm_if(*interface_name == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2074 "Not enough memory\n");
2076 return TETHERING_ERROR_NONE;
2081 * @brief Gets the local IP address.
2083 * @privlevel platform
2084 * @privilege http://tizen.org/privilege/tethering.admin
2085 * @remarks @a ip_address must be released with free() by you.
2086 * @param[in] tethering The handle of tethering
2087 * @param[in] type The type of tethering
2088 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2089 * @param[out] ip_address The local IP address
2090 * @return 0 on success, otherwise negative error value.
2091 * @retval #TETHERING_ERROR_NONE Successful
2092 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2093 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2094 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2095 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2096 * @pre tethering must be enabled.
2097 * @see tethering_is_enabled()
2098 * @see tethering_enable()
2100 API int tethering_get_ip_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **ip_address)
2102 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2103 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE); //LCOV_EXCL_LINE
2104 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2105 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE); //LCOV_EXCL_LINE
2107 _retvm_if(tethering_is_enabled(tethering, type) == false,
2108 TETHERING_ERROR_NOT_ENABLED,
2109 "tethering type[%d] is not enabled\n", type);
2110 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2111 "parameter(tethering) is NULL\n");
2112 _retvm_if(ip_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2113 "parameter(ip_address) is NULL\n");
2119 _retvm_if(!__get_intf_name(type, ifr.ifr_name, sizeof(ifr.ifr_name)),
2120 TETHERING_ERROR_OPERATION_FAILED,
2121 "getting interface name is failed\n");
2123 s = socket(AF_INET, SOCK_DGRAM, 0);
2124 _retvm_if(s < 0, TETHERING_ERROR_OPERATION_FAILED,
2125 "getting socket is failed\n");
2126 if (ioctl(s, SIOCGIFADDR, &ifr) < 0) {
2127 ERR("ioctl is failed\n");
2129 return TETHERING_ERROR_OPERATION_FAILED;
2133 ipbuf = inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);
2134 *ip_address = strdup(ipbuf);
2135 _retvm_if(*ip_address == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2136 "Not enough memory\n");
2138 return TETHERING_ERROR_NONE;
2143 * @brief Gets the Gateway address.
2145 * @privlevel platform
2146 * @privilege http://tizen.org/privilege/tethering.admin
2147 * @remarks @a gateway_address must be released with free() by you.
2148 * @param[in] tethering The handle of tethering
2149 * @param[in] type The type of tethering
2150 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2151 * @param[out] gateway_address The local IP address
2152 * @return 0 on success, otherwise negative error value.
2153 * @retval #TETHERING_ERROR_NONE Successful
2154 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2155 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2156 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2157 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2158 * @pre tethering must be enabled.
2159 * @see tethering_is_enabled()
2160 * @see tethering_enable()
2162 API int tethering_get_gateway_address(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **gateway_address)
2164 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2165 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2166 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2167 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2169 _retvm_if(tethering_is_enabled(tethering, type) == false,
2170 TETHERING_ERROR_NOT_ENABLED,
2171 "tethering type[%d] is not enabled\n", type);
2172 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2173 "parameter(tethering) is NULL\n");
2174 _retvm_if(gateway_address == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2175 "parameter(gateway_address) is NULL\n");
2177 char gateway_buf[TETHERING_STR_INFO_LEN] = {0, };
2179 _retvm_if(!__get_gateway_addr(type, gateway_buf, sizeof(gateway_buf)),
2180 TETHERING_ERROR_OPERATION_FAILED,
2181 "getting gateway address is failed\n");
2183 *gateway_address = strdup(gateway_buf);
2185 return TETHERING_ERROR_NONE;
2190 * @brief Gets the Subnet Mask.
2192 * @privlevel platform
2193 * @privilege http://tizen.org/privilege/tethering.admin
2194 * @remarks @a subnet_mask must be released with free() by you.
2195 * @param[in] tethering The handle of tethering
2196 * @param[in] type The type of tethering
2197 * @param[in] address_family The address family of IP address. Currently, #TETHERING_ADDRESS_FAMILY_IPV4 is only supported.
2198 * @param[out] subnet_mask The local IP address
2199 * @return 0 on success, otherwise negative error value.
2200 * @retval #TETHERING_ERROR_NONE Successful
2201 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2202 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2203 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2204 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2205 * @pre tethering must be enabled.
2206 * @see tethering_is_enabled()
2207 * @see tethering_enable()
2209 API int tethering_get_subnet_mask(tethering_h tethering, tethering_type_e type, tethering_address_family_e address_family, char **subnet_mask)
2211 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2212 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2213 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2214 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2216 _retvm_if(tethering_is_enabled(tethering, type) == false,
2217 TETHERING_ERROR_NOT_ENABLED,
2218 "tethering is not enabled\n");
2219 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2220 "parameter(tethering) is NULL\n");
2221 _retvm_if(subnet_mask == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2222 "parameter(subnet_mask) is NULL\n");
2224 *subnet_mask = strdup(TETHERING_SUBNET_MASK);
2225 _retvm_if(*subnet_mask == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2226 "Not enough memory\n");
2228 return TETHERING_ERROR_NONE;
2233 * @brief Gets the data usage.
2235 * @privlevel platform
2236 * @privilege http://tizen.org/privilege/tethering.admin
2237 * @param[in] tethering The handle of tethering
2238 * @param[out] usage The data usage
2239 * @return 0 on success, otherwise negative error value.
2240 * @retval #TETHERING_ERROR_NONE Successful
2241 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2242 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2243 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2244 * @pre tethering must be enabled.
2245 * @see tethering_is_enabled()
2246 * @see tethering_enable()
2248 API int tethering_get_data_usage(tethering_h tethering, tethering_data_usage_cb callback, void *user_data)
2250 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2252 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2253 "parameter(tethering) is NULL\n");
2254 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2255 "parameter(callback) is NULL\n");
2256 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2257 TETHERING_ERROR_NOT_ENABLED,
2258 "tethering is not enabled\n");
2260 __tethering_h *th = (__tethering_h *)tethering;
2261 GDBusProxy *proxy = th->client_bus_proxy;
2263 th->data_usage_cb = callback;
2264 th->data_usage_user_data = user_data;
2266 g_dbus_proxy_call(proxy, "get_data_packet_usage",
2267 NULL, G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
2268 (GAsyncReadyCallback) __get_data_usage_cb, (gpointer)tethering);
2270 return TETHERING_ERROR_NONE;
2275 * @brief Gets the client which is connected by tethering "type".
2277 * @privlevel platform
2278 * @privilege http://tizen.org/privilege/tethering.admin
2279 * @param[in] tethering The handle of tethering
2280 * @param[in] type The type of tethering
2281 * @param[in] callback The callback function to invoke
2282 * @param[in] user_data The user data to be passed to the callback function
2283 * @retval #TETHERING_ERROR_NONE Successful
2284 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2285 * @retval #TETHERING_ERROR_NOT_ENABLED Not enabled
2286 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2287 * @pre tethering must be enabled.
2288 * @see tethering_is_enabled()
2289 * @see tethering_enable()
2291 API int tethering_foreach_connected_clients(tethering_h tethering, tethering_type_e type, tethering_connected_client_cb callback, void *user_data)
2293 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2294 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2295 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2296 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2298 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2299 "parameter(tethering) is NULL\n");
2300 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2301 "parameter(callback) is NULL\n");
2302 _retvm_if(__any_tethering_is_enabled(tethering) == false,
2303 TETHERING_ERROR_NOT_ENABLED,
2304 "tethering is not enabled\n");
2306 mobile_ap_type_e interface;
2307 __tethering_h *th = (__tethering_h *)tethering;
2308 __tethering_client_h client = {0, };
2311 gchar *hostname = NULL;
2312 guint timestamp = 0;
2313 GError *error = NULL;
2314 GVariant *result = NULL;
2315 GVariantIter *outer_iter = NULL;
2316 GVariantIter *inner_iter = NULL;
2317 GVariant *station = NULL;
2318 GVariant *value = NULL;
2321 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "get_station_info",
2322 NULL, G_DBUS_CALL_FLAGS_NONE,
2323 -1, th->cancellable, &error);
2325 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message); //LCOV_EXCL_LINE
2326 g_variant_get(result, "(a(a{sv}))", &outer_iter);
2328 while (g_variant_iter_loop(outer_iter, "(@a{sv})", &station)) {
2329 g_variant_get(station, "a{sv}", &inner_iter);
2330 while (g_variant_iter_loop(inner_iter, "{sv}", &key, &value)) {
2331 if (g_strcmp0(key, "Type") == 0) {
2332 interface = g_variant_get_int32(value);
2333 if (interface == MOBILE_AP_TYPE_USB)
2334 client.interface = TETHERING_TYPE_USB;
2335 else if (interface == MOBILE_AP_TYPE_WIFI)
2336 client.interface = TETHERING_TYPE_WIFI;
2337 else if (interface == MOBILE_AP_TYPE_BT)
2338 client.interface = TETHERING_TYPE_BT;
2339 else if (interface == MOBILE_AP_TYPE_P2P)
2340 client.interface = TETHERING_TYPE_P2P;
2342 ERR("Invalid interface\n");
2344 g_variant_unref(value);
2347 DBG("interface is %d\n", client.interface);
2348 if (client.interface != type && (TETHERING_TYPE_ALL != type)) {
2350 g_variant_unref(value);
2353 } else if (g_strcmp0(key, "IP") == 0) {
2354 g_variant_get(value, "s", &ip);
2355 SDBG("ip is %s\n", ip);
2356 g_strlcpy(client.ip, ip, sizeof(client.ip));
2357 } else if (g_strcmp0(key, "MAC") == 0) {
2358 g_variant_get(value, "s", &mac);
2359 SDBG("mac is %s\n", mac);
2360 g_strlcpy(client.mac, mac, sizeof(client.mac));
2361 } else if (g_strcmp0(key, "Name") == 0) {
2362 g_variant_get(value, "s", &hostname);
2363 SDBG("hsotname is %s\n", hostname);
2365 client.hostname = g_strdup(hostname);
2366 } else if (g_strcmp0(key, "Time") == 0) {
2367 timestamp = g_variant_get_int32(value);
2368 DBG("timestamp is %d\n", timestamp);
2369 client.tm = (time_t)timestamp;
2371 ERR("Key %s not required\n", key);
2382 g_variant_iter_free(inner_iter);
2383 if (callback((tethering_client_h)&client, user_data) == false) {
2384 DBG("iteration is stopped\n");
2385 g_free(client.hostname);
2386 client.hostname = NULL;
2387 g_variant_iter_free(outer_iter);
2388 g_variant_unref(station);
2389 g_variant_unref(result);
2391 return TETHERING_ERROR_OPERATION_FAILED;
2393 g_free(client.hostname);
2394 client.hostname = NULL;
2397 g_variant_iter_free(outer_iter);
2398 g_variant_unref(station);
2399 g_variant_unref(result);
2401 return TETHERING_ERROR_NONE;
2406 * @brief Registers the callback function called when tethering is enabled.
2408 * @privlevel platform
2409 * @privilege http://tizen.org/privilege/tethering.admin
2410 * @param[in] tethering The handle of tethering
2411 * @param[in] type The type of tethering
2412 * @param[in] callback The callback function to invoke
2413 * @param[in] user_data The user data to be passed to the callback function
2414 * @retval #TETHERING_ERROR_NONE Successful
2415 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2416 * @see tethering_unset_enabled_cb()
2418 API int tethering_set_enabled_cb(tethering_h tethering, tethering_type_e type, tethering_enabled_cb callback, void *user_data)
2420 INFO("+ type: %d\n", type);
2421 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2422 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2423 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2424 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2426 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2427 "parameter(tethering) is NULL\n");
2428 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2429 "parameter(callback) is NULL\n");
2431 __tethering_h *th = (__tethering_h *)tethering;
2432 tethering_type_e ti;
2434 if (type != TETHERING_TYPE_ALL) {
2435 th->enabled_cb[type] = callback;
2436 th->enabled_user_data[type] = user_data;
2438 return TETHERING_ERROR_NONE;
2441 /* TETHERING_TYPE_ALL */
2442 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2443 th->enabled_cb[ti] = callback;
2444 th->enabled_user_data[ti] = user_data;
2448 return TETHERING_ERROR_NONE;
2453 * @brief Unregisters the callback function called when tethering is disabled.
2455 * @privlevel platform
2456 * @privilege http://tizen.org/privilege/tethering.admin
2457 * @param[in] tethering The handle of tethering
2458 * @param[in] type The type of tethering
2459 * @retval #TETHERING_ERROR_NONE Successful
2460 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2461 * @see tethering_set_enabled_cb()
2463 API int tethering_unset_enabled_cb(tethering_h tethering, tethering_type_e type)
2465 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2466 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2467 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2468 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2470 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2471 "parameter(tethering) is NULL\n");
2473 __tethering_h *th = (__tethering_h *)tethering;
2474 tethering_type_e ti;
2476 if (type != TETHERING_TYPE_ALL) {
2477 th->enabled_cb[type] = NULL;
2478 th->enabled_user_data[type] = NULL;
2480 return TETHERING_ERROR_NONE;
2483 /* TETHERING_TYPE_ALL */
2484 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2485 th->enabled_cb[ti] = NULL;
2486 th->enabled_user_data[ti] = NULL;
2489 return TETHERING_ERROR_NONE;
2494 * @brief Registers the callback function called when tethering is disabled.
2496 * @privlevel platform
2497 * @privilege http://tizen.org/privilege/tethering.admin
2498 * @param[in] tethering The handle of tethering
2499 * @param[in] type The type of tethering
2500 * @param[in] callback The callback function to invoke
2501 * @param[in] user_data The user data to be passed to the callback function
2502 * @retval #TETHERING_ERROR_NONE Successful
2503 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2504 * @see tethering_unset_disabled_cb()
2506 API int tethering_set_disabled_cb(tethering_h tethering, tethering_type_e type, tethering_disabled_cb callback, void *user_data)
2508 INFO("+ type: %d\n", type);
2509 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2510 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2511 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2512 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2514 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2515 "parameter(tethering) is NULL\n");
2516 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2517 "parameter(callback) is NULL\n");
2519 __tethering_h *th = (__tethering_h *)tethering;
2520 tethering_type_e ti;
2522 if (type != TETHERING_TYPE_ALL) {
2523 th->disabled_cb[type] = callback;
2524 th->disabled_user_data[type] = user_data;
2526 return TETHERING_ERROR_NONE;
2529 /* TETHERING_TYPE_ALL */
2530 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2531 th->disabled_cb[ti] = callback;
2532 th->disabled_user_data[ti] = user_data;
2535 return TETHERING_ERROR_NONE;
2540 * @brief Unregisters the callback function called when tethering is disabled.
2542 * @privlevel platform
2543 * @privilege http://tizen.org/privilege/tethering.admin
2544 * @param[in] tethering The handle of tethering
2545 * @param[in] type The type of tethering
2546 * @retval #TETHERING_ERROR_NONE Successful
2547 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2548 * @see tethering_set_disabled_cb()
2550 API int tethering_unset_disabled_cb(tethering_h tethering, tethering_type_e type)
2552 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2553 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2554 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2555 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2557 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2558 "parameter(tethering) is NULL\n");
2560 __tethering_h *th = (__tethering_h *)tethering;
2561 tethering_type_e ti;
2563 if (type != TETHERING_TYPE_ALL) {
2564 th->disabled_cb[type] = NULL;
2565 th->disabled_user_data[type] = NULL;
2567 return TETHERING_ERROR_NONE;
2570 /* TETHERING_TYPE_ALL */
2571 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2572 th->disabled_cb[ti] = NULL;
2573 th->disabled_user_data[ti] = NULL;
2576 return TETHERING_ERROR_NONE;
2581 * @brief Registers the callback function called when the state of connection is changed.
2583 * @privlevel platform
2584 * @privilege http://tizen.org/privilege/tethering.admin
2585 * @param[in] tethering The handle of tethering
2586 * @param[in] type The type of tethering
2587 * @param[in] callback The callback function to invoke
2588 * @param[in] user_data The user data to be passed to the callback function
2589 * @retval #TETHERING_ERROR_NONE Successful
2590 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2591 * @see tethering_unset_connection_state_changed_cb_cb()
2593 API int tethering_set_connection_state_changed_cb(tethering_h tethering, tethering_type_e type, tethering_connection_state_changed_cb callback, void *user_data)
2595 INFO("+ type: %d\n", type);
2596 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2597 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2598 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2599 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2601 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2602 "parameter(tethering) is NULL\n");
2603 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2604 "parameter(callback) is NULL\n");
2606 __tethering_h *th = (__tethering_h *)tethering;
2607 tethering_type_e ti;
2609 if (type != TETHERING_TYPE_ALL) {
2610 th->changed_cb[type] = callback;
2611 th->changed_user_data[type] = user_data;
2613 return TETHERING_ERROR_NONE;
2616 /* TETHERING_TYPE_ALL */
2617 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2618 th->changed_cb[ti] = callback;
2619 th->changed_user_data[ti] = user_data;
2622 return TETHERING_ERROR_NONE;
2627 * @brief Unregisters the callback function called when the state of connection is changed.
2629 * @privlevel platform
2630 * @privilege http://tizen.org/privilege/tethering.admin
2631 * @param[in] tethering The handle of tethering
2632 * @param[in] type The type of tethering
2633 * @retval #TETHERING_ERROR_NONE Successful
2634 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2635 * @see tethering_set_connection_state_changed_cb()
2637 API int tethering_unset_connection_state_changed_cb(tethering_h tethering, tethering_type_e type)
2639 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2640 if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
2641 else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2642 else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
2644 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2645 "parameter(tethering) is NULL\n");
2647 __tethering_h *th = (__tethering_h *)tethering;
2648 tethering_type_e ti;
2650 if (type != TETHERING_TYPE_ALL) {
2651 th->changed_cb[type] = NULL;
2652 th->changed_user_data[type] = NULL;
2654 return TETHERING_ERROR_NONE;
2657 /* TETHERING_TYPE_ALL */
2658 for (ti = TETHERING_TYPE_USB; ti <= TETHERING_TYPE_P2P; ti++) {
2659 th->changed_cb[ti] = NULL;
2660 th->changed_user_data[ti] = NULL;
2663 return TETHERING_ERROR_NONE;
2668 * @brief Registers the callback function called when the security type of Wi-Fi tethering is changed.
2670 * @privlevel platform
2671 * @privilege http://tizen.org/privilege/tethering.admin
2672 * @param[in] tethering The handle of tethering
2673 * @param[in] callback The callback function to invoke
2674 * @param[in] user_data The user data to be passed to the callback function
2675 * @retval #TETHERING_ERROR_NONE Successful
2676 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2677 * @see tethering_wifi_unset_security_type_changed_cb()
2679 API int tethering_wifi_set_security_type_changed_cb(tethering_h tethering, tethering_wifi_security_type_changed_cb callback, void *user_data)
2681 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2682 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2684 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2685 "parameter(tethering) is NULL\n");
2686 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2687 "parameter(callback) is NULL\n");
2689 __tethering_h *th = (__tethering_h *)tethering;
2691 th->security_type_changed_cb = callback;
2692 th->security_type_user_data = user_data;
2694 return TETHERING_ERROR_NONE;
2700 * @brief Unregisters the callback function called when the security type of Wi-Fi tethering is changed.
2702 * @privlevel platform
2703 * @privilege http://tizen.org/privilege/tethering.admin
2704 * @param[in] tethering The handle of tethering
2705 * @param[in] type The type of tethering
2706 * @retval #TETHERING_ERROR_NONE Successful
2707 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2708 * @see tethering_wifi_set_security_type_changed_cb()
2710 API int tethering_wifi_unset_security_type_changed_cb(tethering_h tethering)
2712 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2713 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2715 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2716 "parameter(tethering) is NULL\n");
2718 __tethering_h *th = (__tethering_h *)tethering;
2720 th->security_type_changed_cb = NULL;
2721 th->security_type_user_data = NULL;
2723 return TETHERING_ERROR_NONE;
2728 * @brief Registers the callback function called when the visibility of SSID is changed.
2730 * @privlevel platform
2731 * @privilege http://tizen.org/privilege/tethering.admin
2732 * @param[in] tethering The handle of tethering
2733 * @param[in] callback The callback function to invoke
2734 * @param[in] user_data The user data to be passed to the callback function
2735 * @retval #TETHERING_ERROR_NONE Successful
2736 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2737 * @see tethering_wifi_unset_ssid_visibility_changed_cb_cb()
2739 API int tethering_wifi_set_ssid_visibility_changed_cb(tethering_h tethering, tethering_wifi_ssid_visibility_changed_cb callback, void *user_data)
2741 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2742 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2744 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2745 "parameter(tethering) is NULL\n");
2746 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2747 "parameter(callback) is NULL\n");
2749 __tethering_h *th = (__tethering_h *)tethering;
2751 th->ssid_visibility_changed_cb = callback;
2752 th->ssid_visibility_user_data = user_data;
2754 return TETHERING_ERROR_NONE;
2759 * @brief Unregisters the callback function called when the visibility of SSID is changed.
2761 * @privlevel platform
2762 * @privilege http://tizen.org/privilege/tethering.admin
2763 * @param[in] tethering The handle of tethering
2764 * @retval #TETHERING_ERROR_NONE Successful
2765 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2766 * @see tethering_wifi_set_ssid_visibility_changed_cb()
2768 API int tethering_wifi_unset_ssid_visibility_changed_cb(tethering_h tethering)
2770 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2771 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2773 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2774 "parameter(tethering) is NULL\n");
2776 __tethering_h *th = (__tethering_h *)tethering;
2778 th->ssid_visibility_changed_cb = NULL;
2779 th->ssid_visibility_user_data = NULL;
2781 return TETHERING_ERROR_NONE;
2786 * @brief Registers the callback function called when the passphrase of Wi-Fi tethering is changed.
2788 * @privlevel platform
2789 * @privilege http://tizen.org/privilege/tethering.admin
2790 * @param[in] tethering The handle of tethering
2791 * @param[in] callback The callback function to invoke
2792 * @param[in] user_data The user data to be passed to the callback function
2793 * @retval #TETHERING_ERROR_NONE Successful
2794 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2795 * @see tethering_wifi_unset_passphrase_changed_cb()
2797 API int tethering_wifi_set_passphrase_changed_cb(tethering_h tethering, tethering_wifi_passphrase_changed_cb callback, void *user_data)
2799 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2800 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2802 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2803 "parameter(tethering) is NULL\n");
2804 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2805 "parameter(callback) is NULL\n");
2807 __tethering_h *th = (__tethering_h *)tethering;
2809 th->passphrase_changed_cb = callback;
2810 th->passphrase_user_data = user_data;
2812 return TETHERING_ERROR_NONE;
2817 * @brief Unregisters the callback function called when the passphrase of Wi-Fi tethering is changed.
2819 * @privlevel platform
2820 * @privilege http://tizen.org/privilege/tethering.admin
2821 * @param[in] tethering The handle of tethering
2822 * @retval #TETHERING_ERROR_NONE Successful
2823 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2824 * @see tethering_wifi_set_passphrase_changed_cb()
2826 API int tethering_wifi_unset_passphrase_changed_cb(tethering_h tethering)
2828 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2829 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2831 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2832 "parameter(tethering) is NULL\n");
2834 __tethering_h *th = (__tethering_h *)tethering;
2836 th->passphrase_changed_cb = NULL;
2837 th->passphrase_user_data = NULL;
2839 return TETHERING_ERROR_NONE;
2844 * @brief Sets the security type of Wi-Fi tethering.
2846 * @privlevel platform
2847 * @privilege http://tizen.org/privilege/tethering.admin
2848 * @remarks This change is applied next time Wi-Fi tethering is enabled
2849 * @param[in] tethering The handle of tethering
2850 * @param[in] type The security type
2851 * @return 0 on success, otherwise negative error value.
2852 * @retval #TETHERING_ERROR_NONE Successful
2853 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2854 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2855 * @see tethering_wifi_get_security_type()
2857 API int tethering_wifi_set_security_type(tethering_h tethering, tethering_wifi_security_type_e type)
2859 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2860 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2862 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2863 "parameter(tethering) is NULL\n");
2865 __tethering_h *th = (__tethering_h *)tethering;
2866 tethering_error_e ret = TETHERING_ERROR_NONE;
2867 char *sec_str = NULL;
2869 ret = __set_security_type(type);
2870 if (ret == TETHERING_ERROR_NONE) {
2873 case TETHERING_WIFI_SECURITY_TYPE_NONE:
2874 sec_str = TETHERING_WIFI_SECURITY_TYPE_OPEN_STR;
2876 case TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK:
2877 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPA2_PSK_STR;
2879 case TETHERING_WIFI_SECURITY_TYPE_WPS:
2880 sec_str = TETHERING_WIFI_SECURITY_TYPE_WPS_STR;
2884 __send_dbus_signal(th->client_bus,
2885 SIGNAL_NAME_SECURITY_TYPE_CHANGED, sec_str);
2892 * @brief Gets the security type of Wi-Fi tethering.
2894 * @privlevel platform
2895 * @privilege http://tizen.org/privilege/tethering.admin
2896 * @param[in] tethering The handle of tethering
2897 * @param[out] type The security type
2898 * @return 0 on success, otherwise negative error value.
2899 * @retval #TETHERING_ERROR_NONE Successful
2900 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2901 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2902 * @see tethering_wifi_set_security_type()
2904 API int tethering_wifi_get_security_type(tethering_h tethering, tethering_wifi_security_type_e *type)
2906 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2907 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2909 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2910 "parameter(type) is NULL\n");
2912 return __get_security_type(type);
2917 * @brief Sets the SSID (service set identifier).
2919 * @privlevel platform
2920 * @privilege http://tizen.org/privilege/tethering.admin
2921 * @details If SSID is not set, Device name is used as SSID
2922 * @remarks This change is applied next time Wi-Fi tethering is enabled with same @a tethering handle
2923 * @param[in] tethering The handle of tethering
2924 * @param[out] ssid The SSID
2925 * @return 0 on success, otherwise negative error value.
2926 * @retval #TETHERING_ERROR_NONE Successful
2927 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2928 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2930 API int tethering_wifi_set_ssid(tethering_h tethering, const char *ssid)
2932 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2933 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2935 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2936 "parameter(tethering) is NULL\n");
2937 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2938 "parameter(ssid) is NULL\n");
2940 __tethering_h *th = (__tethering_h *)tethering;
2941 char *p_ssid = NULL;
2944 ssid_len = strlen(ssid);
2945 if (ssid_len > TETHERING_WIFI_SSID_MAX_LEN) {
2946 ERR("parameter(ssid) is too long");
2947 return TETHERING_ERROR_INVALID_PARAMETER;
2950 p_ssid = strdup(ssid);
2951 _retvm_if(p_ssid == NULL, TETHERING_ERROR_OUT_OF_MEMORY,
2952 "strdup is failed\n");
2958 return TETHERING_ERROR_NONE;
2963 * @brief Gets the SSID (service set identifier).
2965 * @privlevel platform
2966 * @privilege http://tizen.org/privilege/tethering.admin
2967 * @remarks @a ssid must be released with free() by you.
2968 * @param[in] tethering The handle of tethering
2969 * @param[out] ssid The SSID
2970 * @return 0 on success, otherwise negative error value.
2971 * @retval #TETHERING_ERROR_NONE Successful
2972 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
2973 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
2974 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
2976 API int tethering_wifi_get_ssid(tethering_h tethering, char **ssid)
2978 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
2979 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
2981 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2982 "parameter(tethering) is NULL\n");
2983 _retvm_if(ssid == NULL, TETHERING_ERROR_INVALID_PARAMETER,
2984 "parameter(ssid) is NULL\n");
2987 __tethering_h *th = (__tethering_h *)tethering;
2988 char val[TETHERING_WIFI_SSID_MAX_LEN + 1] = {0, };
2990 if (!tethering_is_enabled(NULL, TETHERING_TYPE_WIFI)) {
2991 if (th->ssid != NULL) {
2992 DBG("Private SSID is set\n");
2993 *ssid = strdup(th->ssid);
2995 if (__get_ssid_from_vconf(VCONFKEY_SETAPPL_DEVICE_NAME_STR,
2996 val, sizeof(val)) == false) {
2997 return TETHERING_ERROR_OPERATION_FAILED;
2999 *ssid = strdup(val);
3002 if (__get_ssid_from_vconf(VCONFKEY_MOBILE_HOTSPOT_SSID,
3003 val, sizeof(val)) == false) {
3004 return TETHERING_ERROR_OPERATION_FAILED;
3006 *ssid = strdup(val);
3009 if (*ssid == NULL) {
3010 ERR("strdup is failed\n"); //LCOV_EXCL_LINE
3011 return TETHERING_ERROR_OUT_OF_MEMORY;
3014 return TETHERING_ERROR_NONE;
3019 * @brief Sets the visibility of SSID(service set identifier).
3021 * @privlevel platform
3022 * @privilege http://tizen.org/privilege/tethering.admin
3023 * @details If you set the visibility invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3024 * @remarks This change is applied next time Wi-Fi tethering is enabled
3025 * @param[in] tethering The handle of tethering
3026 * @param[in] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3027 * @return 0 on success, otherwise negative error value.
3028 * @retval #TETHERING_ERROR_NONE Successful
3029 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3030 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3031 * @see tethering_wifi_get_ssid_visibility()
3033 API int tethering_wifi_set_ssid_visibility(tethering_h tethering, bool visible)
3035 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3036 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3038 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3039 "parameter(tethering) is NULL\n");
3041 __tethering_h *th = (__tethering_h *)tethering;
3042 tethering_error_e ret = TETHERING_ERROR_NONE;
3044 ret = __set_visible(visible);
3045 if (ret == TETHERING_ERROR_NONE) {
3046 __send_dbus_signal(th->client_bus,
3047 SIGNAL_NAME_SSID_VISIBILITY_CHANGED,
3048 visible ? SIGNAL_MSG_SSID_VISIBLE :
3049 SIGNAL_MSG_SSID_HIDE);
3056 * @brief Gets the visibility of SSID(service set identifier).
3058 * @privlevel platform
3059 * @privilege http://tizen.org/privilege/tethering.admin
3060 * @details If the visibility is set invisible, then the SSID of this device is hidden. So, Wi-Fi scan can't find your device.
3061 * @param[in] tethering The handle of tethering
3062 * @param[out] visible The visibility of SSID: (@c true = visible, @c false = invisible)
3063 * @return 0 on success, otherwise negative error value.
3064 * @retval #TETHERING_ERROR_NONE Successful
3065 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3066 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3067 * @see tethering_wifi_set_ssid_visibility()
3069 API int tethering_wifi_get_ssid_visibility(tethering_h tethering, bool *visible)
3071 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3072 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3074 _retvm_if(visible == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3075 "parameter(visible) is NULL\n");
3077 return __get_visible(visible);
3082 * @brief Sets the passphrase.
3084 * @privlevel platform
3085 * @privilege http://tizen.org/privilege/tethering.admin
3086 * @remarks This change is applied next time Wi-Fi tethering is enabled
3087 * @param[in] tethering The handle of tethering
3088 * @param[in] passphrase The passphrase
3089 * @return 0 on success, otherwise negative error value.
3090 * @retval #TETHERING_ERROR_NONE Successful
3091 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3092 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3093 * @see tethering_wifi_get_passphrase()
3095 API int tethering_wifi_set_passphrase(tethering_h tethering, const char *passphrase)
3097 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3098 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3100 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3101 "parameter(tethering) is NULL\n");
3102 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3103 "parameter(passphrase) is NULL\n");
3105 __tethering_h *th = (__tethering_h *)tethering;
3106 GDBusProxy *proxy = th->client_bus_proxy;
3107 GVariant *parameters;
3108 GError *error = NULL;
3109 int passphrase_len = 0;
3113 passphrase_len = strlen(passphrase);
3114 if (passphrase_len < TETHERING_WIFI_KEY_MIN_LEN ||
3115 passphrase_len > TETHERING_WIFI_KEY_MAX_LEN) {
3116 ERR("parameter(passphrase) is too short or long\n");
3117 return TETHERING_ERROR_INVALID_PARAMETER;
3120 parameters = g_dbus_proxy_call_sync(proxy, "set_wifi_tethering_passphrase",
3121 g_variant_new("(s)", passphrase), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3125 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3127 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3128 ret = TETHERING_ERROR_PERMISSION_DENIED;
3130 ret = TETHERING_ERROR_OPERATION_FAILED;
3132 g_error_free(error);
3137 g_variant_get(parameters, "(u)", &ret);
3138 g_variant_unref(parameters);
3140 if (ret == TETHERING_ERROR_NONE) {
3141 __send_dbus_signal(th->client_bus,
3142 SIGNAL_NAME_PASSPHRASE_CHANGED, NULL);
3151 * @brief Gets the passphrase.
3153 * @privlevel platform
3154 * @privilege http://tizen.org/privilege/tethering.admin
3155 * @remarks @a passphrase must be released with free() by you.
3156 * @param[in] tethering The handle of tethering
3157 * @param[out] passphrase The passphrase
3158 * @return 0 on success, otherwise negative error value.
3159 * @retval #TETHERING_ERROR_NONE Successful
3160 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3161 * @retval #TETHERING_ERROR_OUT_OF_MEMORY Out of memory
3162 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3163 * @see tethering_wifi_set_passphrase()
3165 API int tethering_wifi_get_passphrase(tethering_h tethering, char **passphrase)
3167 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3168 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3170 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3171 "parameter(tethering) is NULL\n");
3172 _retvm_if(passphrase == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3173 "parameter(passphrase) is NULL\n");
3175 __tethering_h *th = (__tethering_h *)tethering;
3176 GDBusProxy *proxy = th->client_bus_proxy;
3177 GVariant *parameters;
3178 GError *error = NULL;
3179 unsigned int len = 0;
3180 tethering_error_e ret = TETHERING_ERROR_NONE;
3182 parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_tethering_passphrase",
3183 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3187 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3189 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3190 ret = TETHERING_ERROR_PERMISSION_DENIED;
3192 ret = TETHERING_ERROR_OPERATION_FAILED;
3194 g_error_free(error);
3199 if (parameters != NULL) {
3200 g_variant_get(parameters, "(siu)", passphrase, &len, &ret);
3201 g_variant_unref(parameters);
3204 return TETHERING_ERROR_NONE;
3207 API int tethering_wifi_set_channel(tethering_h tethering, int channel)
3209 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3210 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3212 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3213 "parameter(tethering) is NULL\n");
3215 __tethering_h *th = (__tethering_h *)tethering;
3216 th->channel = channel;
3218 return TETHERING_ERROR_NONE;
3221 API int tethering_wifi_get_channel(tethering_h tethering, int *channel)
3223 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3224 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3226 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3227 "parameter(tethering) is NULL\n");
3229 _retvm_if(channel == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3230 "parameter(channel) is NULL\n");
3232 __tethering_h *th = (__tethering_h *)tethering;
3233 *channel = th->channel;
3235 return TETHERING_ERROR_NONE;
3238 API int tethering_wifi_set_mode(tethering_h tethering, tethering_wifi_mode_type_e type)
3240 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3241 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3243 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3244 "parameter(tethering) is NULL\n");
3246 __tethering_h *th = (__tethering_h *)tethering;
3248 th->mode_type = type;
3250 return TETHERING_ERROR_NONE;
3253 API int tethering_wifi_get_mode(tethering_h tethering, tethering_wifi_mode_type_e *type)
3255 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3256 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3258 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3259 "parameter(tethering) is NULL\n");
3260 _retvm_if(type == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3261 "parameter(type) is NULL\n");
3263 __tethering_h *th = (__tethering_h *)tethering;
3264 *type = th->mode_type;
3266 return TETHERING_ERROR_NONE;
3272 * @brief Reload the settings (SSID / Passphrase / Security type / SSID visibility).
3274 * @privlevel platform
3275 * @privilege http://tizen.org/privilege/tethering.admin
3276 * @remarks Connected devices via Wi-Fi tethering or MobileAP will be disconnected when the settings are reloaded
3277 * @param[in] tethering The handle of tethering
3278 * @param[in] callback The callback function to invoke
3279 * @param[in] user_data The user data to be passed to the callback function
3280 * @return 0 on success, otherwise negative error value.
3281 * @retval #TETHERING_ERROR_NONE Successful
3282 * @retval #TETHERING_ERROR_INVALID_PARAMETER Invalid parameter
3283 * @retval #TETHERING_ERROR_OPERATION_FAILED Operation failed
3285 API int tethering_wifi_reload_settings(tethering_h tethering, tethering_wifi_settings_reloaded_cb callback, void *user_data)
3288 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3289 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3291 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3292 "parameter(tethering) is NULL\n");
3293 _retvm_if(callback == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3294 "parameter(callback) is NULL\n");
3296 __tethering_h *th = (__tethering_h *)tethering;
3297 _softap_settings_t set = {"", "", "", 0, false};
3298 GDBusProxy *proxy = th->client_bus_proxy;
3303 if (th->settings_reloaded_cb) {
3304 ERR("Operation in progress\n"); //LCOV_EXCL_LINE
3305 return TETHERING_ERROR_OPERATION_FAILED;
3308 ret = __prepare_wifi_settings(tethering, &set);
3309 if (ret != TETHERING_ERROR_NONE) {
3310 ERR("softap settings initialization failed\n"); //LCOV_EXCL_LINE
3311 return TETHERING_ERROR_OPERATION_FAILED;
3314 th->settings_reloaded_cb = callback;
3315 th->settings_reloaded_user_data = user_data;
3317 g_dbus_proxy_call(proxy, "reload_wifi_settings",
3318 g_variant_new("(sssiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type),
3319 G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
3320 (GAsyncReadyCallback) __settings_reloaded_cb, (gpointer)tethering);
3322 return TETHERING_ERROR_NONE;
3325 API int tethering_wifi_set_mac_filter(tethering_h tethering, bool mac_filter)
3327 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3328 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3330 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3331 "parameter(tethering) is NULL\n");
3333 __tethering_h *th = (__tethering_h *)tethering;
3334 th->mac_filter = mac_filter;
3336 return TETHERING_ERROR_NONE;
3339 API int tethering_wifi_get_mac_filter(tethering_h tethering, bool *mac_filter)
3341 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3342 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3344 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3345 "parameter(mac_filter) is NULL\n");
3346 _retvm_if(mac_filter == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3347 "parameter(mac_filter) is NULL\n");
3349 __tethering_h *th = (__tethering_h *)tethering;
3350 *mac_filter = th->mac_filter;
3352 return TETHERING_ERROR_NONE;
3355 static int __add_mac_to_file(const char *filepath, const char *mac)
3358 char line[MAX_BUF_SIZE] = "\0";
3359 bool mac_exist = false;
3362 p_mac = strdup(mac);
3363 if (p_mac == NULL) {
3364 ERR("strdup failed\n"); //LCOV_EXCL_LINE
3365 return TETHERING_ERROR_OUT_OF_MEMORY;
3368 fp = fopen(filepath, "a+");
3370 ERR("fopen is failed\n"); //LCOV_EXCL_LINE
3371 return TETHERING_ERROR_OPERATION_FAILED;
3374 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3375 if (strncmp(mac, line, 17) == 0) {
3376 DBG("MAC %s already exist in the list\n", mac); //LCOV_EXCL_LINE
3383 fprintf(fp, "%s\n", mac);
3385 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3386 allowed_list = g_slist_append(allowed_list, p_mac);
3387 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3388 blocked_list = g_slist_append(blocked_list, p_mac);
3393 return TETHERING_ERROR_NONE;
3396 static int __remove_mac_from_file(const char *filepath, const char *mac)
3400 char line[MAX_BUF_SIZE] = "\0";
3402 fp = fopen(filepath, "r");
3404 ERR("fopen is failed\n");
3405 return TETHERING_ERROR_OPERATION_FAILED;
3408 fp1 = fopen(TEMP_LIST, "w+");
3411 ERR("fopen is failed\n");
3412 return TETHERING_ERROR_OPERATION_FAILED;
3415 while (fgets(line, MAX_BUF_SIZE, fp) != NULL) {
3416 if (strncmp(mac, line, 17) == 0) {
3417 DBG("MAC %s found in the list\n", mac);
3419 if ((strcmp(filepath, ALLOWED_LIST) == 0)) {
3420 GSList *list = NULL;
3421 for (list = allowed_list; list != NULL; list = list->next) {
3422 char *p_mac = (char *)list->data;
3423 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3424 allowed_list = g_slist_remove(allowed_list, p_mac);
3426 } else if ((strcmp(filepath, BLOCKED_LIST) == 0)) {
3427 GSList *list = NULL;
3428 for (list = blocked_list; list != NULL; list = list->next) {
3429 char *p_mac = (char *)list->data;
3430 if (strncmp(mac, p_mac, strlen(mac)) == 0)
3431 blocked_list = g_slist_remove(blocked_list, p_mac);
3435 fprintf(fp1, "%s", line);
3442 if ((strcmp(filepath, ALLOWED_LIST) == 0))
3443 rename(TEMP_LIST, ALLOWED_LIST);
3444 else if ((strcmp(filepath, BLOCKED_LIST) == 0))
3445 rename(TEMP_LIST, BLOCKED_LIST);
3447 return TETHERING_ERROR_NONE;
3450 API int tethering_wifi_add_allowed_mac_list(tethering_h tethering, const char *mac)
3452 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3453 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3455 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3456 "parameter(tethering) is NULL\n");
3457 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3458 "parameter(mac) is NULL\n");
3460 return __add_mac_to_file(ALLOWED_LIST, mac);
3463 API int tethering_wifi_remove_allowed_mac_list(tethering_h tethering, const char *mac)
3465 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3466 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3468 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3469 "parameter(tethering) is NULL\n");
3470 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3471 "parameter(mac) is NULL\n");
3473 return __remove_mac_from_file(ALLOWED_LIST, mac);
3476 API int tethering_wifi_get_allowed_mac_list(tethering_h tethering, void **allowed_mac_list)
3478 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3479 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3481 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3482 "parameter(tethering) is NULL\n");
3483 _retvm_if(allowed_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3484 "parameter(allowed_mac_list) is NULL\n");
3486 *allowed_mac_list = g_slist_copy(allowed_list);
3487 return TETHERING_ERROR_NONE;
3490 API int tethering_wifi_add_blocked_mac_list(tethering_h tethering, const char *mac)
3492 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3493 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3495 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3496 "parameter(tethering) is NULL\n");
3497 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3498 "parameter(mac) is NULL\n");
3500 return __add_mac_to_file(BLOCKED_LIST, mac);
3503 API int tethering_wifi_remove_blocked_mac_list(tethering_h tethering, const char *mac)
3505 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3506 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3508 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3509 "parameter(tethering) is NULL\n");
3510 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3511 "parameter(mac) is NULL\n");
3513 return __remove_mac_from_file(BLOCKED_LIST, mac);
3516 API int tethering_wifi_get_blocked_mac_list(tethering_h tethering, void **blocked_mac_list)
3518 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3519 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3521 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3522 "parameter(tethering) is NULL\n");
3523 _retvm_if(blocked_mac_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3524 "parameter(blocked_mac_list) is NULL\n");
3526 *blocked_mac_list = g_slist_copy(blocked_list);
3527 return TETHERING_ERROR_NONE;
3530 API int tethering_wifi_enable_dhcp(tethering_h tethering, bool enable)
3532 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3533 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3535 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3536 "parameter(tethering) is NULL\n");
3538 GVariant *parameters;
3539 GError *error = NULL;
3542 __tethering_h *th = (__tethering_h *)tethering;
3544 GDBusProxy *proxy = th->client_bus_proxy;
3546 parameters = g_dbus_proxy_call_sync(proxy, "enable_dhcp",
3547 g_variant_new("(b)", enable),
3548 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3552 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3553 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3554 result = TETHERING_ERROR_PERMISSION_DENIED;
3556 result = TETHERING_ERROR_OPERATION_FAILED;
3558 g_error_free(error);
3559 th->dhcp_enabled = false;
3565 g_variant_get(parameters, "(u)", &result);
3566 g_variant_unref(parameters);
3569 th->dhcp_enabled = true;
3571 th->dhcp_enabled = false;
3573 return TETHERING_ERROR_NONE;
3576 API int tethering_wifi_set_dhcp_range(tethering_h tethering, char *rangestart, char *rangestop)
3578 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3579 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3581 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3582 "parameter(tethering) is NULL\n");
3583 _retvm_if(rangestart == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3584 "parameter(rangestart) is NULL\n");
3585 _retvm_if(rangestop == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3586 "parameter(rangestop) is NULL\n");
3588 GVariant *parameters;
3589 GError *error = NULL;
3592 __tethering_h *th = (__tethering_h *)tethering;
3594 GDBusProxy *proxy = th->client_bus_proxy;
3596 parameters = g_dbus_proxy_call_sync(proxy, "dhcp_range",
3597 g_variant_new("(ss)", rangestart, rangestop),
3598 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3601 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3603 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3604 result = TETHERING_ERROR_PERMISSION_DENIED;
3606 result = TETHERING_ERROR_OPERATION_FAILED;
3608 g_error_free(error);
3609 th->dhcp_enabled = false;
3615 g_variant_get(parameters, "(u)", &result);
3616 g_variant_unref(parameters);
3618 th->dhcp_enabled = true;
3620 return TETHERING_ERROR_NONE;
3623 API int tethering_wifi_is_dhcp_enabled(tethering_h tethering, bool *dhcp_enabled)
3625 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3626 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3628 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3629 "parameter(tethering) is NULL\n");
3630 _retvm_if(dhcp_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3631 "parameter(dhcp_enabled) is NULL\n");
3633 __tethering_h *th = (__tethering_h *)tethering;
3634 *dhcp_enabled = th->dhcp_enabled;
3636 return TETHERING_ERROR_NONE;
3639 API int tethering_wifi_set_txpower(tethering_h tethering, unsigned int txpower)
3641 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3642 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3644 GError *error = NULL;
3646 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3647 "parameter(tethering) is NULL\n");
3648 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3649 TETHERING_ERROR_NOT_ENABLED,
3650 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3651 __tethering_h *th = (__tethering_h *)tethering;
3653 g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_set_txpower",
3654 g_variant_new("(u)", txpower),
3655 G_DBUS_CALL_FLAGS_NONE,
3656 -1, th->cancellable, &error);
3659 ERR("g_dbus_proxy_call_sync is failed and error is %s\n", error->message);
3660 g_clear_error(&error);
3661 return TETHERING_ERROR_OPERATION_FAILED;
3664 return TETHERING_ERROR_NONE;
3667 API int tethering_wifi_get_txpower(tethering_h tethering, unsigned int *txpower)
3669 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3670 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3672 GError *error = NULL;
3673 GVariant *result = NULL;
3675 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3676 "parameter(tethering) is NULL\n");
3677 _retvm_if(tethering_is_enabled(tethering, TETHERING_TYPE_WIFI) == false,
3678 TETHERING_ERROR_NOT_ENABLED,
3679 "tethering type[%d] is not enabled\n", TETHERING_TYPE_WIFI);
3681 __tethering_h *th = (__tethering_h *)tethering;
3683 result = g_dbus_proxy_call_sync(th->client_bus_proxy, "hostapd_get_txpower",
3685 G_DBUS_CALL_FLAGS_NONE,
3686 -1, th->cancellable, &error);
3688 if (result != NULL) {
3689 g_variant_get(result, "(u)", txpower);
3690 g_variant_unref(result);
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 g_clear_error(&error);
3700 return TETHERING_ERROR_NONE;
3703 API int tethering_wifi_set_mtu(tethering_h tethering, unsigned int mtu)
3705 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3706 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3708 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3709 "parameter(tethering) is NULL\n");
3711 GVariant *parameters;
3712 GError *error = NULL;
3715 __tethering_h *th = (__tethering_h *)tethering;
3717 GDBusProxy *proxy = th->client_bus_proxy;
3719 parameters = g_dbus_proxy_call_sync(proxy, "set_mtu",
3720 g_variant_new("(u)", mtu),
3721 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3724 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3726 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3727 result = TETHERING_ERROR_PERMISSION_DENIED;
3729 result = TETHERING_ERROR_OPERATION_FAILED;
3731 g_error_free(error);
3736 g_variant_get(parameters, "(u)", &result);
3738 g_variant_unref(parameters);
3740 return TETHERING_ERROR_NONE;
3743 API int tethering_wifi_change_mac(tethering_h tethering, char *mac)
3745 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3746 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3748 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3749 "parameter(tethering) is NULL\n");
3750 _retvm_if(mac == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3751 "parameter(mac) is NULL\n");
3753 GVariant *parameters;
3754 GError *error = NULL;
3757 __tethering_h *th = (__tethering_h *)tethering;
3759 GDBusProxy *proxy = th->client_bus_proxy;
3761 parameters = g_dbus_proxy_call_sync(proxy, "change_mac",
3762 g_variant_new("(s)", mac),
3763 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3766 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3768 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3769 result = TETHERING_ERROR_PERMISSION_DENIED;
3771 result = TETHERING_ERROR_OPERATION_FAILED;
3773 g_error_free(error);
3778 g_variant_get(parameters, "(u)", &result);
3779 g_variant_unref(parameters);
3781 if (result == MOBILE_AP_ERROR_NOT_PERMITTED)
3782 return TETHERING_ERROR_NOT_SUPPORT_API;
3784 return TETHERING_ERROR_NONE;
3787 API int tethering_wifi_set_max_connected_device(tethering_h tethering, int max_device)
3789 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3790 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3792 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3793 "parameter(tethering) is NULL\n");
3795 __tethering_h *th = (__tethering_h *)tethering;
3797 th->wifi_max_connected = max_device;
3799 return TETHERING_ERROR_NONE;
3802 API int tethering_wifi_get_max_connected_device(tethering_h tethering, int *max_device)
3804 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3805 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3807 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3808 "parameter(tethering) is NULL\n");
3809 _retvm_if(max_device == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3810 "parameter(max_device) is NULL\n");
3812 __tethering_h *th = (__tethering_h *)tethering;
3814 *max_device = th->wifi_max_connected;
3815 return TETHERING_ERROR_NONE;
3818 API int tethering_wifi_enable_port_forwarding(tethering_h tethering, bool enable)
3820 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3821 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3823 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3824 "parameter(tethering) is NULL\n");
3826 GVariant *parameters;
3827 GError *error = NULL;
3830 __tethering_h *th = (__tethering_h *)tethering;
3832 GDBusProxy *proxy = th->client_bus_proxy;
3834 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_forwarding",
3835 g_variant_new("(b)", enable),
3836 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3839 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3841 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3842 result = TETHERING_ERROR_PERMISSION_DENIED;
3844 result = TETHERING_ERROR_OPERATION_FAILED;
3846 g_error_free(error);
3851 g_variant_get(parameters, "(u)", &result);
3852 g_variant_unref(parameters);
3854 th->port_forwarding = true;
3856 return TETHERING_ERROR_NONE;
3859 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)
3861 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3862 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3864 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3865 "parameter(tethering) is NULL\n");
3866 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3867 "parameter(protocol) is NULL\n");
3869 GVariant *parameters;
3870 GError *error = NULL;
3872 char cmd[MAX_BUF_SIZE] = { 0, };
3875 __tethering_h *th = (__tethering_h *)tethering;
3877 GDBusProxy *proxy = th->client_bus_proxy;
3879 parameters = g_dbus_proxy_call_sync(proxy, "add_port_forwarding_rule",
3880 g_variant_new("(sssisi)", ifname, protocol, org_ip, org_port, final_ip, final_port),
3881 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3884 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3886 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3887 result = TETHERING_ERROR_PERMISSION_DENIED;
3889 result = TETHERING_ERROR_OPERATION_FAILED;
3891 g_error_free(error);
3896 g_variant_get(parameters, "(u)", &result);
3897 g_variant_unref(parameters);
3899 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);
3903 ERR("strdup failed\n"); //LCOV_EXCL_LINE
3904 return TETHERING_ERROR_OUT_OF_MEMORY;
3907 port_forwarding = g_slist_append(port_forwarding, list);
3909 return TETHERING_ERROR_NONE;
3912 API int tethering_wifi_reset_port_forwarding_rule(tethering_h tethering)
3914 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3915 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3917 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3918 "parameter(tethering) is NULL\n");
3920 GVariant *parameters;
3921 GError *error = NULL;
3924 __tethering_h *th = (__tethering_h *)tethering;
3926 GDBusProxy *proxy = th->client_bus_proxy;
3928 parameters = g_dbus_proxy_call_sync(proxy, "reset_port_forwarding_rule",
3929 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
3932 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
3934 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
3935 result = TETHERING_ERROR_PERMISSION_DENIED;
3937 result = TETHERING_ERROR_OPERATION_FAILED;
3939 g_error_free(error);
3944 g_variant_get(parameters, "(u)", &result);
3946 g_variant_unref(parameters);
3948 return TETHERING_ERROR_NONE;
3951 API int tethering_wifi_is_port_forwarding_enabled(tethering_h tethering, bool* forwarding_enabled)
3953 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3954 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3956 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3957 "parameter(tethering) is NULL\n");
3958 _retvm_if(forwarding_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3959 "parameter(forwarding_enabled) is NULL\n");
3961 __tethering_h *th = (__tethering_h *)tethering;
3963 *forwarding_enabled = th->port_forwarding;
3965 return TETHERING_ERROR_NONE;
3968 API int tethering_wifi_get_port_forwarding_rule(tethering_h tethering, void **port_forwarding_list)
3970 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3971 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3973 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3974 "parameter(tethering) is NULL\n");
3975 _retvm_if(port_forwarding_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3976 "parameter(port_forwarding_list) is NULL\n");
3978 *port_forwarding_list = g_slist_copy(port_forwarding);
3979 return TETHERING_ERROR_NONE;
3982 API int tethering_wifi_enable_port_filtering(tethering_h tethering, bool enable)
3984 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
3985 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
3987 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
3988 "parameter(tethering) is NULL\n");
3990 GVariant *parameters;
3991 GError *error = NULL;
3994 __tethering_h *th = (__tethering_h *)tethering;
3996 GDBusProxy *proxy = th->client_bus_proxy;
3998 parameters = g_dbus_proxy_call_sync(proxy, "enable_port_filtering",
3999 g_variant_new("(b)", enable),
4000 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4003 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4005 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4006 result = TETHERING_ERROR_PERMISSION_DENIED;
4008 result = TETHERING_ERROR_OPERATION_FAILED;
4010 g_error_free(error);
4015 g_variant_get(parameters, "(u)", &result);
4016 g_variant_unref(parameters);
4018 th->port_filtering = true;
4020 return TETHERING_ERROR_NONE;
4023 API int tethering_wifi_add_port_filtering_rule(tethering_h tethering, int port, char *protocol, bool allow)
4025 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4026 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4028 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4029 "parameter(tethering) is NULL\n");
4030 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4031 "parameter(protocol) is NULL\n");
4033 GVariant *parameters;
4034 GError *error = NULL;
4036 char cmd[MAX_BUF_SIZE] = { 0, };
4039 __tethering_h *th = (__tethering_h *)tethering;
4041 GDBusProxy *proxy = th->client_bus_proxy;
4043 parameters = g_dbus_proxy_call_sync(proxy, "add_port_filtering_rule",
4044 g_variant_new("(isb)", port, protocol, allow),
4045 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4048 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4050 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4051 result = TETHERING_ERROR_PERMISSION_DENIED;
4053 result = TETHERING_ERROR_OPERATION_FAILED;
4055 g_error_free(error);
4060 g_variant_get(parameters, "(u)", &result);
4061 g_variant_unref(parameters);
4064 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_ACCEPT);
4066 snprintf(cmd, sizeof(cmd), "%s "FILTERING_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port, ACTION_DROP);
4072 ERR("strdup failed\n"); //LCOV_EXCL_LINE
4073 return TETHERING_ERROR_OUT_OF_MEMORY;
4076 port_filtering = g_slist_append(port_filtering, list);
4078 return TETHERING_ERROR_NONE;
4081 API int tethering_wifi_add_custom_port_filtering_rule(tethering_h tethering, int port1, int port2, char *protocol, bool allow)
4083 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4084 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4086 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4087 "parameter(tethering) is NULL\n");
4088 _retvm_if(protocol == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4089 "parameter(protocol) is NULL\n");
4091 GVariant *parameters;
4092 GError *error = NULL;
4094 char cmd[MAX_BUF_SIZE] = { 0, };
4097 __tethering_h *th = (__tethering_h *)tethering;
4099 GDBusProxy *proxy = th->client_bus_proxy;
4101 parameters = g_dbus_proxy_call_sync(proxy, "add_custom_port_filtering_rule",
4102 g_variant_new("(iisb)", port1, port2, protocol, allow),
4103 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4106 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4108 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4109 result = TETHERING_ERROR_PERMISSION_DENIED;
4111 result = TETHERING_ERROR_OPERATION_FAILED;
4113 g_error_free(error);
4118 g_variant_get(parameters, "(u)", &result);
4119 g_variant_unref(parameters);
4122 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_ACCEPT);
4124 snprintf(cmd, sizeof(cmd), "%s "FILTERING_MULTIPORT_RULE_STR, IPTABLES, TABLE_FILTER, TETH_FILTER_FW, protocol, port1, port2, ACTION_DROP);
4130 ERR("strdup failed\n"); //LCOV_EXCL_LINE
4131 return TETHERING_ERROR_OUT_OF_MEMORY;
4134 custom_port_filtering = g_slist_append(custom_port_filtering, list);
4136 return TETHERING_ERROR_NONE;
4139 API int tethering_wifi_get_port_filtering_rule(tethering_h tethering, void **port_filtering_list)
4141 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4142 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4144 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4145 "parameter(tethering) is NULL\n");
4146 _retvm_if(port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4147 "parameter(port_filtering_list) is NULL\n");
4149 *port_filtering_list = g_slist_copy(port_filtering);
4150 return TETHERING_ERROR_NONE;
4153 API int tethering_wifi_get_custom_port_filtering_rule(tethering_h tethering, void **custom_port_filtering_list)
4155 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4156 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4158 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4159 "parameter(tethering) is NULL\n");
4160 _retvm_if(custom_port_filtering_list == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4161 "parameter(custom_port_filtering_list) is NULL\n");
4163 *custom_port_filtering_list = g_slist_copy(custom_port_filtering);
4164 return TETHERING_ERROR_NONE;
4167 API int tethering_wifi_is_port_filtering_enabled(tethering_h tethering, bool* filtering_enabled)
4169 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4170 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4172 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4173 "parameter(tethering) is NULL\n");
4174 _retvm_if(filtering_enabled == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4175 "parameter(filtering_enabled) is NULL\n");
4177 __tethering_h *th = (__tethering_h *)tethering;
4179 *filtering_enabled = th->port_filtering;
4181 return TETHERING_ERROR_NONE;
4184 API int tethering_wifi_set_vpn_passthrough_rule(tethering_h tethering, tethering_vpn_passthrough_type_e type, bool enable)
4186 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4187 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4189 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4190 "parameter(tethering) is NULL\n");
4192 GVariant *parameters;
4193 GError *error = NULL;
4196 __tethering_h *th = (__tethering_h *)tethering;
4198 GDBusProxy *proxy = th->client_bus_proxy;
4200 parameters = g_dbus_proxy_call_sync(proxy, "set_vpn_passthrough_rule",
4201 g_variant_new("(ib)", type, enable),
4202 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4205 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4207 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4208 result = TETHERING_ERROR_PERMISSION_DENIED;
4210 result = TETHERING_ERROR_OPERATION_FAILED;
4212 g_error_free(error);
4217 g_variant_get(parameters, "(u)", &result);
4219 g_variant_unref(parameters);
4221 return TETHERING_ERROR_NONE;
4224 API int tethering_wifi_push_wps_button(tethering_h tethering)
4226 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4227 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4229 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4230 "parameter(tethering) is NULL");
4231 __tethering_h *th = (__tethering_h *)tethering;
4232 GDBusProxy *proxy = th->client_bus_proxy;
4233 GVariant *parameters = NULL;
4235 GError *error = NULL;
4237 parameters = g_dbus_proxy_call_sync(proxy, "push_wps_button",
4238 NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4242 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4244 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4245 ret = TETHERING_ERROR_PERMISSION_DENIED;
4247 ret = TETHERING_ERROR_OPERATION_FAILED;
4249 g_error_free(error);
4254 if (parameters != NULL) {
4255 g_variant_get(parameters, "(u)", &ret);
4256 g_variant_unref(parameters);
4259 return TETHERING_ERROR_NONE;
4262 API int tethering_wifi_set_wps_pin(tethering_h tethering, const char *wps_pin)
4264 CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
4265 CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
4267 _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
4268 "parameter(tethering) is NULL");
4269 __tethering_h *th = (__tethering_h *)tethering;
4270 GDBusProxy *proxy = th->client_bus_proxy;
4271 GVariant *parameters = NULL;
4273 GError *error = NULL;
4275 parameters = g_dbus_proxy_call_sync(proxy, "set_wps_pin",
4276 g_variant_new("(s)", wps_pin), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
4280 ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
4282 if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
4283 ret = TETHERING_ERROR_PERMISSION_DENIED;
4285 ret = TETHERING_ERROR_OPERATION_FAILED;
4287 g_error_free(error);
4292 if (parameters != NULL) {
4293 g_variant_get(parameters, "(u)", &ret);
4294 g_variant_unref(parameters);
4297 return TETHERING_ERROR_NONE;