From 7e5f9a36d80f0d87ba8eb51070c19697e6e1a126 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Tue, 13 Feb 2018 15:31:11 +0100 Subject: [PATCH] add kickcount --- files/dawn.config | 1 + src/include/datastorage.h | 4 +++- src/storage/datastorage.c | 25 ++++++++++++++++++++----- src/utils/dawn_uci.c | 1 + 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/files/dawn.config b/files/dawn.config index 76e686f..397f45d 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -48,3 +48,4 @@ config metric option deny_auth_reason '1' # unspecified option deny_assoc_reason '17' # assoc rejected can't handle new station option use_driver_recog '1' + option min_number_to_kick '3' diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 843e32e..91e6ffb 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -59,6 +59,7 @@ struct probe_metric_s { int deny_auth_reason; int deny_assoc_reason; int use_driver_recog; + int min_kick_count; }; struct time_config_s { @@ -179,6 +180,7 @@ typedef struct client_s { uint8_t mfp; time_t time; uint32_t aid; + uint32_t kick_count; } client; typedef struct ap_s { @@ -220,7 +222,7 @@ void kick_clients(uint8_t bssid[], uint32_t id); void client_array_insert(client entry); -client *client_array_delete(client entry); +client client_array_delete(client entry); void print_client_array(); diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 6a7dfc8..4035977 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -433,6 +433,16 @@ void kick_clients(uint8_t bssid[], uint32_t id) { // better ap available if (do_kick > 0) { + + // kick after algorithm decided to kick several times + // + rssi is changing a lot + // + chan util is changing a lot + // + ping pong behavior of clients will be reduced... + client_array[j].kick_count++; + if(client_array[j].kick_count < dawn_metric.min_kick_count){ + continue; + } + printf("Better AP available. Kicking client:\n"); print_client_entry(client_array[j]); printf("Check if client is active receiving!\n"); @@ -569,21 +579,21 @@ void client_array_insert(client entry) { } } -client *client_array_delete(client entry) { +client client_array_delete(client entry) { int i; int found_in_array = 0; - client *tmp = NULL; + client tmp; if (client_entry_last == -1) { - return NULL; + return tmp; } for (i = 0; i <= client_entry_last; i++) { if (mac_is_equal(entry.bssid_addr, client_array[i].bssid_addr) && mac_is_equal(entry.client_addr, client_array[i].client_addr)) { found_in_array = 1; - tmp = &client_array[i]; + tmp = client_array[i]; break; } } @@ -956,7 +966,12 @@ void insert_client_to_array(client entry) { pthread_mutex_lock(&client_array_mutex); entry.time = time(0); - client_array_delete(entry); + client client_tmp = client_array_delete(entry); + + if (mac_is_equal(entry.bssid_addr, client_tmp.bssid_addr)) { + entry.kick_count = client_tmp.kick_count; + } + client_array_insert(entry); pthread_mutex_unlock(&client_array_mutex); diff --git a/src/utils/dawn_uci.c b/src/utils/dawn_uci.c index b5962f9..7074e74 100644 --- a/src/utils/dawn_uci.c +++ b/src/utils/dawn_uci.c @@ -71,6 +71,7 @@ struct probe_metric_s uci_get_dawn_metric() { ret.deny_assoc_reason = uci_lookup_option_int(uci_ctx, s, "deny_assoc_reason"); ret.max_station_diff = uci_lookup_option_int(uci_ctx, s, "max_station_diff"); ret.use_driver_recog = uci_lookup_option_int(uci_ctx, s, "use_driver_recog"); + ret.min_kick_count = uci_lookup_option_int(uci_ctx, s, "min_kick_count"); return ret; } }