#include "wifi-background-scan.h"
#include "wifi-tdls.h"
-#if defined TIZEN_DEBUG_DISABLE
-#include "wifi-dump.h"
-#endif
-
#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
#define DBUS_INTERFACE_DBUS "org.freedesktop.DBus"
#define SIGNAL_INTERFACE_REMOVED "InterfaceRemoved"
#define SIGNAL_TDLS_CONNECTED "TDLSConnected"
#define SIGNAL_TDLS_DISCONNECTED "TDLSDisconnected"
#define SIGNAL_TDLS_PEER_FOUND "TDLSPeerFound"
+
+#define SIGNAL_WPS_CONNECTED "WPSConnected"
+#define SIGNAL_WPS_EVENT "Event"
+#define SIGNAL_WPS_CREDENTIALS "Credentials"
+
#define CONNMAN_SIGNAL_SERVICES_CHANGED "ServicesChanged"
#define CONNMAN_SIGNAL_PROPERTY_CHANGED "PropertyChanged"
#define CONNMAN_SIGNAL_NAME_CHANGED "NameOwnerChanged"
#define MAX_SIG_LEN 64
-#define TOTAL_CONN_SIGNALS 3
+#define TOTAL_CONN_SIGNALS 5
typedef enum {
SIG_INTERFACE_REMOVED = 0,
};
static int supp_subscription_ids[SIG_MAX] = {0};
-static int dumpservice_subscription_id = 0;
typedef void (*supplicant_signal_cb)(GDBusConnection *conn,
const gchar *name, const gchar *path, const gchar *interface,
const gchar *name, const gchar *path, const gchar *interface,
const gchar *sig, GVariant *param, gpointer user_data);
+static void __netconfig_extract_ipv4_signal_data(GVariant *dictionary, const gchar *profile)
+{
+ gchar *key = NULL;
+ const gchar *value = NULL;
+ GVariant *var = NULL;
+ GVariantIter iter;
+
+ g_variant_iter_init(&iter, dictionary);
+ while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) {
+ if (g_strcmp0(key, "Address") == 0) {
+ value = g_variant_get_string(var, NULL);
+ char *old_ip = vconf_get_str(VCONFKEY_NETWORK_IP);
+
+ DBG("Old IPv4.Address [%s] Received new IPv4.Address [%s]", old_ip, value);
+ if (g_strcmp0(old_ip, value) != 0) {
+ if (value == NULL && strlen(old_ip) > 0)
+ vconf_set_str(VCONFKEY_NETWORK_IP, "");
+ else
+ vconf_set_str(VCONFKEY_NETWORK_IP, value);
+ }
+ free(old_ip);
+ }
+ }
+}
+
+static void __netconfig_extract_ipv6_signal_data(GVariant *dictionary, const gchar *profile)
+{
+ gchar *key = NULL;
+ const gchar *value = NULL;
+ GVariant *var = NULL;
+ GVariantIter iter;
+
+ g_variant_iter_init(&iter, dictionary);
+ while (g_variant_iter_loop(&iter, "{sv}", &key, &var)) {
+ if (g_strcmp0(key, "Address") == 0) {
+ value = g_variant_get_string(var, NULL);
+ char *old_ip6 = vconf_get_str(VCONFKEY_NETWORK_IP6);
+
+ DBG("Old IPv6.Address [%s] Received new IPv6.Address [%s]", old_ip6, value);
+ if (g_strcmp0(old_ip6, value) != 0) {
+ if (value == NULL && strlen(old_ip6) > 0)
+ vconf_set_str(VCONFKEY_NETWORK_IP6, "");
+ else
+ vconf_set_str(VCONFKEY_NETWORK_IP6, value);
+ }
+ free(old_ip6);
+ }
+ }
+}
+
static void _technology_signal_cb(GDBusConnection *conn,
const gchar *name, const gchar *path, const gchar *interface,
const gchar *sig, GVariant *param, gpointer user_data)
if (g_strcmp0(key, "Powered") == 0) {
/* Power state */
value = g_variant_get_boolean(var);
- if (value == TRUE) {
+ if (value == TRUE)
wifi_state_update_power_state(TRUE);
- } else {
+ else
wifi_state_update_power_state(FALSE);
- }
} else if (g_strcmp0(key, "Connected") == 0) {
/* Connection state */
- wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_CONNECTED);
+ value = g_variant_get_boolean(var);
+ if (value == TRUE)
+ wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_CONNECTED);
+ else
+ wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_POWERED);
} else if (g_strcmp0(key, "Tethering") == 0) {
/* Tethering state */
wifi_state_set_tech_state(NETCONFIG_WIFI_TECH_TETHERED);
if (sigvalue == NULL)
goto done;
- if (g_strcmp0(sig, CONNMAN_SIGNAL_PROPERTY_CHANGED) != 0) {
+ if (g_strcmp0(sig, CONNMAN_SIGNAL_PROPERTY_CHANGED) != 0)
goto done;
- }
if (g_strcmp0(sigvalue, "State") == 0) {
g_variant_get(variant, "s", &property);
if (netconfig_is_wifi_profile(path) == TRUE) {
int wifi_state = 0;
- vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
- if (wifi_state == VCONFKEY_WIFI_OFF)
+ netconfig_vconf_get_int(VCONFKEY_WIFI_STATE, &wifi_state);
+ if (wifi_state == VCONFKEY_WIFI_OFF) {
+ g_free(property);
goto done;
+ }
if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) {
- if (wifi_state >= VCONFKEY_WIFI_CONNECTED)
+ if (wifi_state >= VCONFKEY_WIFI_CONNECTED) {
+ g_free(property);
goto done;
+ }
netconfig_update_default_profile(path);
wifi_state_set_service_state(NETCONFIG_WIFI_FAILURE);
else
wifi_state_set_service_state(NETCONFIG_WIFI_IDLE);
+ g_free(property);
goto done;
}
- if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
+ if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
+ g_free(property);
goto done;
+ }
netconfig_update_default_profile(NULL);
wifi_state_set_service_state(NETCONFIG_WIFI_ASSOCIATION);
else
wifi_state_set_service_state(NETCONFIG_WIFI_CONFIGURATION);
+ g_free(property);
goto done;
}
- if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
+ if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
+ g_free(property);
goto done;
+ }
netconfig_update_default_profile(NULL);
} else {
if (g_strcmp0(property, "ready") == 0 || g_strcmp0(property, "online") == 0) {
if (netconfig_get_default_profile() == NULL) {
- if(!netconfig_is_cellular_profile(path)) {
+ if (!netconfig_is_cellular_profile(path))
netconfig_update_default_profile(path);
- } else {
- if (netconfig_is_cellular_internet_profile(path)) {
+ else {
+ if (netconfig_is_cellular_internet_profile(path))
netconfig_update_default_profile(path);
- }
}
}
cellular_state_set_service_state(NETCONFIG_CELLULAR_ONLINE);
} else if (g_strcmp0(property, "failure") == 0 || g_strcmp0(property, "disconnect") == 0 || g_strcmp0(property, "idle") == 0) {
- if (netconfig_get_default_profile() == NULL)
+ if (netconfig_get_default_profile() == NULL) {
+ g_free(property);
goto done;
+ }
if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path))
cellular_state_set_service_state(NETCONFIG_CELLULAR_IDLE);
- if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
+ if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
+ g_free(property);
goto done;
+ }
netconfig_update_default_profile(NULL);
- } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) {
- if (netconfig_get_default_profile() == NULL)
+ } else if (g_strcmp0(property, "association") == 0 || g_strcmp0(property, "configuration") == 0) {
+ if (netconfig_get_default_profile() == NULL) {
+ g_free(property);
goto done;
+ }
if (netconfig_is_cellular_profile(path) && netconfig_is_cellular_internet_profile(path))
cellular_state_set_service_state(NETCONFIG_CELLULAR_CONNECTING);
- if (g_strcmp0(path, netconfig_get_default_profile()) != 0)
+ if (g_strcmp0(path, netconfig_get_default_profile()) != 0) {
+ g_free(property);
goto done;
+ }
netconfig_update_default_profile(NULL);
}
}
+ g_free(property);
} else if (g_strcmp0(sigvalue, "Proxy") == 0) {
if (netconfig_is_wifi_profile(path) != TRUE || g_strcmp0(path, netconfig_get_default_profile()) != 0)
goto done;
}
g_variant_iter_free(iter);
+ } else if (g_strcmp0(sigvalue, "IPv4") == 0) {
+ __netconfig_extract_ipv4_signal_data(variant, path);
+ } else if (g_strcmp0(sigvalue, "IPv6") == 0) {
+ __netconfig_extract_ipv6_signal_data(variant, path);
} else if (g_strcmp0(sigvalue, "Error") == 0) {
g_variant_get(variant, "s", &property);
INFO("[%s] Property : %s", sigvalue, property);
+ g_free(property);
}
done:
if (sigvalue)
return;
}
+static void _services_changed_cb(GDBusConnection *conn, const gchar *name,
+ const gchar *path, const gchar *interface, const gchar *sig,
+ GVariant *param, gpointer user_data)
+{
+ gchar *property, *value;
+ gchar *service_path;
+ GVariant *variant = NULL;
+ GVariantIter *added = NULL, *removed = NULL, *next = NULL;
+
+ if (path == NULL || param == NULL)
+ return;
+
+ if (g_strcmp0(sig, CONNMAN_SIGNAL_SERVICES_CHANGED) != 0)
+ return;
+
+ if (netconfig_get_default_profile() != NULL)
+ return;
+
+ g_variant_get(param, "(a(oa{sv})ao)", &added, &removed);
+
+ while (g_variant_iter_loop(added, "(oa{sv})", &service_path, &next)) {
+ gboolean is_wifi_prof, is_cell_prof, is_cell_internet_prof;
+ is_wifi_prof = netconfig_is_wifi_profile(service_path);
+ is_cell_prof = netconfig_is_cellular_profile(service_path);
+ is_cell_internet_prof = netconfig_is_cellular_internet_profile(
+ service_path);
+ if (service_path != NULL) {
+ while (g_variant_iter_loop(next, "{sv}", &property,
+ &variant)) {
+ if (g_strcmp0(property, "State") == 0) {
+ g_variant_get(variant, "s", &value);
+ DBG("Profile %s State %s", service_path,
+ value);
+ if (g_strcmp0(value, "ready") != 0 &&
+ g_strcmp0(value,
+ "online") != 0) {
+ g_free(property);
+ g_free(value);
+ g_variant_unref(variant);
+ break;
+ }
+
+ if (!is_cell_prof)
+ netconfig_update_default_profile(
+ service_path);
+ else if (is_cell_internet_prof) {
+ netconfig_update_default_profile(
+ service_path);
+ }
+ if (is_wifi_prof)
+ wifi_state_set_service_state(
+ NETCONFIG_WIFI_CONNECTED);
+ else if (is_cell_prof &&
+ is_cell_internet_prof)
+ cellular_state_set_service_state(
+ NETCONFIG_CELLULAR_ONLINE);
+ g_free(property);
+ g_free(value);
+ g_variant_unref(variant);
+ break;
+ }
+ }
+ }
+ }
+
+ g_variant_iter_free(added);
+
+ if (next)
+ g_variant_iter_free(next);
+
+ if (removed)
+ g_variant_iter_free(removed);
+
+ return;
+}
+
static void _supplicant_interface_removed(GDBusConnection *conn,
const gchar *name, const gchar *path, const gchar *interface,
const gchar *sig, GVariant *param, gpointer user_data)
DBG("Driver session overlapped handling!");
ERR("WPS PBC SESSION OVERLAPPED");
#if defined TIZEN_WEARABLE
- wc_launch_syspopup(WC_POPUP_TYPE_SESSION_OVERLAPPED);
+ return;
#else
netconfig_send_message_to_net_popup("WPS Error",
"wps session overlapped", "popup", NULL);
const gchar *name, const gchar *path, const gchar *interface,
const gchar *sig, GVariant *param, gpointer user_data)
{
- ERR("Received TDLS Connected Signal");
- netconfig_wifi_tlds_connected_event(param);
+ DBG("Received TDLS Connected Signal");
+ netconfig_wifi_tdls_connected_event(param);
return;
}
const gchar *name, const gchar *path, const gchar *interface,
const gchar *sig, GVariant *param, gpointer user_data)
{
- ERR("Received TDLS Disconnected Signal");
- netconfig_wifi_tlds_disconnected_event(param);
+ DBG("Received TDLS Disconnected Signal");
+ netconfig_wifi_tdls_disconnected_event(param);
return;
}
const gchar *name, const gchar *path, const gchar *interface,
const gchar *sig, GVariant *param, gpointer user_data)
{
- ERR("Received TDLS Peer Found Signal");
+ DBG("Received TDLS Peer Found Signal");
+ netconfig_wifi_tdls_peer_found_event(param);
+ return;
+}
+
+static void _supplicant_wifi_wps_connected(GVariant *param)
+{
+ gchar *key;
+ char ssid[32] = {0, };
+ gchar *name;
+ GVariantIter *iter;
+ GVariant *variant;
+ int config_error = 0;
+ int error_indication = 0;
+ gsize ssid_len = 0;
+
+ if (param == NULL) {
+ ERR("Param is NULL");
+ return;
+ }
+
+ g_variant_get(param, "(sa{sv})", &name, &iter);
+ INFO("wps Result: %s", name);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
+ INFO("wps Key is %s", key);
+ if (g_strcmp0(key, "SSID") == 0) {
+ const char *t_key = NULL;
+ t_key = g_variant_get_fixed_array(variant, &ssid_len, sizeof(guchar));
+ INFO("wps ssid_len is %d ", ssid_len);
+ if (t_key == NULL) {
+ g_free(key);
+ g_variant_unref(variant);
+ ERR("WPS PBC Connection Failed");
+ goto error;
+ }
+ if (ssid_len > 0 && ssid_len <= 32) {
+ memcpy(ssid, t_key, ssid_len);
+ } else {
+ memset(ssid, 0, sizeof(ssid));
+ ssid_len = 0;
+ }
+ INFO("WPS PBC Connection completed with AP %s", ssid);
+ netconfig_wifi_notify_wps_completed(ssid, ssid_len);
+ }
+ }
+
+ g_variant_iter_free(iter);
+ g_free(name);
+ return;
+
+error:
+ g_variant_iter_free(iter);
+ g_free(name);
+ error_indication = WPS_EI_OPERATION_FAILED;
+ config_error = WPS_CFG_NO_ERROR;
+ ERR("Error Occured! Notifying Fail Event");
+ netconfig_wifi_notify_wps_fail_event(config_error, error_indication);
+
+}
+
+static void _supplicant_wifi_wps_event(GVariant *param)
+{
+ gchar *key;
+ gchar *name;
+ GVariantIter *iter;
+ GVariant *variant;
+ gint32 config_error = 0;
+ gint32 error_indication = 0;
+
+ if (param == NULL) {
+ ERR("Param is NULL");
+ return;
+ }
+
+ g_variant_get(param, "(sa{sv})", &name, &iter);
+ INFO("Event Result: %s", name);
+ if (g_strcmp0(name, "failed") == 0) {
+ while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
+ if (key == NULL)
+ goto error;
+ INFO("Key is %s", key);
+ if (g_strcmp0(key, "config_error") == 0) {
+ config_error = g_variant_get_int32(variant);
+ ERR("Config Error %d", config_error);
+ } else if (g_strcmp0(key, "error_indication") == 0) {
+ error_indication = g_variant_get_int32(variant);
+ ERR("Error Indication %d", error_indication);
+ }
+ }
+ netconfig_wifi_notify_wps_fail_event(config_error, error_indication);
+ }
+
+ g_variant_iter_free(iter);
+ g_free(name);
+ return;
+
+error:
+ g_variant_iter_free(iter);
+ g_free(name);
+ error_indication = WPS_EI_OPERATION_FAILED;
+ config_error = WPS_CFG_NO_ERROR;
+ ERR("Error Occured! Notifying Fail Event");
+ netconfig_wifi_notify_wps_fail_event(config_error, error_indication);
+}
+
+static void _supplicant_wifi_wps_credentials(GVariant *param)
+{
+ gchar *key;
+ char ssid[32];
+ char wps_key[100];
+ GVariantIter *iter;
+ GVariant *variant;
+ int config_error = 0;
+ int error_indication = 0;
+ gsize ssid_len = 0;
+
+ if (param == NULL) {
+ ERR("Param is NULL");
+ return;
+ }
+
+ g_variant_get(param, "(a{sv})", &iter);
+ while (g_variant_iter_loop(iter, "{sv}", &key, &variant)) {
+ if (key == NULL)
+ goto error;
+ INFO("wps Key is %s", key);
+ if (g_strcmp0(key, "Key") == 0) {
+ gsize key_len = 0;
+ const char *t_key = NULL;
+ key_len = g_variant_get_size(variant);
+
+ INFO("wps password len %d ", key_len);
+ if (key_len > 0) {
+ t_key = g_variant_get_fixed_array(variant, &key_len, sizeof(guchar));
+ if (!t_key) {
+ g_free(key);
+ g_variant_unref(variant);
+ goto error;
+ }
+ strncpy(wps_key, t_key, key_len);
+ wps_key[key_len] = '\0';
+ INFO("WPS Key in process credentials %s", wps_key);
+ } else
+ SLOGI("WPS AP Security ->Open");
+ } else if (g_strcmp0(key, "SSID") == 0) {
+ const char *t_key = NULL;
+ t_key = g_variant_get_fixed_array(variant, &ssid_len, sizeof(guchar));
+ INFO("wps ssid_len is %d ", ssid_len);
+ if (!t_key) {
+ g_free(key);
+ g_variant_unref(variant);
+ goto error;
+ }
+ if (ssid_len > 0 && ssid_len <= 32) {
+ memcpy(ssid, t_key, ssid_len);
+ } else {
+ memset(ssid, 0, sizeof(ssid));
+ ssid_len = 0;
+ }
+ INFO("SSID in process credentials %s", ssid);
+ }
+ }
+
+ g_variant_iter_free(iter);
+
+#if 0
+ /*
+ * Notify WPS Credentials only when requested through WPS PBC
+ * In case of WPS PIN connman will take care of notification
+ */
+ if (netconfig_get_wps_field() == TRUE)
+#endif
+ netconfig_wifi_notify_wps_credentials(ssid, ssid_len, wps_key);
+ return;
+
+error:
+ g_variant_iter_free(iter);
+ error_indication = WPS_EI_OPERATION_FAILED;
+ config_error = WPS_CFG_NO_ERROR;
+ ERR("Error Occured! Notifying Fail Event");
+ netconfig_wifi_notify_wps_fail_event(config_error, error_indication);
+}
+
+static void __netconfig_wps_signal_filter_handler(GDBusConnection *conn,
+ const gchar *name, const gchar *path, const gchar *interface,
+ const gchar *sig, GVariant *param, gpointer user_data)
+{
+ if (g_strcmp0(sig, SIGNAL_WPS_CREDENTIALS) == 0) {
+ INFO("Received wps CREDENTIALS Signal from Supplicant");
+ _supplicant_wifi_wps_credentials(param);
+ } else if (g_strcmp0(sig, SIGNAL_WPS_EVENT) == 0) {
+ INFO("Received wps EVENT Signal from Supplicant");
+ _supplicant_wifi_wps_event(param);
+ } else if (g_strcmp0(sig, SIGNAL_WPS_CONNECTED) == 0) {
+ INFO("Received WPSConnected Signal from Supplicant");
+ _supplicant_wifi_wps_connected(param);
+ }
+
return;
}
_supplicant_tdls_peer_found
};
-#if defined TIZEN_DEBUG_DISABLE
-static void __netconfig_dumpservice_handler(GDBusConnection *conn,
- const gchar *name, const gchar *path, const gchar *interface,
- const gchar *sig, GVariant *param, gpointer user_data)
-{
- int mode;
- gchar *signal_path = NULL;
-
- if (param == NULL)
- return;
-
- g_variant_get(param, "(io)", &mode, &signal_path);
- DBG("Path: %s and mode: %d", signal_path, mode);
- netconfig_dump_log(path);
- if (signal_path)
- g_free(signal_path);
-
- return;
-}
-#endif
-
void register_gdbus_signal(void)
{
GDBusConnection *connection = NULL;
NULL,
NULL);
+ conn_subscription_ids[3] = g_dbus_connection_signal_subscribe(
+ connection,
+ CONNMAN_SERVICE,
+ CONNMAN_MANAGER_INTERFACE,
+ CONNMAN_SIGNAL_SERVICES_CHANGED,
+ NULL,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ _services_changed_cb,
+ NULL,
+ NULL);
+
INFO("Successfully register connman DBus signal filters");
+ conn_subscription_ids[4] = g_dbus_connection_signal_subscribe(
+ connection,
+ SUPPLICANT_SERVICE,
+ SUPPLICANT_INTERFACE ".Interface.WPS",
+ NULL,
+ NULL,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ __netconfig_wps_signal_filter_handler,
+ NULL,
+ NULL);
+
+ INFO("Successfully register Supplicant WPS DBus signal filters");
+
for (sig = SIG_INTERFACE_REMOVED; sig < SIG_MAX; sig++) {
/*
* For SIG_INTERFACE_REMOVED INTERFACE_ADDED
INFO("Successfully register Supplicant DBus signal filters");
-#if defined TIZEN_DEBUG_DISABLE
- dumpservice_subscription_id = g_dbus_connection_signal_subscribe(
- connection,
- /*
- * Sender => For testing purpose made NULL
- *WPA_SUPPLICANT,
- */
- NULL,
- DUMP_SERVICE_INTERFACE,
- DUMP_SIGNAL,
- NULL,
- NULL,
- G_DBUS_SIGNAL_FLAGS_NONE,
- __netconfig_dumpservice_handler,
- NULL,
- NULL);
-
- INFO("Successfully register Dumpservice DBus signal filter");
-#endif
/* In case ConnMan precedes this signal register,
* net-config should update the default connected profile.
*/
}
}
- g_dbus_connection_signal_unsubscribe(connection,
- dumpservice_subscription_id);
}