wiphy: Store RSN IE inside struct bss

This commit is contained in:
Denis Kenzior 2015-02-24 23:11:48 -06:00
parent c9bab96237
commit 975953dd89
1 changed files with 15 additions and 12 deletions

View File

@ -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);