nl80211: Make eloop sockets non-blocking
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>
This commit is contained in:
parent
5f65e9f717
commit
10b8592183
1 changed files with 9 additions and 0 deletions
|
@ -140,17 +140,26 @@ static void nl_destroy_handles(struct nl_handle **handle)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if __WORDSIZE == 64
|
||||||
|
#define ELOOP_SOCKET_INVALID (intptr_t) 0x8888888888888889ULL
|
||||||
|
#else
|
||||||
|
#define ELOOP_SOCKET_INVALID (intptr_t) 0x88888889ULL
|
||||||
|
#endif
|
||||||
|
|
||||||
static void nl80211_register_eloop_read(struct nl_handle **handle,
|
static void nl80211_register_eloop_read(struct nl_handle **handle,
|
||||||
eloop_sock_handler handler,
|
eloop_sock_handler handler,
|
||||||
void *eloop_data)
|
void *eloop_data)
|
||||||
{
|
{
|
||||||
|
nl_socket_set_nonblocking(*handle);
|
||||||
eloop_register_read_sock(nl_socket_get_fd(*handle), handler,
|
eloop_register_read_sock(nl_socket_get_fd(*handle), handler,
|
||||||
eloop_data, *handle);
|
eloop_data, *handle);
|
||||||
|
*handle = (void *) (((intptr_t) *handle) ^ ELOOP_SOCKET_INVALID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void nl80211_destroy_eloop_handle(struct nl_handle **handle)
|
static void nl80211_destroy_eloop_handle(struct nl_handle **handle)
|
||||||
{
|
{
|
||||||
|
*handle = (void *) (((intptr_t) *handle) ^ ELOOP_SOCKET_INVALID);
|
||||||
eloop_unregister_read_sock(nl_socket_get_fd(*handle));
|
eloop_unregister_read_sock(nl_socket_get_fd(*handle));
|
||||||
nl_destroy_handles(handle);
|
nl_destroy_handles(handle);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue