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