datastorage: convert to linked lists and optimise use of pointers

datastorage: AP, client, probe, auth entry and MAC list converted to linked list
datastorage: functions adjusted to take pointers as parameters
datastorage: optimised sort and search functions added
mac_utils: struct dawn_mac added and comparisons adjusted
general: adjust code to  call new datastorage functions
test_storage: large scale 100 AP, 3000 client, 70k probe added
This commit is contained in:
Ian-Clowes 2020-07-28 21:57:13 +01:00 committed by Ian Clowes
commit 36fe9998da
21 changed files with 77429 additions and 1441 deletions

View file

@ -9,20 +9,35 @@
#include "mac_utils.h"
#include "utils.h"
// Core data storage array sizes
#define ARRAY_AP_LEN 100
#define ARRAY_CLIENT_LEN 300
#define PROBE_ARRAY_LEN 1000
#define DENY_REQ_ARRAY_LEN 100
/* Mac */
// ---------------- Defines -------------------
#define MAC_LIST_LENGTH 100
// ---------------- Global variables ----------------
extern uint8_t mac_list[][ETH_ALEN];
extern struct mac_entry_s *mac_set;
struct mac_entry_s {
struct mac_entry_s* next_mac;
struct dawn_mac mac;
};
// ---------------- Functions ----------
void insert_macs_from_file();
int insert_to_maclist(uint8_t mac[]);
int insert_to_maclist(struct dawn_mac mac);
int mac_in_maclist(uint8_t mac[]);
int mac_in_maclist(struct dawn_mac mac);
struct mac_entry_s* insert_to_mac_array(struct mac_entry_s* entry, struct mac_entry_s** insert_pos);
void mac_array_delete(struct mac_entry_s* entry);
// ---------------- Global variables ----------------
@ -97,7 +112,7 @@ extern struct probe_metric_s dawn_metric;
/*** Core DAWN data structures for tracking network devices and status ***/
// Define this to remove printing / reporing of fields, and hence observe
// which fields are evaluated in use.
// which fields are evaluated in use at compile time.
// #define DAWN_NO_OUTPUT
// TODO notes:
@ -108,9 +123,11 @@ extern struct probe_metric_s dawn_metric;
// ---------------- Structs ----------------
typedef struct probe_entry_s {
uint8_t bssid_addr[ETH_ALEN];
uint8_t client_addr[ETH_ALEN];
uint8_t target_addr[ETH_ALEN]; // TODO: Never evaluated?
struct probe_entry_s* next_probe;
struct probe_entry_s* next_probe_skip;
struct dawn_mac client_addr;
struct dawn_mac bssid_addr;
struct dawn_mac target_addr; // TODO: Never evaluated?
uint32_t signal; // eval_probe_metric()
uint32_t freq; // eval_probe_metric()
uint8_t ht_capabilities; // eval_probe_metric()
@ -126,10 +143,17 @@ typedef struct probe_entry_s {
uint32_t rsni;
} probe_entry;
//struct probe_entry_s {
// struct dawn_mac client_addr;
// struct dawn_mac bssid_addr;
// struct probe_entry_s* entry;
//};
typedef struct auth_entry_s {
uint8_t bssid_addr[ETH_ALEN];
uint8_t client_addr[ETH_ALEN];
uint8_t target_addr[ETH_ALEN]; // TODO: Never evaluated?
struct auth_entry_s* next_auth;
struct dawn_mac bssid_addr;
struct dawn_mac client_addr;
struct dawn_mac target_addr; // TODO: Never evaluated?
uint32_t signal; // TODO: Never evaluated?
uint32_t freq; // TODO: Never evaluated?
time_t time; // Never used for removal?
@ -137,62 +161,42 @@ typedef struct auth_entry_s {
} auth_entry;
typedef struct hostapd_notify_entry_s {
uint8_t bssid_addr[ETH_ALEN];
uint8_t client_addr[ETH_ALEN];
struct dawn_mac bssid_addr;
struct dawn_mac client_addr;
} hostapd_notify_entry;
typedef struct auth_entry_s assoc_entry;
// ---------------- Defines ----------------
#define DENY_REQ_ARRAY_LEN 100
#define PROBE_ARRAY_LEN 1000
#define SSID_MAX_LEN 32
#define NEIGHBOR_REPORT_LEN 200
// ---------------- Global variables ----------------
extern struct auth_entry_s denied_req_array[];
extern int denied_req_last;
extern struct auth_entry_s *denied_req_set;
extern pthread_mutex_t denied_array_mutex;
extern struct probe_entry_s probe_array[];
extern int probe_entry_last;
extern struct probe_entry_s *probe_set;
extern pthread_mutex_t probe_array_mutex;
// ---------------- Functions ----------------
probe_entry insert_to_array(probe_entry entry, int inc_counter, int save_80211k, int is_beacon);
void probe_array_insert(probe_entry entry);
probe_entry probe_array_delete(probe_entry entry);
probe_entry probe_array_get_entry(uint8_t bssid_addr[], uint8_t client_addr[]);
void remove_old_probe_entries(time_t current_time, long long int threshold);
void print_probe_array();
void print_probe_entry(probe_entry entry);
int eval_probe_metric(struct probe_entry_s probe_entry);
void denied_req_array_insert(auth_entry entry);
auth_entry denied_req_array_delete(auth_entry entry);
auth_entry insert_to_denied_req_array(auth_entry entry, int inc_counter);
void print_auth_entry(auth_entry entry);
/* AP, Client */
#define SIGNATURE_LEN 1024
#define MAX_INTERFACE_NAME 64
// ---------------- Structs ----------------
// Testing only: Removes the ability to find clients via secondary search, hence replicates
// the pre-optimisation behaviour of only scanning the BSSID+MAC orderd list
//#define DAWN_CLIENT_SCAN_BC_ONLY
typedef struct client_s {
uint8_t bssid_addr[ETH_ALEN];
uint8_t client_addr[ETH_ALEN];
struct client_s* next_entry_bc;
struct client_s* next_skip_entry_bc;
#ifndef DAWN_CLIENT_SCAN_BC_ONLY
struct client_s* next_entry_c;
#endif
struct dawn_mac bssid_addr;
struct dawn_mac client_addr;
char signature[SIGNATURE_LEN]; // TODO: Never evaluated?
uint8_t ht_supported; // TODO: Never evaluated?
uint8_t vht_supported; // TODO: Never evaluated?
@ -214,7 +218,8 @@ typedef struct client_s {
} client;
typedef struct ap_s {
uint8_t bssid_addr[ETH_ALEN];
struct ap_s* next_ap;
struct dawn_mac bssid_addr;
uint32_t freq; // TODO: Never evaluated?
uint8_t ht_support; // eval_probe_metric()
uint8_t vht_support; // eval_probe_metric()
@ -231,71 +236,90 @@ typedef struct ap_s {
} ap;
// ---------------- Defines ----------------
#define ARRAY_AP_LEN 50
#define TIME_THRESHOLD_AP 30
#define ARRAY_CLIENT_LEN 1000
#define TIME_THRESHOLD_CLIENT 30
#define TIME_THRESHOLD_CLIENT_UPDATE 10
#define TIME_THRESHOLD_CLIENT_KICK 60
// ---------------- Global variables ----------------
extern struct ap_s ap_array[];
extern int ap_entry_last;
extern struct ap_s* ap_set;
extern pthread_mutex_t ap_array_mutex;
extern struct client_s client_array[];
extern int client_entry_last;
extern struct client_s *client_set_bc;
extern pthread_mutex_t client_array_mutex;
// ---------------- Functions ----------------
probe_entry *insert_to_array(probe_entry *entry, int inc_counter, int save_80211k, int is_beacon);
int probe_array_update_rssi(uint8_t bssid_addr[], uint8_t client_addr[], uint32_t rssi, int send_network);
int probe_array_delete(probe_entry *entry);
int probe_array_update_rcpi_rsni(uint8_t bssid_addr[], uint8_t client_addr[], uint32_t rcpi, uint32_t rsni, int send_network);
probe_entry *probe_array_get_entry(struct dawn_mac bssid_addr, struct dawn_mac client_addr);
void remove_old_probe_entries(time_t current_time, long long int threshold);
void print_probe_array();
void print_probe_entry(probe_entry *entry);
int eval_probe_metric(struct probe_entry_s * probe_entry, ap *ap_entry);
void denied_req_array_delete(auth_entry *entry);
auth_entry *insert_to_denied_req_array(auth_entry*entry, int inc_counter);
void print_auth_entry(auth_entry *entry);
// ---------------- Functions ----------------
int probe_array_update_rssi(struct dawn_mac bssid_addr, struct dawn_mac client_addr, uint32_t rssi, int send_network);
int probe_array_update_rcpi_rsni(struct dawn_mac bssid_addr, struct dawn_mac client_addr, uint32_t rcpi, uint32_t rsni, int send_network);
void remove_old_client_entries(time_t current_time, long long int threshold);
void insert_client_to_array(client entry);
void insert_client_to_array(client *entry);
int kick_clients(uint8_t bssid[], uint32_t id);
int kick_clients(ap* kicking_ap, uint32_t id);
void update_iw_info(uint8_t bssid[]);
void update_iw_info(struct dawn_mac bssid);
void client_array_insert(client entry);
void client_array_insert(client *entry, client ** insert_pos);
client client_array_get_client(const uint8_t* client_addr);
client *client_array_get_client(const struct dawn_mac client_addr);
client client_array_delete(client entry);
client *client_array_delete(client *entry, int unlink_only);
void print_client_array();
void print_client_entry(client entry);
void print_client_entry(client *entry);
int is_connected_somehwere(uint8_t client_addr[]);
int is_connected_somehwere(struct dawn_mac client_addr);
ap insert_to_ap_array(ap entry);
ap *insert_to_ap_array(ap *entry);
void remove_old_ap_entries(time_t current_time, long long int threshold);
void print_ap_array();
ap ap_array_get_ap(uint8_t bssid_addr[]);
ap *ap_array_get_ap(struct dawn_mac bssid_mac);
int probe_array_set_all_probe_count(uint8_t client_addr[], uint32_t probe_count);
int probe_array_set_all_probe_count(struct dawn_mac client_addr, uint32_t probe_count);
#ifndef DAWN_NO_OUTPUT
int ap_get_collision_count(int col_domain);
#endif
void send_beacon_reports(uint8_t bssid[], int id);
void send_beacon_reports(struct dawn_mac bssid, int id);
/* Utils */
// deprecate use of this - it makes things slow
#define SORT_LENGTH 5
extern char sort_string[];
// ---------------- Functions -------------------
int better_ap_available(uint8_t bssid_addr[], uint8_t client_addr[], char* neighbor_report, int automatic_kick);
int better_ap_available(ap *kicking_ap, struct dawn_mac client_addr, char* neighbor_report);
// All users of datastorage should call init_ / destroy_mutex at initialisation and termination respectively
int init_mutex();