From 1a2aa2c6e2fafad3438414f55ad1e1af60186bb4 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Tue, 21 Nov 2017 18:37:12 +0100 Subject: [PATCH 01/27] insert macs to list --- files/mac_list | 2 ++ src/include/datastorage.h | 13 ++++++++ src/main.c | 1 - src/storage/datastorage.c | 63 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 files/mac_list diff --git a/files/mac_list b/files/mac_list new file mode 100644 index 0000000..8a35cbc --- /dev/null +++ b/files/mac_list @@ -0,0 +1,2 @@ +a4:2b:b0:de:f1:fd +f0:79:60:1c:26:f0 diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 93f845f..d375738 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -13,9 +13,22 @@ #define ETH_ALEN 6 #endif +/* Mac */ + +// ---------------- Defines ------------------- +#define MAC_LIST_LENGTH 100 + +// ---------------- Structs ---------------- +uint8_t mac_list[MAC_LIST_LENGTH][ETH_ALEN]; + +// ---------------- Functions ---------- +void insert_macs_from_file(); + /* Metric */ +struct probe_metric_s dawn_metric; + // ---------------- Structs ---------------- struct probe_metric_s { int ht_support; diff --git a/src/main.c b/src/main.c index dba35be..947a67e 100644 --- a/src/main.c +++ b/src/main.c @@ -108,7 +108,6 @@ int main(int argc, char **argv) { sigaction(SIGTERM, &newSigAction, NULL); /* catch term signal */ sigaction(SIGINT, &newSigAction, NULL); /* catch interrupt signal */ - gcrypt_init(); gcrypt_set_key_and_iv(shared_key, iv); diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index c8eda89..bc44789 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -41,9 +41,12 @@ int probe_array_update_rssi(uint8_t bssid_addr[], uint8_t client_addr[], uint32_ int is_connected(uint8_t bssid_addr[], uint8_t client_addr[]); +int mac_in_maclist(uint8_t mac[]); + int probe_entry_last = -1; int client_entry_last = -1; int ap_entry_last = -1; +int mac_list_entry_last = -1; void remove_probe_array_cb(struct uloop_timeout *t); @@ -134,7 +137,7 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[]) { } int kick_client(struct client_s client_entry) { - return better_ap_available(client_entry.bssid_addr, client_entry.client_addr); + return !mac_in_maclist(client_entry.client_addr) && better_ap_available(client_entry.bssid_addr, client_entry.client_addr); } void kick_clients(uint8_t bssid[], uint32_t id) { @@ -600,6 +603,64 @@ void insert_client_to_array(client entry) { pthread_mutex_unlock(&client_array_mutex); } +void insert_macs_from_file() +{ + FILE * fp; + char * line = NULL; + size_t len = 0; + ssize_t read; + + fp = fopen("/etc/config/dawn", "r"); + if (fp == NULL) + exit(EXIT_FAILURE); + + while ((read = getline(&line, &len, fp)) != -1) { + printf("Retrieved line of length %zu :\n", read); + printf("%s", line); + + int tmp_int_mac[ETH_ALEN]; + sscanf(line, MACSTR, STR2MAC(tmp_int_mac)); + + for (int i = 0; i < ETH_ALEN; ++i) { + mac_list[mac_list_entry_last][i] = (uint8_t) tmp_int_mac[i]; + } + } + + printf("Printing MAC List:\n"); + for(int i = 0; i <= mac_list_entry_last; i++) + { + char mac_buf_target[20]; + sprintf(mac_buf_target, MACSTR, MAC2STR(mac_list[0])); + printf("%d: %s\n", i, mac_buf_target); + } + + fclose(fp); + if (line) + free(line); + exit(EXIT_SUCCESS); +} + +int mac_in_maclist(uint8_t mac[]) +{ + for(int i = 0; i <= mac_list_entry_last; i++) + { + if(mac_is_equal(mac, mac_list[i])) + { + return 1; + } + } + return 0; +} + + + + + + + + + + node *delete_probe_req(node **ret_remove, node *head, uint8_t bssid_addr[], uint8_t client_addr[]); From 2a9d87698836644427c6c2d2a0fd129f6c0465bc Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Wed, 22 Nov 2017 15:11:43 +0100 Subject: [PATCH 02/27] add function to main --- src/main.c | 2 ++ src/storage/datastorage.c | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 947a67e..1d4805e 100644 --- a/src/main.c +++ b/src/main.c @@ -136,6 +136,8 @@ int main(int argc, char **argv) { init_socket_runopts(opt_broadcast_ip, opt_broadcast_port, 1); + insert_macs_from_file(); + dawn_init_ubus(ubus_socket, opt_hostapd_dir); return 0; diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index bc44789..ce47b42 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -610,7 +610,7 @@ void insert_macs_from_file() size_t len = 0; ssize_t read; - fp = fopen("/etc/config/dawn", "r"); + fp = fopen("/etc/dawn/mac_list", "r"); if (fp == NULL) exit(EXIT_FAILURE); @@ -621,6 +621,7 @@ void insert_macs_from_file() int tmp_int_mac[ETH_ALEN]; sscanf(line, MACSTR, STR2MAC(tmp_int_mac)); + mac_list_entry_last++; for (int i = 0; i < ETH_ALEN; ++i) { mac_list[mac_list_entry_last][i] = (uint8_t) tmp_int_mac[i]; } @@ -630,7 +631,7 @@ void insert_macs_from_file() for(int i = 0; i <= mac_list_entry_last; i++) { char mac_buf_target[20]; - sprintf(mac_buf_target, MACSTR, MAC2STR(mac_list[0])); + sprintf(mac_buf_target, MACSTR, MAC2STR(mac_list[i])); printf("%d: %s\n", i, mac_buf_target); } From 4c16b53e5d9411afaac3be2b02d3655d6964b007 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Wed, 22 Nov 2017 16:10:32 +0100 Subject: [PATCH 03/27] add object --- src/utils/ubus.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/utils/ubus.c b/src/utils/ubus.c index 33e7488..27f4d41 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -473,6 +473,8 @@ int dawn_init_ubus(const char *ubus_socket, char *hostapd_dir) { //ubus_call_umdns(); + ubus_add_oject(); + uloop_run(); close_socket(); @@ -686,4 +688,60 @@ int ubus_send_probe_via_network(struct probe_entry_s probe_entry) { send_string_enc(str); return 0; +} + +enum { + MAC_ADDR, + __ADD_DEL_MAC_MAX +}; + +static const struct blobmsg_policy add_del_policy[__ADD_DEL_MAC_MAX] = { + [MAC_ADDR] = { "addr", BLOBMSG_TYPE_STRING }, +}; + +static const struct ubus_method dawn_methods[] = { + UBUS_METHOD("hello", test_hello, add_del_policy), +}; + +static struct ubus_object_type dawn_object_type = + UBUS_OBJECT_TYPE("test", dawn_methods); + +static struct ubus_object dawn_object = { + .name = "dawn", + .type = &dawn_object_type, + .methods = dawn_methods, + .n_methods = ARRAY_SIZE(dawn_methods), +}; + +static int +add_mac(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) { + + struct blob_attr *tb[__ADD_DEL_MAC_MAX]; + uint8_t addr[ETH_ALEN]; + + blobmsg_parse(add_del_policy, __ADD_DEL_MAC_MAX, tb, blob_data(msg), blob_len(msg)); + + if (!tb[MAC_ADDR]) + return UBUS_STATUS_INVALID_ARGUMENT; + + if (hwaddr_aton(blobmsg_data(tb[MAC_ADDR]), addr)) + return UBUS_STATUS_INVALID_ARGUMENT; + + printf("ADDED SOME MAC!\n"); +} + +static void ubus_add_oject(void) +{ + int ret; + + ret = ubus_add_object(ctx, &dawn_object); + if (ret) + fprintf(stderr, "Failed to add object: %s\n", ubus_strerror(ret)); + + /*ret = ubus_register_subscriber(ctx, &test_event); + if (ret) + fprintf(stderr, "Failed to add watch handler: %s\n", ubus_strerror(ret)); + */ } \ No newline at end of file From 8eaba2697452e72fb48351f475415a3bf967dfea Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Wed, 22 Nov 2017 16:11:35 +0100 Subject: [PATCH 04/27] add object --- src/include/datastorage.h | 1 + src/include/utils.h | 2 ++ src/storage/datastorage.c | 17 ++++++++++++++++- src/utils/ubus.c | 17 +++++++++++++---- src/utils/utils.c | 16 ++++++++++++++++ 5 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/include/datastorage.h b/src/include/datastorage.h index d375738..dce9263 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -23,6 +23,7 @@ uint8_t mac_list[MAC_LIST_LENGTH][ETH_ALEN]; // ---------------- Functions ---------- void insert_macs_from_file(); +int insert_to_maclist(uint8_t mac[]); /* Metric */ diff --git a/src/include/utils.h b/src/include/utils.h index ec0e87a..e07a776 100644 --- a/src/include/utils.h +++ b/src/include/utils.h @@ -15,4 +15,6 @@ int hwaddr_aton(const char *txt, uint8_t *addr); int convert_mac(char *in, char *out); +void write_mac_to_file(char* path, uint8_t addr[]); + #endif \ No newline at end of file diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index ce47b42..2eb08f4 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -638,9 +638,24 @@ void insert_macs_from_file() fclose(fp); if (line) free(line); - exit(EXIT_SUCCESS); + //exit(EXIT_SUCCESS); } +int insert_to_maclist(uint8_t mac[]) +{ + if(mac_in_maclist(mac)) + { + return 0; + } + + mac_list_entry_last++; + for (int i = 0; i < ETH_ALEN; ++i) { + mac_list[mac_list_entry_last][i] = mac[i]; + } + return 0; +} + + int mac_in_maclist(uint8_t mac[]) { for(int i = 0; i <= mac_list_entry_last; i++) diff --git a/src/utils/ubus.c b/src/utils/ubus.c index 27f4d41..caba791 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -136,9 +136,15 @@ static int subscribe_to_hostapd_interfaces(char *hostapd_dir); static int ubus_get_clients(); +static int +add_mac(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg); + int hostapd_array_check_id(uint32_t id); void hostapd_array_insert(uint32_t id); void hostapd_array_delete(uint32_t id); +static void ubus_add_oject(); int hostapd_array_check_id(uint32_t id) { @@ -700,11 +706,11 @@ static const struct blobmsg_policy add_del_policy[__ADD_DEL_MAC_MAX] = { }; static const struct ubus_method dawn_methods[] = { - UBUS_METHOD("hello", test_hello, add_del_policy), + UBUS_METHOD("add_mac", add_mac, add_del_policy), }; static struct ubus_object_type dawn_object_type = - UBUS_OBJECT_TYPE("test", dawn_methods); + UBUS_OBJECT_TYPE("dawn", dawn_methods); static struct ubus_object dawn_object = { .name = "dawn", @@ -729,10 +735,13 @@ add_mac(struct ubus_context *ctx, struct ubus_object *obj, if (hwaddr_aton(blobmsg_data(tb[MAC_ADDR]), addr)) return UBUS_STATUS_INVALID_ARGUMENT; - printf("ADDED SOME MAC!\n"); + insert_to_maclist(addr); + write_mac_to_file("/etc/dawn/mac_list", addr); + + return 0; } -static void ubus_add_oject(void) +static void ubus_add_oject() { int ret; diff --git a/src/utils/utils.c b/src/utils/utils.c index 323d4b2..8af0488 100644 --- a/src/utils/utils.c +++ b/src/utils/utils.c @@ -44,3 +44,19 @@ int convert_mac(char *in, char *out) { return 0; } +void write_mac_to_file(char* path, uint8_t addr[]) +{ + FILE *f = fopen(path, "a"); + if (f == NULL) + { + printf("Error opening file!\n"); + exit(1); + } + + char mac_buf[20]; + sprintf(mac_buf, MACSTR, MAC2STR(addr)); + + fprintf(f, "%s\n", mac_buf); + + fclose(f); +} \ No newline at end of file From a6140a0a8d82e9b14e555683783e307113d2d315 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Wed, 13 Dec 2017 12:23:01 +0100 Subject: [PATCH 05/27] print probe array --- src/utils/ubus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/ubus.c b/src/utils/ubus.c index 2d09677..f9b0c53 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -345,7 +345,7 @@ static int handle_probe_req(struct blob_attr *msg) { printf("[WC] Hostapd-Probe: %s : %s\n", "probe", str); - //print_probe_array(); + print_probe_array(); /* // deny access if (!decide_function(&tmp_probe)) { From e2a16404b1f3af767c32486ece697ea40cb1b76f Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 15 Dec 2017 19:07:40 +0100 Subject: [PATCH 06/27] compare station count --- src/include/datastorage.h | 3 ++- src/storage/datastorage.c | 33 +++++++++++++++++++++++++++++++-- src/utils/ubus.c | 15 +++++++++++++-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/include/datastorage.h b/src/include/datastorage.h index c47e2a4..86c1e73 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -128,6 +128,7 @@ typedef struct ap_s { uint8_t vht; uint32_t channel_utilization; time_t time; + uint32_t station_count; } ap; // ---------------- Defines ---------------- @@ -177,7 +178,7 @@ int mac_is_equal(uint8_t addr1[], uint8_t addr2[]); int mac_is_greater(uint8_t addr1[], uint8_t addr2[]); -int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[]); +int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automatic_kick); /* List stuff */ diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index a80cccf..458a3e3 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -41,6 +41,8 @@ int probe_array_update_rssi(uint8_t bssid_addr[], uint8_t client_addr[], uint32_ int is_connected(uint8_t bssid_addr[], uint8_t client_addr[]); +int compare_station_count(uint8_t *bssid_addr_own, uint8_t *bssid_addr_to_compare, int automatic_kick); + int probe_entry_last = -1; int client_entry_last = -1; int ap_entry_last = -1; @@ -89,7 +91,28 @@ int eval_probe_metric(struct probe_entry_s probe_entry) { return score; } -int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[]) { +int compare_station_count(uint8_t *bssid_addr_own, uint8_t *bssid_addr_to_compare, int automatic_kick) { + + ap ap_entry_own = ap_array_get_ap(bssid_addr_own); + ap ap_entry_to_compre = ap_array_get_ap(bssid_addr_to_compare); + + // check if ap entry is available + if (mac_is_equal(ap_entry_own.bssid_addr, bssid_addr_own) + && mac_is_equal(ap_entry_to_compre.bssid_addr, bssid_addr_to_compare) + ) { + printf("Comparing own %d to %d\n", ap_entry_own.station_count, ap_entry_to_compre.station_count); + if(automatic_kick){ + return (ap_entry_own.station_count - 1) > ap_entry_to_compre.station_count; + } else { + return ap_entry_own.station_count > ap_entry_to_compre.station_count; + } + } + + return 0; +} + + +int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automatic_kick) { int own_score = -1; // find first client entry in probe array @@ -131,12 +154,18 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[]) { { return 1; } + if (!mac_is_equal(bssid_addr, probe_array[k].bssid_addr) && + own_score == eval_probe_metric(probe_array[k])) + { + // if ap have same value but station count is different... + return compare_station_count(bssid_addr, probe_array[k].bssid_addr, automatic_kick); + } } return 0; } int kick_client(struct client_s client_entry) { - return better_ap_available(client_entry.bssid_addr, client_entry.client_addr); + return better_ap_available(client_entry.bssid_addr, client_entry.client_addr, 1); } void kick_clients(uint8_t bssid[], uint32_t id) { diff --git a/src/utils/ubus.c b/src/utils/ubus.c index f9b0c53..f10e047 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -80,6 +80,7 @@ enum { CLIENT_TABLE_HT, CLIENT_TABLE_VHT, CLIENT_TABLE_CHAN_UTIL, + CLIENT_TABLE_NUM_STA, __CLIENT_TABLE_MAX, }; @@ -90,6 +91,7 @@ static const struct blobmsg_policy client_table_policy[__CLIENT_TABLE_MAX] = { [CLIENT_TABLE_HT] = {.name = "ht_supported", .type = BLOBMSG_TYPE_INT8}, [CLIENT_TABLE_VHT] = {.name = "vht_supported", .type = BLOBMSG_TYPE_INT8}, [CLIENT_TABLE_CHAN_UTIL] = {.name = "channel_utilization", .type = BLOBMSG_TYPE_INT32}, + [CLIENT_TABLE_NUM_STA] = {.name = "num_sta", .type = BLOBMSG_TYPE_INT32}, }; enum { @@ -215,7 +217,7 @@ static int decide_function(probe_entry *prob_req) { return 0; } - if(better_ap_available(prob_req->bssid_addr, prob_req->client_addr)) + if(better_ap_available(prob_req->bssid_addr, prob_req->client_addr, 0)) { return 0; } @@ -345,7 +347,7 @@ static int handle_probe_req(struct blob_attr *msg) { printf("[WC] Hostapd-Probe: %s : %s\n", "probe", str); - print_probe_array(); + //print_probe_array(); /* // deny access if (!decide_function(&tmp_probe)) { @@ -574,6 +576,15 @@ int parse_to_clients(struct blob_attr *msg, int do_kick, uint32_t id) { ap_entry.ht = blobmsg_get_u8(tb[CLIENT_TABLE_HT]); ap_entry.vht = blobmsg_get_u8(tb[CLIENT_TABLE_VHT]); ap_entry.channel_utilization = blobmsg_get_u32(tb[CLIENT_TABLE_CHAN_UTIL]); + + if(tb[CLIENT_TABLE_NUM_STA]) + { + ap_entry.station_count = blobmsg_get_u32(tb[CLIENT_TABLE_NUM_STA]); + } else + { + ap_entry.station_count = 0; + } + insert_to_ap_array(ap_entry); if (do_kick) { From 22cc461d527b4b73c39626aae230400970a1c25f Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 15 Dec 2017 23:18:28 +0100 Subject: [PATCH 07/27] add ability of station count to config file --- src/include/datastorage.h | 1 + src/storage/datastorage.c | 2 +- src/utils/dawn_uci.c | 8 ++++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 86c1e73..6d7a6fd 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -33,6 +33,7 @@ struct probe_metric_s { int max_chan_util_val; int min_probe_count; int bandwith_threshold; + int use_station_count; }; struct time_config_s { diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 458a3e3..a07eae8 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -154,7 +154,7 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automat { return 1; } - if (!mac_is_equal(bssid_addr, probe_array[k].bssid_addr) && + if ( dawn_metric.use_station_count && !mac_is_equal(bssid_addr, probe_array[k].bssid_addr) && own_score == eval_probe_metric(probe_array[k])) { // if ap have same value but station count is different... diff --git a/src/utils/dawn_uci.c b/src/utils/dawn_uci.c index 9ca9938..05401a6 100644 --- a/src/utils/dawn_uci.c +++ b/src/utils/dawn_uci.c @@ -209,6 +209,14 @@ struct probe_metric_s uci_get_dawn_metric() { if (ptr.o->type == UCI_TYPE_STRING) ret.bandwith_threshold = atoi(ptr.o->v.string); + char tmp_use_station_count[] = "dawn.metric.use_station_count"; + if (uci_lookup_ptr(c, &ptr, tmp_use_station_count, 1) != UCI_OK) { + uci_perror(c, "uci_get_daw_metric Error"); + return ret; + } + if (ptr.o->type == UCI_TYPE_STRING) + ret.use_station_count = atoi(ptr.o->v.string); + printf("Loaded metric: %d\n", ret.min_probe_count); uci_free_context(c); From 3b6f6e1fc4b6810b3a53eb2cb710e9031dc72e9b Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 15 Dec 2017 23:18:28 +0100 Subject: [PATCH 08/27] add ability of station count to config file --- files/dawn.config | 53 ++++++++++++++++++++------------------- src/include/datastorage.h | 1 + src/storage/datastorage.c | 2 +- src/utils/dawn_uci.c | 8 ++++++ 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/files/dawn.config b/files/dawn.config index 817255c..91ef099 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -1,36 +1,37 @@ config settings network - option broadcast_ip '225.0.0.37' - option broadcast_port '1025' - option multicast '1' - option shared_key 'Niiiiiiiiiiiiiik' - option iv 'Niiiiiiiiiiiiiik' + option broadcast_ip '225.0.0.37' + option broadcast_port '1025' + option multicast '1' + option shared_key 'Niiiiiiiiiiiiiik' + option iv 'Niiiiiiiiiiiiiik' config settings ordering option sort_order 'csfb' config settings hostapd - option hostapd_dir '/var/run/hostapd' + option hostapd_dir '/var/run/hostapd' config settings times - option update_client '50' - option remove_client '120' - option remove_probe '120' - option remove_ap '460' - option update_hostapd '10' + option update_client '10' + option remove_client '120' + option remove_probe '120' + option remove_ap '460' + option update_hostapd '10' config settings metric - option ht_support '10' - option vht_support '50' - option no_ht_support '0' - option no_vht_support '0' - option rssi '10' - option low_rssi '-500' - option freq '100' - option chan_util '50' - option max_chan_util '-50' - option rssi_val '-60' - option low_rssi_val '-80' - option chan_util_val '140' - option max_chan_util_val '170' - option min_probe_count '2' - option bandwith_threshold '6' + option ht_support '10' + option vht_support '10' + option no_ht_support '0' + option no_vht_support '0' + option rssi '10' + option low_rssi '-500' + option freq '100' + option chan_util '50' + option max_chan_util '-50' + option rssi_val '-60' + option low_rssi_val '-80' + option chan_util_val '140' + option max_chan_util_val '170' + option min_probe_count '4' + option bandwith_threshold '6' + option use_station_count '1' diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 86c1e73..6d7a6fd 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -33,6 +33,7 @@ struct probe_metric_s { int max_chan_util_val; int min_probe_count; int bandwith_threshold; + int use_station_count; }; struct time_config_s { diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 458a3e3..a07eae8 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -154,7 +154,7 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automat { return 1; } - if (!mac_is_equal(bssid_addr, probe_array[k].bssid_addr) && + if ( dawn_metric.use_station_count && !mac_is_equal(bssid_addr, probe_array[k].bssid_addr) && own_score == eval_probe_metric(probe_array[k])) { // if ap have same value but station count is different... diff --git a/src/utils/dawn_uci.c b/src/utils/dawn_uci.c index 9ca9938..05401a6 100644 --- a/src/utils/dawn_uci.c +++ b/src/utils/dawn_uci.c @@ -209,6 +209,14 @@ struct probe_metric_s uci_get_dawn_metric() { if (ptr.o->type == UCI_TYPE_STRING) ret.bandwith_threshold = atoi(ptr.o->v.string); + char tmp_use_station_count[] = "dawn.metric.use_station_count"; + if (uci_lookup_ptr(c, &ptr, tmp_use_station_count, 1) != UCI_OK) { + uci_perror(c, "uci_get_daw_metric Error"); + return ret; + } + if (ptr.o->type == UCI_TYPE_STRING) + ret.use_station_count = atoi(ptr.o->v.string); + printf("Loaded metric: %d\n", ret.min_probe_count); uci_free_context(c); From c6336b7c4819a4555ba8196f6af40c15f8c1e62c Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Sat, 16 Dec 2017 00:48:00 +0100 Subject: [PATCH 09/27] send first clientstring via network and then parse --- src/utils/ubus.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/utils/ubus.c b/src/utils/ubus.c index f10e047..bd2ada9 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -599,10 +599,11 @@ static void ubus_get_clients_cb(struct ubus_request *req, int type, struct blob_ if (!msg) return; - parse_to_clients(msg, 1, req->peer); - char *str = blobmsg_format_json(msg, true); send_string_enc(str); + + parse_to_clients(msg, 1, req->peer); + print_client_array(); print_ap_array(); } From 3b35ad46455fd3c8bf9a26e44d5cf9e337c95291 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Sat, 16 Dec 2017 17:47:04 +0100 Subject: [PATCH 10/27] don't use utilization --- files/dawn.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/files/dawn.config b/files/dawn.config index 91ef099..a204eb8 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -20,14 +20,14 @@ config settings times config settings metric option ht_support '10' - option vht_support '10' + option vht_support '100' option no_ht_support '0' option no_vht_support '0' option rssi '10' option low_rssi '-500' option freq '100' - option chan_util '50' - option max_chan_util '-50' + option chan_util '0' + option max_chan_util '0' option rssi_val '-60' option low_rssi_val '-80' option chan_util_val '140' From 1787c8110fa48782a1b9a429211e3deb4d790388 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Sun, 17 Dec 2017 09:39:38 +0100 Subject: [PATCH 11/27] remove prints --- src/storage/datastorage.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index a07eae8..2dd33de 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -508,11 +508,11 @@ ap insert_to_ap_array(ap entry) { ap ap_array_get_ap(uint8_t bssid_addr[]) { ap ret; - char bssid_mac_string[20]; - sprintf(bssid_mac_string, MACSTR, MAC2STR(bssid_addr)); - printf("Try to find: %s\n", bssid_mac_string); - printf("in\n"); - print_ap_array(); + //char bssid_mac_string[20]; + //sprintf(bssid_mac_string, MACSTR, MAC2STR(bssid_addr)); + //printf("Try to find: %s\n", bssid_mac_string); + //printf("in\n"); + //print_ap_array(); if (ap_entry_last == -1) { return ret; From 9569a87ca5c36423be7e38c9925cb42ba0d32ae1 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Tue, 19 Dec 2017 10:48:59 +0100 Subject: [PATCH 12/27] add debug msgs --- src/storage/datastorage.c | 6 ++++++ src/utils/ubus.c | 1 + 2 files changed, 7 insertions(+) diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 2dd33de..1cbcf86 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -171,6 +171,10 @@ int kick_client(struct client_s client_entry) { void kick_clients(uint8_t bssid[], uint32_t id) { pthread_mutex_lock(&client_array_mutex); pthread_mutex_lock(&probe_array_mutex); + printf("-------- KICKING CLIENS!!!---------\n"); + char mac_buf_ap[20]; + sprintf(mac_buf_ap, MACSTR, MAC2STR(bssid)); + printf("EVAL %s\n", mac_buf_ap); // Seach for BSSID int i; @@ -240,6 +244,8 @@ void kick_clients(uint8_t bssid[], uint32_t id) { } } + printf("---------------------------\n"); + pthread_mutex_unlock(&probe_array_mutex); pthread_mutex_unlock(&client_array_mutex); } diff --git a/src/utils/ubus.c b/src/utils/ubus.c index bd2ada9..5017262 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -619,6 +619,7 @@ static int ubus_get_clients() { void update_clients(struct uloop_timeout *t) { ubus_get_clients(); + // maybe to much?! don't set timer again... uloop_timeout_set(&client_timer, timeout_config.update_client * 1000); } From 8b1d45a80de7194fbf499b10f0123bf6344d8a7a Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Tue, 19 Dec 2017 13:21:28 +0100 Subject: [PATCH 13/27] improve device function --- files/dawn.config | 2 +- src/storage/datastorage.c | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/files/dawn.config b/files/dawn.config index a204eb8..74f0c5e 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -32,6 +32,6 @@ config settings metric option low_rssi_val '-80' option chan_util_val '140' option max_chan_util_val '170' - option min_probe_count '4' + option min_probe_count '0' option bandwith_threshold '6' option use_station_count '1' diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 1cbcf86..2149cfa 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -133,6 +133,7 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automat break; } if (mac_is_equal(bssid_addr, probe_array[j].bssid_addr)) { + printf("Calculating own score!\n"); own_score = eval_probe_metric(probe_array[j]); break; } @@ -145,17 +146,28 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automat int k; for (k = i; k <= probe_entry_last; k++) { - if (!mac_is_equal(probe_array[k].client_addr, client_addr)) { + int score_to_compare; + + if (!mac_is_equal(probe_array[k].client_addr, client_addr)) + { break; } - if (!mac_is_equal(bssid_addr, probe_array[k].bssid_addr) && - own_score < - eval_probe_metric(probe_array[k])) // that's wrong! find client_entry OR write things in probe array struct! + + if(mac_is_equal(bssid_addr, probe_array[k].bssid_addr)) + { + printf("Own Score! Skipping!\n"); + print_probe_entry(probe_array[k]); + continue; + } + + printf("Calculating score to compare!\n"); + score_to_compare = eval_probe_metric(probe_array[k]); + + if(own_score < score_to_compare) { return 1; } - if ( dawn_metric.use_station_count && !mac_is_equal(bssid_addr, probe_array[k].bssid_addr) && - own_score == eval_probe_metric(probe_array[k])) + if (dawn_metric.use_station_count && own_score == score_to_compare) { // if ap have same value but station count is different... return compare_station_count(bssid_addr, probe_array[k].bssid_addr, automatic_kick); @@ -204,8 +216,10 @@ void kick_clients(uint8_t bssid[], uint32_t id) { } + int do_kick = kick_client(client_array[j]); + // better ap available - if (kick_client(client_array[j]) > 0) { + if (do_kick > 0) { printf("Better AP available. Kicking client:\n"); print_client_entry(client_array[j]); printf("Check if client is active receiving!\n"); @@ -232,7 +246,7 @@ void kick_clients(uint8_t bssid[], uint32_t id) { break; // no entry in probe array for own bssid - } else if (kick_client(client_array[j]) == -1) { + } else if (do_kick == -1) { printf("No Information about client. Force reconnect:\n"); print_client_entry(client_array[j]); del_client_interface(id, client_array[j].client_addr, 0, 0, 0); From c22b499e0ce0a7a4f18682427ccb615e7108d428 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Tue, 19 Dec 2017 13:49:37 +0100 Subject: [PATCH 14/27] reset files/ --- files/dawn.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/dawn.config b/files/dawn.config index 74f0c5e..a204eb8 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -32,6 +32,6 @@ config settings metric option low_rssi_val '-80' option chan_util_val '140' option max_chan_util_val '170' - option min_probe_count '0' + option min_probe_count '4' option bandwith_threshold '6' option use_station_count '1' From 1375b7a736b8a54e79f7132fab56554c401578cf Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Tue, 19 Dec 2017 18:56:12 +0100 Subject: [PATCH 15/27] check probe requests --- src/utils/ubus.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/utils/ubus.c b/src/utils/ubus.c index 5017262..a5b311c 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -337,7 +337,7 @@ static int handle_probe_req(struct blob_attr *msg) { parse_to_probe_req(msg, &prob_req); //insert_to_list(prob_req, 1); //probe_entry tmp_probe = - insert_to_array(prob_req, 1); + probe_entry tmp_prob_req = insert_to_array(prob_req, 1); // send probe via network @@ -348,12 +348,12 @@ static int handle_probe_req(struct blob_attr *msg) { printf("[WC] Hostapd-Probe: %s : %s\n", "probe", str); //print_probe_array(); - /* + // deny access - if (!decide_function(&tmp_probe)) { + if (!decide_function(&tmp_prob_req)) { //printf("MAC WILL BE DECLINED!!!\n"); return UBUS_STATUS_UNKNOWN_ERROR; - }*/ + } //printf("MAC WILL BE ACCEPDTED!!!\n"); return 0; } From bd1c38c0ea80b524c3abce04588f625031af3dd9 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Tue, 19 Dec 2017 19:07:41 +0100 Subject: [PATCH 16/27] add option to deny on probe requests --- files/dawn.config | 1 + src/include/datastorage.h | 1 + src/utils/dawn_uci.c | 8 ++++++++ src/utils/ubus.c | 6 ++++++ 4 files changed, 16 insertions(+) diff --git a/files/dawn.config b/files/dawn.config index a204eb8..bcd4a52 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -35,3 +35,4 @@ config settings metric option min_probe_count '4' option bandwith_threshold '6' option use_station_count '1' + option eval_probe_req '1' \ No newline at end of file diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 6d7a6fd..2c1c65e 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -34,6 +34,7 @@ struct probe_metric_s { int min_probe_count; int bandwith_threshold; int use_station_count; + int eval_probe_req; }; struct time_config_s { diff --git a/src/utils/dawn_uci.c b/src/utils/dawn_uci.c index 05401a6..150e995 100644 --- a/src/utils/dawn_uci.c +++ b/src/utils/dawn_uci.c @@ -217,6 +217,14 @@ struct probe_metric_s uci_get_dawn_metric() { if (ptr.o->type == UCI_TYPE_STRING) ret.use_station_count = atoi(ptr.o->v.string); + char tmp_eval_probe_req[] = "dawn.metric.eval_probe_req"; + if (uci_lookup_ptr(c, &ptr, tmp_eval_probe_req, 1) != UCI_OK) { + uci_perror(c, "uci_get_daw_metric Error"); + return ret; + } + if (ptr.o->type == UCI_TYPE_STRING) + ret.eval_probe_req = atoi(ptr.o->v.string); + printf("Loaded metric: %d\n", ret.min_probe_count); uci_free_context(c); diff --git a/src/utils/ubus.c b/src/utils/ubus.c index a5b311c..9d28ec2 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -350,6 +350,12 @@ static int handle_probe_req(struct blob_attr *msg) { //print_probe_array(); // deny access + + if(!dawn_metric.eval_probe_req) + { + return 0; + } + if (!decide_function(&tmp_prob_req)) { //printf("MAC WILL BE DECLINED!!!\n"); return UBUS_STATUS_UNKNOWN_ERROR; From 7a7519d420d4476b6736783c50b7e7dbe27a2a26 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Wed, 20 Dec 2017 18:26:30 +0100 Subject: [PATCH 17/27] don't return if ap is not lower! --- src/storage/datastorage.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 2149cfa..6eabe3e 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -170,7 +170,10 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automat if (dawn_metric.use_station_count && own_score == score_to_compare) { // if ap have same value but station count is different... - return compare_station_count(bssid_addr, probe_array[k].bssid_addr, automatic_kick); + if(compare_station_count(bssid_addr, probe_array[k].bssid_addr, automatic_kick)) + { + return 1; + } } } return 0; From dc26e1a03a0a8bda003350eeb0f30a5eb9330bf9 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Thu, 21 Dec 2017 18:47:11 +0100 Subject: [PATCH 18/27] reformat code --- src/crypto/base64.c | 111 ++++++++++++++++------------------ src/network/broadcastsocket.c | 2 +- src/network/multicastsocket.c | 13 ++-- src/network/networksocket.c | 2 +- src/storage/datastorage.c | 32 ++++------ src/utils/dawn_iwinfo.c | 38 +++++------- src/utils/ubus.c | 62 +++++++------------ 7 files changed, 110 insertions(+), 150 deletions(-) diff --git a/src/crypto/base64.c b/src/crypto/base64.c index eec7d98..9bed459 100644 --- a/src/crypto/base64.c +++ b/src/crypto/base64.c @@ -88,28 +88,27 @@ /* aaaack but it's fast and const should make it shared text page. */ static const unsigned char pr2six[256] = -{ - /* ASCII table */ - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, - 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, - 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 -}; + { + /* ASCII table */ + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, + 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, + 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 + }; -int Base64decode_len(const char *bufcoded) -{ +int Base64decode_len(const char *bufcoded) { int nbytesdecoded; register const unsigned char *bufin; register int nprbytes; @@ -123,8 +122,7 @@ int Base64decode_len(const char *bufcoded) return nbytesdecoded + 1; } -int Base64decode(char *bufplain, const char *bufcoded) -{ +int Base64decode(char *bufplain, const char *bufcoded) { int nbytesdecoded; register const unsigned char *bufin; register unsigned char *bufout; @@ -139,28 +137,28 @@ int Base64decode(char *bufplain, const char *bufcoded) bufin = (const unsigned char *) bufcoded; while (nprbytes > 4) { - *(bufout++) = - (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4); - *(bufout++) = - (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); - *(bufout++) = - (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]); - bufin += 4; - nprbytes -= 4; + *(bufout++) = + (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4); + *(bufout++) = + (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); + *(bufout++) = + (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]); + bufin += 4; + nprbytes -= 4; } /* Note: (nprbytes == 1) would be an error, so just ingore that case */ if (nprbytes > 1) { - *(bufout++) = - (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4); + *(bufout++) = + (unsigned char) (pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4); } if (nprbytes > 2) { - *(bufout++) = - (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); + *(bufout++) = + (unsigned char) (pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2); } if (nprbytes > 3) { - *(bufout++) = - (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]); + *(bufout++) = + (unsigned char) (pr2six[bufin[2]] << 6 | pr2six[bufin[3]]); } *(bufout++) = '\0'; @@ -169,39 +167,36 @@ int Base64decode(char *bufplain, const char *bufcoded) } static const char basis_64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -int Base64encode_len(int len) -{ +int Base64encode_len(int len) { return ((len + 2) / 3 * 4) + 1; } -int Base64encode(char *encoded, const char *string, int len) -{ +int Base64encode(char *encoded, const char *string, int len) { int i; char *p; p = encoded; for (i = 0; i < len - 2; i += 3) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - *p++ = basis_64[((string[i] & 0x3) << 4) | - ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2) | - ((int) (string[i + 2] & 0xC0) >> 6)]; - *p++ = basis_64[string[i + 2] & 0x3F]; - } - if (i < len) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - if (i == (len - 1)) { - *p++ = basis_64[((string[i] & 0x3) << 4)]; - *p++ = '='; - } - else { + *p++ = basis_64[(string[i] >> 2) & 0x3F]; *p++ = basis_64[((string[i] & 0x3) << 4) | ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2) | + ((int) (string[i + 2] & 0xC0) >> 6)]; + *p++ = basis_64[string[i + 2] & 0x3F]; } - *p++ = '='; + if (i < len) { + *p++ = basis_64[(string[i] >> 2) & 0x3F]; + if (i == (len - 1)) { + *p++ = basis_64[((string[i] & 0x3) << 4)]; + *p++ = '='; + } else { + *p++ = basis_64[((string[i] & 0x3) << 4) | + ((int) (string[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; + } + *p++ = '='; } *p++ = '\0'; diff --git a/src/network/broadcastsocket.c b/src/network/broadcastsocket.c index b002046..7d6fc94 100644 --- a/src/network/broadcastsocket.c +++ b/src/network/broadcastsocket.c @@ -33,7 +33,7 @@ int setup_broadcast_socket(const char *_broadcast_ip, unsigned short _broadcast_ addr->sin_port = htons(_broadcast_port); while (bind(sock, (struct sockaddr *) addr, sizeof(*addr)) < - 0) { + 0) { fprintf(stderr, "Binding socket failed!\n"); sleep(1); } diff --git a/src/network/multicastsocket.c b/src/network/multicastsocket.c index b67499e..66664f2 100644 --- a/src/network/multicastsocket.c +++ b/src/network/multicastsocket.c @@ -69,13 +69,12 @@ int setup_multicast_socket(const char *_multicast_ip, unsigned short _multicast_ return sock; } -int remove_multicast_socket(int socket) -{ - if (setsockopt ( socket, - IPPROTO_IP, - IP_DROP_MEMBERSHIP, - &command, sizeof (command)) < 0 ) { - perror ("setsockopt:IP_DROP_MEMBERSHIP"); +int remove_multicast_socket(int socket) { + if (setsockopt(socket, + IPPROTO_IP, + IP_DROP_MEMBERSHIP, + &command, sizeof(command)) < 0) { + perror("setsockopt:IP_DROP_MEMBERSHIP"); return -1; } return 0; diff --git a/src/network/networksocket.c b/src/network/networksocket.c index ed33e02..a4a975e 100644 --- a/src/network/networksocket.c +++ b/src/network/networksocket.c @@ -238,7 +238,7 @@ int send_string_enc(char *msg) { } void close_socket() { - if(multicast_socket){ + if (multicast_socket) { remove_multicast_socket(sock); } close(sock); diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 6eabe3e..bc3ab08 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -98,10 +98,10 @@ int compare_station_count(uint8_t *bssid_addr_own, uint8_t *bssid_addr_to_compar // check if ap entry is available if (mac_is_equal(ap_entry_own.bssid_addr, bssid_addr_own) - && mac_is_equal(ap_entry_to_compre.bssid_addr, bssid_addr_to_compare) + && mac_is_equal(ap_entry_to_compre.bssid_addr, bssid_addr_to_compare) ) { printf("Comparing own %d to %d\n", ap_entry_own.station_count, ap_entry_to_compre.station_count); - if(automatic_kick){ + if (automatic_kick) { return (ap_entry_own.station_count - 1) > ap_entry_to_compre.station_count; } else { return ap_entry_own.station_count > ap_entry_to_compre.station_count; @@ -148,30 +148,25 @@ int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], int automat for (k = i; k <= probe_entry_last; k++) { int score_to_compare; - if (!mac_is_equal(probe_array[k].client_addr, client_addr)) - { + if (!mac_is_equal(probe_array[k].client_addr, client_addr)) { break; } - if(mac_is_equal(bssid_addr, probe_array[k].bssid_addr)) - { + if (mac_is_equal(bssid_addr, probe_array[k].bssid_addr)) { printf("Own Score! Skipping!\n"); print_probe_entry(probe_array[k]); continue; } - + printf("Calculating score to compare!\n"); score_to_compare = eval_probe_metric(probe_array[k]); - if(own_score < score_to_compare) - { + if (own_score < score_to_compare) { return 1; } - if (dawn_metric.use_station_count && own_score == score_to_compare) - { + if (dawn_metric.use_station_count && own_score == score_to_compare) { // if ap have same value but station count is different... - if(compare_station_count(bssid_addr, probe_array[k].bssid_addr, automatic_kick)) - { + if (compare_station_count(bssid_addr, probe_array[k].bssid_addr, automatic_kick)) { return 1; } } @@ -228,12 +223,11 @@ void kick_clients(uint8_t bssid[], uint32_t id) { printf("Check if client is active receiving!\n"); float rx_rate, tx_rate; - if(get_bandwidth_iwinfo(client_array[j].client_addr, &rx_rate, &tx_rate)) - { + if (get_bandwidth_iwinfo(client_array[j].client_addr, &rx_rate, &tx_rate)) { // 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.bandwith_threshold){ + if (rx_rate > dawn_metric.bandwith_threshold) { printf("Client is probably in active transmisison. Don't kick! RxRate is: %f\n", rx_rate); continue; } @@ -633,8 +627,7 @@ void remove_old_ap_entries(time_t current_time, long long int threshold) { } } -void uloop_add_data_cbs() -{ +void uloop_add_data_cbs() { uloop_timeout_add(&probe_timeout); uloop_timeout_add(&client_timeout); uloop_timeout_add(&ap_timeout); @@ -648,8 +641,7 @@ void remove_probe_array_cb(struct uloop_timeout *t) { uloop_timeout_set(&probe_timeout, timeout_config.remove_probe * 1000); } -void remove_client_array_cb(struct uloop_timeout *t) -{ +void remove_client_array_cb(struct uloop_timeout *t) { pthread_mutex_lock(&client_array_mutex); printf("[Thread] : Removing old client entries!\n"); remove_old_client_entries(time(0), timeout_config.update_client); diff --git a/src/utils/dawn_iwinfo.c b/src/utils/dawn_iwinfo.c index 7cacad6..7984f31 100644 --- a/src/utils/dawn_iwinfo.c +++ b/src/utils/dawn_iwinfo.c @@ -17,7 +17,7 @@ int get_rssi(const char *ifname, uint8_t *client_addr); int get_bandwith(const char *ifname, uint8_t *client_addr, float *rx_rate, float *tx_rate); -#define IWINFO_BUFSIZE 24 * 1024 +#define IWINFO_BUFSIZE 24 * 1024 int get_bandwidth_iwinfo(__uint8_t *client_addr, float *rx_rate, float *tx_rate) { @@ -33,8 +33,7 @@ int get_bandwidth_iwinfo(__uint8_t *client_addr, float *rx_rate, float *tx_rate) while ((entry = readdir(dirp)) != NULL) { if (entry->d_type == DT_SOCK) { - if(get_bandwith(entry->d_name, client_addr, rx_rate, tx_rate)) - { + if (get_bandwith(entry->d_name, client_addr, rx_rate, tx_rate)) { sucess = 1; break; } @@ -44,7 +43,7 @@ int get_bandwidth_iwinfo(__uint8_t *client_addr, float *rx_rate, float *tx_rate) return sucess; } -int get_bandwith(const char *ifname, uint8_t *client_addr, float *rx_rate, float *tx_rate){ +int get_bandwith(const char *ifname, uint8_t *client_addr, float *rx_rate, float *tx_rate) { int i, len; char buf[IWINFO_BUFSIZE]; @@ -53,23 +52,18 @@ int get_bandwith(const char *ifname, uint8_t *client_addr, float *rx_rate, float iw = iwinfo_backend(ifname); - if (iw->assoclist(ifname, buf, &len)) - { + if (iw->assoclist(ifname, buf, &len)) { printf("No information available\n"); return 0; - } - else if (len <= 0) - { + } else if (len <= 0) { printf("No station connected\n"); return 0; } - for (i = 0; i < len; i += sizeof(struct iwinfo_assoclist_entry)) - { + for (i = 0; i < len; i += sizeof(struct iwinfo_assoclist_entry)) { e = (struct iwinfo_assoclist_entry *) &buf[i]; - if(mac_is_equal(client_addr, e->mac)) - { + if (mac_is_equal(client_addr, e->mac)) { //struct iwinfo_assoclist_entry * rx_rate = e->rx_rate; //struct iwinfo_assoclist_entry * tx_rate = e->tx_rate; *rx_rate = e->rx_rate.rate / 1000; @@ -99,7 +93,7 @@ int get_rssi_iwinfo(__uint8_t *client_addr) { while ((entry = readdir(dirp)) != NULL) { if (entry->d_type == DT_SOCK) { rssi = get_rssi(entry->d_name, client_addr); - if(rssi != INT_MIN) + if (rssi != INT_MIN) break; } } @@ -107,7 +101,7 @@ int get_rssi_iwinfo(__uint8_t *client_addr) { return rssi; } -int get_rssi(const char *ifname, uint8_t *client_addr){ +int get_rssi(const char *ifname, uint8_t *client_addr) { int i, len; char buf[IWINFO_BUFSIZE]; @@ -116,23 +110,19 @@ int get_rssi(const char *ifname, uint8_t *client_addr){ iw = iwinfo_backend(ifname); - if (iw->assoclist(ifname, buf, &len)) - { + if (iw->assoclist(ifname, buf, &len)) { printf("No information available\n"); return INT_MIN; - } - else if (len <= 0) - { + } else if (len <= 0) { printf("No station connected\n"); return INT_MIN; } - for (i = 0; i < len; i += sizeof(struct iwinfo_assoclist_entry)) - { + for (i = 0; i < len; i += sizeof(struct iwinfo_assoclist_entry)) { e = (struct iwinfo_assoclist_entry *) &buf[i]; - if(mac_is_equal(client_addr, e->mac)) - return e->signal; + if (mac_is_equal(client_addr, e->mac)) + return e->signal; } return INT_MIN; diff --git a/src/utils/ubus.c b/src/utils/ubus.c index 9d28ec2..415eadc 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -138,20 +138,18 @@ static int subscribe_to_hostapd_interfaces(char *hostapd_dir); static int ubus_get_clients(); int hostapd_array_check_id(uint32_t id); + void hostapd_array_insert(uint32_t id); + void hostapd_array_delete(uint32_t id); -void add_client_update_timer(time_t time) -{ +void add_client_update_timer(time_t time) { uloop_timeout_set(&client_timer, time); } -int hostapd_array_check_id(uint32_t id) -{ - for(int i = 0; i <= hostapd_sock_last; i++) - { - if(hostapd_sock_arr[i] == id) - { +int hostapd_array_check_id(uint32_t id) { + for (int i = 0; i <= hostapd_sock_last; i++) { + if (hostapd_sock_arr[i] == id) { return 1; } } @@ -159,21 +157,18 @@ int hostapd_array_check_id(uint32_t id) } -void hostapd_array_insert(uint32_t id) -{ - if(hostapd_sock_last < MAX_HOSTAPD_SOCKETS) { +void hostapd_array_insert(uint32_t id) { + if (hostapd_sock_last < MAX_HOSTAPD_SOCKETS) { hostapd_sock_last++; hostapd_sock_arr[hostapd_sock_last] = id; } - for(int i = 0; i <= hostapd_sock_last; i++) - { - printf("%d: %d\n",i,hostapd_sock_arr[i]); + for (int i = 0; i <= hostapd_sock_last; i++) { + printf("%d: %d\n", i, hostapd_sock_arr[i]); } } -void hostapd_array_delete(uint32_t id) -{ +void hostapd_array_delete(uint32_t id) { int i = 0; int found_in_array = 0; @@ -181,9 +176,8 @@ void hostapd_array_delete(uint32_t id) return; } - for(i = 0; i <= hostapd_sock_last; i++) - { - if(hostapd_sock_arr[i] == id) { + for (i = 0; i <= hostapd_sock_last; i++) { + if (hostapd_sock_arr[i] == id) { found_in_array = 1; break; } @@ -217,8 +211,7 @@ static int decide_function(probe_entry *prob_req) { return 0; } - if(better_ap_available(prob_req->bssid_addr, prob_req->client_addr, 0)) - { + if (better_ap_available(prob_req->bssid_addr, prob_req->client_addr, 0)) { return 0; } @@ -309,8 +302,7 @@ static int handle_auth_req(struct blob_attr *msg) { print_probe_entry(tmp); // block if entry was not already found in probe database - if(!(mac_is_equal(tmp.bssid_addr, auth_req.bssid_addr) && mac_is_equal(tmp.client_addr, auth_req.client_addr))) - { + if (!(mac_is_equal(tmp.bssid_addr, auth_req.bssid_addr) && mac_is_equal(tmp.client_addr, auth_req.client_addr))) { printf("DENY AUTH!\n"); return UBUS_STATUS_UNKNOWN_ERROR; } @@ -351,8 +343,7 @@ static int handle_probe_req(struct blob_attr *msg) { // deny access - if(!dawn_metric.eval_probe_req) - { + if (!dawn_metric.eval_probe_req) { return 0; } @@ -390,8 +381,7 @@ static int add_subscriber(char *name) { return -1; } - if(hostapd_array_check_id(id)) - { + if (hostapd_array_check_id(id)) { return 0; } @@ -406,8 +396,7 @@ static int subscribe_to_hostapd_interfaces(char *hostapd_dir) { DIR *dirp; struct dirent *entry; - if(ctx == NULL) - { + if (ctx == NULL) { return 0; } @@ -429,8 +418,7 @@ static int subscribe_to_hostapd_interfaces(char *hostapd_dir) { static int subscribe_to_hostapd(char *hostapd_dir) { - if(ctx == NULL) - { + if (ctx == NULL) { return 0; } @@ -583,11 +571,9 @@ int parse_to_clients(struct blob_attr *msg, int do_kick, uint32_t id) { ap_entry.vht = blobmsg_get_u8(tb[CLIENT_TABLE_VHT]); ap_entry.channel_utilization = blobmsg_get_u32(tb[CLIENT_TABLE_CHAN_UTIL]); - if(tb[CLIENT_TABLE_NUM_STA]) - { + if (tb[CLIENT_TABLE_NUM_STA]) { ap_entry.station_count = blobmsg_get_u32(tb[CLIENT_TABLE_NUM_STA]); - } else - { + } else { ap_entry.station_count = 0; } @@ -615,8 +601,7 @@ static void ubus_get_clients_cb(struct ubus_request *req, int type, struct blob_ } static int ubus_get_clients() { - for(int i = 0; i <= hostapd_sock_last; i++) - { + for (int i = 0; i <= hostapd_sock_last; i++) { int timeout = 1; ubus_invoke(ctx_clients, hostapd_sock_arr[i], "get_clients", NULL, ubus_get_clients_cb, NULL, timeout * 1000); } @@ -651,8 +636,7 @@ void del_client_all_interfaces(const uint8_t *client_addr, uint32_t reason, uint blobmsg_add_u8(&b, "deauth", deauth); blobmsg_add_u32(&b, "ban_time", ban_time); - for(int i = 0; i <= hostapd_sock_last; i++) - { + for (int i = 0; i <= hostapd_sock_last; i++) { int timeout = 1; ubus_invoke(ctx_clients, hostapd_sock_arr[i], "del_client", b.head, NULL, NULL, timeout * 1000); } From 7e46afec1c6d5ddb6faae05a490700292e4e54b1 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Thu, 21 Dec 2017 22:45:49 +0100 Subject: [PATCH 19/27] update config file --- files/dawn.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/dawn.config b/files/dawn.config index bcd4a52..87edacb 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -23,8 +23,8 @@ config settings metric option vht_support '100' option no_ht_support '0' option no_vht_support '0' - option rssi '10' - option low_rssi '-500' + option rssi '0' + option low_rssi '0' option freq '100' option chan_util '0' option max_chan_util '0' From 8eb7d68e65ca71855f452c6559e4147c7437b36d Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 10:56:03 +0100 Subject: [PATCH 20/27] use uci context --- files/dawn.config | 10 +- files/dawn.init | 43 +---- src/crypto/crypto.c | 2 +- src/include/crypto.h | 2 +- src/include/datastorage.h | 11 +- src/include/dawn_uci.h | 10 ++ src/include/networksocket.h | 2 +- src/include/ubus.h | 4 +- src/main.c | 70 ++------ src/network/networksocket.c | 4 +- src/utils/dawn_uci.c | 337 ++++++++++++++---------------------- src/utils/ubus.c | 8 +- 12 files changed, 183 insertions(+), 320 deletions(-) diff --git a/files/dawn.config b/files/dawn.config index 87edacb..4009ec7 100644 --- a/files/dawn.config +++ b/files/dawn.config @@ -1,24 +1,24 @@ -config settings network +config network option broadcast_ip '225.0.0.37' option broadcast_port '1025' option multicast '1' option shared_key 'Niiiiiiiiiiiiiik' option iv 'Niiiiiiiiiiiiiik' -config settings ordering +config ordering option sort_order 'csfb' -config settings hostapd +config hostapd option hostapd_dir '/var/run/hostapd' -config settings times +config times option update_client '10' option remove_client '120' option remove_probe '120' option remove_ap '460' option update_hostapd '10' -config settings metric +config metric option ht_support '10' option vht_support '100' option no_ht_support '0' diff --git a/files/dawn.init b/files/dawn.init index 8e9a39c..8e83253 100755 --- a/files/dawn.init +++ b/files/dawn.init @@ -11,51 +11,10 @@ NAME=dawn start_service() { echo "Starting Service..." - - local broadcast_ip - local broadcast_port - local sort_order - local hostapd_dir - local shared_key - local iv - - config_load "${NAME}" - config_get broadcast_ip network broadcast_ip - config_get broadcast_port network broadcast_port - config_get shared_key network shared_key - config_get iv network iv - - config_get sort_order ordering sort_order - config_get hostapd_dir hostapd hostapd_dir - - config_get multicast network multicast - procd_open_instance - echo "$PROG -p $broadcast_port -i $broadcast_ip -o $sort_order" - procd_set_param command "$PROG" - procd_append_param command -p "${broadcast_port}" - procd_append_param command -i "${broadcast_ip}" - procd_append_param command -o "${sort_order}" - procd_append_param command -h "${hostapd_dir}" - procd_append_param command -k "${shared_key}" - procd_append_param command -v "${iv}" - - if [ "${multicast}" -gt 0 ]; then - procd_append_param command -m - fi - + procd_set_param command $PROG procd_set_param stdout 1 procd_set_param stderr 1 - - echo "${command}" - - # procd_set_param respawn - - echo "Starting mdns" - procd_add_mdns "dawn" "udp" "${broadcast_port}" "daemon=dawn" "colour=fuschia" - - echo "MDNS Startet" - procd_close_instance echo "Dawn instance started!" } \ No newline at end of file diff --git a/src/crypto/crypto.c b/src/crypto/crypto.c index 00c0832..50419d0 100644 --- a/src/crypto/crypto.c +++ b/src/crypto/crypto.c @@ -25,7 +25,7 @@ void gcrypt_init() { } } -void gcrypt_set_key_and_iv(char *key, char *iv) { +void gcrypt_set_key_and_iv(const char *key, const char *iv) { size_t keylen = gcry_cipher_get_algo_keylen(GCRY_CIPHER); size_t blklen = gcry_cipher_get_algo_blklen(GCRY_CIPHER); diff --git a/src/include/crypto.h b/src/include/crypto.h index 8124b2d..fd80314 100644 --- a/src/include/crypto.h +++ b/src/include/crypto.h @@ -9,7 +9,7 @@ char *unbase_64(unsigned char *input, int length); void gcrypt_init(); -void gcrypt_set_key_and_iv(char *key, char *iv); +void gcrypt_set_key_and_iv(const char *key, const char *iv); //char *gcrypt_encrypt_msg(char *msg, size_t msg_length); char *gcrypt_encrypt_msg(char *msg, size_t msg_length, int *out_length); diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 2c1c65e..9705a27 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -45,6 +45,15 @@ struct time_config_s { time_t update_hostapd; }; +struct network_config_s { + const char* broadcast_ip; + int broadcast_port; + const char* multicast; + const char* shared_key; + const char* iv; + int bool_multicast; +}; + struct time_config_s timeout_config; // ---------------- Global variables ---------------- @@ -173,7 +182,7 @@ ap ap_array_get_ap(uint8_t bssid_addr[]); #define TIME_THRESHOLD 120 // every minute // ---------------- Global variables ---------------- -char sort_string[SORT_NUM]; +char* sort_string; // ---------------- Functions ------------------- int mac_is_equal(uint8_t addr1[], uint8_t addr2[]); diff --git a/src/include/dawn_uci.h b/src/include/dawn_uci.h index b2ee0cf..ed65d52 100644 --- a/src/include/dawn_uci.h +++ b/src/include/dawn_uci.h @@ -5,4 +5,14 @@ struct probe_metric_s uci_get_dawn_metric(); struct time_config_s uci_get_time_config(); +struct network_config_s uci_get_dawn_network(); + +const char* uci_get_dawn_hostapd_dir(); + +const char* uci_get_dawn_sort_order(); + +int uci_init(); + +int uci_clear(); + #endif //DAWN_UCI_H_H diff --git a/src/include/networksocket.h b/src/include/networksocket.h index 4e11724..4ab5a23 100644 --- a/src/include/networksocket.h +++ b/src/include/networksocket.h @@ -5,7 +5,7 @@ pthread_mutex_t send_mutex; -int init_socket_runopts(char *_ip, char *_port, int _multicast_socket); +int init_socket_runopts(const char *_ip, int _port, int _multicast_socket); int send_string(char *msg); diff --git a/src/include/ubus.h b/src/include/ubus.h index 2f1d190..5c169fc 100644 --- a/src/include/ubus.h +++ b/src/include/ubus.h @@ -8,7 +8,7 @@ #define MIN_PROBE_REQ 2 // TODO: Parse from config file... -int dawn_init_ubus(const char *ubus_socket, char *hostapd_dir); +int dawn_init_ubus(const char *ubus_socket, const char *hostapd_dir); int parse_to_probe_req(struct blob_attr *msg, probe_entry *prob_req); @@ -24,7 +24,7 @@ void del_client_all_interfaces(const uint8_t *client_addr, uint32_t reason, uint void *update_clients_thread(void *arg); -char *hostapd_dir_glob; +const char *hostapd_dir_glob; int ubus_call_umdns(); diff --git a/src/main.c b/src/main.c index bc24151..84294d8 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,7 @@ #include "networksocket.h" #include "ubus.h" #include "dawn_uci.h" +#include "dawn_uci.h" #include "crypto.h" #define BUFSIZE 17 @@ -22,6 +23,7 @@ struct sigaction newSigAction; void daemon_shutdown() { // kill threads close_socket(); + uci_clear(); printf("Cancelling Threads!\n"); uloop_cancelled = true; @@ -52,74 +54,32 @@ int main(int argc, char **argv) { //free_counter = 0; const char *ubus_socket = NULL; - int ch; - - char opt_broadcast_ip[BUFSIZE]; - char opt_broadcast_port[BUFSIZE]; - char opt_hostapd_dir[BUFSIZE_DIR]; - - char shared_key[BUFSIZE_DIR]; - char iv[BUFSIZE_DIR]; - int multicast = 0; - - while ((ch = getopt(argc, argv, "cs:p:i:b:o:h:i:k:v:m")) != -1) { - switch (ch) { - case 's': - ubus_socket = optarg; - break; - case 'p': - snprintf(opt_broadcast_port, BUFSIZE, "%s", optarg); - printf("broadcast port: %s\n", opt_broadcast_port); - break; - case 'i': - snprintf(opt_broadcast_ip, BUFSIZE, "%s", optarg); - printf("broadcast ip: %s\n", opt_broadcast_ip); - break; - case 'o': - snprintf(sort_string, SORT_NUM, "%s", optarg); - printf("sort string: %s\n", sort_string); - break; - case 'h': - snprintf(opt_hostapd_dir, BUFSIZE_DIR, "%s", optarg); - printf("hostapd dir: %s\n", opt_hostapd_dir); - hostapd_dir_glob = optarg; - break; - case 'k': - snprintf(shared_key, BUFSIZE_DIR, "%s", optarg); - printf("Key: %s\n", shared_key); - break; - case 'v': - snprintf(iv, BUFSIZE_DIR, "%s", optarg); - printf("IV: %s\n", iv); - break; - case 'm': - multicast = 1; - break; - default: - break; - } - } + // int ch; argc -= optind; argv += optind; - /* Set up a signal handler */ newSigAction.sa_handler = signal_handler; sigemptyset(&newSigAction.sa_mask); newSigAction.sa_flags = 0; - /* Signals to handle */ - sigaction(SIGHUP, &newSigAction, NULL); /* catch hangup signal */ - sigaction(SIGTERM, &newSigAction, NULL); /* catch term signal */ - sigaction(SIGINT, &newSigAction, NULL); /* catch interrupt signal */ + sigaction(SIGHUP, &newSigAction, NULL); + sigaction(SIGTERM, &newSigAction, NULL); + sigaction(SIGINT, &newSigAction, NULL); + uci_init(); + struct network_config_s net_config = uci_get_dawn_network(); + printf("Broadcst bla: %s\n", net_config.broadcast_ip); gcrypt_init(); - gcrypt_set_key_and_iv(shared_key, iv); + gcrypt_set_key_and_iv(net_config.shared_key, net_config.iv); struct time_config_s time_config = uci_get_time_config(); timeout_config = time_config; // TODO: Refactor... + hostapd_dir_glob = uci_get_dawn_hostapd_dir(); + sort_string = (char*) uci_get_dawn_sort_order(); + if (pthread_mutex_init(&list_mutex, NULL) != 0) { printf("\n mutex init failed\n"); return 1; @@ -140,9 +100,9 @@ int main(int argc, char **argv) { return 1; } - init_socket_runopts(opt_broadcast_ip, opt_broadcast_port, multicast); + init_socket_runopts(net_config.broadcast_ip, net_config.broadcast_port, net_config.bool_multicast); - dawn_init_ubus(ubus_socket, opt_hostapd_dir); + dawn_init_ubus(ubus_socket, hostapd_dir_glob); return 0; } \ No newline at end of file diff --git a/src/network/networksocket.c b/src/network/networksocket.c index a4a975e..4833431 100644 --- a/src/network/networksocket.c +++ b/src/network/networksocket.c @@ -35,9 +35,9 @@ void *receive_msg(void *args); void *receive_msg_enc(void *args); -int init_socket_runopts(char *_ip, char *_port, int _multicast_socket) { +int init_socket_runopts(const char *_ip, int _port, int _multicast_socket) { - port = atoi(_port); + port = _port; ip = _ip; multicast_socket = _multicast_socket; diff --git a/src/utils/dawn_uci.c b/src/utils/dawn_uci.c index 150e995..71cdde3 100644 --- a/src/utils/dawn_uci.c +++ b/src/utils/dawn_uci.c @@ -4,76 +4,38 @@ #include "dawn_uci.h" -/* -dawn.metric.ht_support -dawn.metric.vht_support' -dawn.metric.rssi -dawn.metric.freq +static struct uci_context *uci_ctx; +static struct uci_package *uci_pkg; - */ - -/* - config settings times - option update_client '50' - option remove_client '120' - option remove_probe '120' - */ +// why is this not included in uci lib...?! +// fund here: https://github.com/br101/pingcheck/blob/master/uci.c +static int uci_lookup_option_int(struct uci_context *uci, struct uci_section *s, + const char *name) +{ + const char* str = uci_lookup_option_string(uci, s, name); + return str == NULL ? -1 : atoi(str); +} struct time_config_s uci_get_time_config() { struct time_config_s ret; - struct uci_context *c; - struct uci_ptr ptr; + printf("Loading Times!"); - c = uci_alloc_context(); + struct uci_element *e; + uci_foreach_element(&uci_pkg->sections, e) { + struct uci_section *s = uci_to_section(e); - printf("Loading TImes!"); - - - char tmp_update_client[] = "dawn.times.update_client"; - if (uci_lookup_ptr(c, &ptr, tmp_update_client, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; + if (strcmp(s->type, "times") == 0) + { + ret.update_client = uci_lookup_option_int(uci_ctx, s, "update_client"); + ret.remove_client = uci_lookup_option_int(uci_ctx, s, "remove_client"); + ret.remove_probe = uci_lookup_option_int(uci_ctx, s, "remove_probe"); + ret.update_hostapd = uci_lookup_option_int(uci_ctx, s, "update_hostapd"); + ret.remove_ap = uci_lookup_option_int(uci_ctx, s, "remove_ap"); + return ret; + } } - if (ptr.o->type == UCI_TYPE_STRING) - ret.update_client = atoi(ptr.o->v.string); - - char tmp_remove_client[] = "dawn.times.remove_client"; - if (uci_lookup_ptr(c, &ptr, tmp_remove_client, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.remove_client = atoi(ptr.o->v.string); - - char tmp_remove_probe[] = "dawn.times.remove_probe"; - if (uci_lookup_ptr(c, &ptr, tmp_remove_probe, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.remove_probe = atoi(ptr.o->v.string); - - char tmp_update_hostapd[] = "dawn.times.update_hostapd"; - if (uci_lookup_ptr(c, &ptr, tmp_update_hostapd, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.update_hostapd = atoi(ptr.o->v.string); - - char tmp_remove_ap[] = "dawn.times.remove_ap"; - if (uci_lookup_ptr(c, &ptr, tmp_remove_ap, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.remove_ap = atoi(ptr.o->v.string); - - printf("Times: %lu, %lu, %lu %lu\n", ret.update_client, ret.remove_client, ret.remove_probe, ret.update_hostapd); - - uci_free_context(c); return ret; } @@ -81,153 +43,116 @@ struct time_config_s uci_get_time_config() { struct probe_metric_s uci_get_dawn_metric() { struct probe_metric_s ret; - struct uci_context *c; - struct uci_ptr ptr; + struct uci_element *e; + uci_foreach_element(&uci_pkg->sections, e) { + struct uci_section *s = uci_to_section(e); - c = uci_alloc_context(); - - char tmp_ht_support[] = "dawn.metric.ht_support"; - if (uci_lookup_ptr(c, &ptr, tmp_ht_support, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; + if (strcmp(s->type, "metric") == 0) + { + ret.ht_support = uci_lookup_option_int(uci_ctx, s, "ht_support"); + ret.vht_support = uci_lookup_option_int(uci_ctx, s, "vht_support"); + ret.no_ht_support = uci_lookup_option_int(uci_ctx, s, "no_ht_support"); + ret.no_vht_support = uci_lookup_option_int(uci_ctx, s, "no_vht_support"); + ret.rssi = uci_lookup_option_int(uci_ctx, s, "rssi"); + ret.freq = uci_lookup_option_int(uci_ctx, s, "freq"); + ret.rssi_val = uci_lookup_option_int(uci_ctx, s, "rssi_val"); + ret.chan_util = uci_lookup_option_int(uci_ctx, s, "chan_util"); + ret.max_chan_util = uci_lookup_option_int(uci_ctx, s, "max_chan_util"); + ret.chan_util_val = uci_lookup_option_int(uci_ctx, s, "chan_util_val"); + ret.max_chan_util_val = uci_lookup_option_int(uci_ctx, s, "max_chan_util_val"); + ret.min_probe_count = uci_lookup_option_int(uci_ctx, s, "min_probe_count"); + ret.low_rssi = uci_lookup_option_int(uci_ctx, s, "low_rssi"); + ret.low_rssi_val = uci_lookup_option_int(uci_ctx, s, "low_rssi_val"); + ret.bandwith_threshold = uci_lookup_option_int(uci_ctx, s, "bandwith_threshold"); + ret.use_station_count = uci_lookup_option_int(uci_ctx, s, "use_station_count"); + ret.eval_probe_req = uci_lookup_option_int(uci_ctx, s, "eval_probe_req"); + return ret; + } } - if (ptr.o->type == UCI_TYPE_STRING) - ret.ht_support = atoi(ptr.o->v.string); - - char tmp_vht_support[] = "dawn.metric.vht_support"; - if (uci_lookup_ptr(c, &ptr, tmp_vht_support, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.vht_support = atoi(ptr.o->v.string); - - char tmp_no_ht_support[] = "dawn.metric.no_ht_support"; - if (uci_lookup_ptr(c, &ptr, tmp_no_ht_support, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.no_ht_support = atoi(ptr.o->v.string); - - char tmp_no_vht_support[] = "dawn.metric.no_vht_support"; - if (uci_lookup_ptr(c, &ptr, tmp_no_vht_support, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.no_vht_support = atoi(ptr.o->v.string); - - char tmp_rssi[] = "dawn.metric.rssi"; - if (uci_lookup_ptr(c, &ptr, tmp_rssi, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.rssi = atoi(ptr.o->v.string); - - char tmp_freq[] = "dawn.metric.freq"; - if (uci_lookup_ptr(c, &ptr, tmp_freq, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.freq = atoi(ptr.o->v.string); - - char tmp_util[] = "dawn.metric.chan_util"; - if (uci_lookup_ptr(c, &ptr, tmp_util, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.chan_util = atoi(ptr.o->v.string); - - char tmp_rssi_val[] = "dawn.metric.rssi_val"; - if (uci_lookup_ptr(c, &ptr, tmp_rssi_val, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.rssi_val = atoi(ptr.o->v.string); - - char tmp_max_chan_util[] = "dawn.metric.max_chan_util"; - if (uci_lookup_ptr(c, &ptr, tmp_max_chan_util, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.max_chan_util = atoi(ptr.o->v.string); - - char tmp_chan_util_val[] = "dawn.metric.chan_util_val"; - if (uci_lookup_ptr(c, &ptr, tmp_chan_util_val, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.chan_util_val = atoi(ptr.o->v.string); - - - char tmp_max_chan_util_val[] = "dawn.metric.max_chan_util_val"; - if (uci_lookup_ptr(c, &ptr, tmp_max_chan_util_val, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.max_chan_util_val = atoi(ptr.o->v.string); - - - printf("Try to load min_probe_count\n"); - char tmp_min_probe_count[] = "dawn.metric.min_probe_count"; - if (uci_lookup_ptr(c, &ptr, tmp_min_probe_count, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.min_probe_count = atoi(ptr.o->v.string); - - char tmp_low_rssi[] = "dawn.metric.low_rssi"; - if (uci_lookup_ptr(c, &ptr, tmp_low_rssi, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.low_rssi = atoi(ptr.o->v.string); - - char tmp_low_rssi_val[] = "dawn.metric.low_rssi_val"; - if (uci_lookup_ptr(c, &ptr, tmp_low_rssi_val, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.low_rssi_val = atoi(ptr.o->v.string); - - char tmp_bandwith_threshold[] = "dawn.metric.bandwith_threshold"; - if (uci_lookup_ptr(c, &ptr, tmp_bandwith_threshold, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.bandwith_threshold = atoi(ptr.o->v.string); - - char tmp_use_station_count[] = "dawn.metric.use_station_count"; - if (uci_lookup_ptr(c, &ptr, tmp_use_station_count, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.use_station_count = atoi(ptr.o->v.string); - - char tmp_eval_probe_req[] = "dawn.metric.eval_probe_req"; - if (uci_lookup_ptr(c, &ptr, tmp_eval_probe_req, 1) != UCI_OK) { - uci_perror(c, "uci_get_daw_metric Error"); - return ret; - } - if (ptr.o->type == UCI_TYPE_STRING) - ret.eval_probe_req = atoi(ptr.o->v.string); - - printf("Loaded metric: %d\n", ret.min_probe_count); - - uci_free_context(c); return ret; +} + +struct network_config_s uci_get_dawn_network() { + struct network_config_s ret; + + struct uci_element *e; + uci_foreach_element(&uci_pkg->sections, e) { + struct uci_section *s = uci_to_section(e); + + if (strcmp(s->type, "network") == 0) + { + printf("Fronund network entry!\n"); + ret.broadcast_ip = uci_lookup_option_string(uci_ctx, s, "broadcast_ip"); + printf("BROADCAST: %s\n", ret.broadcast_ip); + ret.broadcast_port = uci_lookup_option_int(uci_ctx, s, "broadcast_port"); + ret.bool_multicast = uci_lookup_option_int(uci_ctx, s, "multicast"); + printf("multicast: %s\n", ret.broadcast_ip); + ret.shared_key = uci_lookup_option_string(uci_ctx, s, "shared_key"); + ret.iv = uci_lookup_option_string(uci_ctx, s, "iv"); + return ret; + } + } + + return ret; +} +const char* uci_get_dawn_hostapd_dir() { + struct uci_element *e; + uci_foreach_element(&uci_pkg->sections, e) + { + struct uci_section *s = uci_to_section(e); + + if (strcmp(s->type, "hostapd") == 0) { + return uci_lookup_option_string(uci_ctx, s, "hostapd_dir"); + } + } + return NULL; +} + +const char* uci_get_dawn_sort_order() { + struct uci_element *e; + uci_foreach_element(&uci_pkg->sections, e) { + struct uci_section *s = uci_to_section(e); + + if (strcmp(s->type, "ordering") == 0) + { + return uci_lookup_option_string(uci_ctx, s, "sort_order"); + } + } + return NULL; +} + +int uci_init() +{ + struct uci_context *ctx = uci_ctx; + + if (!ctx) { + ctx = uci_alloc_context(); + uci_ctx = ctx; + + ctx->flags &= ~UCI_FLAG_STRICT; + } else { + // shouldn't happen? + uci_pkg = uci_lookup_package(ctx, "dawn"); + if (uci_pkg) + uci_unload(ctx, uci_pkg); + } + + if (uci_load(ctx, "dawn", &uci_pkg)) + return -1; + + return 1; +} + +int uci_clear() +{ + if(uci_pkg != NULL) + { + uci_unload(uci_ctx, uci_pkg); + } + if(uci_ctx != NULL) + { + uci_free_context(uci_ctx); + } + return 1; } \ No newline at end of file diff --git a/src/utils/ubus.c b/src/utils/ubus.c index 415eadc..28db0e5 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -133,7 +133,7 @@ static int hostapd_notify(struct ubus_context *ctx, struct ubus_object *obj, static int add_subscriber(char *name); -static int subscribe_to_hostapd_interfaces(char *hostapd_dir); +static int subscribe_to_hostapd_interfaces(const char *hostapd_dir); static int ubus_get_clients(); @@ -392,7 +392,7 @@ static int add_subscriber(char *name) { return 0; } -static int subscribe_to_hostapd_interfaces(char *hostapd_dir) { +static int subscribe_to_hostapd_interfaces(const char *hostapd_dir) { DIR *dirp; struct dirent *entry; @@ -416,7 +416,7 @@ static int subscribe_to_hostapd_interfaces(char *hostapd_dir) { return 0; } -static int subscribe_to_hostapd(char *hostapd_dir) { +static int subscribe_to_hostapd(const char *hostapd_dir) { if (ctx == NULL) { return 0; @@ -440,7 +440,7 @@ static int subscribe_to_hostapd(char *hostapd_dir) { return 0; } -int dawn_init_ubus(const char *ubus_socket, char *hostapd_dir) { +int dawn_init_ubus(const char *ubus_socket, const char *hostapd_dir) { uloop_init(); signal(SIGPIPE, SIG_IGN); From cfde7b7c97af4964d2e46948f2cad372700da121 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 16:21:00 +0100 Subject: [PATCH 21/27] add get_hearing_map call --- src/include/datastorage.h | 4 ++++ src/include/ubus.h | 4 ++-- src/main.c | 2 +- src/storage/datastorage.c | 35 +++++++++++++++++++++++++++++++++++ src/utils/ubus.c | 26 +++++++++++++++++++++----- 5 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/include/datastorage.h b/src/include/datastorage.h index 492bce6..efe3580 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -8,6 +8,8 @@ #include #include #include +#include + #ifndef ETH_ALEN #define ETH_ALEN 6 @@ -189,6 +191,8 @@ void print_ap_array(); ap ap_array_get_ap(uint8_t bssid_addr[]); +int build_hearing_map_sort_client(struct blob_buf *b); + /* Utils */ // ---------------- Defines ------------------- diff --git a/src/include/ubus.h b/src/include/ubus.h index 5c169fc..7788cb0 100644 --- a/src/include/ubus.h +++ b/src/include/ubus.h @@ -6,8 +6,6 @@ #include "datastorage.h" -#define MIN_PROBE_REQ 2 // TODO: Parse from config file... - int dawn_init_ubus(const char *ubus_socket, const char *hostapd_dir); int parse_to_probe_req(struct blob_attr *msg, probe_entry *prob_req); @@ -34,4 +32,6 @@ void update_hostapd_sockets(struct uloop_timeout *t); void add_client_update_timer(time_t time); +void blobmsg_add_macaddr(struct blob_buf *buf, const char *name, const uint8_t *addr); + #endif diff --git a/src/main.c b/src/main.c index 0942347..694e075 100644 --- a/src/main.c +++ b/src/main.c @@ -102,7 +102,7 @@ int main(int argc, char **argv) { init_socket_runopts(net_config.broadcast_ip, net_config.broadcast_port, net_config.bool_multicast); - insert_macs_from_file(); + //insert_macs_from_file(); dawn_init_ubus(ubus_socket, hostapd_dir_glob); return 0; diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index b35c6ac..7c8c0ff 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -68,6 +68,41 @@ struct uloop_timeout ap_timeout = { .cb = remove_ap_array_cb }; +int build_hearing_map_sort_client(struct blob_buf *b) +{ + pthread_mutex_lock(&probe_array_mutex); + + void *client_list, *ap_list; + char ap_mac_buf[20]; + char client_mac_buf[20]; + + blob_buf_init(b, 0); + int i; + for (i = 0; i <= probe_entry_last; i++) { + int k; + sprintf(client_mac_buf, MACSTR, MAC2STR(probe_array[i].client_addr)); + client_list = blobmsg_open_table(b, client_mac_buf); + for (k = i; i <= probe_entry_last; k++){ + if(!mac_is_equal(probe_array[k].client_addr, probe_array[i].client_addr)) + { + i = k - 1; + break; + } + sprintf(ap_mac_buf, MACSTR, MAC2STR(probe_array[k].bssid_addr)); + ap_list = blobmsg_open_table(b, ap_mac_buf); + blobmsg_add_u32(b, "signal", probe_array[k].signal); + blobmsg_add_u32(b, "freq", probe_array[k].freq); + blobmsg_add_u8(b, "ht_support", probe_array[k].ht_support); + blobmsg_add_u8(b, "vht_support", probe_array[k].vht_support); + blobmsg_add_u32(b, "score", eval_probe_metric(probe_array[k])); + blobmsg_close_table(b, ap_list); + } + blobmsg_close_table(b, client_list); + } + pthread_mutex_unlock(&probe_array_mutex); + return 0; +} + int eval_probe_metric(struct probe_entry_s probe_entry) { int score = 0; diff --git a/src/utils/ubus.c b/src/utils/ubus.c index d12be7b..a69fef7 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -142,7 +142,11 @@ add_mac(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg); -int hostapd_array_check_id(uint32_t id); +static int get_hearing_map(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg); + + int hostapd_array_check_id(uint32_t id); void hostapd_array_insert(uint32_t id); @@ -199,8 +203,7 @@ void hostapd_array_delete(uint32_t id) { } -static void -blobmsg_add_macaddr(struct blob_buf *buf, const char *name, const uint8_t *addr) { +void blobmsg_add_macaddr(struct blob_buf *buf, const char *name, const uint8_t *addr) { char *s; s = blobmsg_alloc_string_buffer(buf, name, 20); @@ -483,6 +486,7 @@ int dawn_init_ubus(const char *ubus_socket, const char *hostapd_dir) { uloop_run(); + close_socket(); ubus_free(ctx); @@ -715,6 +719,9 @@ static const struct blobmsg_policy add_del_policy[__ADD_DEL_MAC_MAX] = { static const struct ubus_method dawn_methods[] = { UBUS_METHOD("add_mac", add_mac, add_del_policy), + UBUS_METHOD_NOARG("get_hearing_map", get_hearing_map) + //UBUS_METHOD_NOARG("get_aps"); + //UBUS_METHOD_NOARG("get_clients"); }; static struct ubus_object_type dawn_object_type = @@ -727,8 +734,7 @@ static struct ubus_object dawn_object = { .n_methods = ARRAY_SIZE(dawn_methods), }; -static int -add_mac(struct ubus_context *ctx, struct ubus_object *obj, +static int add_mac(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg) { @@ -749,6 +755,15 @@ add_mac(struct ubus_context *ctx, struct ubus_object *obj, return 0; } +static int get_hearing_map(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) { + + build_hearing_map_sort_client(&b); + ubus_send_reply(ctx, req, b.head); + return 0; +} + static void ubus_add_oject() { int ret; @@ -756,6 +771,7 @@ static void ubus_add_oject() ret = ubus_add_object(ctx, &dawn_object); if (ret) fprintf(stderr, "Failed to add object: %s\n", ubus_strerror(ret)); + printf("ADDED UBUS OBJECT!!!\n"); /*ret = ubus_register_subscriber(ctx, &test_event); if (ret) From 9eddd6323391ddddf64b8c54d1687152560de9ff Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 17:18:49 +0100 Subject: [PATCH 22/27] cleanup main --- src/main.c | 77 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/src/main.c b/src/main.c index 694e075..5e73b5f 100644 --- a/src/main.c +++ b/src/main.c @@ -8,19 +8,16 @@ #include "networksocket.h" #include "ubus.h" #include "dawn_uci.h" -#include "dawn_uci.h" #include "crypto.h" -#define BUFSIZE 17 -#define BUFSIZE_DIR 256 - void daemon_shutdown(); void signal_handler(int sig); -struct sigaction newSigAction; +struct sigaction signal_action; void daemon_shutdown() { + // kill threads close_socket(); uci_clear(); @@ -36,50 +33,24 @@ void daemon_shutdown() { } void signal_handler(int sig) { - printf("SOME SIGNAL RECEIVED!\n"); switch (sig) { case SIGHUP: + daemon_shutdown(); break; case SIGINT: + daemon_shutdown(); + break; case SIGTERM: daemon_shutdown(); exit(EXIT_SUCCESS); - break; default: + daemon_shutdown(); break; } } -int main(int argc, char **argv) { - //free_counter = 0; - - const char *ubus_socket = NULL; - // int ch; - - argc -= optind; - argv += optind; - - newSigAction.sa_handler = signal_handler; - sigemptyset(&newSigAction.sa_mask); - newSigAction.sa_flags = 0; - - sigaction(SIGHUP, &newSigAction, NULL); - sigaction(SIGTERM, &newSigAction, NULL); - sigaction(SIGINT, &newSigAction, NULL); - - uci_init(); - struct network_config_s net_config = uci_get_dawn_network(); - printf("Broadcst bla: %s\n", net_config.broadcast_ip); - - gcrypt_init(); - gcrypt_set_key_and_iv(net_config.shared_key, net_config.iv); - - struct time_config_s time_config = uci_get_time_config(); - timeout_config = time_config; // TODO: Refactor... - - hostapd_dir_glob = uci_get_dawn_hostapd_dir(); - sort_string = (char*) uci_get_dawn_sort_order(); - +int init_mutex() +{ if (pthread_mutex_init(&list_mutex, NULL) != 0) { printf("\n mutex init failed\n"); return 1; @@ -99,6 +70,38 @@ int main(int argc, char **argv) { printf("\n mutex init failed\n"); return 1; } + return 0; +} + +int main(int argc, char **argv) { + + const char *ubus_socket = NULL; + + argc -= optind; + argv += optind; + + // connect signals + signal_action.sa_handler = signal_handler; + sigemptyset(&signal_action.sa_mask); + signal_action.sa_flags = 0; + sigaction(SIGHUP, &signal_action, NULL); + sigaction(SIGTERM, &signal_action, NULL); + sigaction(SIGINT, &signal_action, NULL); + + uci_init(); + struct network_config_s net_config = uci_get_dawn_network(); + printf("Broadcst bla: %s\n", net_config.broadcast_ip); + + gcrypt_init(); + gcrypt_set_key_and_iv(net_config.shared_key, net_config.iv); + + struct time_config_s time_config = uci_get_time_config(); + timeout_config = time_config; // TODO: Refactor... + + hostapd_dir_glob = uci_get_dawn_hostapd_dir(); + sort_string = (char*) uci_get_dawn_sort_order(); + + init_mutex(); init_socket_runopts(net_config.broadcast_ip, net_config.broadcast_port, net_config.bool_multicast); From 389be8fca12c33ab8a5595ba793c51e79c12cf42 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 17:25:18 +0100 Subject: [PATCH 23/27] fix maclist --- src/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main.c b/src/main.c index 5e73b5f..4252b4f 100644 --- a/src/main.c +++ b/src/main.c @@ -14,6 +14,8 @@ void daemon_shutdown(); void signal_handler(int sig); +int init_mutex(); + struct sigaction signal_action; void daemon_shutdown() { @@ -105,7 +107,7 @@ int main(int argc, char **argv) { init_socket_runopts(net_config.broadcast_ip, net_config.broadcast_port, net_config.bool_multicast); - //insert_macs_from_file(); + insert_macs_from_file(); dawn_init_ubus(ubus_socket, hostapd_dir_glob); return 0; From 590de3617f85d3e98d106144e048b6b30928b76a Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 17:37:36 +0100 Subject: [PATCH 24/27] fix maclist --- src/storage/datastorage.c | 14 +++++++++++++- src/utils/ubus.c | 6 ++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 7c8c0ff..5ec49f5 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -94,6 +94,17 @@ int build_hearing_map_sort_client(struct blob_buf *b) blobmsg_add_u32(b, "freq", probe_array[k].freq); blobmsg_add_u8(b, "ht_support", probe_array[k].ht_support); blobmsg_add_u8(b, "vht_support", probe_array[k].vht_support); + + ap ap_entry = ap_array_get_ap(probe_array[k].bssid_addr); + + // check if ap entry is available + if (mac_is_equal(ap_entry.bssid_addr, probe_array[k].bssid_addr)) { + blobmsg_add_u32(b, "channel_utilization", ap_entry.channel_utilization); + blobmsg_add_u32(b, "num_sta", ap_entry.station_count); + blobmsg_add_u32(b, "ht", ap_entry.ht); + blobmsg_add_u32(b, "vht", ap_entry.vht); + } + blobmsg_add_u32(b, "score", eval_probe_metric(probe_array[k])); blobmsg_close_table(b, ap_list); } @@ -747,13 +758,14 @@ int insert_to_maclist(uint8_t mac[]) { if(mac_in_maclist(mac)) { - return 0; + return -1; } mac_list_entry_last++; for (int i = 0; i < ETH_ALEN; ++i) { mac_list[mac_list_entry_last][i] = mac[i]; } + return 0; } diff --git a/src/utils/ubus.c b/src/utils/ubus.c index a69fef7..30c99f4 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -749,8 +749,10 @@ static int add_mac(struct ubus_context *ctx, struct ubus_object *obj, if (hwaddr_aton(blobmsg_data(tb[MAC_ADDR]), addr)) return UBUS_STATUS_INVALID_ARGUMENT; - insert_to_maclist(addr); - write_mac_to_file("/etc/dawn/mac_list", addr); + if(insert_to_maclist(addr) == 0) + { + write_mac_to_file("/etc/dawn/mac_list", addr); + } return 0; } From c259c29d1d0bb6e75ade954d179027489494aa1b Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 18:08:05 +0100 Subject: [PATCH 25/27] fix client array --- src/storage/datastorage.c | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 5ec49f5..120d4d2 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -336,28 +336,10 @@ int client_array_go_next_help(char sort_order[], int i, client entry, case 'b': return mac_is_greater(entry.bssid_addr, next_entry.bssid_addr) && mac_is_equal(entry.client_addr, next_entry.client_addr); - break; - // client-mac case 'c': - return mac_is_greater(entry.client_addr, next_entry.client_addr); - break; - - // frequency - // mac is 5 ghz or 2.4 ghz? - // case 'f': - // return //entry.freq < next_entry.freq && - // entry.freq < 5000 && - // next_entry.freq >= 5000 && - // //entry.freq < 5 && - // mac_is_equal(entry.client_addr, next_entry.client_addr); - // break; - - // signal strength (RSSI) - //case 's': - // return entry.signal < next_entry.signal && - // mac_is_equal(entry.client_addr, next_entry.client_addr); - // break; + return mac_is_greater(entry.client_addr, next_entry.client_addr) && + mac_is_greater(entry.bssid_addr, next_entry.bssid_addr); default: return 0; From 3a127e990089d622e160bd0a7fd362b5b37f78e5 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 18:15:03 +0100 Subject: [PATCH 26/27] fix client array insert function --- src/storage/datastorage.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index 120d4d2..a7e3a3b 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -334,17 +334,15 @@ int client_array_go_next_help(char sort_order[], int i, client entry, switch (sort_order[i]) { // bssid-mac case 'b': - return mac_is_greater(entry.bssid_addr, next_entry.bssid_addr) && - mac_is_equal(entry.client_addr, next_entry.client_addr); + return mac_is_greater(entry.bssid_addr, next_entry.bssid_addr); // client-mac case 'c': return mac_is_greater(entry.client_addr, next_entry.client_addr) && - mac_is_greater(entry.bssid_addr, next_entry.bssid_addr); - + mac_is_equal(entry.bssid_addr, next_entry.bssid_addr); default: - return 0; break; } + return 0; } int client_array_go_next(char sort_order[], int i, client entry, From 1be4ca829c90c80bd425cf937a4ba3aa1a24c837 Mon Sep 17 00:00:00 2001 From: PolynomialDivision Date: Fri, 22 Dec 2017 18:26:23 +0100 Subject: [PATCH 27/27] add network overview --- src/include/datastorage.h | 2 ++ src/storage/datastorage.c | 33 +++++++++++++++++++++++++++++++++ src/utils/ubus.c | 19 +++++++++++++++++-- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/include/datastorage.h b/src/include/datastorage.h index efe3580..da829f7 100644 --- a/src/include/datastorage.h +++ b/src/include/datastorage.h @@ -193,6 +193,8 @@ ap ap_array_get_ap(uint8_t bssid_addr[]); int build_hearing_map_sort_client(struct blob_buf *b); +int build_network_overview(struct blob_buf *b); + /* Utils */ // ---------------- Defines ------------------- diff --git a/src/storage/datastorage.c b/src/storage/datastorage.c index a7e3a3b..d1fddab 100644 --- a/src/storage/datastorage.c +++ b/src/storage/datastorage.c @@ -114,6 +114,39 @@ int build_hearing_map_sort_client(struct blob_buf *b) return 0; } +int build_network_overview(struct blob_buf *b) +{ + pthread_mutex_lock(&probe_array_mutex); + + void *client_list, *ap_list; + char ap_mac_buf[20]; + char client_mac_buf[20]; + + blob_buf_init(b, 0); + int i; + for (i = 0; i <= client_entry_last; i++) { + int k; + sprintf(ap_mac_buf, MACSTR, MAC2STR(client_array[i].bssid_addr)); + ap_list = blobmsg_open_table(b, ap_mac_buf); + for (k = i; i <= client_entry_last; k++){ + if(!mac_is_equal(client_array[k].bssid_addr, client_array[i].bssid_addr)) + { + i = k - 1; + break; + } + sprintf(client_mac_buf, MACSTR, MAC2STR(client_array[k].client_addr)); + client_list = blobmsg_open_table(b, client_mac_buf); + blobmsg_add_u32(b, "freq", client_array[k].freq); + blobmsg_add_u32(b, "ht", client_array[k].ht); + blobmsg_add_u32(b, "vht", client_array[k].vht); + blobmsg_close_table(b, client_list); + } + blobmsg_close_table(b, ap_list); + } + pthread_mutex_unlock(&probe_array_mutex); + return 0; +} + int eval_probe_metric(struct probe_entry_s probe_entry) { int score = 0; diff --git a/src/utils/ubus.c b/src/utils/ubus.c index 30c99f4..17c7d13 100644 --- a/src/utils/ubus.c +++ b/src/utils/ubus.c @@ -146,7 +146,11 @@ static int get_hearing_map(struct ubus_context *ctx, struct ubus_object *obj, struct ubus_request_data *req, const char *method, struct blob_attr *msg); - int hostapd_array_check_id(uint32_t id); +static int get_network(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg); + +int hostapd_array_check_id(uint32_t id); void hostapd_array_insert(uint32_t id); @@ -719,7 +723,8 @@ static const struct blobmsg_policy add_del_policy[__ADD_DEL_MAC_MAX] = { static const struct ubus_method dawn_methods[] = { UBUS_METHOD("add_mac", add_mac, add_del_policy), - UBUS_METHOD_NOARG("get_hearing_map", get_hearing_map) + UBUS_METHOD_NOARG("get_hearing_map", get_hearing_map), + UBUS_METHOD_NOARG("get_network", get_network) //UBUS_METHOD_NOARG("get_aps"); //UBUS_METHOD_NOARG("get_clients"); }; @@ -766,6 +771,16 @@ static int get_hearing_map(struct ubus_context *ctx, struct ubus_object *obj, return 0; } + +static int get_network(struct ubus_context *ctx, struct ubus_object *obj, + struct ubus_request_data *req, const char *method, + struct blob_attr *msg) { + + build_network_overview(&b); + ubus_send_reply(ctx, req, b.head); + return 0; +} + static void ubus_add_oject() { int ret;