mirror of
https://github.com/berlin-open-wireless-lab/DAWN.git
synced 2025-03-09 15:40:12 +00:00
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:
commit
36fe9998da
21 changed files with 77429 additions and 1441 deletions
|
@ -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();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue