]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
wlantest: Select correct TDLS context if multiple exists
authorJouni Malinen <j@w1.fi>
Sun, 26 May 2013 18:46:54 +0000 (21:46 +0300)
committerJouni Malinen <j@w1.fi>
Sun, 26 May 2013 19:14:00 +0000 (22:14 +0300)
Some corner cases may result in both directions of TDLS tracking context
existing. If that is the case, the incorrect one may end up getting
picked when figuring out which TK to use for decryption or fix
statistics counter to increment. Fix this by preferring the context that
has TDLS link up.

Signed-hostap: Jouni Malinen <j@w1.fi>

wlantest/rx_data.c

index 579c06a21d0c4f42049c0867e8d018884f0c5253..9d439be88046330b14eddfe3b91d4e5c28aebb46 100644 (file)
@@ -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;
 }