Patchwork [3/3] nl80211: make eloop sockets non-blocking

login
register
mail settings
Submitter Johannes Berg
Date Oct. 26, 2013, 10:23 a.m.
Message ID <1382783032-26302-3-git-send-email-johannes@sipsolutions.net>
Download mbox | patch
Permalink /patch/286273/
State Accepted
Commit 10b85921839f9c3582f0f69c3bde841b0ffbca10
Headers show

Comments

Johannes Berg - Oct. 26, 2013, 10:23 a.m.
From: Johannes Berg <johannes.berg@intel.com>

To avoid a problem where the beacon socket occasionally
blocks, mark any sockets on the eloop as non-blocking.
The previous patch reordered the code to never send a
command after a socket was put on the eloop, but now also
invalidate the nl handle pointer while it's on there.

Signed-hostap: Johannes Berg <johannes.berg@intel.com>
---
 src/drivers/driver_nl80211.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Patch

diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c
index 2021a9c..8ce5c2a 100644
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
@@ -139,16 +139,25 @@  static void nl_destroy_handles(struct nl_handle **handle)
 	*handle = NULL;
 }
 
+#if __WORDSIZE == 64
+#define ELOOP_SOCKET_INVALID	0x8888888888888889ULL
+#else
+#define ELOOP_SOCKET_INVALID	0x88888889ULL
+#endif
+
 static void nl80211_register_eloop_read(struct nl_handle **handle,
 					eloop_sock_handler handler,
 					void *eloop_data)
 {
+	nl_socket_set_nonblocking(*handle);
 	eloop_register_read_sock(nl_socket_get_fd(*handle), handler,
 				 eloop_data, *handle);
+	*handle = (void *)(((unsigned long)*handle) ^ ELOOP_SOCKET_INVALID);
 }
 
 static void nl80211_destroy_eloop_handle(struct nl_handle **handle)
 {
+	*handle = (void *)(((unsigned long)*handle) ^ ELOOP_SOCKET_INVALID);
 	eloop_unregister_read_sock(nl_socket_get_fd(*handle));
 	nl_destroy_handles(handle);
 }