@@ -232,6 +232,7 @@ struct wpa_driver_nl80211_data {
int scan_complete_events;
struct nl80211_handles nl_event;
+ struct nl_cb *nl_cb;
u8 auth_bssid[ETH_ALEN];
u8 bssid[ETH_ALEN];
@@ -1867,18 +1868,11 @@ static int process_drv_event(struct nl_msg *msg, void *arg)
static void wpa_driver_nl80211_drv_event_receive(int sock, void *eloop_ctx,
void *handle)
{
- struct nl_cb *cb;
struct wpa_driver_nl80211_data *drv = eloop_ctx;
wpa_printf(MSG_DEBUG, "nl80211: Event message available");
- cb = nl_cb_clone(drv->global->nl_cb);
- if (!cb)
- return;
- nl_cb_set(cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM, no_seq_check, NULL);
- nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, process_drv_event, drv);
- nl_recvmsgs(handle, cb);
- nl_cb_put(cb);
+ nl_recvmsgs(handle, drv->nl_cb);
}
@@ -2249,6 +2243,17 @@ static int wpa_driver_nl80211_init_nl(struct wpa_driver_nl80211_data *drv)
/* Continue without regulatory events */
}
+ drv->nl_cb = nl_cb_alloc(NL_CB_DEFAULT);
+ if (!drv->nl_cb) {
+ wpa_printf(MSG_ERROR, "nl80211: failed to alloc cb struct\n");
+ goto err4;
+ }
+
+ nl_cb_set(drv->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,
+ no_seq_check, NULL);
+ nl_cb_set(drv->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,
+ process_drv_event, drv);
+
eloop_register_read_sock(nl_socket_get_fd(drv->nl_event.handle),
wpa_driver_nl80211_drv_event_receive, drv,
drv->nl_event.handle);
@@ -2720,6 +2725,7 @@ static void wpa_driver_nl80211_deinit(void *priv)
eloop_unregister_read_sock(nl_socket_get_fd(drv->nl_event.handle));
nl_destroy_handles(&drv->nl_event);
+ nl_cb_put(drv->nl_cb);
os_free(drv->filter_ssids);
From: Johannes Berg <johannes.berg@intel.com> There's no need to clone the CB all the time and then assign it, just use a constant one. Signed-hostap: Johannes Berg <johannes.berg@intel.com> --- src/drivers/driver_nl80211.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-)