From dd1a8cef4c050866c8273955694c2142c7db0258 Mon Sep 17 00:00:00 2001 From: Jouni Malinen Date: Fri, 12 Apr 2019 20:38:08 +0300 Subject: [PATCH] Remove unnecessary copying of SSID and BSSID for external_auth The external authentication command and event does not need to copy the BSSID/SSID values into struct external_auth since those values are used before returning from the call. Simplify this by using const u8 * to external data instead of the array with a copy of the external data. Signed-off-by: Jouni Malinen --- src/ap/ieee802_11.c | 2 +- src/drivers/driver.h | 4 ++-- src/drivers/driver_nl80211.c | 5 +++-- src/drivers/driver_nl80211_event.c | 6 ++---- wpa_supplicant/sme.c | 7 +++---- 5 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index a8f3fc1d8..a8a83795e 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -708,7 +708,7 @@ static void sae_sme_send_external_auth_status(struct hostapd_data *hapd, os_memset(¶ms, 0, sizeof(params)); params.status = status; - os_memcpy(params.bssid, sta->addr, ETH_ALEN); + params.bssid = sta->addr; if (status == WLAN_STATUS_SUCCESS && sta->sae) params.pmkid = sta->sae->pmkid; diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 073c50e54..e7c8f318f 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -2163,8 +2163,8 @@ struct external_auth { EXT_AUTH_START, EXT_AUTH_ABORT, } action; - u8 bssid[ETH_ALEN]; - u8 ssid[SSID_MAX_LEN]; + const u8 *bssid; + const u8 *ssid; size_t ssid_len; unsigned int key_mgmt_suite; u16 status; diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index b934c8422..60934fbbc 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -10820,11 +10820,12 @@ static int nl80211_send_external_auth_status(void *priv, msg = nl80211_drv_msg(drv, 0, NL80211_CMD_EXTERNAL_AUTH); if (!msg || nla_put_u16(msg, NL80211_ATTR_STATUS_CODE, params->status) || - (params->ssid_len && + (params->ssid && params->ssid_len && nla_put(msg, NL80211_ATTR_SSID, params->ssid_len, params->ssid)) || (params->pmkid && nla_put(msg, NL80211_ATTR_PMKID, PMKID_LEN, params->pmkid)) || - nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid)) + (params->bssid && + nla_put(msg, NL80211_ATTR_BSSID, ETH_ALEN, params->bssid))) goto fail; ret = send_and_recv_msgs(drv, msg, NULL, NULL); msg = NULL; diff --git a/src/drivers/driver_nl80211_event.c b/src/drivers/driver_nl80211_event.c index ffddd94d2..4db79e711 100644 --- a/src/drivers/driver_nl80211_event.c +++ b/src/drivers/driver_nl80211_event.c @@ -2269,11 +2269,9 @@ static void nl80211_external_auth(struct wpa_driver_nl80211_data *drv, event.external_auth.ssid_len = nla_len(tb[NL80211_ATTR_SSID]); if (event.external_auth.ssid_len > SSID_MAX_LEN) return; - os_memcpy(event.external_auth.ssid, nla_data(tb[NL80211_ATTR_SSID]), - event.external_auth.ssid_len); + event.external_auth.ssid = nla_data(tb[NL80211_ATTR_SSID]); - os_memcpy(event.external_auth.bssid, nla_data(tb[NL80211_ATTR_BSSID]), - ETH_ALEN); + event.external_auth.bssid = nla_data(tb[NL80211_ATTR_BSSID]); wpa_printf(MSG_DEBUG, "nl80211: External auth action: %u, AKM: 0x%x", diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index 4bb5f3aef..c33d1da73 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -965,10 +965,9 @@ static void sme_send_external_auth_status(struct wpa_supplicant *wpa_s, os_memset(¶ms, 0, sizeof(params)); params.status = status; - os_memcpy(params.ssid, wpa_s->sme.ext_auth.ssid, - wpa_s->sme.ext_auth.ssid_len); + params.ssid = wpa_s->sme.ext_auth.ssid; params.ssid_len = wpa_s->sme.ext_auth.ssid_len; - os_memcpy(params.bssid, wpa_s->sme.ext_auth.bssid, ETH_ALEN); + params.bssid = wpa_s->sme.ext_auth.bssid; wpa_drv_send_external_auth_status(wpa_s, ¶ms); } @@ -978,7 +977,7 @@ static void sme_handle_external_auth_start(struct wpa_supplicant *wpa_s, { struct wpa_ssid *ssid; size_t ssid_str_len = data->external_auth.ssid_len; - u8 *ssid_str = data->external_auth.ssid; + const u8 *ssid_str = data->external_auth.ssid; /* Get the SSID conf from the ssid string obtained */ for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next) {