3
0
mirror of https://git.kernel.org/pub/scm/network/wireless/iwd.git synced 2024-12-03 17:49:24 +01:00

netdev: move request IE parsing into function

Moves the parsing of NL80211_ATTR_REQ_IE into its own parsing
function for use elsewhere.
This commit is contained in:
James Prestwood 2021-04-02 10:11:13 -07:00 committed by Denis Kenzior
parent ca085d799d
commit c390deafcb

View File

@ -1851,6 +1851,41 @@ static void netdev_send_qos_map_set(struct netdev *netdev,
netdev, NULL); netdev, NULL);
} }
static void parse_request_ies(struct netdev *netdev, const uint8_t *ies,
size_t ies_len)
{
struct ie_tlv_iter iter;
const void *data;
/*
* The driver may have modified the IEs we passed to CMD_CONNECT
* before sending them out, the actual IE sent is reflected in the
* ATTR_REQ_IE sequence. These are the values EAPoL will need to use.
*/
ie_tlv_iter_init(&iter, ies, ies_len);
while (ie_tlv_iter_next(&iter)) {
data = ie_tlv_iter_get_data(&iter);
switch (ie_tlv_iter_get_tag(&iter)) {
case IE_TYPE_RSN:
handshake_state_set_supplicant_ie(netdev->handshake,
data - 2);
break;
case IE_TYPE_VENDOR_SPECIFIC:
if (!is_ie_wpa_ie(data, ie_tlv_iter_get_length(&iter)))
break;
handshake_state_set_supplicant_ie(netdev->handshake,
data - 2);
break;
case IE_TYPE_MOBILITY_DOMAIN:
handshake_state_set_mde(netdev->handshake, data - 2);
break;
}
}
}
static void netdev_connect_event(struct l_genl_msg *msg, struct netdev *netdev) static void netdev_connect_event(struct l_genl_msg *msg, struct netdev *netdev)
{ {
struct l_genl_attr attr; struct l_genl_attr attr;
@ -1929,33 +1964,8 @@ static void netdev_connect_event(struct l_genl_msg *msg, struct netdev *netdev)
if (!ies) if (!ies)
goto process_resp_ies; goto process_resp_ies;
/*
* The driver may have modified the IEs we passed to CMD_CONNECT
* before sending them out, the actual IE sent is reflected in the
* ATTR_REQ_IE sequence. These are the values EAPoL will need to use.
*/
ie_tlv_iter_init(&iter, ies, ies_len);
while (ie_tlv_iter_next(&iter)) { parse_request_ies(netdev, ies, ies_len);
data = ie_tlv_iter_get_data(&iter);
switch (ie_tlv_iter_get_tag(&iter)) {
case IE_TYPE_RSN:
handshake_state_set_supplicant_ie(netdev->handshake,
data - 2);
break;
case IE_TYPE_VENDOR_SPECIFIC:
if (!is_ie_wpa_ie(data, ie_tlv_iter_get_length(&iter)))
break;
handshake_state_set_supplicant_ie(netdev->handshake,
data - 2);
break;
case IE_TYPE_MOBILITY_DOMAIN:
handshake_state_set_mde(netdev->handshake, data - 2);
break;
}
}
process_resp_ies: process_resp_ies:
if (resp_ies) { if (resp_ies) {