INFO("+ type : %d\n", type);
CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
if (type == TETHERING_TYPE_USB) CHECK_FEATURE_SUPPORTED(TETHERING_USB_FEATURE);
- else if (type == TETHERING_TYPE_WIFI) CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
+ else if (type == TETHERING_TYPE_WIFI || type == TETHERING_TYPE_WIFI_SHARING)
+ CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
else if (type == TETHERING_TYPE_BT) CHECK_FEATURE_SUPPORTED(TETHERING_BT_FEATURE);
_retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
(GAsyncReadyCallback) __usb_enabled_cfm_cb, (gpointer)tethering);
break;
- case TETHERING_TYPE_WIFI: {
+ case TETHERING_TYPE_WIFI:
+ case TETHERING_TYPE_WIFI_SHARING: {
_softap_settings_t set = {"", "", "", 0, false};
ret = __prepare_wifi_settings(tethering, &set);
set.ssid, set.key, set.channel, set.mode, set.txpower, set.sec_type,
set.max_connected);
+ char key[TETHERING_WIFI_KEY_MAX_LEN + 1] = {0, };
+ if (type == TETHERING_TYPE_WIFI_SHARING)
+ g_strlcpy(key, "wifi_sharing", TETHERING_WIFI_KEY_MAX_LEN);
+ else
+ g_strlcpy(key, "wifi_tether", TETHERING_WIFI_KEY_MAX_LEN);
+
g_dbus_proxy_call(proxy, "enable_wifi_tethering",
- g_variant_new("(sssiiiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV4),
+ g_variant_new("(ssssiiiiiii)", key, set.ssid, set.key, set.mode,
+ set.channel, set.visibility, set.mac_filter, set.max_connected,
+ set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV4),
G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
(GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
break;
sigs[E_SIGNAL_WIFI_TETHER_ON].sig_id);
g_dbus_proxy_call(proxy, "enable_wifi_tethering",
- g_variant_new("(sssiiiiii)", set.ssid, set.key, set.mode,
+ g_variant_new("(ssssiiiiiii)", "wifi_tether", set.ssid, set.key, set.mode,
set.channel, set.visibility, set.mac_filter, set.max_connected,
- set.sec_type, TETHERING_ADDRESS_FAMILY_IPV4),
+ set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV4),
G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
(GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
break;
}
- case TETHERING_TYPE_WIFI: {
+ case TETHERING_TYPE_WIFI:
+ case TETHERING_TYPE_WIFI_SHARING: {
_softap_settings_t set = {"", "", "", 0, false, false, 0, 0};
ret = __prepare_wifi_settings(tethering, &set);
set.ssid, set.key, set.channel, set.mode, set.txpower, set.sec_type,
set.max_connected);
+ char key[TETHERING_WIFI_KEY_MAX_LEN + 1] = {0, };
+ if (type == TETHERING_TYPE_WIFI_SHARING)
+ g_strlcpy(key, "wifi_sharing", TETHERING_WIFI_KEY_MAX_LEN);
+ else
+ g_strlcpy(key, "wifi_tether", TETHERING_WIFI_KEY_MAX_LEN);
+
g_dbus_proxy_call(proxy, "enable_wifi_tethering",
- g_variant_new("(sssiiiiiii)", set.ssid, set.key, set.mode, set.channel, set.visibility, set.mac_filter, set.max_connected, set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV6),
- G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
- (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
+ g_variant_new("(ssssiiiiiii)", key, set.ssid, set.key, set.mode,
+ set.channel, set.visibility, set.mac_filter, set.max_connected,
+ set.sec_type, set.txpower, TETHERING_ADDRESS_FAMILY_IPV6),
+ G_DBUS_CALL_FLAGS_NONE, -1, th->cancellable,
+ (GAsyncReadyCallback) __wifi_enabled_cfm_cb, (gpointer)tethering);
break;
}
break;
case TETHERING_TYPE_WIFI:
+ case TETHERING_TYPE_WIFI_SHARING:
DBG("Disable wifi tethering..");
g_dbus_connection_signal_unsubscribe(connection,
sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
break;
case TETHERING_TYPE_WIFI:
+ case TETHERING_TYPE_WIFI_SHARING:
g_dbus_connection_signal_unsubscribe(connection,
sigs[E_SIGNAL_WIFI_TETHER_OFF].sig_id);
return TETHERING_ERROR_NONE;
}
+API int tethering_wifi_is_sharing_supported(tethering_h tethering, bool *supported)
+{
+ CHECK_FEATURE_SUPPORTED(TETHERING_FEATURE);
+ CHECK_FEATURE_SUPPORTED(TETHERING_WIFI_FEATURE);
+
+ _retvm_if(tethering == NULL, TETHERING_ERROR_INVALID_PARAMETER,
+ "parameter(tethering) is NULL\n");
+ _retvm_if(supported == NULL, TETHERING_ERROR_INVALID_PARAMETER,
+ "parameter(supported) is NULL\n");
+
+ /** Check if wifi-sharing is supported */
+ __tethering_h *th = (__tethering_h *)tethering;
+ GDBusProxy *proxy = th->client_bus_proxy;
+
+ int ret = TETHERING_ERROR_NONE;
+ int count = 0;
+ gchar *key = NULL;
+ GVariant *value = NULL;
+ GVariantIter *iter = NULL;
+ GVariantIter *sub_iter = NULL;
+ GVariant *parameters = NULL;
+ GError *error = NULL;
+
+ parameters = g_dbus_proxy_call_sync(proxy, "get_wifi_interfaces",
+ NULL, G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error);
+
+ if (!parameters && error) {
+ ERR("g_dbus_proxy_call_sync failed because %s\n", error->message);
+
+ if (error->code == G_DBUS_ERROR_ACCESS_DENIED)
+ ret = TETHERING_ERROR_PERMISSION_DENIED;
+ else
+ ret = TETHERING_ERROR_OPERATION_FAILED;
+
+ g_error_free(error);
+ goto error;
+ }
+ g_variant_get(parameters, "(a(a{sv}))", &iter);
+ if (iter == NULL) {
+ g_variant_unref(parameters);
+ ret = TETHERING_ERROR_OPERATION_FAILED;
+ goto error;
+ }
+
+ while (g_variant_iter_loop(iter, "(a{sv})", &sub_iter)) {
+ while (g_variant_iter_loop(sub_iter, "{sv}", &key, &value)) {
+ if (g_strcmp0(key, "IfName") == 0) {
+ const gchar *interface = g_variant_get_string(value, NULL);
+ ERR("interface: %s\n", interface);
+ if (strncmp(interface, "wlan", 4) == 0)
+ count++;
+ }
+ }
+ }
+ g_variant_unref(parameters);
+
+ if (count > 1)
+ *supported = true;
+ else
+ *supported = false;
+
+error:
+ return ret;
+}