extract data from hostapd to extra struct
This commit is contained in:
		
							parent
							
								
									268e35040a
								
							
						
					
					
						commit
						4d314298c8
					
				| 
						 | 
				
			
			@ -19,5 +19,4 @@ struct wifi_client {
 | 
			
		|||
	uint32_t signal_highfreq;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -85,7 +85,13 @@ static int receive_notify(struct ubus_context *ctx, struct ubus_object *obj, str
 | 
			
		|||
{
 | 
			
		||||
	const char *attr_name, *str;
 | 
			
		||||
	u8 addr[ETH_ALEN];
 | 
			
		||||
	uint32_t freq, ssi_signal = -1;
 | 
			
		||||
	struct hostapd_client hclient = {
 | 
			
		||||
		.method = method,
 | 
			
		||||
		.auth = false,
 | 
			
		||||
		.freq = -1,
 | 
			
		||||
		.ssi_signal = -1,
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	struct blob_attr *pos;
 | 
			
		||||
	int rem = blobmsg_data_len(msg);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -98,18 +104,20 @@ static int receive_notify(struct ubus_context *ctx, struct ubus_object *obj, str
 | 
			
		|||
		if (!strcmp(attr_name, "address")){
 | 
			
		||||
			str = blobmsg_get_string(pos);
 | 
			
		||||
			hwaddr_aton(str, addr);
 | 
			
		||||
			hclient.address = addr;
 | 
			
		||||
		} else if(!strcmp(attr_name, "signal")){
 | 
			
		||||
			ssi_signal = blobmsg_get_u32(pos);
 | 
			
		||||
			hclient.ssi_signal = blobmsg_get_u32(pos);
 | 
			
		||||
		} else if(!strcmp(attr_name, "freq")){
 | 
			
		||||
			freq = blobmsg_get_u32(pos);
 | 
			
		||||
			hclient.freq = blobmsg_get_u32(pos);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	// handle
 | 
			
		||||
	log_verbose("%s["MACSTR"] freq: %d signal %d", method, MAC2STR(addr), freq, ssi_signal);
 | 
			
		||||
	log_verbose("%s["MACSTR"] freq: %d signal %d", method, MAC2STR(addr), hclient.freq, hclient.ssi_signal);
 | 
			
		||||
	if (!strcmp(method, "auth")) {
 | 
			
		||||
		if (wifi_clients_try(true, addr, freq, ssi_signal)) {
 | 
			
		||||
		hclient.auth = true;
 | 
			
		||||
		if (wifi_clients_try(&hclient)) {
 | 
			
		||||
			log_debug(" -> reject\n");
 | 
			
		||||
			return WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY;
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -119,7 +127,7 @@ static int receive_notify(struct ubus_context *ctx, struct ubus_object *obj, str
 | 
			
		|||
 | 
			
		||||
	if (!strcmp(method, "probe")) {
 | 
			
		||||
		if(config_client_probe_steering) {
 | 
			
		||||
			if (wifi_clients_try(false, addr, freq, ssi_signal)) {
 | 
			
		||||
			if (wifi_clients_try(&hclient)) {
 | 
			
		||||
				log_debug(" -> reject\n");
 | 
			
		||||
				return WLAN_STATUS_UNSPECIFIED_FAILURE;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -128,12 +136,12 @@ static int receive_notify(struct ubus_context *ctx, struct ubus_object *obj, str
 | 
			
		|||
		}
 | 
			
		||||
		if(config_client_probe_learning) {
 | 
			
		||||
			log_verbose(" learn");
 | 
			
		||||
		wifi_clients_learn(addr, freq, ssi_signal);
 | 
			
		||||
		wifi_clients_learn(&hclient);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!strcmp(method, "deauth")) {
 | 
			
		||||
		wifi_clients_disconnect(addr, freq, ssi_signal);
 | 
			
		||||
		wifi_clients_disconnect(&hclient);
 | 
			
		||||
		log_verbose(" -> disconnect\n");
 | 
			
		||||
		return WLAN_STATUS_SUCCESS;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,85 +62,84 @@ void wifi_clients_close() {
 | 
			
		|||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct wifi_client *__get_client(const u8 *address){
 | 
			
		||||
void __client_setvalues(struct wifi_client *client, struct hostapd_client *hclient) {
 | 
			
		||||
	log_debug("wifi_clients.__client_setvalues(., %d):", hclient->freq);
 | 
			
		||||
	if (client->freq_highest < hclient->freq) {
 | 
			
		||||
		client->freq_highest = hclient->freq;
 | 
			
		||||
		log_debug(" new highest freq");
 | 
			
		||||
	}
 | 
			
		||||
	if (hclient->freq > WIFI_CLIENT_FREQ_THREASHOLD) {
 | 
			
		||||
		client->signal_highfreq = hclient->ssi_signal;
 | 
			
		||||
	}else{
 | 
			
		||||
		client->signal_lowfreq = hclient->ssi_signal;
 | 
			
		||||
	}
 | 
			
		||||
	log_debug("\n");
 | 
			
		||||
	time(&client->time);
 | 
			
		||||
	if(!client->authed) {
 | 
			
		||||
		client->authed = hclient->auth;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct wifi_client *__get_client(struct hostapd_client *hclient){
 | 
			
		||||
	struct wifi_client *client;
 | 
			
		||||
 | 
			
		||||
	client = avl_find_element(&clients_by_addr, address, client, avl);
 | 
			
		||||
	client = avl_find_element(&clients_by_addr, hclient->address, client, avl);
 | 
			
		||||
	if (client) {
 | 
			
		||||
		log_debug("wifi_clients.__get_client("MACSTR"): found existing client\n", MAC2STR(address));
 | 
			
		||||
		__client_setvalues(client, hclient);
 | 
			
		||||
		log_debug("wifi_clients.__get_client("MACSTR"): found existing client\n", MAC2STR(hclient->address));
 | 
			
		||||
		return client;
 | 
			
		||||
	}
 | 
			
		||||
	log_debug("wifi_clients.__get_client("MACSTR"): gen new client\n", MAC2STR(address));
 | 
			
		||||
	log_debug("wifi_clients.__get_client("MACSTR"): gen new client\n", MAC2STR(hclient->address));
 | 
			
		||||
	client = malloc(sizeof(*client));
 | 
			
		||||
	memcpy(client->addr, address, sizeof(client->addr));
 | 
			
		||||
	memcpy(client->addr, hclient->address, sizeof(client->addr));
 | 
			
		||||
	client->try_probe = 0;
 | 
			
		||||
	client->try_auth = 0;
 | 
			
		||||
	time(&client->time);
 | 
			
		||||
	client->authed = 0;
 | 
			
		||||
	client->connected = 0;
 | 
			
		||||
	client->freq_highest = 0;
 | 
			
		||||
	client->signal_lowfreq = 0;
 | 
			
		||||
	client->signal_highfreq = 0;
 | 
			
		||||
	client->time = 0;
 | 
			
		||||
	__client_setvalues(client, hclient);
 | 
			
		||||
	client->avl.key = client->addr;
 | 
			
		||||
	log_debug("wifi_clients.__get_client("MACSTR"): add client to mem\n", MAC2STR(address));
 | 
			
		||||
	log_debug("wifi_clients.__get_client("MACSTR"): add client to mem\n", MAC2STR(hclient->address));
 | 
			
		||||
	avl_insert(&clients_by_addr, &client->avl);
 | 
			
		||||
	return client;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __client_learn(struct wifi_client *client, uint32_t freq, uint32_t ssi_signal) {
 | 
			
		||||
	log_debug("wifi_clients.__client_learn(., %d):", freq);
 | 
			
		||||
	if (client->freq_highest < freq) {
 | 
			
		||||
		client->freq_highest = freq;
 | 
			
		||||
		log_debug(" new highest freq");
 | 
			
		||||
	}
 | 
			
		||||
	if (freq > WIFI_CLIENT_FREQ_THREASHOLD) {
 | 
			
		||||
		client->signal_highfreq = ssi_signal;
 | 
			
		||||
	}else{
 | 
			
		||||
		client->signal_lowfreq = ssi_signal;
 | 
			
		||||
	}
 | 
			
		||||
	log_debug("\n");
 | 
			
		||||
	time(&client->time);
 | 
			
		||||
void wifi_clients_learn(struct hostapd_client *hclient) {
 | 
			
		||||
	__get_client(hclient);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void wifi_clients_learn(const u8 *address, uint32_t freq, uint32_t ssi_signal) {
 | 
			
		||||
int wifi_clients_try(struct hostapd_client *hclient) {
 | 
			
		||||
	struct wifi_client *client;
 | 
			
		||||
	client = __get_client(address);
 | 
			
		||||
	__client_learn(client, freq, ssi_signal);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int wifi_clients_try(bool auth, const u8 *address, uint32_t freq, uint32_t ssi_signal) {
 | 
			
		||||
	struct wifi_client *client;
 | 
			
		||||
	client = __get_client(address);
 | 
			
		||||
	__client_learn(client, freq, ssi_signal);
 | 
			
		||||
	client = __get_client(hclient);
 | 
			
		||||
 | 
			
		||||
	if (auth) {
 | 
			
		||||
		log_info("auth(try=%d mac="MACSTR" freq=%d ssi=%d): ", client->try_auth, MAC2STR(address), freq, ssi_signal);
 | 
			
		||||
	if (hclient->auth) {
 | 
			
		||||
		log_info("auth(try=%d mac="MACSTR" freq=%d ssi=%d): ", client->try_auth, MAC2STR(hclient->address), hclient->freq, hclient->ssi_signal);
 | 
			
		||||
		client->try_auth++;
 | 
			
		||||
		client->try_probe = 0;
 | 
			
		||||
	}else{
 | 
			
		||||
		if(config_client_force_probe){
 | 
			
		||||
			log_verbose("probe(try=%d mac="MACSTR" freq=%d ssi=%d): ", client->try_auth, MAC2STR(address), freq, ssi_signal);
 | 
			
		||||
			log_verbose("probe(try=%d mac="MACSTR" freq=%d ssi=%d): ", client->try_auth, MAC2STR(hclient->address), hclient->freq, hclient->ssi_signal);
 | 
			
		||||
		}else{
 | 
			
		||||
			log_verbose("probe(try=%d mac="MACSTR" freq=%d ssi=%d): ", client->try_probe, MAC2STR(address), freq, ssi_signal);
 | 
			
		||||
			log_verbose("probe(try=%d mac="MACSTR" freq=%d ssi=%d): ", client->try_probe, MAC2STR(hclient->address), hclient->freq, hclient->ssi_signal);
 | 
			
		||||
			client->try_probe++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (freq > WIFI_CLIENT_FREQ_THREASHOLD) {
 | 
			
		||||
		if(!auth){
 | 
			
		||||
	if (hclient->freq > WIFI_CLIENT_FREQ_THREASHOLD) {
 | 
			
		||||
		if(!hclient->auth){
 | 
			
		||||
			client->try_probe = 0;
 | 
			
		||||
			log_verbose("accept\n");
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
		log_info("accept\n");
 | 
			
		||||
		client->try_auth = 0;
 | 
			
		||||
		client->authed = 1;
 | 
			
		||||
		client->connected = 1;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	if (client->freq_highest > WIFI_CLIENT_FREQ_THREASHOLD) {
 | 
			
		||||
		if (config_client_force || config_client_force_probe && !auth) {
 | 
			
		||||
			if(!auth){
 | 
			
		||||
		if (config_client_force || config_client_force_probe && !hclient->auth) {
 | 
			
		||||
			if(!hclient->auth){
 | 
			
		||||
				log_verbose("reject - force\n");
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -148,8 +147,8 @@ int wifi_clients_try(bool auth, const u8 *address, uint32_t freq, uint32_t ssi_s
 | 
			
		|||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (ssi_signal > config_client_signal_threashold) {
 | 
			
		||||
			if(!auth){
 | 
			
		||||
		if (hclient->ssi_signal > config_client_signal_threashold) {
 | 
			
		||||
			if(!hclient->auth){
 | 
			
		||||
				log_verbose("reject - learned higher freq + ssi is high enough\n");
 | 
			
		||||
				return -1;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -158,21 +157,20 @@ int wifi_clients_try(bool auth, const u8 *address, uint32_t freq, uint32_t ssi_s
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if(auth && client->try_auth > config_client_try_threashold ||
 | 
			
		||||
		!auth && client->try_probe > config_client_try_threashold
 | 
			
		||||
	if(hclient->auth && client->try_auth > config_client_try_threashold ||
 | 
			
		||||
		!hclient->auth && client->try_probe > config_client_try_threashold
 | 
			
		||||
		) {
 | 
			
		||||
		if(!auth){
 | 
			
		||||
		if(!hclient->auth){
 | 
			
		||||
			client->try_probe = 0;
 | 
			
		||||
			log_verbose("accept - threashold\n");
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
		log_info("accept - threashold\n");
 | 
			
		||||
		client->try_auth = 0;
 | 
			
		||||
		client->authed = 1;
 | 
			
		||||
		client->connected = 1;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	if(!auth){
 | 
			
		||||
	if(!hclient->auth){
 | 
			
		||||
		log_verbose("reject\n");
 | 
			
		||||
		return client->try_probe;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -180,17 +178,16 @@ int wifi_clients_try(bool auth, const u8 *address, uint32_t freq, uint32_t ssi_s
 | 
			
		|||
	return client->try_auth;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void wifi_clients_disconnect(const u8 *address, uint32_t freq, uint32_t ssi_signal) {
 | 
			
		||||
void wifi_clients_disconnect(struct hostapd_client *hclient) {
 | 
			
		||||
	struct wifi_client *client;
 | 
			
		||||
	client = __get_client(address);
 | 
			
		||||
	__client_learn(client, freq, ssi_signal);
 | 
			
		||||
	client = __get_client(hclient);
 | 
			
		||||
	client->connected = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void wifi_clients_del(const u8 *addr) {
 | 
			
		||||
void wifi_clients_del(const u8 *address) {
 | 
			
		||||
	struct wifi_client *client;
 | 
			
		||||
 | 
			
		||||
	client = avl_find_element(&clients_by_addr, addr, client, avl);
 | 
			
		||||
	client = avl_find_element(&clients_by_addr, address, client, avl);
 | 
			
		||||
	if (!client)
 | 
			
		||||
			return;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,13 +3,23 @@
 | 
			
		|||
 | 
			
		||||
#include "include.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
struct hostapd_client {
 | 
			
		||||
	u8 *address;
 | 
			
		||||
	const char *method;
 | 
			
		||||
	bool auth;
 | 
			
		||||
	uint32_t freq;
 | 
			
		||||
	uint32_t ssi_signal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int wifi_clients_init();
 | 
			
		||||
void wifi_clients_close();
 | 
			
		||||
 | 
			
		||||
void wifi_clients_learn(const uint8_t *address, uint32_t freq, uint32_t ssi_signal);
 | 
			
		||||
int wifi_clients_try(bool auth, const uint8_t *address, uint32_t freq, uint32_t ssi_signal);
 | 
			
		||||
void wifi_clients_disconnect(const uint8_t *address, uint32_t freq, uint32_t ssi_signal);
 | 
			
		||||
void wifi_clients_learn(struct hostapd_client *hclient);
 | 
			
		||||
int wifi_clients_try(struct hostapd_client *hclient);
 | 
			
		||||
void wifi_clients_disconnect(struct hostapd_client *hclient);
 | 
			
		||||
 | 
			
		||||
void wifi_clients_del(const u8 *addr);
 | 
			
		||||
void wifi_clients_del(const u8 *address);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue