From 3734552f15856f3247f8bc484ffdb6d2a7d08113 Mon Sep 17 00:00:00 2001 From: Jayant Sane Date: Sat, 25 Jun 2011 11:47:04 +0300 Subject: [PATCH] P2P: Add WpsFailed signal in P2P D-Bus Signal is triggered if an error occurs during WPS provisioning phase. Signed-off-by: Jean-Michel.Bachot Signed-off-by: Jayant Sane --- wpa_supplicant/ap.c | 3 +- wpa_supplicant/dbus/dbus_new.c | 51 +++++++++++++++++++++++++++++++++ wpa_supplicant/dbus/dbus_new.h | 9 ++++++ wpa_supplicant/notify.c | 8 ++++++ wpa_supplicant/notify.h | 3 ++ wpa_supplicant/p2p_supplicant.c | 12 ++++++++ wpa_supplicant/p2p_supplicant.h | 2 ++ wpa_supplicant/wps_supplicant.c | 3 ++ 8 files changed, 90 insertions(+), 1 deletion(-) diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c index 95279d376..531195002 100644 --- a/wpa_supplicant/ap.c +++ b/wpa_supplicant/ap.c @@ -226,10 +226,10 @@ static void ap_wps_event_cb(void *ctx, enum wps_event event, { #ifdef CONFIG_P2P struct wpa_supplicant *wpa_s = ctx; + struct wps_event_fail *fail = &data->fail; if (event == WPS_EV_FAIL && wpa_s->parent && wpa_s->parent != wpa_s && wpa_s == wpa_s->global->p2p_group_formation) { - struct wps_event_fail *fail = &data->fail; /* * src/ap/wps_hostapd.c has already sent this on the main @@ -240,6 +240,7 @@ static void ap_wps_event_cb(void *ctx, enum wps_event event, "msg=%d config_error=%d", fail->msg, fail->config_error); } + wpas_p2p_wps_failed(wpa_s, fail); #endif /* CONFIG_P2P */ } diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c index 4e704852a..c75fbdfae 100644 --- a/wpa_supplicant/dbus/dbus_new.c +++ b/wpa_supplicant/dbus/dbus_new.c @@ -1377,6 +1377,50 @@ static void wpas_dbus_signal_persistent_group_removed( FALSE); } + +/** + * wpas_dbus_signal_p2p_wps_failed - Signals WpsFailed event + * @wpa_s: %wpa_supplicant network interface data + * + * Sends Event dbus signal with name "fail" and dictionary containing + * "msg" field with fail message number (int32) as arguments + */ +void wpas_dbus_signal_p2p_wps_failed(struct wpa_supplicant *wpa_s, + struct wps_event_fail *fail) +{ + + DBusMessage *msg; + DBusMessageIter iter, dict_iter; + struct wpas_dbus_priv *iface; + char *key = "fail"; + + iface = wpa_s->global->dbus; + + /* Do nothing if the control interface is not turned on */ + if (iface == NULL) + return; + + msg = dbus_message_new_signal(wpa_s->dbus_new_path, + WPAS_DBUS_NEW_IFACE_P2PDEVICE, + "WpsFailed"); + if (msg == NULL) + return; + + dbus_message_iter_init_append(msg, &iter); + + if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key) || + !wpa_dbus_dict_open_write(&iter, &dict_iter) || + !wpa_dbus_dict_append_int32(&dict_iter, "msg", fail->msg) || + !wpa_dbus_dict_append_int16(&dict_iter, "config_error", + fail->config_error) || + !wpa_dbus_dict_close_write(&iter, &dict_iter)) + wpa_printf(MSG_ERROR, "dbus: Failed to construct signal"); + else + dbus_connection_send(iface->con, msg, NULL); + + dbus_message_unref(msg); +} + #endif /*CONFIG_P2P*/ @@ -2585,6 +2629,13 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = { END_ARGS } }, + { "WpsFailed", WPAS_DBUS_NEW_IFACE_P2PDEVICE, + { + { "name", "s", ARG_OUT }, + { "args", "a{sv}", ARG_OUT }, + END_ARGS + } + }, #endif /* CONFIG_P2P */ { NULL, NULL, { END_ARGS } } }; diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h index 92cc36534..3b0d50c4b 100644 --- a/wpa_supplicant/dbus/dbus_new.h +++ b/wpa_supplicant/dbus/dbus_new.h @@ -199,6 +199,8 @@ void wpas_dbus_signal_p2p_sd_response(struct wpa_supplicant *wpa_s, const u8 *tlvs, size_t tlvs_len); void wpas_dbus_signal_p2p_peer_joined(struct wpa_supplicant *wpa_s, const u8 *member); +void wpas_dbus_signal_p2p_wps_failed(struct wpa_supplicant *wpa_s, + struct wps_event_fail *fail); #else /* CONFIG_CTRL_IFACE_DBUS_NEW */ @@ -434,6 +436,13 @@ wpas_dbus_signal_p2p_peer_disconnected(struct wpa_supplicant *wpa_s, const u8 *member) { } + +static inline void +wpas_dbus_signal_p2p_wps_failed(struct wpa_supplicant *wpa_s, + struct wps_event_fail *fail) +{ +} + #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */ #endif /* CTRL_IFACE_DBUS_H_NEW */ diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index 84c2cbd8d..6595fec97 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -493,6 +493,14 @@ void wpas_notify_p2p_group_started(struct wpa_supplicant *wpa_s, wpas_dbus_signal_p2p_group_started(wpa_s, ssid, client, network_id); } + + +void wpas_notify_p2p_wps_failed(struct wpa_supplicant *wpa_s, + struct wps_event_fail *fail) +{ + wpas_dbus_signal_p2p_wps_failed(wpa_s, fail); +} + #endif /* CONFIG_P2P */ diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h index 30c4a2c16..766668fc6 100644 --- a/wpa_supplicant/notify.h +++ b/wpa_supplicant/notify.h @@ -116,4 +116,7 @@ void wpas_notify_persistent_group_added(struct wpa_supplicant *wpa_s, void wpas_notify_persistent_group_removed(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid); +void wpas_notify_p2p_wps_failed(struct wpa_supplicant *wpa_s, + struct wps_event_fail *fail); + #endif /* NOTIFY_H */ diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 3287df014..d4ec261bb 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -3489,6 +3489,18 @@ void wpas_p2p_wps_success(struct wpa_supplicant *wpa_s, const u8 *peer_addr, } +void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s, + struct wps_event_fail *fail) +{ + if (!wpa_s->p2p_in_provisioning) { + wpa_printf(MSG_DEBUG, "P2P: Ignore WPS fail event - P2P " + "provisioning not in progress"); + return; + } + wpas_notify_p2p_wps_failed(wpa_s, fail); +} + + int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr, const char *config_method) { diff --git a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h index 69df47526..b1080a55e 100644 --- a/wpa_supplicant/p2p_supplicant.h +++ b/wpa_supplicant/p2p_supplicant.h @@ -124,5 +124,7 @@ void wpas_p2p_update_best_channels(struct wpa_supplicant *wpa_s, int freq_24, int freq_5, int freq_overall); int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr); int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s); +void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s, + struct wps_event_fail *fail); #endif /* P2P_SUPPLICANT_H */ diff --git a/wpa_supplicant/wps_supplicant.c b/wpa_supplicant/wps_supplicant.c index ba59e7cf5..b75c6ef6c 100644 --- a/wpa_supplicant/wps_supplicant.c +++ b/wpa_supplicant/wps_supplicant.c @@ -470,6 +470,9 @@ static void wpa_supplicant_wps_event_fail(struct wpa_supplicant *wpa_s, } wpas_clear_wps(wpa_s); wpas_notify_wps_event_fail(wpa_s, fail); +#ifdef CONFIG_P2P + wpas_p2p_wps_failed(wpa_s, fail); +#endif /* CONFIG_P2P */ }