TDLS: Remove peer from global peer-list on free
There is no need to keep the peer entry in memory after the link has been removed. Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com> Tested-by: Ilan Peer <ilan.peer@intel.com>
This commit is contained in:
parent
5841958f26
commit
819c943a3b
1 changed files with 54 additions and 21 deletions
|
@ -631,7 +631,33 @@ static void wpa_tdls_tpk_timeout(void *eloop_ctx, void *timeout_ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
|
static void wpa_tdls_peer_remove_from_list(struct wpa_sm *sm,
|
||||||
|
struct wpa_tdls_peer *peer)
|
||||||
|
{
|
||||||
|
struct wpa_tdls_peer *cur, *prev;
|
||||||
|
|
||||||
|
cur = sm->tdls;
|
||||||
|
prev = NULL;
|
||||||
|
while (cur && cur != peer) {
|
||||||
|
prev = cur;
|
||||||
|
cur = cur->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cur != peer) {
|
||||||
|
wpa_printf(MSG_ERROR, "TDLS: Could not find peer " MACSTR
|
||||||
|
" to remove it from the list",
|
||||||
|
MAC2STR(peer->addr));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (prev)
|
||||||
|
prev->next = peer->next;
|
||||||
|
else
|
||||||
|
sm->tdls = peer->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void wpa_tdls_peer_clear(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
|
||||||
{
|
{
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Clear state for peer " MACSTR,
|
wpa_printf(MSG_DEBUG, "TDLS: Clear state for peer " MACSTR,
|
||||||
MAC2STR(peer->addr));
|
MAC2STR(peer->addr));
|
||||||
|
@ -663,6 +689,14 @@ static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void wpa_tdls_peer_free(struct wpa_sm *sm, struct wpa_tdls_peer *peer)
|
||||||
|
{
|
||||||
|
wpa_tdls_peer_clear(sm, peer);
|
||||||
|
wpa_tdls_peer_remove_from_list(sm, peer);
|
||||||
|
os_free(peer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void wpa_tdls_linkid(struct wpa_sm *sm, struct wpa_tdls_peer *peer,
|
static void wpa_tdls_linkid(struct wpa_sm *sm, struct wpa_tdls_peer *peer,
|
||||||
struct wpa_tdls_lnkid *lnkid)
|
struct wpa_tdls_lnkid *lnkid)
|
||||||
{
|
{
|
||||||
|
@ -1644,16 +1678,16 @@ static int wpa_tdls_process_tpk_m1(struct wpa_sm *sm, const u8 *src_addr,
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: TDLS Setup Request while "
|
wpa_printf(MSG_DEBUG, "TDLS: TDLS Setup Request while "
|
||||||
"direct link is enabled - tear down the "
|
"direct link is enabled - tear down the "
|
||||||
"old link first");
|
"old link first");
|
||||||
wpa_tdls_disable_peer_link(sm, peer);
|
wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
|
||||||
}
|
wpa_tdls_peer_clear(sm, peer);
|
||||||
|
} else if (peer->initiator) {
|
||||||
/*
|
/*
|
||||||
* An entry is already present, so check if we already sent a
|
* An entry is already present, so check if we already
|
||||||
* TDLS Setup Request. If so, compare MAC addresses and let the
|
* sent a TDLS Setup Request. If so, compare MAC
|
||||||
* STA with the lower MAC address continue as the initiator.
|
* addresses and let the STA with the lower MAC address
|
||||||
* The other negotiation is terminated.
|
* continue as the initiator. The other negotiation is
|
||||||
|
* terminated.
|
||||||
*/
|
*/
|
||||||
if (peer->initiator) {
|
|
||||||
if (os_memcmp(sm->own_addr, src_addr, ETH_ALEN) < 0) {
|
if (os_memcmp(sm->own_addr, src_addr, ETH_ALEN) < 0) {
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Discard request "
|
wpa_printf(MSG_DEBUG, "TDLS: Discard request "
|
||||||
"from peer with higher address "
|
"from peer with higher address "
|
||||||
|
@ -1665,7 +1699,9 @@ static int wpa_tdls_process_tpk_m1(struct wpa_sm *sm, const u8 *src_addr,
|
||||||
MACSTR " (terminate previously "
|
MACSTR " (terminate previously "
|
||||||
"initiated negotiation",
|
"initiated negotiation",
|
||||||
MAC2STR(src_addr));
|
MAC2STR(src_addr));
|
||||||
wpa_tdls_disable_peer_link(sm, peer);
|
wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK,
|
||||||
|
peer->addr);
|
||||||
|
wpa_tdls_peer_clear(sm, peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1918,7 +1954,7 @@ skip_rsn_check:
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Response / TPK M2");
|
wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Response / TPK M2");
|
||||||
if (wpa_tdls_send_tpk_m2(sm, src_addr, dtoken, lnkid, peer) < 0) {
|
if (wpa_tdls_send_tpk_m2(sm, src_addr, dtoken, lnkid, peer) < 0) {
|
||||||
wpa_tdls_disable_peer_link(sm, peer);
|
wpa_sm_tdls_oper(sm, TDLS_DISABLE_LINK, peer->addr);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2226,10 +2262,8 @@ skip_rsn:
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Confirm / "
|
wpa_printf(MSG_DEBUG, "TDLS: Sending TDLS Setup Confirm / "
|
||||||
"TPK Handshake Message 3");
|
"TPK Handshake Message 3");
|
||||||
if (wpa_tdls_send_tpk_m3(sm, src_addr, dtoken, lnkid, peer) < 0) {
|
if (wpa_tdls_send_tpk_m3(sm, src_addr, dtoken, lnkid, peer) < 0)
|
||||||
wpa_tdls_disable_peer_link(sm, peer);
|
goto error;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!peer->tpk_success) {
|
if (!peer->tpk_success) {
|
||||||
/*
|
/*
|
||||||
|
@ -2621,13 +2655,14 @@ int wpa_tdls_init(struct wpa_sm *sm)
|
||||||
|
|
||||||
void wpa_tdls_teardown_peers(struct wpa_sm *sm)
|
void wpa_tdls_teardown_peers(struct wpa_sm *sm)
|
||||||
{
|
{
|
||||||
struct wpa_tdls_peer *peer;
|
struct wpa_tdls_peer *peer, *tmp;
|
||||||
|
|
||||||
peer = sm->tdls;
|
peer = sm->tdls;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Tear down peers");
|
wpa_printf(MSG_DEBUG, "TDLS: Tear down peers");
|
||||||
|
|
||||||
while (peer) {
|
while (peer) {
|
||||||
|
tmp = peer->next;
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Tear down peer " MACSTR,
|
wpa_printf(MSG_DEBUG, "TDLS: Tear down peer " MACSTR,
|
||||||
MAC2STR(peer->addr));
|
MAC2STR(peer->addr));
|
||||||
if (sm->tdls_external_setup)
|
if (sm->tdls_external_setup)
|
||||||
|
@ -2636,7 +2671,7 @@ void wpa_tdls_teardown_peers(struct wpa_sm *sm)
|
||||||
else
|
else
|
||||||
wpa_sm_tdls_oper(sm, TDLS_TEARDOWN, peer->addr);
|
wpa_sm_tdls_oper(sm, TDLS_TEARDOWN, peer->addr);
|
||||||
|
|
||||||
peer = peer->next;
|
peer = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2646,7 +2681,6 @@ static void wpa_tdls_remove_peers(struct wpa_sm *sm)
|
||||||
struct wpa_tdls_peer *peer, *tmp;
|
struct wpa_tdls_peer *peer, *tmp;
|
||||||
|
|
||||||
peer = sm->tdls;
|
peer = sm->tdls;
|
||||||
sm->tdls = NULL;
|
|
||||||
|
|
||||||
while (peer) {
|
while (peer) {
|
||||||
int res;
|
int res;
|
||||||
|
@ -2655,7 +2689,6 @@ static void wpa_tdls_remove_peers(struct wpa_sm *sm)
|
||||||
wpa_printf(MSG_DEBUG, "TDLS: Remove peer " MACSTR " (res=%d)",
|
wpa_printf(MSG_DEBUG, "TDLS: Remove peer " MACSTR " (res=%d)",
|
||||||
MAC2STR(peer->addr), res);
|
MAC2STR(peer->addr), res);
|
||||||
wpa_tdls_peer_free(sm, peer);
|
wpa_tdls_peer_free(sm, peer);
|
||||||
os_free(peer);
|
|
||||||
peer = tmp;
|
peer = tmp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue