From 099224c18e26161560f8313bced13930fdb832af Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Sun, 28 Apr 2019 21:05:54 +0300 Subject: [PATCH] nl80211: Simplify if_indices tracking Maintain a single array (of struct with two int variables) instead of two independent arrays (of int) for tracking know ifindexes and reasons for having added them. The previous implementation tried to maintain two independent arrays even though they were always required to be of exactly same length and order. That had resulted in a bug earlier and the code was not exactly easy to understand either, so replace this with a single array. Signed-off-by: Jouni Malinen --- src/drivers/driver_nl80211.c | 61 +++++++++++------------------------- src/drivers/driver_nl80211.h | 13 +++++--- 2 files changed, 26 insertions(+), 48 deletions(-) diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index ab2bdaf83..ef37c8bcd 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -2010,9 +2010,8 @@ static void * wpa_driver_nl80211_drv_init(void *ctx, const char *ifname, */ drv->set_rekey_offload = 1; - drv->num_if_indices = sizeof(drv->default_if_indices) / sizeof(int); + drv->num_if_indices = ARRAY_SIZE(drv->default_if_indices); drv->if_indices = drv->default_if_indices; - drv->if_indices_reason = drv->default_if_indices_reason; drv->first_bss = os_zalloc(sizeof(*drv->first_bss)); if (!drv->first_bss) { @@ -2789,9 +2788,6 @@ static void wpa_driver_nl80211_deinit(struct i802_bss *bss) if (drv->if_indices != drv->default_if_indices) os_free(drv->if_indices); - if (drv->if_indices_reason != drv->default_if_indices_reason) - os_free(drv->if_indices_reason); - if (drv->disabled_11b_rates) nl80211_disable_11b_rates(drv, drv->ifindex, 0); @@ -6620,11 +6616,11 @@ static void dump_ifidx(struct wpa_driver_nl80211_data *drv) end = pos + sizeof(buf); for (i = 0; i < drv->num_if_indices; i++) { - if (!drv->if_indices[i]) + if (!drv->if_indices[i].ifindex) continue; res = os_snprintf(pos, end - pos, " %d(%d)", - drv->if_indices[i], - drv->if_indices_reason[i]); + drv->if_indices[i].ifindex, + drv->if_indices[i].reason); if (os_snprintf_error(end - pos, res)) break; pos += res; @@ -6640,8 +6636,7 @@ static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx, int ifidx_reason) { int i; - int *old, *old_reason; - int alloc_failed = 0; + struct drv_nl80211_if_info *old; wpa_printf(MSG_DEBUG, "nl80211: Add own interface ifindex %d (ifidx_reason %d)", @@ -6652,9 +6647,9 @@ static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx, return; } for (i = 0; i < drv->num_if_indices; i++) { - if (drv->if_indices[i] == 0) { - drv->if_indices[i] = ifidx; - drv->if_indices_reason[i] = ifidx_reason; + if (drv->if_indices[i].ifindex == 0) { + drv->if_indices[i].ifindex = ifidx; + drv->if_indices[i].reason = ifidx_reason; dump_ifidx(drv); return; } @@ -6665,31 +6660,13 @@ static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx, else old = NULL; - if (drv->if_indices_reason != drv->default_if_indices_reason) - old_reason = drv->if_indices_reason; - else - old_reason = NULL; - drv->if_indices = os_realloc_array(old, drv->num_if_indices + 1, - sizeof(int)); - drv->if_indices_reason = os_realloc_array(old_reason, - drv->num_if_indices + 1, - sizeof(int)); + sizeof(*old)); if (!drv->if_indices) { if (!old) drv->if_indices = drv->default_if_indices; else drv->if_indices = old; - alloc_failed = 1; - } - if (!drv->if_indices_reason) { - if (!old_reason) - drv->if_indices_reason = drv->default_if_indices_reason; - else - drv->if_indices_reason = old_reason; - alloc_failed = 1; - } - if (alloc_failed) { wpa_printf(MSG_ERROR, "Failed to reallocate memory for " "interfaces"); wpa_printf(MSG_ERROR, "Ignoring EAPOL on interface %d", ifidx); @@ -6698,12 +6675,8 @@ static void add_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx, if (!old) os_memcpy(drv->if_indices, drv->default_if_indices, sizeof(drv->default_if_indices)); - if (!old_reason) - os_memcpy(drv->if_indices_reason, - drv->default_if_indices_reason, - sizeof(drv->default_if_indices_reason)); - drv->if_indices[drv->num_if_indices] = ifidx; - drv->if_indices_reason[drv->num_if_indices] = ifidx_reason; + drv->if_indices[drv->num_if_indices].ifindex = ifidx; + drv->if_indices[drv->num_if_indices].reason = ifidx_reason; drv->num_if_indices++; dump_ifidx(drv); } @@ -6715,10 +6688,12 @@ static void del_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx, int i; for (i = 0; i < drv->num_if_indices; i++) { - if ((drv->if_indices[i] == ifidx || ifidx == IFIDX_ANY) && - (drv->if_indices_reason[i] == ifidx_reason || + if ((drv->if_indices[i].ifindex == ifidx || + ifidx == IFIDX_ANY) && + (drv->if_indices[i].reason == ifidx_reason || ifidx_reason == IFIDX_ANY)) { - drv->if_indices[i] = 0; + drv->if_indices[i].ifindex = 0; + drv->if_indices[i].reason = 0; break; } } @@ -6732,8 +6707,8 @@ static int have_ifidx(struct wpa_driver_nl80211_data *drv, int ifidx, int i; for (i = 0; i < drv->num_if_indices; i++) - if (drv->if_indices[i] == ifidx && - (drv->if_indices_reason[i] == ifidx_reason || + if (drv->if_indices[i].ifindex == ifidx && + (drv->if_indices[i].reason == ifidx_reason || ifidx_reason == IFIDX_ANY)) return 1; diff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h index 8c7c6a3cd..749826945 100644 --- a/src/drivers/driver_nl80211.h +++ b/src/drivers/driver_nl80211.h @@ -83,6 +83,12 @@ struct i802_bss { u8 rand_addr[ETH_ALEN]; }; +struct drv_nl80211_if_info { + int ifindex; + /* the AP/AP_VLAN iface that is in this bridge */ + int reason; +}; + struct wpa_driver_nl80211_data { struct nl80211_global *global; struct dl_list list; @@ -187,11 +193,8 @@ struct wpa_driver_nl80211_data { struct nl_handle *rtnl_sk; /* nl_sock for NETLINK_ROUTE */ - int default_if_indices[16]; - /* the AP/AP_VLAN iface that is in this bridge */ - int default_if_indices_reason[16]; - int *if_indices; - int *if_indices_reason; + struct drv_nl80211_if_info default_if_indices[16]; + struct drv_nl80211_if_info *if_indices; int num_if_indices; /* From failed authentication command */