nl80211: Use one CB for driver event RX
authorJohannes Berg <johannes.berg@intel.com>
Sat, 3 Dec 2011 18:00:11 +0000 (20:00 +0200)
committerJouni Malinen <j@w1.fi>
Sat, 3 Dec 2011 18:00:11 +0000 (20:00 +0200)
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

index f670006..0a742b1 100644 (file)
@@ -216,6 +216,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];
@@ -1864,18 +1865,11 @@ static int process_event(struct nl_msg *msg, void *arg)
 static void wpa_driver_nl80211_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_event, drv);
-       nl_recvmsgs(handle, cb);
-       nl_cb_put(cb);
+       nl_recvmsgs(handle, drv->nl_cb);
 }
 
 
@@ -2243,6 +2237,16 @@ 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");
+               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_event, drv);
+
        eloop_register_read_sock(nl_socket_get_fd(drv->nl_event.handle),
                                 wpa_driver_nl80211_event_receive, drv,
                                 drv->nl_event.handle);
@@ -2719,6 +2723,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);