]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
nl80211: Reduce the number of nlctrl name resolution calls
authorMasashi Honma <masashi.honma@gmail.com>
Fri, 20 Aug 2021 09:26:33 +0000 (18:26 +0900)
committerJouni Malinen <j@w1.fi>
Wed, 25 Aug 2021 09:01:06 +0000 (12:01 +0300)
The number of nlctrl name resolution calls required to connect to a
WPA2-PSK AP is 12. And each nlctrl name resolution call spends 55 micro
seconds on a lower spec CPU like Intel Atom N270. Reduce the number of
nctrl name resolution calls from 12 to 1 by caching the results of nctrl
name resolution calls on int size memory to speed up the connection
process a little bit.

Signed-off-by: Masashi Honma <masashi.honma@gmail.com>
src/drivers/driver_nl80211.c
src/drivers/driver_nl80211.h

index 49b2f86649898678754779422b7c72bccd7347e4..447897d96fae0019f6de2588a51986608fc2e2ca 100644 (file)
@@ -604,7 +604,7 @@ static int nl_get_multicast_id(struct nl80211_global *global,
        msg = nlmsg_alloc();
        if (!msg)
                return -ENOMEM;
-       if (!genlmsg_put(msg, 0, 0, genl_ctrl_resolve(global->nl, "nlctrl"),
+       if (!genlmsg_put(msg, 0, 0, global->nlctrl_id,
                         0, 0, CTRL_CMD_GETFAMILY, 0) ||
            nla_put_string(msg, CTRL_ATTR_FAMILY_NAME, family)) {
                nlmsg_free(msg);
@@ -1883,6 +1883,13 @@ static int wpa_driver_nl80211_init_nl_global(struct nl80211_global *global)
                goto err;
        }
 
+       global->nlctrl_id = genl_ctrl_resolve(global->nl, "nlctrl");
+       if (global->nlctrl_id < 0) {
+               wpa_printf(MSG_ERROR,
+                          "nl80211: 'nlctrl' generic netlink not found");
+               goto err;
+       }
+
        global->nl_event = nl_create_handle(global->nl_cb, "event");
        if (global->nl_event == NULL)
                goto err;
index 9d61c1d6930ff812ef1eace7522f5bd3c932d072..80d4564721ade3c1db8c529bd38c97f8b89780fe 100644 (file)
@@ -32,6 +32,7 @@ struct nl80211_global {
        struct nl_cb *nl_cb;
        struct nl_sock *nl;
        int nl80211_id;
+       int nlctrl_id;
        int ioctl_sock; /* socket for ioctl() use */
 
        struct nl_sock *nl_event;