TDLS: Do not reenable TDLS link on retransmitted setup frame
A reenable of the TDLS link while the host driver is already processing the same (due to the retransmitted M2/M3 frames) might result in a failed TDLS setup handshake due to some host driver's implementation. Thus, issue enable link only when the peer's TDLS status signifies no prior link (tpk_success=0). Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
cc14091eab
commit
179fc5527d
1 changed files with 29 additions and 13 deletions
|
@ -1839,7 +1839,7 @@ static int wpa_tdls_process_tpk_m2(struct wpa_sm *sm, const u8 *src_addr,
|
||||||
int ielen;
|
int ielen;
|
||||||
u16 status;
|
u16 status;
|
||||||
const u8 *pos;
|
const u8 *pos;
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Received TDLS Setup Response / TPK M2 "
|
wpa_printf(MSG_DEBUG, "TDLS: Received TDLS Setup Response / TPK M2 "
|
||||||
"(Peer " MACSTR ")", MAC2STR(src_addr));
|
"(Peer " MACSTR ")", MAC2STR(src_addr));
|
||||||
|
@ -2056,11 +2056,19 @@ skip_rsn:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = wpa_tdls_enable_link(sm, peer);
|
if (!peer->tpk_success) {
|
||||||
if (ret < 0) {
|
/*
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Could not enable link");
|
* Enable Link only when tpk_success is 0, signifying that this
|
||||||
wpa_tdls_do_teardown(sm, peer,
|
* processing of TPK M2 frame is not because of a retransmission
|
||||||
WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
|
* during TDLS setup handshake.
|
||||||
|
*/
|
||||||
|
ret = wpa_tdls_enable_link(sm, peer);
|
||||||
|
if (ret < 0) {
|
||||||
|
wpa_printf(MSG_DEBUG, "TDLS: Could not enable link");
|
||||||
|
wpa_tdls_do_teardown(
|
||||||
|
sm, peer,
|
||||||
|
WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -2084,7 +2092,7 @@ static int wpa_tdls_process_tpk_m3(struct wpa_sm *sm, const u8 *src_addr,
|
||||||
u16 status;
|
u16 status;
|
||||||
const u8 *pos;
|
const u8 *pos;
|
||||||
u32 lifetime;
|
u32 lifetime;
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Received TDLS Setup Confirm / TPK M3 "
|
wpa_printf(MSG_DEBUG, "TDLS: Received TDLS Setup Confirm / TPK M3 "
|
||||||
"(Peer " MACSTR ")", MAC2STR(src_addr));
|
"(Peer " MACSTR ")", MAC2STR(src_addr));
|
||||||
|
@ -2201,11 +2209,19 @@ static int wpa_tdls_process_tpk_m3(struct wpa_sm *sm, const u8 *src_addr,
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_rsn:
|
skip_rsn:
|
||||||
ret = wpa_tdls_enable_link(sm, peer);
|
if (!peer->tpk_success) {
|
||||||
if (ret < 0) {
|
/*
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Could not enable link");
|
* Enable Link only when tpk_success is 0, signifying that this
|
||||||
wpa_tdls_do_teardown(sm, peer,
|
* processing of TPK M3 frame is not because of a retransmission
|
||||||
WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
|
* during TDLS setup handshake.
|
||||||
|
*/
|
||||||
|
ret = wpa_tdls_enable_link(sm, peer);
|
||||||
|
if (ret < 0) {
|
||||||
|
wpa_printf(MSG_DEBUG, "TDLS: Could not enable link");
|
||||||
|
wpa_tdls_do_teardown(
|
||||||
|
sm, peer,
|
||||||
|
WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
error:
|
error:
|
||||||
|
@ -2306,7 +2322,7 @@ void wpa_tdls_remove(struct wpa_sm *sm, const u8 *addr)
|
||||||
* Disable previous link to allow renegotiation to be completed
|
* Disable previous link to allow renegotiation to be completed
|
||||||
* on AP path.
|
* on AP path.
|
||||||
*/
|
*/
|
||||||
wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
|
wpa_tdls_disable_peer_link(sm, peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue