From 33c5deb816f51d80b7ac6aa44b224e6b699ef85c Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Fri, 15 Oct 2010 18:56:36 +0300 Subject: [PATCH] nl80211: Indicate channel list change events Listen to regulatory event messages from kernel and convert them to internal driver event notifications indicated that the channel list may have changed. --- src/drivers/driver_nl80211.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index 8e527a5..352ecd5 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -1305,6 +1305,16 @@ static int process_event(struct nl_msg *msg, void *arg) case NL80211_CMD_NOTIFY_CQM: nl80211_cqm_event(drv, tb); break; + case NL80211_CMD_REG_CHANGE: + wpa_printf(MSG_DEBUG, "nl80211: Regulatory domain change"); + wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED, + NULL); + break; + case NL80211_CMD_REG_BEACON_HINT: + wpa_printf(MSG_DEBUG, "nl80211: Regulatory beacon hint"); + wpa_supplicant_event(drv->ctx, EVENT_CHANNEL_LIST_CHANGED, + NULL); + break; default: wpa_printf(MSG_DEBUG, "nl80211: Ignored unknown event " "(cmd=%d)", gnlh->cmd); @@ -1578,6 +1588,16 @@ static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv) goto err4; } + ret = nl_get_multicast_id(drv, "nl80211", "regulatory"); + if (ret >= 0) + ret = nl_socket_add_membership(drv->nl_handle_event, ret); + if (ret < 0) { + wpa_printf(MSG_DEBUG, "nl80211: Could not add multicast " + "membership for regulatory events: %d (%s)", + ret, strerror(-ret)); + /* Continue without regulatory events */ + } + eloop_register_read_sock(nl_socket_get_fd(drv->nl_handle_event), wpa_driver_nl80211_event_receive, drv, drv->nl_handle_event); -- 2.1.4