From 975953dd8980fb50515dfc7f7d0a2721384f7028 Mon Sep 17 00:00:00 2001 From: Denis Kenzior Date: Tue, 24 Feb 2015 23:11:48 -0600 Subject: [PATCH] wiphy: Store RSN IE inside struct bss --- src/wiphy.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/wiphy.c b/src/wiphy.c index ee29afe3..84e5382c 100644 --- a/src/wiphy.c +++ b/src/wiphy.c @@ -58,6 +58,7 @@ struct bss { uint32_t frequency; int32_t signal_strength; uint16_t capability; + uint8_t rsne[256]; }; struct netdev { @@ -766,7 +767,6 @@ error: } static bool parse_ie(struct bss *bss, const uint8_t **ssid, int *ssid_len, - struct ie_rsn_info *rsne, const void *data, uint16_t len) { struct ie_tlv_iter iter; @@ -775,7 +775,6 @@ static bool parse_ie(struct bss *bss, const uint8_t **ssid, int *ssid_len, while (ie_tlv_iter_next(&iter)) { uint8_t tag = ie_tlv_iter_get_tag(&iter); - int ret; switch (tag) { case IE_TYPE_SSID: @@ -788,13 +787,7 @@ static bool parse_ie(struct bss *bss, const uint8_t **ssid, int *ssid_len, *ssid = iter.data; break; case IE_TYPE_RSN: - ret = ie_parse_rsne_from_data(iter.data - 2, - iter.len + 2, rsne); - if (ret < 0) { - l_debug("Cannot parse RSN field (%d, %s)", - ret, strerror(-ret)); - return false; - } + memcpy(bss->rsne, iter.data - 2, iter.len + 2); break; default: break; @@ -823,9 +816,10 @@ static void parse_bss(struct netdev *netdev, struct l_genl_attr *attr) const uint8_t *ssid = NULL; int ssid_len; struct network *network = NULL; - struct ie_rsn_info rsne = { 0 }; + struct ie_rsn_info rsne; enum scan_ssid_security ssid_security; const char *id; + int res; bss = l_new(struct bss, 1); @@ -864,8 +858,7 @@ static void parse_bss(struct netdev *netdev, struct l_genl_attr *attr) bss->signal_strength = *((int32_t *) data); break; case NL80211_BSS_INFORMATION_ELEMENTS: - if (!parse_ie(bss, &ssid, &ssid_len, &rsne, data, - len)) { + if (!parse_ie(bss, &ssid, &ssid_len, data, len)) { l_warn("Could not parse BSS IEs"); goto fail; } @@ -879,6 +872,16 @@ static void parse_bss(struct netdev *netdev, struct l_genl_attr *attr) goto fail; } + /* + * Length was already validated by parse_ie, so use the one from the + * IE directly. + */ + res = ie_parse_rsne_from_data(bss->rsne, bss->rsne[1] + 2, &rsne); + if (res < 0) { + l_debug("Cannot parse RSN field (%d, %s)", res, strerror(-res)); + goto fail; + } + ssid_security = scan_get_ssid_security(bss->capability, &rsne); id = iwd_network_get_id(ssid, ssid_len, ssid_security);