diff --git a/wlantest/rx_data.c b/wlantest/rx_data.c index 579c06a21..9d439be88 100644 --- a/wlantest/rx_data.c +++ b/wlantest/rx_data.c @@ -202,7 +202,7 @@ static void rx_data_bss_prot(struct wlantest *wt, size_t dlen; int tid; u8 pn[6], *rsc; - struct wlantest_tdls *tdls = NULL; + struct wlantest_tdls *tdls = NULL, *found; const u8 *tk = NULL; if (hdr->addr1[0] & 0x01) { @@ -230,17 +230,24 @@ static void rx_data_bss_prot(struct wlantest *wt, sta2 = sta_find(bss, hdr->addr1); if (sta == NULL || sta2 == NULL) return; + found = NULL; dl_list_for_each(tdls, &bss->tdls, struct wlantest_tdls, list) { if ((tdls->init == sta && tdls->resp == sta2) || (tdls->init == sta2 && tdls->resp == sta)) { - if (!tdls->link_up) - wpa_printf(MSG_DEBUG, "TDLS: Link not " - "up, but Data frame seen"); - tk = tdls->tpk.tk; - break; + found = tdls; + if (tdls->link_up) + break; } } + if (found) { + if (!found->link_up) + add_note(wt, MSG_DEBUG, + "TDLS: Link not up, but Data " + "frame seen"); + tk = found->tpk.tk; + tdls = found; + } } if ((sta == NULL || (!sta->ptk_set && sta->pairwise_cipher != WPA_CIPHER_WEP40)) && @@ -401,7 +408,7 @@ static struct wlantest_tdls * get_tdls(struct wlantest *wt, const u8 *bssid, { struct wlantest_bss *bss; struct wlantest_sta *sta1, *sta2; - struct wlantest_tdls *tdls; + struct wlantest_tdls *tdls, *found = NULL; bss = bss_find(wt, bssid); if (bss == NULL) @@ -415,11 +422,14 @@ static struct wlantest_tdls * get_tdls(struct wlantest *wt, const u8 *bssid, dl_list_for_each(tdls, &bss->tdls, struct wlantest_tdls, list) { if ((tdls->init == sta1 && tdls->resp == sta2) || - (tdls->init == sta2 && tdls->resp == sta1)) - return tdls; + (tdls->init == sta2 && tdls->resp == sta1)) { + found = tdls; + if (tdls->link_up) + break; + } } - return NULL; + return found; }