From a7a830950a9455b1e674c2b952099260dd9a3cf9 Mon Sep 17 00:00:00 2001 From: Eneas U de Queiroz Date: Mon, 12 Jul 2021 15:20:10 -0300 Subject: [PATCH] List all neighbors with same score when kicking The wnm_disassoc_imminent procedure takes a list of neighbor reports to send to the client. Instead of picking just one AP to be sent, send all that have the same score. Signed-off-by: Eneas U de Queiroz --- src/include/datastorage.h | 7 +- src/include/mac_utils.h | 3 + src/include/ubus.h | 2 +- src/storage/datastorage.c | 78 +++++++--- src/test/kick_deep.script | 20 +-- src/test/scale_kick_100_3000_b.script | 200 +++++++++++++------------- src/test/scale_test_A.script | 20 +-- src/test/simple_kick.script | 4 +- src/test/test_storage.c | 19 ++- src/utils/ubus.c | 11 +- 10 files changed, 211 insertions(+), 153 deletions(-) diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 59f81fd..2553359 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -347,9 +347,14 @@ void send_beacon_reports(ap *a, int id); #define SORT_LENGTH 5 extern char sort_string[]; +struct kicking_nr { + char nr[NEIGHBOR_REPORT_LEN]; + int score; + struct kicking_nr *next; +}; // ---------------- Functions ------------------- -int better_ap_available(ap *kicking_ap, struct dawn_mac client_addr, char* neighbor_report); +int better_ap_available(ap *kicking_ap, struct dawn_mac client_addr, struct kicking_nr** neighbor_report); // All users of datastorage should call init_ / destroy_mutex at initialisation and termination respectively int init_mutex(); diff --git a/src/include/mac_utils.h b/src/include/mac_utils.h index 3c1299f..04b0dee 100644 --- a/src/include/mac_utils.h +++ b/src/include/mac_utils.h @@ -10,6 +10,9 @@ #define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X" #define MACSTRLOWER "%02x:%02x:%02x:%02x:%02x:%02x" +#define NR_MACSTR "%c%c:%c%c:%c%c:%c%c:%c%c:%c%c" +#define NR_MAC2STR(a) *a, *(a+1), *(a+2), *(a+3), *(a+4), *(a+5), *(a+6), *(a+7), *(a+8), *(a+9), *(a+10), *(a+11) + #ifndef ETH_ALEN #define ETH_ALEN 6 #endif diff --git a/src/include/ubus.h b/src/include/ubus.h index 855f7b6..4ad2893 100644 --- a/src/include/ubus.h +++ b/src/include/ubus.h @@ -139,7 +139,7 @@ int send_set_probe(struct dawn_mac client_addr); * @param duration * @return - 0 = asynchronous (client has been told to remove itself, and caller should manage arrays); 1 = synchronous (caller should assume arrays are updated) */ -int wnm_disassoc_imminent(uint32_t id, const struct dawn_mac client_addr, char* dest_ap, uint32_t duration); +int wnm_disassoc_imminent(uint32_t id, const struct dawn_mac client_addr, struct kicking_nr* neighbor_list, uint32_t duration); /** * Send control message to all hosts to add the mac to a don't control list. diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index dcb1751..d3fe5c6 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -20,7 +20,7 @@ struct time_config_s timeout_config; static int probe_compare(probe_entry *probe1, probe_entry *probe2); -static int kick_client(ap *kicking_ap, struct client_s *client_entry, char* neighbor_report); +static int kick_client(ap* kicking_ap, struct client_s *client_entry, struct kicking_nr** neighbor_report); static void print_ap_entry(ap *entry); @@ -463,10 +463,36 @@ static int compare_station_count(ap* ap_entry_own, ap* ap_entry_to_compare, stru } printf("Comparing own station count %d to %d\n", sta_count, sta_count_to_compare); - return sta_count - sta_count_to_compare > dawn_metric.max_station_diff; + if (sta_count - sta_count_to_compare > dawn_metric.max_station_diff) + return 1; + else if (sta_count_to_compare - sta_count > dawn_metric.max_station_diff) + return -1; + else + return 0; } -int better_ap_available(ap *kicking_ap, struct dawn_mac client_mac, char* neighbor_report) { +static struct kicking_nr *insert_kicking_nr(struct kicking_nr *nr_list, char *nr, int score) { + struct kicking_nr *new_entry; + + if (!(new_entry = dawn_malloc(sizeof (struct kicking_nr)))) + return NULL; + strncpy(new_entry->nr, nr, NEIGHBOR_REPORT_LEN); + new_entry->score = score; + new_entry->next = nr_list; + return new_entry; +} + +static void remove_kicking_nr_list(struct kicking_nr *nr_list) { + struct kicking_nr *n; + + while(nr_list) { + n = nr_list->next; + dawn_free(nr_list); + nr_list = n; + } +} + +int better_ap_available(ap *kicking_ap, struct dawn_mac client_mac, struct kicking_nr **neighbor_report) { // This remains set to the current AP of client for rest of function probe_entry* own_probe = *probe_array_find_first_entry(client_mac, kicking_ap->bssid_addr, true); @@ -515,32 +541,40 @@ int better_ap_available(ap *kicking_ap, struct dawn_mac client_mac, char* neighb if (score_to_compare > max_score) { if(neighbor_report == NULL) { - fprintf(stderr,"Neigbor-Report is NULL!\n"); + fprintf(stderr,"Neighbor-Report is NULL!\n"); return 1; // TODO: Should this be -1? } kick = 1; - // instead of returning we append a neighbor report list... - strcpy(neighbor_report, candidate_ap->neighbor_report); + // instead of returning we create a neighbor report list... + remove_kicking_nr_list(*neighbor_report); + *neighbor_report = insert_kicking_nr(NULL, candidate_ap->neighbor_report, score_to_compare); max_score = score_to_compare; } // if ap have same value but station count is different... // TODO: Is absolute number meaningful when AP have diffeent capacity? else if (dawn_metric.use_station_count > 0 && score_to_compare == max_score ) { + int compare = compare_station_count(kicking_ap, candidate_ap, client_mac); - if (compare_station_count(kicking_ap, candidate_ap, client_mac)) { + if (compare > 0) { if (neighbor_report == NULL) { - fprintf(stderr, "Neigbor-Report is NULL!\n"); + fprintf(stderr, "Neighbor-Report is NULL!\n"); return 1; // TODO: Should this be -1? } kick = 1; - - strcpy(neighbor_report, candidate_ap->neighbor_report); + remove_kicking_nr_list(*neighbor_report); + *neighbor_report = insert_kicking_nr(NULL, candidate_ap->neighbor_report, score_to_compare); } + else if (compare == 0 && kick) { + *neighbor_report = insert_kicking_nr(*neighbor_report, candidate_ap->neighbor_report, score_to_compare); + } + } + else if (score_to_compare == max_score && kick) { + *neighbor_report = insert_kicking_nr(*neighbor_report, candidate_ap->neighbor_report, score_to_compare); } i = i->next_probe; @@ -549,7 +583,7 @@ int better_ap_available(ap *kicking_ap, struct dawn_mac client_mac, char* neighb return kick; } -static int kick_client(ap* kicking_ap, struct client_s *client_entry, char* neighbor_report) { +static int kick_client(ap* kicking_ap, struct client_s *client_entry, struct kicking_nr** neighbor_report) { int ret = 0; if (!mac_in_maclist(client_entry->client_addr)) { @@ -575,10 +609,11 @@ int kick_clients(ap* kicking_ap, uint32_t id) { // Go threw clients while (j != NULL && mac_is_equal_bb(j->bssid_addr, kicking_ap->bssid_addr)) { - char neighbor_report[NEIGHBOR_REPORT_LEN] = ""; + struct kicking_nr *neighbor_report = NULL; - int do_kick = kick_client(kicking_ap, j, neighbor_report); - printf("Chosen AP %s\n", neighbor_report); + int do_kick = kick_client(kicking_ap, j, &neighbor_report); + for (struct kicking_nr *n = neighbor_report; n; n = n->next) + printf("Chosen AP candidate: " NR_MACSTR ", score=%d\n", NR_MAC2STR(n->nr), n->score); // better ap available if (do_kick > 0) { @@ -596,7 +631,8 @@ int kick_clients(ap* kicking_ap, uint32_t id) { printf("Check if client is active receiving!\n"); float rx_rate, tx_rate; - if (get_bandwidth_iwinfo(j->client_addr, &rx_rate, &tx_rate)) { + bool have_bandwidth_iwinfo = !(get_bandwidth_iwinfo(j->client_addr, &rx_rate, &tx_rate)); + if (!have_bandwidth_iwinfo && dawn_metric.bandwidth_threshold > 0) { printf("No active transmission data for client. Don't kick!\n"); } else @@ -604,12 +640,16 @@ int kick_clients(ap* kicking_ap, uint32_t id) { // only use rx_rate for indicating if transmission is going on // <= 6MBits <- probably no transmission // tx_rate has always some weird value so don't use ist - if (rx_rate > dawn_metric.bandwidth_threshold) { + if (have_bandwidth_iwinfo && rx_rate > dawn_metric.bandwidth_threshold) { printf("Client is probably in active transmisison. Don't kick! RxRate is: %f\n", rx_rate); } else { - printf("Client is probably NOT in active transmisison. KICK! RxRate is: %f\n", rx_rate); + if (have_bandwidth_iwinfo) + printf("Client is probably NOT in active transmisison. KICK! RxRate is: %f\n", rx_rate); + else + printf("No active tranmission data for client, but bandwidth_threshold=%d means we don't care. KICK!\n", + dawn_metric.bandwidth_threshold); // here we should send a messsage to set the probe.count for all aps to the min that there is no delay between switching // the hearing map is full... @@ -632,6 +672,8 @@ int kick_clients(ap* kicking_ap, uint32_t id) { // don't delete clients in a row. use update function again... // -> chan_util update, ... add_client_update_timer(timeout_config.update_client * 1000 / 4); + remove_kicking_nr_list(neighbor_report); + neighbor_report = NULL; break; } } @@ -653,6 +695,8 @@ int kick_clients(ap* kicking_ap, uint32_t id) { j->kick_count = 0; } + remove_kicking_nr_list(neighbor_report); + neighbor_report = NULL; j = j->next_entry_bc; } diff --git a/src/test/kick_deep.script b/src/test/kick_deep.script index 4e89139..60516e2 100644 --- a/src/test/kick_deep.script +++ b/src/test/kick_deep.script @@ -12,16 +12,16 @@ dawn min_kick_count=1 #AP -ap bssid=0A:7B:AA:00:01:00 ht_sup=1 vht_sup=1 util=156 stations=13 ssid=aTestSSID weight=10 neighbors=0A:7B:AA:00:01:00 -ap bssid=02:67:AA:00:02:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=02:67:AA:00:02:00 -ap bssid=14:02:AA:00:03:00 ht_sup=1 vht_sup=1 util=126 stations=9 ssid=aTestSSID weight=10 neighbors=14:02:AA:00:03:00 -ap bssid=1F:36:AA:00:04:00 ht_sup=0 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=1F:36:AA:00:04:00 -ap bssid=69:E9:AA:00:05:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=69:E9:AA:00:05:00 -ap bssid=6A:97:AA:00:06:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=6A:97:AA:00:06:00 -ap bssid=45:63:AA:00:07:00 ht_sup=0 vht_sup=0 util=55 stations=5 ssid=aTestSSID weight=10 neighbors=45:63:AA:00:07:00 -ap bssid=07:1E:AA:00:08:00 ht_sup=1 vht_sup=1 util=88 stations=8 ssid=aTestSSID weight=10 neighbors=07:1E:AA:00:08:00 -ap bssid=45:A2:AA:00:09:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=45:A2:AA:00:09:00 -ap bssid=4C:4D:AA:00:0A:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=4C:4D:AA:00:0A:00 +ap bssid=0A:7B:AA:00:01:00 ht_sup=1 vht_sup=1 util=156 stations=13 ssid=aTestSSID weight=10 neighbors=0A7BAA000100 +ap bssid=02:67:AA:00:02:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=0267AA000200 +ap bssid=14:02:AA:00:03:00 ht_sup=1 vht_sup=1 util=126 stations=9 ssid=aTestSSID weight=10 neighbors=1402AA000300 +ap bssid=1F:36:AA:00:04:00 ht_sup=0 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=1F36AA000400 +ap bssid=69:E9:AA:00:05:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=69E9AA000500 +ap bssid=6A:97:AA:00:06:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=6A97AA000600 +ap bssid=45:63:AA:00:07:00 ht_sup=0 vht_sup=0 util=55 stations=5 ssid=aTestSSID weight=10 neighbors=4563AA000700 +ap bssid=07:1E:AA:00:08:00 ht_sup=1 vht_sup=1 util=88 stations=8 ssid=aTestSSID weight=10 neighbors=071EAA000800 +ap bssid=45:A2:AA:00:09:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=45A2AA000900 +ap bssid=4C:4D:AA:00:0A:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=4C4DAA000A00 #Client client client=50:7B:DD:00:01:00 bssid=45:A2:AA:00:09:00 freq=2500 ht_cap=1 vht_cap=1 diff --git a/src/test/scale_kick_100_3000_b.script b/src/test/scale_kick_100_3000_b.script index 9779088..6fe6e0a 100644 --- a/src/test/scale_kick_100_3000_b.script +++ b/src/test/scale_kick_100_3000_b.script @@ -11,106 +11,106 @@ dawn low_rssi=0 dawn min_kick_count=1 # AP -ap bssid=20:C9:AA:00:01:00 ht_sup=0 vht_sup=0 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=20:C9:AA:00:01:00 -ap bssid=47:90:AA:00:02:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=47:90:AA:00:02:00 -ap bssid=57:BD:AA:00:03:00 ht_sup=0 vht_sup=0 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=57:BD:AA:00:03:00 -ap bssid=23:0F:AA:00:04:00 ht_sup=0 vht_sup=0 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=23:0F:AA:00:04:00 -ap bssid=2C:B9:AA:00:05:00 ht_sup=0 vht_sup=0 util=84 stations=7 ssid=aTestSSID weight=10 neighbors=2C:B9:AA:00:05:00 -ap bssid=73:74:AA:00:06:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=73:74:AA:00:06:00 -ap bssid=13:0F:AA:00:07:00 ht_sup=0 vht_sup=0 util=20 stations=2 ssid=aTestSSID weight=10 neighbors=13:0F:AA:00:07:00 -ap bssid=77:C0:AA:00:08:00 ht_sup=0 vht_sup=0 util=196 stations=14 ssid=aTestSSID weight=10 neighbors=77:C0:AA:00:08:00 -ap bssid=16:9D:AA:00:09:00 ht_sup=1 vht_sup=1 util=84 stations=6 ssid=aTestSSID weight=10 neighbors=16:9D:AA:00:09:00 -ap bssid=77:99:AA:00:0A:00 ht_sup=1 vht_sup=0 util=70 stations=7 ssid=aTestSSID weight=10 neighbors=77:99:AA:00:0A:00 -ap bssid=01:D2:AA:00:0B:00 ht_sup=0 vht_sup=0 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=01:D2:AA:00:0B:00 -ap bssid=27:B9:AA:00:0C:00 ht_sup=1 vht_sup=1 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=27:B9:AA:00:0C:00 -ap bssid=59:D5:AA:00:0D:00 ht_sup=0 vht_sup=0 util=105 stations=7 ssid=aTestSSID weight=10 neighbors=59:D5:AA:00:0D:00 -ap bssid=7C:37:AA:00:0E:00 ht_sup=1 vht_sup=1 util=99 stations=9 ssid=aTestSSID weight=10 neighbors=7C:37:AA:00:0E:00 -ap bssid=1D:0F:AA:00:0F:00 ht_sup=0 vht_sup=0 util=210 stations=15 ssid=aTestSSID weight=10 neighbors=1D:0F:AA:00:0F:00 -ap bssid=60:AD:AA:00:10:00 ht_sup=1 vht_sup=1 util=80 stations=8 ssid=aTestSSID weight=10 neighbors=60:AD:AA:00:10:00 -ap bssid=3B:81:AA:00:11:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=3B:81:AA:00:11:00 -ap bssid=6A:1B:AA:00:12:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=6A:1B:AA:00:12:00 -ap bssid=61:D6:AA:00:13:00 ht_sup=1 vht_sup=1 util=28 stations=2 ssid=aTestSSID weight=10 neighbors=61:D6:AA:00:13:00 -ap bssid=5B:F3:AA:00:14:00 ht_sup=1 vht_sup=1 util=24 stations=2 ssid=aTestSSID weight=10 neighbors=5B:F3:AA:00:14:00 -ap bssid=7A:92:AA:00:15:00 ht_sup=0 vht_sup=0 util=105 stations=7 ssid=aTestSSID weight=10 neighbors=7A:92:AA:00:15:00 -ap bssid=3D:08:AA:00:16:00 ht_sup=1 vht_sup=0 util=75 stations=5 ssid=aTestSSID weight=10 neighbors=3D:08:AA:00:16:00 -ap bssid=11:C4:AA:00:17:00 ht_sup=1 vht_sup=1 util=20 stations=2 ssid=aTestSSID weight=10 neighbors=11:C4:AA:00:17:00 -ap bssid=21:01:AA:00:18:00 ht_sup=0 vht_sup=0 util=225 stations=15 ssid=aTestSSID weight=10 neighbors=21:01:AA:00:18:00 -ap bssid=27:35:AA:00:19:00 ht_sup=0 vht_sup=0 util=60 stations=4 ssid=aTestSSID weight=10 neighbors=27:35:AA:00:19:00 -ap bssid=22:44:AA:00:1A:00 ht_sup=1 vht_sup=0 util=90 stations=9 ssid=aTestSSID weight=10 neighbors=22:44:AA:00:1A:00 -ap bssid=1B:18:AA:00:1B:00 ht_sup=1 vht_sup=1 util=90 stations=9 ssid=aTestSSID weight=10 neighbors=1B:18:AA:00:1B:00 -ap bssid=28:6D:AA:00:1C:00 ht_sup=0 vht_sup=0 util=121 stations=11 ssid=aTestSSID weight=10 neighbors=28:6D:AA:00:1C:00 -ap bssid=01:39:AA:00:1D:00 ht_sup=1 vht_sup=1 util=50 stations=5 ssid=aTestSSID weight=10 neighbors=01:39:AA:00:1D:00 -ap bssid=37:35:AA:00:1E:00 ht_sup=1 vht_sup=0 util=90 stations=6 ssid=aTestSSID weight=10 neighbors=37:35:AA:00:1E:00 -ap bssid=46:AF:AA:00:1F:00 ht_sup=0 vht_sup=0 util=26 stations=2 ssid=aTestSSID weight=10 neighbors=46:AF:AA:00:1F:00 -ap bssid=21:ED:AA:00:20:00 ht_sup=0 vht_sup=0 util=132 stations=11 ssid=aTestSSID weight=10 neighbors=21:ED:AA:00:20:00 -ap bssid=36:0C:AA:00:21:00 ht_sup=1 vht_sup=0 util=150 stations=10 ssid=aTestSSID weight=10 neighbors=36:0C:AA:00:21:00 -ap bssid=1F:62:AA:00:22:00 ht_sup=1 vht_sup=0 util=60 stations=4 ssid=aTestSSID weight=10 neighbors=1F:62:AA:00:22:00 -ap bssid=06:08:AA:00:23:00 ht_sup=0 vht_sup=0 util=22 stations=2 ssid=aTestSSID weight=10 neighbors=06:08:AA:00:23:00 -ap bssid=5A:57:AA:00:24:00 ht_sup=1 vht_sup=0 util=165 stations=15 ssid=aTestSSID weight=10 neighbors=5A:57:AA:00:24:00 -ap bssid=3E:BB:AA:00:25:00 ht_sup=1 vht_sup=1 util=112 stations=8 ssid=aTestSSID weight=10 neighbors=3E:BB:AA:00:25:00 -ap bssid=3A:70:AA:00:26:00 ht_sup=0 vht_sup=0 util=15 stations=1 ssid=aTestSSID weight=10 neighbors=3A:70:AA:00:26:00 -ap bssid=61:41:AA:00:27:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=61:41:AA:00:27:00 -ap bssid=41:A1:AA:00:28:00 ht_sup=0 vht_sup=0 util=66 stations=6 ssid=aTestSSID weight=10 neighbors=41:A1:AA:00:28:00 -ap bssid=5D:F5:AA:00:29:00 ht_sup=0 vht_sup=0 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=5D:F5:AA:00:29:00 -ap bssid=7A:24:AA:00:2A:00 ht_sup=0 vht_sup=0 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=7A:24:AA:00:2A:00 -ap bssid=05:18:AA:00:2B:00 ht_sup=1 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=05:18:AA:00:2B:00 -ap bssid=10:E2:AA:00:2C:00 ht_sup=0 vht_sup=0 util=90 stations=6 ssid=aTestSSID weight=10 neighbors=10:E2:AA:00:2C:00 -ap bssid=3E:07:AA:00:2D:00 ht_sup=1 vht_sup=0 util=48 stations=4 ssid=aTestSSID weight=10 neighbors=3E:07:AA:00:2D:00 -ap bssid=58:66:AA:00:2E:00 ht_sup=0 vht_sup=0 util=84 stations=6 ssid=aTestSSID weight=10 neighbors=58:66:AA:00:2E:00 -ap bssid=70:EA:AA:00:2F:00 ht_sup=0 vht_sup=0 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=70:EA:AA:00:2F:00 -ap bssid=10:4F:AA:00:30:00 ht_sup=0 vht_sup=0 util=33 stations=3 ssid=aTestSSID weight=10 neighbors=10:4F:AA:00:30:00 -ap bssid=2E:E0:AA:00:31:00 ht_sup=1 vht_sup=1 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=2E:E0:AA:00:31:00 -ap bssid=6D:3B:AA:00:32:00 ht_sup=0 vht_sup=0 util=33 stations=3 ssid=aTestSSID weight=10 neighbors=6D:3B:AA:00:32:00 -ap bssid=44:B5:AA:00:33:00 ht_sup=1 vht_sup=1 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=44:B5:AA:00:33:00 -ap bssid=7D:3D:AA:00:34:00 ht_sup=1 vht_sup=1 util=72 stations=6 ssid=aTestSSID weight=10 neighbors=7D:3D:AA:00:34:00 -ap bssid=04:0E:AA:00:35:00 ht_sup=1 vht_sup=0 util=195 stations=15 ssid=aTestSSID weight=10 neighbors=04:0E:AA:00:35:00 -ap bssid=24:C9:AA:00:36:00 ht_sup=1 vht_sup=0 util=52 stations=4 ssid=aTestSSID weight=10 neighbors=24:C9:AA:00:36:00 -ap bssid=2F:19:AA:00:37:00 ht_sup=0 vht_sup=0 util=75 stations=5 ssid=aTestSSID weight=10 neighbors=2F:19:AA:00:37:00 -ap bssid=10:24:AA:00:38:00 ht_sup=0 vht_sup=0 util=105 stations=7 ssid=aTestSSID weight=10 neighbors=10:24:AA:00:38:00 -ap bssid=12:BE:AA:00:39:00 ht_sup=1 vht_sup=0 util=143 stations=13 ssid=aTestSSID weight=10 neighbors=12:BE:AA:00:39:00 -ap bssid=15:56:AA:00:3A:00 ht_sup=0 vht_sup=0 util=52 stations=4 ssid=aTestSSID weight=10 neighbors=15:56:AA:00:3A:00 -ap bssid=7B:52:AA:00:3B:00 ht_sup=0 vht_sup=0 util=140 stations=14 ssid=aTestSSID weight=10 neighbors=7B:52:AA:00:3B:00 -ap bssid=22:99:AA:00:3C:00 ht_sup=1 vht_sup=0 util=154 stations=11 ssid=aTestSSID weight=10 neighbors=22:99:AA:00:3C:00 -ap bssid=4F:BF:AA:00:3D:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=4F:BF:AA:00:3D:00 -ap bssid=75:49:AA:00:3E:00 ht_sup=1 vht_sup=0 util=30 stations=2 ssid=aTestSSID weight=10 neighbors=75:49:AA:00:3E:00 -ap bssid=3F:3E:AA:00:3F:00 ht_sup=1 vht_sup=1 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=3F:3E:AA:00:3F:00 -ap bssid=75:52:AA:00:40:00 ht_sup=0 vht_sup=0 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=75:52:AA:00:40:00 -ap bssid=0D:7F:AA:00:41:00 ht_sup=1 vht_sup=1 util=143 stations=13 ssid=aTestSSID weight=10 neighbors=0D:7F:AA:00:41:00 -ap bssid=31:26:AA:00:42:00 ht_sup=1 vht_sup=1 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=31:26:AA:00:42:00 -ap bssid=29:5C:AA:00:43:00 ht_sup=0 vht_sup=0 util=48 stations=4 ssid=aTestSSID weight=10 neighbors=29:5C:AA:00:43:00 -ap bssid=16:26:AA:00:44:00 ht_sup=0 vht_sup=0 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=16:26:AA:00:44:00 -ap bssid=5A:0B:AA:00:45:00 ht_sup=1 vht_sup=1 util=22 stations=2 ssid=aTestSSID weight=10 neighbors=5A:0B:AA:00:45:00 -ap bssid=21:95:AA:00:46:00 ht_sup=0 vht_sup=0 util=182 stations=13 ssid=aTestSSID weight=10 neighbors=21:95:AA:00:46:00 -ap bssid=6E:CA:AA:00:47:00 ht_sup=0 vht_sup=0 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=6E:CA:AA:00:47:00 -ap bssid=66:09:AA:00:48:00 ht_sup=0 vht_sup=0 util=121 stations=11 ssid=aTestSSID weight=10 neighbors=66:09:AA:00:48:00 -ap bssid=7D:12:AA:00:49:00 ht_sup=0 vht_sup=0 util=140 stations=10 ssid=aTestSSID weight=10 neighbors=7D:12:AA:00:49:00 -ap bssid=61:5A:AA:00:4A:00 ht_sup=0 vht_sup=0 util=150 stations=15 ssid=aTestSSID weight=10 neighbors=61:5A:AA:00:4A:00 -ap bssid=59:46:AA:00:4B:00 ht_sup=1 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=59:46:AA:00:4B:00 -ap bssid=3F:13:AA:00:4C:00 ht_sup=1 vht_sup=1 util=22 stations=2 ssid=aTestSSID weight=10 neighbors=3F:13:AA:00:4C:00 -ap bssid=15:E2:AA:00:4D:00 ht_sup=1 vht_sup=0 util=60 stations=5 ssid=aTestSSID weight=10 neighbors=15:E2:AA:00:4D:00 -ap bssid=43:5D:AA:00:4E:00 ht_sup=1 vht_sup=1 util=11 stations=1 ssid=aTestSSID weight=10 neighbors=43:5D:AA:00:4E:00 -ap bssid=75:2D:AA:00:4F:00 ht_sup=0 vht_sup=0 util=91 stations=7 ssid=aTestSSID weight=10 neighbors=75:2D:AA:00:4F:00 -ap bssid=3A:78:AA:00:50:00 ht_sup=0 vht_sup=0 util=225 stations=15 ssid=aTestSSID weight=10 neighbors=3A:78:AA:00:50:00 -ap bssid=59:68:AA:00:51:00 ht_sup=0 vht_sup=0 util=182 stations=14 ssid=aTestSSID weight=10 neighbors=59:68:AA:00:51:00 -ap bssid=68:A3:AA:00:52:00 ht_sup=0 vht_sup=0 util=99 stations=9 ssid=aTestSSID weight=10 neighbors=68:A3:AA:00:52:00 -ap bssid=5F:7D:AA:00:53:00 ht_sup=1 vht_sup=0 util=50 stations=5 ssid=aTestSSID weight=10 neighbors=5F:7D:AA:00:53:00 -ap bssid=16:90:AA:00:54:00 ht_sup=1 vht_sup=0 util=70 stations=5 ssid=aTestSSID weight=10 neighbors=16:90:AA:00:54:00 -ap bssid=70:32:AA:00:55:00 ht_sup=1 vht_sup=1 util=195 stations=15 ssid=aTestSSID weight=10 neighbors=70:32:AA:00:55:00 -ap bssid=76:52:AA:00:56:00 ht_sup=1 vht_sup=1 util=143 stations=11 ssid=aTestSSID weight=10 neighbors=76:52:AA:00:56:00 -ap bssid=33:D6:AA:00:57:00 ht_sup=0 vht_sup=0 util=39 stations=3 ssid=aTestSSID weight=10 neighbors=33:D6:AA:00:57:00 -ap bssid=3C:D0:AA:00:58:00 ht_sup=0 vht_sup=0 util=165 stations=11 ssid=aTestSSID weight=10 neighbors=3C:D0:AA:00:58:00 -ap bssid=74:70:AA:00:59:00 ht_sup=0 vht_sup=0 util=135 stations=9 ssid=aTestSSID weight=10 neighbors=74:70:AA:00:59:00 -ap bssid=6B:B1:AA:00:5A:00 ht_sup=0 vht_sup=0 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=6B:B1:AA:00:5A:00 -ap bssid=1A:74:AA:00:5B:00 ht_sup=1 vht_sup=0 util=182 stations=13 ssid=aTestSSID weight=10 neighbors=1A:74:AA:00:5B:00 -ap bssid=67:CE:AA:00:5C:00 ht_sup=1 vht_sup=1 util=15 stations=1 ssid=aTestSSID weight=10 neighbors=67:CE:AA:00:5C:00 -ap bssid=0F:EE:AA:00:5D:00 ht_sup=1 vht_sup=0 util=156 stations=12 ssid=aTestSSID weight=10 neighbors=0F:EE:AA:00:5D:00 -ap bssid=18:24:AA:00:5E:00 ht_sup=1 vht_sup=0 util=132 stations=11 ssid=aTestSSID weight=10 neighbors=18:24:AA:00:5E:00 -ap bssid=76:35:AA:00:5F:00 ht_sup=1 vht_sup=0 util=60 stations=4 ssid=aTestSSID weight=10 neighbors=76:35:AA:00:5F:00 -ap bssid=69:40:AA:00:60:00 ht_sup=0 vht_sup=0 util=180 stations=12 ssid=aTestSSID weight=10 neighbors=69:40:AA:00:60:00 -ap bssid=3A:1A:AA:00:61:00 ht_sup=0 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=3A:1A:AA:00:61:00 -ap bssid=31:32:AA:00:62:00 ht_sup=1 vht_sup=1 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=31:32:AA:00:62:00 -ap bssid=32:98:AA:00:63:00 ht_sup=0 vht_sup=0 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=32:98:AA:00:63:00 -ap bssid=0F:FC:AA:00:64:00 ht_sup=1 vht_sup=0 util=26 stations=2 ssid=aTestSSID weight=10 neighbors=0F:FC:AA:00:64:00 +ap bssid=20:C9:AA:00:01:00 ht_sup=0 vht_sup=0 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=20C9AA000100 +ap bssid=47:90:AA:00:02:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=4790AA000200 +ap bssid=57:BD:AA:00:03:00 ht_sup=0 vht_sup=0 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=57BDAA000300 +ap bssid=23:0F:AA:00:04:00 ht_sup=0 vht_sup=0 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=230FAA000400 +ap bssid=2C:B9:AA:00:05:00 ht_sup=0 vht_sup=0 util=84 stations=7 ssid=aTestSSID weight=10 neighbors=2CB9AA000500 +ap bssid=73:74:AA:00:06:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=7374AA000600 +ap bssid=13:0F:AA:00:07:00 ht_sup=0 vht_sup=0 util=20 stations=2 ssid=aTestSSID weight=10 neighbors=130FAA000700 +ap bssid=77:C0:AA:00:08:00 ht_sup=0 vht_sup=0 util=196 stations=14 ssid=aTestSSID weight=10 neighbors=77C0AA000800 +ap bssid=16:9D:AA:00:09:00 ht_sup=1 vht_sup=1 util=84 stations=6 ssid=aTestSSID weight=10 neighbors=169DAA000900 +ap bssid=77:99:AA:00:0A:00 ht_sup=1 vht_sup=0 util=70 stations=7 ssid=aTestSSID weight=10 neighbors=7799AA000A00 +ap bssid=01:D2:AA:00:0B:00 ht_sup=0 vht_sup=0 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=01D2AA000B00 +ap bssid=27:B9:AA:00:0C:00 ht_sup=1 vht_sup=1 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=27B9AA000C00 +ap bssid=59:D5:AA:00:0D:00 ht_sup=0 vht_sup=0 util=105 stations=7 ssid=aTestSSID weight=10 neighbors=59D5AA000D00 +ap bssid=7C:37:AA:00:0E:00 ht_sup=1 vht_sup=1 util=99 stations=9 ssid=aTestSSID weight=10 neighbors=7C37AA000E00 +ap bssid=1D:0F:AA:00:0F:00 ht_sup=0 vht_sup=0 util=210 stations=15 ssid=aTestSSID weight=10 neighbors=1D0FAA000F00 +ap bssid=60:AD:AA:00:10:00 ht_sup=1 vht_sup=1 util=80 stations=8 ssid=aTestSSID weight=10 neighbors=60ADAA001000 +ap bssid=3B:81:AA:00:11:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=3B81AA001100 +ap bssid=6A:1B:AA:00:12:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=6A1BAA001200 +ap bssid=61:D6:AA:00:13:00 ht_sup=1 vht_sup=1 util=28 stations=2 ssid=aTestSSID weight=10 neighbors=61D6AA001300 +ap bssid=5B:F3:AA:00:14:00 ht_sup=1 vht_sup=1 util=24 stations=2 ssid=aTestSSID weight=10 neighbors=5BF3AA001400 +ap bssid=7A:92:AA:00:15:00 ht_sup=0 vht_sup=0 util=105 stations=7 ssid=aTestSSID weight=10 neighbors=7A92AA001500 +ap bssid=3D:08:AA:00:16:00 ht_sup=1 vht_sup=0 util=75 stations=5 ssid=aTestSSID weight=10 neighbors=3D08AA001600 +ap bssid=11:C4:AA:00:17:00 ht_sup=1 vht_sup=1 util=20 stations=2 ssid=aTestSSID weight=10 neighbors=11C4AA001700 +ap bssid=21:01:AA:00:18:00 ht_sup=0 vht_sup=0 util=225 stations=15 ssid=aTestSSID weight=10 neighbors=2101AA001800 +ap bssid=27:35:AA:00:19:00 ht_sup=0 vht_sup=0 util=60 stations=4 ssid=aTestSSID weight=10 neighbors=2735AA001900 +ap bssid=22:44:AA:00:1A:00 ht_sup=1 vht_sup=0 util=90 stations=9 ssid=aTestSSID weight=10 neighbors=2244AA001A00 +ap bssid=1B:18:AA:00:1B:00 ht_sup=1 vht_sup=1 util=90 stations=9 ssid=aTestSSID weight=10 neighbors=1B18AA001B00 +ap bssid=28:6D:AA:00:1C:00 ht_sup=0 vht_sup=0 util=121 stations=11 ssid=aTestSSID weight=10 neighbors=286DAA001C00 +ap bssid=01:39:AA:00:1D:00 ht_sup=1 vht_sup=1 util=50 stations=5 ssid=aTestSSID weight=10 neighbors=0139AA001D00 +ap bssid=37:35:AA:00:1E:00 ht_sup=1 vht_sup=0 util=90 stations=6 ssid=aTestSSID weight=10 neighbors=3735AA001E00 +ap bssid=46:AF:AA:00:1F:00 ht_sup=0 vht_sup=0 util=26 stations=2 ssid=aTestSSID weight=10 neighbors=46AFAA001F00 +ap bssid=21:ED:AA:00:20:00 ht_sup=0 vht_sup=0 util=132 stations=11 ssid=aTestSSID weight=10 neighbors=21EDAA002000 +ap bssid=36:0C:AA:00:21:00 ht_sup=1 vht_sup=0 util=150 stations=10 ssid=aTestSSID weight=10 neighbors=360CAA002100 +ap bssid=1F:62:AA:00:22:00 ht_sup=1 vht_sup=0 util=60 stations=4 ssid=aTestSSID weight=10 neighbors=1F62AA002200 +ap bssid=06:08:AA:00:23:00 ht_sup=0 vht_sup=0 util=22 stations=2 ssid=aTestSSID weight=10 neighbors=0608AA002300 +ap bssid=5A:57:AA:00:24:00 ht_sup=1 vht_sup=0 util=165 stations=15 ssid=aTestSSID weight=10 neighbors=5A57AA002400 +ap bssid=3E:BB:AA:00:25:00 ht_sup=1 vht_sup=1 util=112 stations=8 ssid=aTestSSID weight=10 neighbors=3EBBAA002500 +ap bssid=3A:70:AA:00:26:00 ht_sup=0 vht_sup=0 util=15 stations=1 ssid=aTestSSID weight=10 neighbors=3A70AA002600 +ap bssid=61:41:AA:00:27:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=6141AA002700 +ap bssid=41:A1:AA:00:28:00 ht_sup=0 vht_sup=0 util=66 stations=6 ssid=aTestSSID weight=10 neighbors=41A1AA002800 +ap bssid=5D:F5:AA:00:29:00 ht_sup=0 vht_sup=0 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=5DF5AA002900 +ap bssid=7A:24:AA:00:2A:00 ht_sup=0 vht_sup=0 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=7A24AA002A00 +ap bssid=05:18:AA:00:2B:00 ht_sup=1 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=0518AA002B00 +ap bssid=10:E2:AA:00:2C:00 ht_sup=0 vht_sup=0 util=90 stations=6 ssid=aTestSSID weight=10 neighbors=10E2AA002C00 +ap bssid=3E:07:AA:00:2D:00 ht_sup=1 vht_sup=0 util=48 stations=4 ssid=aTestSSID weight=10 neighbors=3E07AA002D00 +ap bssid=58:66:AA:00:2E:00 ht_sup=0 vht_sup=0 util=84 stations=6 ssid=aTestSSID weight=10 neighbors=5866AA002E00 +ap bssid=70:EA:AA:00:2F:00 ht_sup=0 vht_sup=0 util=98 stations=7 ssid=aTestSSID weight=10 neighbors=70EAAA002F00 +ap bssid=10:4F:AA:00:30:00 ht_sup=0 vht_sup=0 util=33 stations=3 ssid=aTestSSID weight=10 neighbors=104FAA003000 +ap bssid=2E:E0:AA:00:31:00 ht_sup=1 vht_sup=1 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=2EE0AA003100 +ap bssid=6D:3B:AA:00:32:00 ht_sup=0 vht_sup=0 util=33 stations=3 ssid=aTestSSID weight=10 neighbors=6D3BAA003200 +ap bssid=44:B5:AA:00:33:00 ht_sup=1 vht_sup=1 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=44B5AA003300 +ap bssid=7D:3D:AA:00:34:00 ht_sup=1 vht_sup=1 util=72 stations=6 ssid=aTestSSID weight=10 neighbors=7D3DAA003400 +ap bssid=04:0E:AA:00:35:00 ht_sup=1 vht_sup=0 util=195 stations=15 ssid=aTestSSID weight=10 neighbors=040EAA003500 +ap bssid=24:C9:AA:00:36:00 ht_sup=1 vht_sup=0 util=52 stations=4 ssid=aTestSSID weight=10 neighbors=24C9AA003600 +ap bssid=2F:19:AA:00:37:00 ht_sup=0 vht_sup=0 util=75 stations=5 ssid=aTestSSID weight=10 neighbors=2F19AA003700 +ap bssid=10:24:AA:00:38:00 ht_sup=0 vht_sup=0 util=105 stations=7 ssid=aTestSSID weight=10 neighbors=1024AA003800 +ap bssid=12:BE:AA:00:39:00 ht_sup=1 vht_sup=0 util=143 stations=13 ssid=aTestSSID weight=10 neighbors=12BEAA003900 +ap bssid=15:56:AA:00:3A:00 ht_sup=0 vht_sup=0 util=52 stations=4 ssid=aTestSSID weight=10 neighbors=1556AA003A00 +ap bssid=7B:52:AA:00:3B:00 ht_sup=0 vht_sup=0 util=140 stations=14 ssid=aTestSSID weight=10 neighbors=7B52AA003B00 +ap bssid=22:99:AA:00:3C:00 ht_sup=1 vht_sup=0 util=154 stations=11 ssid=aTestSSID weight=10 neighbors=2299AA003C00 +ap bssid=4F:BF:AA:00:3D:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=4FBFAA003D00 +ap bssid=75:49:AA:00:3E:00 ht_sup=1 vht_sup=0 util=30 stations=2 ssid=aTestSSID weight=10 neighbors=7549AA003E00 +ap bssid=3F:3E:AA:00:3F:00 ht_sup=1 vht_sup=1 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=3F3EAA003F00 +ap bssid=75:52:AA:00:40:00 ht_sup=0 vht_sup=0 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=7552AA004000 +ap bssid=0D:7F:AA:00:41:00 ht_sup=1 vht_sup=1 util=143 stations=13 ssid=aTestSSID weight=10 neighbors=0D7FAA004100 +ap bssid=31:26:AA:00:42:00 ht_sup=1 vht_sup=1 util=100 stations=10 ssid=aTestSSID weight=10 neighbors=3126AA004200 +ap bssid=29:5C:AA:00:43:00 ht_sup=0 vht_sup=0 util=48 stations=4 ssid=aTestSSID weight=10 neighbors=295CAA004300 +ap bssid=16:26:AA:00:44:00 ht_sup=0 vht_sup=0 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=1626AA004400 +ap bssid=5A:0B:AA:00:45:00 ht_sup=1 vht_sup=1 util=22 stations=2 ssid=aTestSSID weight=10 neighbors=5A0BAA004500 +ap bssid=21:95:AA:00:46:00 ht_sup=0 vht_sup=0 util=182 stations=13 ssid=aTestSSID weight=10 neighbors=2195AA004600 +ap bssid=6E:CA:AA:00:47:00 ht_sup=0 vht_sup=0 util=120 stations=10 ssid=aTestSSID weight=10 neighbors=6ECAAA004700 +ap bssid=66:09:AA:00:48:00 ht_sup=0 vht_sup=0 util=121 stations=11 ssid=aTestSSID weight=10 neighbors=6609AA004800 +ap bssid=7D:12:AA:00:49:00 ht_sup=0 vht_sup=0 util=140 stations=10 ssid=aTestSSID weight=10 neighbors=7D12AA004900 +ap bssid=61:5A:AA:00:4A:00 ht_sup=0 vht_sup=0 util=150 stations=15 ssid=aTestSSID weight=10 neighbors=615AAA004A00 +ap bssid=59:46:AA:00:4B:00 ht_sup=1 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=5946AA004B00 +ap bssid=3F:13:AA:00:4C:00 ht_sup=1 vht_sup=1 util=22 stations=2 ssid=aTestSSID weight=10 neighbors=3F13AA004C00 +ap bssid=15:E2:AA:00:4D:00 ht_sup=1 vht_sup=0 util=60 stations=5 ssid=aTestSSID weight=10 neighbors=15E2AA004D00 +ap bssid=43:5D:AA:00:4E:00 ht_sup=1 vht_sup=1 util=11 stations=1 ssid=aTestSSID weight=10 neighbors=435DAA004E00 +ap bssid=75:2D:AA:00:4F:00 ht_sup=0 vht_sup=0 util=91 stations=7 ssid=aTestSSID weight=10 neighbors=752DAA004F00 +ap bssid=3A:78:AA:00:50:00 ht_sup=0 vht_sup=0 util=225 stations=15 ssid=aTestSSID weight=10 neighbors=3A78AA005000 +ap bssid=59:68:AA:00:51:00 ht_sup=0 vht_sup=0 util=182 stations=14 ssid=aTestSSID weight=10 neighbors=5968AA005100 +ap bssid=68:A3:AA:00:52:00 ht_sup=0 vht_sup=0 util=99 stations=9 ssid=aTestSSID weight=10 neighbors=68A3AA005200 +ap bssid=5F:7D:AA:00:53:00 ht_sup=1 vht_sup=0 util=50 stations=5 ssid=aTestSSID weight=10 neighbors=5F7DAA005300 +ap bssid=16:90:AA:00:54:00 ht_sup=1 vht_sup=0 util=70 stations=5 ssid=aTestSSID weight=10 neighbors=1690AA005400 +ap bssid=70:32:AA:00:55:00 ht_sup=1 vht_sup=1 util=195 stations=15 ssid=aTestSSID weight=10 neighbors=7032AA005500 +ap bssid=76:52:AA:00:56:00 ht_sup=1 vht_sup=1 util=143 stations=11 ssid=aTestSSID weight=10 neighbors=7652AA005600 +ap bssid=33:D6:AA:00:57:00 ht_sup=0 vht_sup=0 util=39 stations=3 ssid=aTestSSID weight=10 neighbors=33D6AA005700 +ap bssid=3C:D0:AA:00:58:00 ht_sup=0 vht_sup=0 util=165 stations=11 ssid=aTestSSID weight=10 neighbors=3CD0AA005800 +ap bssid=74:70:AA:00:59:00 ht_sup=0 vht_sup=0 util=135 stations=9 ssid=aTestSSID weight=10 neighbors=7470AA005900 +ap bssid=6B:B1:AA:00:5A:00 ht_sup=0 vht_sup=0 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=6BB1AA005A00 +ap bssid=1A:74:AA:00:5B:00 ht_sup=1 vht_sup=0 util=182 stations=13 ssid=aTestSSID weight=10 neighbors=1A74AA005B00 +ap bssid=67:CE:AA:00:5C:00 ht_sup=1 vht_sup=1 util=15 stations=1 ssid=aTestSSID weight=10 neighbors=67CEAA005C00 +ap bssid=0F:EE:AA:00:5D:00 ht_sup=1 vht_sup=0 util=156 stations=12 ssid=aTestSSID weight=10 neighbors=0FEEAA005D00 +ap bssid=18:24:AA:00:5E:00 ht_sup=1 vht_sup=0 util=132 stations=11 ssid=aTestSSID weight=10 neighbors=1824AA005E00 +ap bssid=76:35:AA:00:5F:00 ht_sup=1 vht_sup=0 util=60 stations=4 ssid=aTestSSID weight=10 neighbors=7635AA005F00 +ap bssid=69:40:AA:00:60:00 ht_sup=0 vht_sup=0 util=180 stations=12 ssid=aTestSSID weight=10 neighbors=6940AA006000 +ap bssid=3A:1A:AA:00:61:00 ht_sup=0 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=3A1AAA006100 +ap bssid=31:32:AA:00:62:00 ht_sup=1 vht_sup=1 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=3132AA006200 +ap bssid=32:98:AA:00:63:00 ht_sup=0 vht_sup=0 util=65 stations=5 ssid=aTestSSID weight=10 neighbors=3298AA006300 +ap bssid=0F:FC:AA:00:64:00 ht_sup=1 vht_sup=0 util=26 stations=2 ssid=aTestSSID weight=10 neighbors=0FFCAA006400 # Device diff --git a/src/test/scale_test_A.script b/src/test/scale_test_A.script index 4e89139..60516e2 100644 --- a/src/test/scale_test_A.script +++ b/src/test/scale_test_A.script @@ -12,16 +12,16 @@ dawn min_kick_count=1 #AP -ap bssid=0A:7B:AA:00:01:00 ht_sup=1 vht_sup=1 util=156 stations=13 ssid=aTestSSID weight=10 neighbors=0A:7B:AA:00:01:00 -ap bssid=02:67:AA:00:02:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=02:67:AA:00:02:00 -ap bssid=14:02:AA:00:03:00 ht_sup=1 vht_sup=1 util=126 stations=9 ssid=aTestSSID weight=10 neighbors=14:02:AA:00:03:00 -ap bssid=1F:36:AA:00:04:00 ht_sup=0 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=1F:36:AA:00:04:00 -ap bssid=69:E9:AA:00:05:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=69:E9:AA:00:05:00 -ap bssid=6A:97:AA:00:06:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=6A:97:AA:00:06:00 -ap bssid=45:63:AA:00:07:00 ht_sup=0 vht_sup=0 util=55 stations=5 ssid=aTestSSID weight=10 neighbors=45:63:AA:00:07:00 -ap bssid=07:1E:AA:00:08:00 ht_sup=1 vht_sup=1 util=88 stations=8 ssid=aTestSSID weight=10 neighbors=07:1E:AA:00:08:00 -ap bssid=45:A2:AA:00:09:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=45:A2:AA:00:09:00 -ap bssid=4C:4D:AA:00:0A:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=4C:4D:AA:00:0A:00 +ap bssid=0A:7B:AA:00:01:00 ht_sup=1 vht_sup=1 util=156 stations=13 ssid=aTestSSID weight=10 neighbors=0A7BAA000100 +ap bssid=02:67:AA:00:02:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=0267AA000200 +ap bssid=14:02:AA:00:03:00 ht_sup=1 vht_sup=1 util=126 stations=9 ssid=aTestSSID weight=10 neighbors=1402AA000300 +ap bssid=1F:36:AA:00:04:00 ht_sup=0 vht_sup=0 util=120 stations=8 ssid=aTestSSID weight=10 neighbors=1F36AA000400 +ap bssid=69:E9:AA:00:05:00 ht_sup=0 vht_sup=0 util=44 stations=4 ssid=aTestSSID weight=10 neighbors=69E9AA000500 +ap bssid=6A:97:AA:00:06:00 ht_sup=0 vht_sup=0 util=110 stations=11 ssid=aTestSSID weight=10 neighbors=6A97AA000600 +ap bssid=45:63:AA:00:07:00 ht_sup=0 vht_sup=0 util=55 stations=5 ssid=aTestSSID weight=10 neighbors=4563AA000700 +ap bssid=07:1E:AA:00:08:00 ht_sup=1 vht_sup=1 util=88 stations=8 ssid=aTestSSID weight=10 neighbors=071EAA000800 +ap bssid=45:A2:AA:00:09:00 ht_sup=0 vht_sup=0 util=120 stations=12 ssid=aTestSSID weight=10 neighbors=45A2AA000900 +ap bssid=4C:4D:AA:00:0A:00 ht_sup=1 vht_sup=1 util=195 stations=13 ssid=aTestSSID weight=10 neighbors=4C4DAA000A00 #Client client client=50:7B:DD:00:01:00 bssid=45:A2:AA:00:09:00 freq=2500 ht_cap=1 vht_cap=1 diff --git a/src/test/simple_kick.script b/src/test/simple_kick.script index eaf9165..6b283c7 100644 --- a/src/test/simple_kick.script +++ b/src/test/simple_kick.script @@ -1,7 +1,7 @@ dawn default dawn min_kick_count=2 -ap bssid=11:22:33:44:55:66 neighbors=11:22:33:44:55:66 -ap bssid=22:33:44:55:66:77 neighbors=22:33:44:55:66:77 +ap bssid=11:22:33:44:55:66 neighbors=112233445566 +ap bssid=22:33:44:55:66:77 neighbors=223344556677 client bssid=11:22:33:44:55:66 client=ff:ee:dd:cc:bb:aa ap_show client_show diff --git a/src/test/test_storage.c b/src/test/test_storage.c index c6d3046..8882575 100644 --- a/src/test/test_storage.c +++ b/src/test/test_storage.c @@ -22,20 +22,25 @@ int send_set_probe(struct dawn_mac client_addr) return 0; } -int wnm_disassoc_imminent(uint32_t id, const struct dawn_mac client_addr, char* dest_ap, uint32_t duration) +int wnm_disassoc_imminent(uint32_t id, const struct dawn_mac client_addr, struct kicking_nr* neighbor_list, uint32_t duration) { int ret = 0; printf("wnm_disassoc_imminent() was called...\n"); - if (dest_ap != NULL) + if (neighbor_list != NULL) { // Fake a client being disassociated and then rejoining on the recommended neoghbor client *mc = client_array_get_client(client_addr); mc = client_array_delete(mc, true); - hwaddr_aton(dest_ap, mc->bssid_addr.u8); + // Originally, there was only one AP, not a list of them; that AP is at the tail of the list + // Use it to keep the results the same as before + while (neighbor_list && neighbor_list->next) + neighbor_list = neighbor_list->next; + for (int n=0; n < ETH_ALEN; n++) + sscanf(neighbor_list->nr + n*2, "%2hhx", mc->bssid_addr.u8 + n); insert_client_to_array(mc, 0); - printf("BSS TRANSITION TO %s\n", dest_ap); + printf("BSS TRANSITION TO " NR_MACSTR "\n", NR_MAC2STR(neighbor_list->nr)); // Tell caller not to change the arrays any further ret = 1; @@ -996,6 +1001,8 @@ static int consume_actions(int argc, char* argv[], int harness_verbosity) load_u32(&autokick, argv[3]); char nb[NEIGHBOR_REPORT_LEN] = "TAMPER EVIDENT NEIGHBOR REPORT INITIALISATION STRING"; + struct kicking_nr neighbor = {0}; + struct kicking_nr *neighbor_list = &neighbor; if (curr_arg + 5 <= argc) { @@ -1009,8 +1016,8 @@ static int consume_actions(int argc, char* argv[], int harness_verbosity) { strcpy(nb, argv[4]); } - - tr = better_ap_available(ap_array_get_ap(bssid_mac, NULL), client_mac, nb); + strncpy(neighbor.nr, nb, NEIGHBOR_REPORT_LEN); + tr = better_ap_available(ap_array_get_ap(bssid_mac, NULL), client_mac, &neighbor_list); } else { diff --git a/src/utils/ubus.c b/src/utils/ubus.c index abddd3b..6af745d 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -926,7 +926,7 @@ void del_client_interface(uint32_t id, const struct dawn_mac client_addr, uint32 } -int wnm_disassoc_imminent(uint32_t id, const struct dawn_mac client_addr, char *dest_ap, uint32_t duration) { +int wnm_disassoc_imminent(uint32_t id, const struct dawn_mac client_addr, struct kicking_nr* neighbor_list, uint32_t duration) { struct hostapd_sock_entry *sub; blob_buf_init(&b, 0); @@ -934,12 +934,11 @@ int wnm_disassoc_imminent(uint32_t id, const struct dawn_mac client_addr, char * blobmsg_add_u32(&b, "duration", duration); blobmsg_add_u8(&b, "abridged", 1); // prefer aps in neighborlist - // ToDo: maybe exchange to a list of aps void* nbs = blobmsg_open_array(&b, "neighbors"); - if (dest_ap != NULL) - { - blobmsg_add_string(&b, NULL, dest_ap); - printf("BSS TRANSITION TO %s\n", dest_ap); + while(neighbor_list != NULL) { + printf("BSS TRANSITION NEIGHBOR " NR_MACSTR ", Score=%d\n", NR_MAC2STR(neighbor_list->nr), neighbor_list->score); + blobmsg_add_string(&b, NULL, neighbor_list->nr); + neighbor_list = neighbor_list->next; } blobmsg_close_array(&b, nbs);