GAS: Assign new dialog token even if previous one is free
authorJouni Malinen <jouni@qca.qualcomm.com>
Sun, 14 Apr 2013 20:23:50 +0000 (13:23 -0700)
committerJouni Malinen <j@w1.fi>
Mon, 20 May 2013 08:09:16 +0000 (11:09 +0300)
This makes the design more robust against unexpected duplicates since
each new GAS exchange gets a different dialog token compared to the
previous one.

Signed-hostap: Jouni Malinen <jouni@qca.qualcomm.com>

wpa_supplicant/gas_query.c

index 09d308a..38c342e 100644 (file)
@@ -466,16 +466,20 @@ int gas_query_req(struct gas_query *gas, const u8 *dst, int freq,
 {
        struct gas_query_pending *query;
        int dialog_token;
+       static int next_start = 0;
 
        if (wpabuf_len(req) < 3)
                return -1;
 
        for (dialog_token = 0; dialog_token < 256; dialog_token++) {
-               if (gas_query_dialog_token_available(gas, dst, dialog_token))
+               if (gas_query_dialog_token_available(
+                           gas, dst, (next_start + dialog_token) % 256))
                        break;
        }
        if (dialog_token == 256)
                return -1; /* Too many pending queries */
+       dialog_token = (next_start + dialog_token) % 256;
+       next_start = (dialog_token + 1) % 256;
 
        query = os_zalloc(sizeof(*query));
        if (query == NULL)