|
@@ -3262,16 +3262,6 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
|
|
if (ifmgd->associated &&
|
|
if (ifmgd->associated &&
|
|
ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid))
|
|
ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid))
|
|
ieee80211_reset_ap_probe(sdata);
|
|
ieee80211_reset_ap_probe(sdata);
|
|
-
|
|
|
|
- if (ifmgd->auth_data && !ifmgd->auth_data->bss->proberesp_ies &&
|
|
|
|
- ether_addr_equal(mgmt->bssid, ifmgd->auth_data->bss->bssid)) {
|
|
|
|
- /* got probe response, continue with auth */
|
|
|
|
- sdata_info(sdata, "direct probe responded\n");
|
|
|
|
- ifmgd->auth_data->tries = 0;
|
|
|
|
- ifmgd->auth_data->timeout = jiffies;
|
|
|
|
- ifmgd->auth_data->timeout_started = true;
|
|
|
|
- run_again(sdata, ifmgd->auth_data->timeout);
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -3717,12 +3707,14 @@ static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
|
|
reason);
|
|
reason);
|
|
}
|
|
}
|
|
|
|
|
|
-static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
|
|
|
|
|
+static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
|
|
{
|
|
{
|
|
struct ieee80211_local *local = sdata->local;
|
|
struct ieee80211_local *local = sdata->local;
|
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
|
struct ieee80211_mgd_auth_data *auth_data = ifmgd->auth_data;
|
|
struct ieee80211_mgd_auth_data *auth_data = ifmgd->auth_data;
|
|
u32 tx_flags = 0;
|
|
u32 tx_flags = 0;
|
|
|
|
+ u16 trans = 1;
|
|
|
|
+ u16 status = 0;
|
|
|
|
|
|
sdata_assert_lock(sdata);
|
|
sdata_assert_lock(sdata);
|
|
|
|
|
|
@@ -3746,54 +3738,27 @@ static int ieee80211_probe_auth(struct ieee80211_sub_if_data *sdata)
|
|
|
|
|
|
drv_mgd_prepare_tx(local, sdata);
|
|
drv_mgd_prepare_tx(local, sdata);
|
|
|
|
|
|
- if (auth_data->bss->proberesp_ies) {
|
|
|
|
- u16 trans = 1;
|
|
|
|
- u16 status = 0;
|
|
|
|
-
|
|
|
|
- sdata_info(sdata, "send auth to %pM (try %d/%d)\n",
|
|
|
|
- auth_data->bss->bssid, auth_data->tries,
|
|
|
|
- IEEE80211_AUTH_MAX_TRIES);
|
|
|
|
-
|
|
|
|
- auth_data->expected_transaction = 2;
|
|
|
|
|
|
+ sdata_info(sdata, "send auth to %pM (try %d/%d)\n",
|
|
|
|
+ auth_data->bss->bssid, auth_data->tries,
|
|
|
|
+ IEEE80211_AUTH_MAX_TRIES);
|
|
|
|
|
|
- if (auth_data->algorithm == WLAN_AUTH_SAE) {
|
|
|
|
- trans = auth_data->sae_trans;
|
|
|
|
- status = auth_data->sae_status;
|
|
|
|
- auth_data->expected_transaction = trans;
|
|
|
|
- }
|
|
|
|
|
|
+ auth_data->expected_transaction = 2;
|
|
|
|
|
|
- if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
|
|
|
- tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
|
|
|
- IEEE80211_TX_INTFL_MLME_CONN_TX;
|
|
|
|
-
|
|
|
|
- ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,
|
|
|
|
- auth_data->data, auth_data->data_len,
|
|
|
|
- auth_data->bss->bssid,
|
|
|
|
- auth_data->bss->bssid, NULL, 0, 0,
|
|
|
|
- tx_flags);
|
|
|
|
- } else {
|
|
|
|
- const u8 *ssidie;
|
|
|
|
|
|
+ if (auth_data->algorithm == WLAN_AUTH_SAE) {
|
|
|
|
+ trans = auth_data->sae_trans;
|
|
|
|
+ status = auth_data->sae_status;
|
|
|
|
+ auth_data->expected_transaction = trans;
|
|
|
|
+ }
|
|
|
|
|
|
- sdata_info(sdata, "direct probe to %pM (try %d/%i)\n",
|
|
|
|
- auth_data->bss->bssid, auth_data->tries,
|
|
|
|
- IEEE80211_AUTH_MAX_TRIES);
|
|
|
|
|
|
+ if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
|
|
|
|
+ tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
|
|
|
|
+ IEEE80211_TX_INTFL_MLME_CONN_TX;
|
|
|
|
|
|
- rcu_read_lock();
|
|
|
|
- ssidie = ieee80211_bss_get_ie(auth_data->bss, WLAN_EID_SSID);
|
|
|
|
- if (!ssidie) {
|
|
|
|
- rcu_read_unlock();
|
|
|
|
- return -EINVAL;
|
|
|
|
- }
|
|
|
|
- /*
|
|
|
|
- * Direct probe is sent to broadcast address as some APs
|
|
|
|
- * will not answer to direct packet in unassociated state.
|
|
|
|
- */
|
|
|
|
- ieee80211_send_probe_req(sdata, sdata->vif.addr, NULL,
|
|
|
|
- ssidie + 2, ssidie[1],
|
|
|
|
- NULL, 0, (u32) -1, true, 0,
|
|
|
|
- auth_data->bss->channel, false);
|
|
|
|
- rcu_read_unlock();
|
|
|
|
- }
|
|
|
|
|
|
+ ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,
|
|
|
|
+ auth_data->data, auth_data->data_len,
|
|
|
|
+ auth_data->bss->bssid,
|
|
|
|
+ auth_data->bss->bssid, NULL, 0, 0,
|
|
|
|
+ tx_flags);
|
|
|
|
|
|
if (tx_flags == 0) {
|
|
if (tx_flags == 0) {
|
|
auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
|
|
auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
|
|
@@ -3874,8 +3839,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
|
bool status_acked = ifmgd->status_acked;
|
|
bool status_acked = ifmgd->status_acked;
|
|
|
|
|
|
ifmgd->status_received = false;
|
|
ifmgd->status_received = false;
|
|
- if (ifmgd->auth_data &&
|
|
|
|
- (ieee80211_is_probe_req(fc) || ieee80211_is_auth(fc))) {
|
|
|
|
|
|
+ if (ifmgd->auth_data && ieee80211_is_auth(fc)) {
|
|
if (status_acked) {
|
|
if (status_acked) {
|
|
ifmgd->auth_data->timeout =
|
|
ifmgd->auth_data->timeout =
|
|
jiffies + IEEE80211_AUTH_TIMEOUT_SHORT;
|
|
jiffies + IEEE80211_AUTH_TIMEOUT_SHORT;
|
|
@@ -3906,7 +3870,7 @@ void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
|
|
* so let's just kill the auth data
|
|
* so let's just kill the auth data
|
|
*/
|
|
*/
|
|
ieee80211_destroy_auth_data(sdata, false);
|
|
ieee80211_destroy_auth_data(sdata, false);
|
|
- } else if (ieee80211_probe_auth(sdata)) {
|
|
|
|
|
|
+ } else if (ieee80211_auth(sdata)) {
|
|
u8 bssid[ETH_ALEN];
|
|
u8 bssid[ETH_ALEN];
|
|
struct ieee80211_event event = {
|
|
struct ieee80211_event event = {
|
|
.type = MLME_EVENT,
|
|
.type = MLME_EVENT,
|
|
@@ -4597,7 +4561,7 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
|
if (err)
|
|
if (err)
|
|
goto err_clear;
|
|
goto err_clear;
|
|
|
|
|
|
- err = ieee80211_probe_auth(sdata);
|
|
|
|
|
|
+ err = ieee80211_auth(sdata);
|
|
if (err) {
|
|
if (err) {
|
|
sta_info_destroy_addr(sdata, req->bss->bssid);
|
|
sta_info_destroy_addr(sdata, req->bss->bssid);
|
|
goto err_clear;
|
|
goto err_clear;
|