Merge "Modify eap config file name for mac address" into tizen
[platform/core/connectivity/net-config.git] / src / wifi-wps.c
index 6cf4262..2704c1b 100755 (executable)
 #include "netsupplicant.h"
 #include "wifi-background-scan.h"
 
-struct netconfig_wifi_wps {
+typedef struct {
+       char *interface_name;
        char *pin;
        gboolean pbc;
-};
+} wifi_wps_s;
 
-static struct netconfig_wifi_wps wifi_wps;
+GSList *g_wifi_wps_list = NULL;
 
-void netconfig_wifi_notify_wps_credentials(const char *ssid, gsize ssid_len, const char *wps_key)
+static void __free_wifi_wps(gpointer data)
+{
+       wifi_wps_s *wifi_wps = data;
+
+       g_free(wifi_wps->interface_name);
+       g_free(wifi_wps->pin);
+       g_free(wifi_wps);
+}
+
+static wifi_wps_s *__get_wifi_wps(const char *interface_name)
+{
+       GSList *list = NULL;
+
+       for (list = g_wifi_wps_list; list; list = list->next) {
+               wifi_wps_s *wifi_wps = list->data;
+               if (g_strcmp0(wifi_wps->interface_name, interface_name) == 0)
+                       return wifi_wps;
+       }
+
+       return NULL;
+}
+
+static void __destroy_wifi_wps(const char *interface_name)
+{
+       wifi_wps_s *wifi_wps;
+
+       wifi_wps = __get_wifi_wps(interface_name);
+       if (wifi_wps == NULL)
+               return;
+
+       g_wifi_wps_list = g_slist_remove(g_wifi_wps_list, wifi_wps);
+       __free_wifi_wps(wifi_wps);
+}
+
+static void __create_wifi_wps(const char *interface_name)
+{
+       wifi_wps_s *wifi_wps;
+
+       wifi_wps = g_try_new0(wifi_wps_s, 1);
+       if (wifi_wps == NULL)
+               return;
+
+       wifi_wps->interface_name = g_strdup(interface_name);
+       g_wifi_wps_list = g_slist_append(g_wifi_wps_list, wifi_wps);
+}
+
+static void __set_wifi_wps(const char *interface_name, gboolean pbc, char *pin)
+{
+       wifi_wps_s *wifi_wps;
+
+       wifi_wps = __get_wifi_wps(interface_name);
+       if (wifi_wps == NULL)
+               return;
+
+       wifi_wps->pbc = pbc;
+       if (pin)
+               wifi_wps->pin = g_strdup(pin);
+}
+
+static gboolean __get_wifi_wps_pbc(const char *interface_name)
+{
+       wifi_wps_s *wifi_wps;
+
+       wifi_wps = __get_wifi_wps(interface_name);
+       if (wifi_wps == NULL)
+               return FALSE;
+
+       return wifi_wps->pbc;
+}
+
+static char *__get_wifi_wps_pin(const char *interface_name)
+{
+       wifi_wps_s *wifi_wps;
+
+       wifi_wps = __get_wifi_wps(interface_name);
+       if (wifi_wps == NULL)
+               return NULL;
+
+       return wifi_wps->pin;
+}
+
+void netconfig_wifi_notify_wps_credentials(const char *interface_name,
+               const char *ssid, gsize ssid_len, const char *wps_key)
 {
        GVariantBuilder *builder;
        GVariant *params;
@@ -56,7 +139,8 @@ void netconfig_wifi_notify_wps_credentials(const char *ssid, gsize ssid_len, con
        g_variant_builder_unref(rawssid_builder);
        g_variant_builder_add(builder, "{sv}", prop_key, g_variant_new_string(wps_key));
 
-       params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+       params = g_variant_new("(s@a{sv})", interface_name,
+                               g_variant_builder_end(builder));
        g_variant_builder_unref(builder);
 
        netconfig_dbus_emit_signal(NULL,
@@ -69,7 +153,8 @@ void netconfig_wifi_notify_wps_credentials(const char *ssid, gsize ssid_len, con
        return;
 }
 
-void netconfig_wifi_notify_wps_completed(const char *ssid, gsize ssid_len)
+void netconfig_wifi_notify_wps_completed(const char *interface_name,
+               const char *ssid, gsize ssid_len)
 {
        GVariantBuilder *builder;
        GVariant *params;
@@ -85,7 +170,8 @@ void netconfig_wifi_notify_wps_completed(const char *ssid, gsize ssid_len)
        g_variant_builder_add(builder, "{sv}", prop_ssid, g_variant_new("ay", rawssid_builder));
        g_variant_builder_unref(rawssid_builder);
 
-       params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+       params = g_variant_new("(s@a{sv})", interface_name,
+                               g_variant_builder_end(builder));
        g_variant_builder_unref(builder);
 
        netconfig_dbus_emit_signal(NULL,
@@ -98,7 +184,8 @@ void netconfig_wifi_notify_wps_completed(const char *ssid, gsize ssid_len)
        return;
 }
 
-void netconfig_wifi_notify_wps_fail_event(int config_error, int error_indication)
+void netconfig_wifi_notify_wps_fail_event(const char *interface_name,
+               int config_error, int error_indication)
 {
        GVariantBuilder *builder;
        GVariant *params;
@@ -110,7 +197,8 @@ void netconfig_wifi_notify_wps_fail_event(int config_error, int error_indication
        g_variant_builder_add(builder, "{sv}", prop_config_error, g_variant_new_int32(config_error));
        g_variant_builder_add(builder, "{sv}", prop_error_indication, g_variant_new_int32(error_indication));
 
-       params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
+       params = g_variant_new("(s@a{sv})", interface_name,
+                               g_variant_builder_end(builder));
        g_variant_builder_unref(builder);
 
        netconfig_dbus_emit_signal(NULL,
@@ -157,10 +245,12 @@ static void __netconfig_wifi_invoke_wps_connect(GObject *source_object,
        const char *role = "enrollee", *type, *key;
        char *if_path = NULL;
        gboolean reply = FALSE;
+       char *interface_name = user_data;
 
-       if_path = netconfig_wifi_get_supplicant_interface();
+       if_path = netconfig_wifi_get_supplicant_interface_path(interface_name);
        if (if_path == NULL) {
                DBG("Fail to get wpa_supplicant DBus path");
+               g_free(interface_name);
                return;
        }
 
@@ -171,16 +261,17 @@ static void __netconfig_wifi_invoke_wps_connect(GObject *source_object,
 
        key = "Type";
 
-       if (wifi_wps.pbc == TRUE)
+       if (__get_wifi_wps_pbc(interface_name) == TRUE)
                type = "pbc";
        else
                type = "pin";
 
        g_variant_builder_add(builder, "{sv}", key, g_variant_new_string(type));
 
-       if (wifi_wps.pin != NULL) {
+       if (__get_wifi_wps_pin(interface_name) != NULL) {
                key = "Pin";
-               g_variant_builder_add(builder, "{sv}", key, g_variant_new_string(wifi_wps.pin));
+               g_variant_builder_add(builder, "{sv}", key,
+                       g_variant_new_string(__get_wifi_wps_pin(interface_name)));
        }
        message = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
        g_variant_builder_unref(builder);
@@ -192,31 +283,33 @@ static void __netconfig_wifi_invoke_wps_connect(GObject *source_object,
                        SUPPLICANT_IFACE_WPS,
                        "Start",
                        message,
-                       (GAsyncReadyCallback) interface_wps_start_result);
+                       (GAsyncReadyCallback) interface_wps_start_result,
+                       NULL);
 
-       g_free(if_path);
        if (reply != TRUE)
                ERR("Fail to Scan");
 
+       __destroy_wifi_wps(interface_name);
+       g_free(interface_name);
+       g_free(if_path);
        return;
 }
 
-static gboolean __netconfig_wifi_invoke_wps_process_credentials(char *object_path)
+static gboolean __netconfig_wifi_invoke_wps_process_credentials(char *object_path,
+                       const char *interface_name)
 {
        gboolean reply = FALSE;
        GVariant *params = NULL;
        const char *interface = SUPPLICANT_IFACE_WPS;
        const char *key = "ProcessCredentials";
        gboolean credentials = TRUE;
-       GVariant *var = NULL;
 
-        var = g_variant_new_boolean(credentials);
-       params = g_variant_new("(ssv)", interface, key, var);
+       params = g_variant_new("(ssv)", interface, key, g_variant_new_boolean(credentials));
 
        INFO("[net-config]: TizenMW-->WPAS: .Set");
        reply = netconfig_invoke_dbus_method_nonblock(SUPPLICANT_SERVICE,
-                       object_path, DBUS_INTERFACE_PROPERTIES,
-                       "Set", params, __netconfig_wifi_invoke_wps_connect);
+                       object_path, DBUS_INTERFACE_PROPERTIES, "Set", params,
+                       __netconfig_wifi_invoke_wps_connect, g_strdup(interface_name));
 
        if (reply != TRUE)
                ERR("M/W--->WPAS: Interface.WPS.Set Method Failed");
@@ -224,17 +317,17 @@ static gboolean __netconfig_wifi_invoke_wps_process_credentials(char *object_pat
        return reply;
 }
 
-gboolean netconfig_wifi_wps_connect()
+gboolean netconfig_wifi_wps_connect(const char *interface_name)
 {
        char *if_path = NULL;
 
-       if_path = netconfig_wifi_get_supplicant_interface();
+       if_path = netconfig_wifi_get_supplicant_interface_path(interface_name);
        if (if_path == NULL) {
                DBG("Fail to get wpa_supplicant DBus path");
                 return FALSE;
        }
 
-       if (__netconfig_wifi_invoke_wps_process_credentials(if_path) == TRUE) {
+       if (__netconfig_wifi_invoke_wps_process_credentials(if_path, interface_name) == TRUE) {
                ERR("Wi-Fi WPS Connect started");
                g_free(if_path);
                return TRUE;
@@ -270,12 +363,12 @@ static void __interface_wps_cancel_result(GObject *source_object,
        netconfig_gdbus_pending_call_unref();
 }
 
-static gboolean __netconfig_wifi_invoke_wps_cancel()
+static gboolean __netconfig_wifi_invoke_wps_cancel(const char *interface_name)
 {
        gboolean reply = FALSE;
        char *if_path = NULL;
 
-       if_path = netconfig_wifi_get_supplicant_interface();
+       if_path = netconfig_wifi_get_supplicant_interface_path(interface_name);
        if (if_path == NULL) {
                DBG("Fail to get wpa_supplicant DBus path");
                return -ESRCH;
@@ -284,8 +377,8 @@ static gboolean __netconfig_wifi_invoke_wps_cancel()
        DBG("M/W--->WPAS: Interface.WPS.Cancel Method");
 
        reply = netconfig_invoke_dbus_method_nonblock(SUPPLICANT_SERVICE,
-                       if_path, SUPPLICANT_IFACE_WPS,
-                       "Cancel", NULL, __interface_wps_cancel_result);
+                       if_path, SUPPLICANT_IFACE_WPS, "Cancel", NULL,
+                       __interface_wps_cancel_result, NULL);
 
        if (reply != TRUE)
                ERR("M/W--->WPAS: Interface.WPS.Cancel Method Failed");
@@ -294,39 +387,34 @@ static gboolean __netconfig_wifi_invoke_wps_cancel()
        return reply;
 }
 
-gboolean netconfig_get_wps_field()
-{
-       return wifi_wps.pbc;
-}
-
-gboolean handle_request_wps_cancel(Wifi *wifi, GDBusMethodInvocation *context)
+gboolean handle_request_wps_cancel(Wifi *wifi, GDBusMethodInvocation *context,
+                       const gchar *ifname)
 {
        INFO("Received WPS PBC Cancel Request");
-       g_return_val_if_fail(wifi != NULL, FALSE);
-       __netconfig_wifi_invoke_wps_cancel();
+       g_return_val_if_fail(wifi != NULL, TRUE);
+       __netconfig_wifi_invoke_wps_cancel(ifname);
 
        wifi_complete_request_wps_cancel(wifi, context);
        return TRUE;
 }
 
-gboolean handle_request_wps_connect(Wifi *wifi, GDBusMethodInvocation *context, gchar *param)
+gboolean handle_request_wps_connect(Wifi *wifi, GDBusMethodInvocation *context,
+                       const gchar *ifname, gchar *param)
 {
        INFO("Received WPS PBC/PIN Connection Request");
 
-       g_return_val_if_fail(wifi != NULL, FALSE);
+       g_return_val_if_fail(wifi != NULL, TRUE);
 
        /* Checking the value of pin if param have a string "PBC"
         * in that scenario PBC will trigger otherwise PIN Connection */
+        __create_wifi_wps(ifname);
 
-       if (g_strcmp0(param, "PBC") == 0) {
-               wifi_wps.pbc = TRUE;
-               wifi_wps.pin = NULL;
-       } else {
-               wifi_wps.pin = g_strdup(param);
-               wifi_wps.pbc = FALSE;
-       }
+       if (g_strcmp0(param, "PBC") == 0)
+               __set_wifi_wps(ifname, TRUE, NULL);
+       else
+               __set_wifi_wps(ifname, FALSE, param);
 
-       netconfig_wifi_wps_connect();
+       netconfig_wifi_wps_connect(ifname);
 
        wifi_complete_request_wps_connect(wifi, context);
        return TRUE;