mirror of
https://git.kernel.org/pub/scm/network/wireless/iwd.git
synced 2024-12-23 14:22:36 +01:00
station: Set network's vendor IEs into handshake
This guarantees that the vendor IEs will be used on ReAssociate and Fast-Transition paths, as well as on all non-CMD_CONNECT based connections.
This commit is contained in:
parent
7e9971661b
commit
da0fa4e012
@ -1608,14 +1608,6 @@ void network_blacklist_add(struct network *network, struct scan_bss *bss)
|
||||
l_queue_push_head(network->blacklist, bss);
|
||||
}
|
||||
|
||||
const struct iovec *network_get_extra_ies(struct network *network,
|
||||
size_t *num_elems)
|
||||
{
|
||||
struct scan_bss *bss = network_bss_select(network, false);
|
||||
|
||||
return network_info_get_extra_ies(network->info, bss, num_elems);
|
||||
}
|
||||
|
||||
static bool network_property_get_name(struct l_dbus *dbus,
|
||||
struct l_dbus_message *message,
|
||||
struct l_dbus_message_builder *builder,
|
||||
|
@ -85,9 +85,6 @@ struct l_dbus_message *network_connect_new_hidden_network(
|
||||
|
||||
void network_blacklist_add(struct network *network, struct scan_bss *bss);
|
||||
|
||||
const struct iovec *network_get_extra_ies(struct network *network,
|
||||
size_t *num_elems);
|
||||
|
||||
struct erp_cache_entry *network_get_erp_cache(struct network *network);
|
||||
|
||||
const struct l_queue_entry *network_bss_list_get_entries(
|
||||
|
@ -891,7 +891,10 @@ static struct handshake_state *station_handshake_setup(struct station *station,
|
||||
struct scan_bss *bss)
|
||||
{
|
||||
struct wiphy *wiphy = station->wiphy;
|
||||
const struct network_info *info = network_get_info(network);
|
||||
struct handshake_state *hs;
|
||||
const struct iovec *vendor_ies;
|
||||
size_t iov_elems = 0;
|
||||
|
||||
hs = netdev_handshake_state_new(station->netdev);
|
||||
|
||||
@ -905,6 +908,9 @@ static struct handshake_state *station_handshake_setup(struct station *station,
|
||||
if (network_handshake_setup(network, hs) < 0)
|
||||
goto not_supported;
|
||||
|
||||
vendor_ies = network_info_get_extra_ies(info, bss, &iov_elems);
|
||||
handshake_state_set_vendor_ies(hs, vendor_ies, iov_elems);
|
||||
|
||||
return hs;
|
||||
|
||||
not_supported:
|
||||
@ -1720,6 +1726,10 @@ static void station_transition_start(struct station *station,
|
||||
|
||||
/* Can we use Fast Transition? */
|
||||
if (station_can_fast_transition(hs, bss)) {
|
||||
const struct network_info *info = network_get_info(connected);
|
||||
const struct iovec *vendor_ies;
|
||||
size_t iov_elems = 0;
|
||||
|
||||
/* Rebuild handshake RSN for target AP */
|
||||
if (station_build_handshake_rsn(hs, station->wiphy,
|
||||
station->connected_network, bss) < 0) {
|
||||
@ -1728,6 +1738,10 @@ static void station_transition_start(struct station *station,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Reset the vendor_ies in case they're different */
|
||||
vendor_ies = network_info_get_extra_ies(info, bss, &iov_elems);
|
||||
handshake_state_set_vendor_ies(hs, vendor_ies, iov_elems);
|
||||
|
||||
/* FT-over-DS can be better suited for these situations */
|
||||
if ((hs->mde[4] & 1) && station->signal_low) {
|
||||
ret = netdev_fast_transition_over_ds(station->netdev,
|
||||
@ -2548,8 +2562,6 @@ static void station_netdev_event(struct netdev *netdev, enum netdev_event event,
|
||||
int __station_connect_network(struct station *station, struct network *network,
|
||||
struct scan_bss *bss)
|
||||
{
|
||||
const struct iovec *extra_ies;
|
||||
size_t iov_elems = 0;
|
||||
struct handshake_state *hs;
|
||||
int r;
|
||||
|
||||
@ -2557,10 +2569,8 @@ int __station_connect_network(struct station *station, struct network *network,
|
||||
if (!hs)
|
||||
return -ENOTSUP;
|
||||
|
||||
extra_ies = network_get_extra_ies(network, &iov_elems);
|
||||
|
||||
r = netdev_connect(station->netdev, bss, hs, extra_ies,
|
||||
iov_elems, station_netdev_event,
|
||||
r = netdev_connect(station->netdev, bss, hs, NULL, 0,
|
||||
station_netdev_event,
|
||||
station_connect_cb, station);
|
||||
if (r < 0) {
|
||||
handshake_state_free(hs);
|
||||
|
Loading…
Reference in New Issue
Block a user