[PATCH] Adding some important wlan cotnrol events as dbus signals

Avichal Agarwal avichal.a
Sun May 31 23:21:53 PDT 2015


 
>From 51363ead405042ca466a418b4676086ec060de4c Mon Sep 17 00:00:00 2001

Following events are added as dbus signals , this patch will help application
to make quick decisions based on events , as happens in wpa ctrl_socket
based application. This make dbus interface fast.
Now no more waithing for state change notifications.

1. WPA-CONNECTED
2. WPA-DISCONNECTED
3. WPA-ASSOCREJECT
4. WPA-TERMINATING
5. WPA-SCAN-STARTED
6. WPA-SCAN-RESULTS
7. WPA-SCAN-FAILED
8. WPS-EVENT-OVERLAP

Signed-off-by: Avichal Agarwal <avichal.a at samsung.com>
---
 0001-added-variable-to-get-runtime-values.patch |   27 ++++
 wpa_supplicant/ap.c                             |    1 +
 wpa_supplicant/dbus/dbus_new.c                  |  194 +++++++++++++++++++++++
 wpa_supplicant/dbus/dbus_new.h                  |   32 ++++
 wpa_supplicant/events.c                         |    4 +
 wpa_supplicant/notify.c                         |   50 ++++++
 wpa_supplicant/notify.h                         |    7 +
 wpa_supplicant/scan.c                           |    3 +
 wpa_supplicant/wpa_supplicant.c                 |    5 +-
 9 files changed, 322 insertions(+), 1 deletion(-)
 create mode 100644 0001-added-variable-to-get-runtime-values.patch

diff --git a/0001-added-variable-to-get-runtime-values.patch b/0001-added-variable-to-get-runtime-values.patch
new file mode 100644
index 0000000..90c4741
--- /dev/null
+++ b/0001-added-variable-to-get-runtime-values.patch
@@ -0,0 +1,27 @@
+From 5599cabefc5a66a5b467e4d577df6c1b02dd7999 Mon Sep 17 00:00:00 2001
+From: samsung <samsung at samsung.(none)>
+Date: Mon, 1 Jun 2015 09:10:04 +0530
+Subject: [PATCH] added variable to get runtime values
+
+descriptoin goes here
+
+Signed-off-by: Avichal Agarwal <avichal.a at samsung.com>
+---
+ wpa_supplicant/main.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/wpa_supplicant/main.c b/wpa_supplicant/main.c
+index 2282747..d938b02 100644
+--- a/wpa_supplicant/main.c
++++ b/wpa_supplicant/main.c
+@@ -20,6 +20,7 @@
+ static void usage(void)
+ {
+ 	int i;
++	int p;
+ 	printf("%s\n\n%s\n"
+ 	       "usage:\n"
+ 	       "  wpa_supplicant [-BddhKLqq"
+-- 
+1.7.9.5
+
diff --git a/wpa_supplicant/ap.c b/wpa_supplicant/ap.c
index bfb69fc..faa7f92 100644
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
@@ -707,6 +707,7 @@ void wpa_supplicant_ap_deinit(struct wpa_supplicant *wpa_s)
 	hostapd_interface_free(wpa_s->ap_iface);
 	wpa_s->ap_iface = NULL;
 	wpa_drv_deinit_ap(wpa_s);
+	wpas_notify_disconnected(wpa_s);
 	wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR
 		" reason=%d locally_generated=1",
 		MAC2STR(wpa_s->own_addr), WLAN_REASON_DEAUTH_LEAVING);
diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index 6382d77..4e1b66f 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -2965,6 +2965,48 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
 		  END_ARGS
 	  }
 	},
+
+	{ "WPA-CONNECTED", WPAS_DBUS_NEW_IFACE_INTERFACE,
+	  {
+
+		  END_ARGS
+	  }
+	},
+
+	{ "WPA-DISCONNECTED", WPAS_DBUS_NEW_IFACE_INTERFACE,
+	  {
+
+		  END_ARGS
+	  }
+	},
+
+
+	{ "WPA-ASSOCREJECT", WPAS_DBUS_NEW_IFACE_INTERFACE,
+		  {
+
+			  END_ARGS
+		  }
+	},
+
+	{ "WPA-TERMINATING", WPAS_DBUS_NEW_IFACE_INTERFACE,
+		  {
+
+			  END_ARGS
+		  }
+	},
+
+	{ "WPA-SCAN-STARTED", WPAS_DBUS_NEW_IFACE_INTERFACE,
+		  {
+
+			  END_ARGS
+		  }
+	},
+	{ "WPA-SCAN-FAILED", WPAS_DBUS_NEW_IFACE_INTERFACE,
+		  {
+
+			  END_ARGS
+		  }
+	},
 	{ "BSSAdded", WPAS_DBUS_NEW_IFACE_INTERFACE,
 	  {
 		  { "path", "o", ARG_OUT },
@@ -3037,6 +3079,12 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
 		  END_ARGS
 	  }
 	},
+	{ "WPS-EVENT-OVERLAP", WPAS_DBUS_NEW_IFACE_WPS,
+		  {
+
+			  END_ARGS
+		  }
+	},
 #endif /* CONFIG_WPS */
 #ifdef CONFIG_P2P
 	{ "DeviceFound", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
@@ -3216,6 +3264,152 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
 };
 
 
+
+
+void wpas_dbus_signal_wpa_connected(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,	WPAS_DBUS_NEW_IFACE_INTERFACE,"WPA-CONNECTED");
+	if (msg == NULL)
+		return;
+
+	dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+void wpas_dbus_signal_wpa_disconnected(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,	WPAS_DBUS_NEW_IFACE_INTERFACE,"WPA-DISCONNECTED");
+	if (msg == NULL)
+		return;
+
+	dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+void wpas_dbus_signal_assoc_reject(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,	WPAS_DBUS_NEW_IFACE_INTERFACE,"WPA-ASSOCREJECT");
+	if (msg == NULL)
+		return;
+
+	dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+void wpas_dbus_signal_terminating(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,	WPAS_DBUS_NEW_IFACE_INTERFACE,"WPA-TERMINATING");
+	if (msg == NULL)
+		return;
+
+	dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+
+void wpas_dbus_signal_scan_started(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,	WPAS_DBUS_NEW_IFACE_INTERFACE,"WPA-SCAN-STARTED");
+	if (msg == NULL)
+		return;
+
+	dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+void wpas_dbus_signal_scan_failed(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,	WPAS_DBUS_NEW_IFACE_INTERFACE,"WPA-SCAN-FAILED");
+	if (msg == NULL)
+		return;
+
+	dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+
+
+void wpas_dbus_signal_wps_overlap(struct wpa_supplicant *wpa_s)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,	WPAS_DBUS_NEW_IFACE_WPS,"WPS-EVENT-OVERLAP");
+	if (msg == NULL)
+		return;
+
+	dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+
 int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
 {
 
diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h
index 31db8d4..2319db1 100644
--- a/wpa_supplicant/dbus/dbus_new.h
+++ b/wpa_supplicant/dbus/dbus_new.h
@@ -271,11 +271,38 @@ static inline void wpas_dbus_signal_network_request(
 {
 }
 
+static inline void wpas_dbus_signal_wpa_connected(struct wpa_supplicant *wpa_s)
+{
+
+}
+
+static inline void wpas_dbus_signal_wpa_disconnected(struct wpa_supplicant *wpa_s)
+{
+
+}
+static inline void wpas_dbus_signal_assoc_reject(struct wpa_supplicant *wpa_s)
+{
+
+}
+static inline void wpas_dbus_signal_terminating(struct wpa_supplicant *wpa_s)
+{
+
+}
+
+
 static inline void wpas_dbus_signal_scan_done(struct wpa_supplicant *wpa_s,
 					      int success)
 {
 }
 
+static inline void  wpas_dbus_signal_scan_started(struct wpa_supplicant *wpa_s)
+{
+
+}
+static inline void wpas_dbus_signal_scan_failed(struct wpa_supplicant *wpa_s)
+{
+
+}
 static inline void wpas_dbus_signal_wps_cred(struct wpa_supplicant *wpa_s,
 					     const struct wps_credential *cred)
 {
@@ -286,6 +313,11 @@ static inline void wpas_dbus_signal_wps_event_m2d(struct wpa_supplicant *wpa_s,
 {
 }
 
+static inline void wpas_dbus_signal_wps_overlap(struct wpa_supplicant *wpa_s)
+{
+
+}
+
 static inline void wpas_dbus_signal_wps_event_fail(
 	struct wpa_supplicant *wpa_s, struct wps_event_fail *fail)
 {
diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c
index d086624..26153dc 100644
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
@@ -1177,6 +1177,7 @@ int wpa_supplicant_connect(struct wpa_supplicant *wpa_s,
 			   struct wpa_ssid *ssid)
 {
 	if (wpas_wps_scan_pbc_overlap(wpa_s, selected, ssid)) {
+		wpas_notify_wps_overlap(wpa_s);
 		wpa_msg(wpa_s, MSG_INFO, WPS_EVENT_OVERLAP
 			"PBC session overlap");
 #ifdef CONFIG_P2P
@@ -2268,6 +2269,7 @@ static void wpa_supplicant_event_disassoc(struct wpa_supplicant *wpa_s,
 
 	if (!is_zero_ether_addr(bssid) ||
 	    wpa_s->wpa_state >= WPA_AUTHENTICATING) {
+		wpas_notify_disconnected(wpa_s);
 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_DISCONNECTED "bssid=" MACSTR
 			" reason=%d%s",
 			MAC2STR(bssid), reason_code,
@@ -3218,6 +3220,7 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
 #ifndef CONFIG_NO_SCAN_PROCESSING
 	case EVENT_SCAN_STARTED:
 		os_get_reltime(&wpa_s->scan_start_time);
+		wpas_notify_scan_started(wpa_s);
 		if (wpa_s->own_scan_requested) {
 			struct os_reltime diff;
 
@@ -3294,6 +3297,7 @@ void wpa_supplicant_event(void *ctx, enum wpa_event_type event,
 		break;
 #endif /* CONFIG_IBSS_RSN */
 	case EVENT_ASSOC_REJECT:
+		wpas_notify_assoc_reject(wpa_s);
 		if (data->assoc_reject.bssid)
 			wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_ASSOC_REJECT
 				"bssid=" MACSTR	" status_code=%u",
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 4df9d90..9d1d7f8 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -206,6 +206,56 @@ void wpas_notify_scan_done(struct wpa_supplicant *wpa_s, int success)
 	wpas_dbus_signal_scan_done(wpa_s, success);
 }
 
+void wpas_notify_connected(struct wpa_supplicant *wpa_s)
+{
+	if (wpa_s->p2p_mgmt)
+				return;
+	wpas_dbus_signal_wpa_connected(wpa_s);
+}
+
+void wpas_notify_disconnected(struct wpa_supplicant *wpa_s)
+{
+	if (wpa_s->p2p_mgmt)
+				return;
+	wpas_dbus_signal_wpa_disconnected(wpa_s);
+}
+
+void wpas_notify_assoc_reject(struct wpa_supplicant *wpa_s)
+{
+	if (wpa_s->p2p_mgmt)
+				return;
+	 wpas_dbus_signal_assoc_reject(wpa_s);
+}
+
+void wpas_notify_terminating(struct wpa_supplicant *wpa_s)
+{
+	 wpas_dbus_signal_terminating(wpa_s);
+}
+
+void wpas_notify_scan_started(struct wpa_supplicant *wpa_s)
+{
+	if (wpa_s->p2p_mgmt)
+			return;
+	wpas_dbus_signal_scan_started(wpa_s);
+
+}
+
+void wpas_notify_scan_failed(struct wpa_supplicant *wpa_s)
+{
+	if (wpa_s->p2p_mgmt)
+			return;
+	wpas_dbus_signal_scan_failed(wpa_s);
+
+}
+
+
+void wpas_notify_wps_overlap(struct wpa_supplicant *wpa_s)
+{
+	if (wpa_s->p2p_mgmt)
+			return;
+	 wpas_dbus_signal_wps_overlap(wpa_s);
+
+}
 
 void wpas_notify_scan_results(struct wpa_supplicant *wpa_s)
 {
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index 1025ca8..9a98660 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -134,5 +134,12 @@ void wpas_notify_network_bssid_set_changed(struct wpa_supplicant *wpa_s,
 					   struct wpa_ssid *ssid);
 void wpas_notify_network_type_changed(struct wpa_supplicant *wpa_s,
 				      struct wpa_ssid *ssid);
+void wpas_notify_connected(struct wpa_supplicant *wpa_s);
+void wpas_notify_disconnected(struct wpa_supplicant *wpa_s);
+void wpas_notify_assoc_reject(struct wpa_supplicant *wpa_s);
+void wpas_notify_terminating(struct wpa_supplicant *wpa_s);
+void wpas_notify_scan_started(struct wpa_supplicant *wpa_s);
+void wpas_notify_scan_failed(struct wpa_supplicant *wpa_s);
+void wpas_notify_wps_overlap(struct wpa_supplicant *wpa_s);
 
 #endif /* NOTIFY_H */
diff --git a/wpa_supplicant/scan.c b/wpa_supplicant/scan.c
index 3c6b2c7..9ad5302 100644
--- a/wpa_supplicant/scan.c
+++ b/wpa_supplicant/scan.c
@@ -189,10 +189,13 @@ static void wpas_trigger_scan_cb(struct wpa_radio_work *work, int deinit)
 		wpa_supplicant_notify_scanning(wpa_s, 0);
 		wpas_notify_scan_done(wpa_s, 0);
 		if (wpa_s->wpa_state == WPA_SCANNING)
+		{
+			 wpas_notify_scan_failed(wpa_s);
 			wpa_supplicant_set_state(wpa_s,
 						 wpa_s->scan_prev_wpa_state);
 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_SCAN_FAILED "ret=%d%s",
 			ret, retry ? " retry=1" : "");
+		}
 		radio_work_done(work);
 
 		if (retry) {
diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c
index 48bded6..abeced8 100644
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
@@ -723,6 +723,7 @@ void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
 
 	if (state == WPA_COMPLETED && wpa_s->new_connection) {
 		struct wpa_ssid *ssid = wpa_s->current_ssid;
+		 wpas_notify_connected(wpa_s);
 #if defined(CONFIG_CTRL_IFACE) || !defined(CONFIG_NO_STDOUT_DEBUG)
 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_CONNECTED "- Connection to "
 			MACSTR " completed [id=%d id_str=%s]",
@@ -4317,8 +4318,10 @@ static void wpa_supplicant_deinit_iface(struct wpa_supplicant *wpa_s,
 		wpas_notify_iface_removed(wpa_s);
 
 	if (terminate)
+	{
+		wpas_notify_terminating(wpa_s);
 		wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
-
+	}
 	if (wpa_s->ctrl_iface) {
 		wpa_supplicant_ctrl_iface_deinit(wpa_s->ctrl_iface);
 		wpa_s->ctrl_iface = NULL;
-- 
1.7.9.5



More information about the Hostap mailing list