2 * Network Configuration Module
4 * Copyright (c) 2000 - 2012 Samsung Electronics Co., Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
29 #include "wifi-power.h"
30 #include "wifi-state.h"
31 #include "netsupplicant.h"
32 #include "wifi-background-scan.h"
34 struct netconfig_wifi_wps {
39 static struct netconfig_wifi_wps wifi_wps;
41 void netconfig_wifi_notify_wps_credentials(const char *ssid, gsize ssid_len, const char *wps_key)
43 GVariantBuilder *builder;
45 const char *sig_name = "WpsCredentials";
46 const char *prop_ssid = "ssid";
47 const char *prop_key = "key";
48 GVariantBuilder *rawssid_builder = NULL;
51 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
52 rawssid_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
53 for (i = 0; i < ssid_len; i++)
54 g_variant_builder_add(rawssid_builder, "y", ssid[i]);
55 g_variant_builder_add(builder, "{sv}", prop_ssid, g_variant_new("ay", rawssid_builder));
56 g_variant_builder_unref(rawssid_builder);
57 g_variant_builder_add(builder, "{sv}", prop_key, g_variant_new_string(wps_key));
59 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
60 g_variant_builder_unref(builder);
62 netconfig_dbus_emit_signal(NULL,
64 NETCONFIG_WIFI_INTERFACE,
68 INFO("Sent signal (%s)", sig_name);
72 void netconfig_wifi_notify_wps_completed(const char *ssid, gsize ssid_len)
74 GVariantBuilder *builder;
76 const char *sig_name = "WpsCompleted";
77 const char *prop_ssid = "ssid";
78 GVariantBuilder *rawssid_builder = NULL;
81 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
82 rawssid_builder = g_variant_builder_new(G_VARIANT_TYPE("ay"));
83 for (i = 0; i < ssid_len; i++)
84 g_variant_builder_add(rawssid_builder, "y", ssid[i]);
85 g_variant_builder_add(builder, "{sv}", prop_ssid, g_variant_new("ay", rawssid_builder));
86 g_variant_builder_unref(rawssid_builder);
88 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
89 g_variant_builder_unref(builder);
91 netconfig_dbus_emit_signal(NULL,
93 NETCONFIG_WIFI_INTERFACE,
97 INFO("Sent signal (%s)", sig_name);
101 void netconfig_wifi_notify_wps_fail_event(int config_error, int error_indication)
103 GVariantBuilder *builder;
105 const char *sig_name = "WpsFailEvent";
106 const char *prop_config_error = "config_error";
107 const char *prop_error_indication = "error_indication";
109 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
110 g_variant_builder_add(builder, "{sv}", prop_config_error, g_variant_new_int32(config_error));
111 g_variant_builder_add(builder, "{sv}", prop_error_indication, g_variant_new_int32(error_indication));
113 params = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
114 g_variant_builder_unref(builder);
116 netconfig_dbus_emit_signal(NULL,
118 NETCONFIG_WIFI_INTERFACE,
122 INFO("Sent signal (%s)", sig_name);
126 static void interface_wps_start_result(GObject *source_object,
127 GAsyncResult *res, gpointer user_data)
130 GDBusConnection *conn = NULL;
131 GError *error = NULL;
133 conn = G_DBUS_CONNECTION(source_object);
134 reply = g_dbus_connection_call_finish(conn, res, &error);
138 ERR("Fail to request status [%d: %s]",
139 error->code, error->message);
142 ERR("Fail torequest status");
145 DBG("Successfully M/W--->WPAS: Interface.WPS.Start Method");
148 g_variant_unref(reply);
149 netconfig_gdbus_pending_call_unref();
152 static void __netconfig_wifi_invoke_wps_connect(GObject *source_object,
153 GAsyncResult *res, gpointer user_data)
155 GVariant *message = NULL;
156 GVariantBuilder *builder = NULL;
157 const char *role = "enrollee", *type, *key;
158 const char *if_path = NULL;
159 gboolean reply = FALSE;
162 if_path = netconfig_wifi_get_supplicant_interface();
164 if (if_path == NULL) {
165 DBG("Fail to get wpa_supplicant DBus path");
169 builder = g_variant_builder_new(G_VARIANT_TYPE("a{sv}"));
172 g_variant_builder_add(builder, "{sv}", key, g_variant_new_string(role));
176 if (wifi_wps.pbc == TRUE)
181 g_variant_builder_add(builder, "{sv}", key, g_variant_new_string(type));
183 if (wifi_wps.pin != NULL) {
185 g_variant_builder_add(builder, "{sv}", key, g_variant_new_string(wifi_wps.pin));
187 message = g_variant_new("(@a{sv})", g_variant_builder_end(builder));
188 g_variant_builder_unref(builder);
190 DBG("[net-config]: TizenMW-->WPAS: .Interface.WPS.Start");
191 reply = netconfig_supplicant_invoke_dbus_method_nonblock(
194 SUPPLICANT_IFACE_WPS,
197 (GAsyncReadyCallback) interface_wps_start_result);
205 static gboolean __netconfig_wifi_invoke_wps_process_credentials(const char *object_path)
207 gboolean reply = FALSE;
208 GVariant *params = NULL;
209 const char *interface = SUPPLICANT_IFACE_WPS;
210 const char *key = "ProcessCredentials";
211 gboolean credentials = TRUE;
212 GVariant *var = NULL;
214 var = g_variant_new_boolean(credentials);
215 params = g_variant_new("(ssv)", interface, key, var);
217 INFO("[net-config]: TizenMW-->WPAS: .Set");
218 reply = netconfig_invoke_dbus_method_nonblock(SUPPLICANT_SERVICE,
219 object_path, DBUS_INTERFACE_PROPERTIES,
220 "Set", params, __netconfig_wifi_invoke_wps_connect);
223 ERR("M/W--->WPAS: Interface.WPS.Set Method Failed");
228 gboolean netconfig_wifi_wps_connect()
230 const char *if_path = NULL;
232 if_path = netconfig_wifi_get_supplicant_interface();
233 if (if_path == NULL) {
234 DBG("Fail to get wpa_supplicant DBus path");
238 if (__netconfig_wifi_invoke_wps_process_credentials(if_path) == TRUE) {
239 ERR("Wi-Fi WPS Connect started");
247 static void __interface_wps_cancel_result(GObject *source_object,
248 GAsyncResult *res, gpointer user_data)
251 GDBusConnection *conn = NULL;
252 GError *error = NULL;
254 conn = G_DBUS_CONNECTION(source_object);
255 reply = g_dbus_connection_call_finish(conn, res, &error);
259 ERR("Fail to request status [%d: %s]",
260 error->code, error->message);
263 ERR("Fail torequest status");
266 DBG("Successfully M/W--->WPAS: Interface.WPS.Cancel Method");
269 g_variant_unref(reply);
270 netconfig_gdbus_pending_call_unref();
273 static gboolean __netconfig_wifi_invoke_wps_cancel()
275 gboolean reply = FALSE;
276 const char *if_path = NULL;
278 if_path = netconfig_wifi_get_supplicant_interface();
279 if (if_path == NULL) {
280 DBG("Fail to get wpa_supplicant DBus path");
284 DBG("M/W--->WPAS: Interface.WPS.Cancel Method");
286 reply = netconfig_invoke_dbus_method_nonblock(SUPPLICANT_SERVICE,
287 if_path, SUPPLICANT_IFACE_WPS,
288 "Cancel", NULL, __interface_wps_cancel_result);
291 ERR("M/W--->WPAS: Interface.WPS.Cancel Method Failed");
296 gboolean netconfig_get_wps_field()
301 gboolean handle_request_wps_cancel(Wifi *wifi, GDBusMethodInvocation *context)
303 INFO("Received WPS PBC Cancel Request");
304 g_return_val_if_fail(wifi != NULL, FALSE);
305 __netconfig_wifi_invoke_wps_cancel();
307 wifi_complete_request_wps_cancel(wifi, context);
311 gboolean handle_request_wps_connect(Wifi *wifi, GDBusMethodInvocation *context, gchar *param)
313 INFO("Received WPS PBC/PIN Connection Request");
315 g_return_val_if_fail(wifi != NULL, FALSE);
317 /* Checking the value of pin if param have a string "PBC"
318 * in that scenario PBC will trigger otherwise PIN Connection */
320 if (g_strcmp0(param, "PBC") == 0) {
324 wifi_wps.pin = g_strdup(param);
325 wifi_wps.pbc = FALSE;
328 netconfig_wifi_wps_connect();
330 wifi_complete_request_wps_connect(wifi, context);